From 9404cc6de0faf045ceeb4c61bdae0995cc23dcef Mon Sep 17 00:00:00 2001 From: Fabio Capucci Date: Mon, 30 Mar 2026 18:00:25 +0200 Subject: [PATCH] added supported literals to accepted rule --- src/Configuration/RuleTransformers.php | 2 ++ src/RuleTransformers/AcceptedRule.php | 21 +++++++++++++++++++ .../RuleSetToSchemaTransformersTest.php | 14 +++++++++++++ tests/ValidationRulesDocumentingTest.php | 19 +++++++++++++++++ ...tingTest__it_supports_accepted_rule__2.yml | 10 +++++++++ 5 files changed, 66 insertions(+) create mode 100644 src/RuleTransformers/AcceptedRule.php create mode 100644 tests/__snapshots__/ValidationRulesDocumentingTest__it_supports_accepted_rule__2.yml diff --git a/src/Configuration/RuleTransformers.php b/src/Configuration/RuleTransformers.php index 5068b39b9..803617b83 100644 --- a/src/Configuration/RuleTransformers.php +++ b/src/Configuration/RuleTransformers.php @@ -4,6 +4,7 @@ use Dedoc\Scramble\Contracts\AllRulesSchemasTransformer; use Dedoc\Scramble\Contracts\RuleTransformer; +use Dedoc\Scramble\RuleTransformers\AcceptedRule; use Dedoc\Scramble\RuleTransformers\ConfirmedRule; use Dedoc\Scramble\RuleTransformers\EnumRule; use Dedoc\Scramble\RuleTransformers\ExistsRule; @@ -81,6 +82,7 @@ public function instances(string $type, array $contextfulBindings): Collection public function all(): array { $base = $this->transformers ?: [ + AcceptedRule::class, EnumRule::class, InRule::class, ConfirmedRule::class, diff --git a/src/RuleTransformers/AcceptedRule.php b/src/RuleTransformers/AcceptedRule.php new file mode 100644 index 000000000..4b3b9635c --- /dev/null +++ b/src/RuleTransformers/AcceptedRule.php @@ -0,0 +1,21 @@ +is('accepted'); + } + + public function toSchema(Type $previous, NormalizedRule $rule, RuleTransformerContext $context): Type + { + return $previous->enum(['yes', 'on', '1', 'true']); + } +} diff --git a/tests/Support/OperationExtensions/RulesExtractor/RuleSetToSchemaTransformersTest.php b/tests/Support/OperationExtensions/RulesExtractor/RuleSetToSchemaTransformersTest.php index d8e7fe175..51f4f35a4 100644 --- a/tests/Support/OperationExtensions/RulesExtractor/RuleSetToSchemaTransformersTest.php +++ b/tests/Support/OperationExtensions/RulesExtractor/RuleSetToSchemaTransformersTest.php @@ -4,6 +4,7 @@ use Dedoc\Scramble\GeneratorConfig; use Dedoc\Scramble\OpenApiContext; +use Dedoc\Scramble\RuleTransformers\AcceptedRule; use Dedoc\Scramble\RuleTransformers\EnumRule; use Dedoc\Scramble\RuleTransformers\InRule; use Dedoc\Scramble\Support\Generator\OpenApi; @@ -99,6 +100,19 @@ }); }); +describe(AcceptedRule::class, function () { + test('accepted rule', function () { + $rules = ['accepted']; + + $schema = $this->transformer->transform($rules); + + expect($schema->toArray())->toBe([ + 'type' => 'string', + 'enum' => ['yes', 'on', '1', 'true'], + ]); + }); +}); + enum Enum_RuleSetToSchemaTransformerTest: string { case FOO = 'foo'; diff --git a/tests/ValidationRulesDocumentingTest.php b/tests/ValidationRulesDocumentingTest.php index 8ad63c4f5..255ba5992 100644 --- a/tests/ValidationRulesDocumentingTest.php +++ b/tests/ValidationRulesDocumentingTest.php @@ -951,6 +951,15 @@ public function __invoke(Request $request) assertMatchesSnapshot($openApiDocument); }); + +it('supports accepted rule', function () { + RouteFacade::get('api/test', [ValidationAcceptedRulesDocumenting_Test::class, 'index']); + + Scramble::routes(fn (Route $r) => $r->uri === 'api/test'); + $openApiDocument = app()->make(\Dedoc\Scramble\Generator::class)(); + + assertMatchesSnapshot($openApiDocument); +}); class ValidationRulesDocumenting_Test { /** @@ -996,6 +1005,16 @@ public function index(ValidationRulesAndFormRequestAtTheSameTime_TestFormRequest } } +class ValidationAcceptedRulesDocumenting_Test +{ + public function index(Request $request) + { + $request->validate([ + 'content' => ['required', 'accepted'], + ]); + } +} + class ValidationRulesWithDocs_Test { public function index(Request $request) diff --git a/tests/__snapshots__/ValidationRulesDocumentingTest__it_supports_accepted_rule__2.yml b/tests/__snapshots__/ValidationRulesDocumentingTest__it_supports_accepted_rule__2.yml new file mode 100644 index 000000000..9b82e3a1d --- /dev/null +++ b/tests/__snapshots__/ValidationRulesDocumentingTest__it_supports_accepted_rule__2.yml @@ -0,0 +1,10 @@ +openapi: 3.1.0 +info: + title: Laravel + version: 0.0.1 +servers: + - { url: 'http://localhost/api' } +paths: + /test: { get: { operationId: validationAcceptedRulesDocumentingTest.index, tags: [ValidationAcceptedRulesDocumenting_Test], parameters: [{ name: content, in: query, required: true, schema: { type: string, enum: ['yes', 'on', '1', 'true'] } }], responses: { 200: { description: '' }, 422: { $ref: '#/components/responses/ValidationException' } } } } +components: + responses: { ValidationException: { description: 'Validation error', content: { application/json: { schema: { type: object, properties: { message: { type: string, description: 'Errors overview.' }, errors: { type: object, description: 'A detailed description of each field that failed validation.', additionalProperties: { type: array, items: { type: string } } } }, required: [message, errors] } } } } }