diff --git a/src/RuleTransformers/EnumRule.php b/src/RuleTransformers/EnumRule.php index c1c47530b..a03bfcad4 100644 --- a/src/RuleTransformers/EnumRule.php +++ b/src/RuleTransformers/EnumRule.php @@ -4,6 +4,7 @@ use BackedEnum; use Dedoc\Scramble\Contracts\RuleTransformer; +use Dedoc\Scramble\Support\Generator\Types\ArrayType; use Dedoc\Scramble\Support\Generator\Types\Type; use Dedoc\Scramble\Support\Generator\Types\UnknownType; use Dedoc\Scramble\Support\Generator\TypeTransformer; @@ -42,11 +43,17 @@ public function toSchema(Type $previous, NormalizedRule $rule, RuleTransformerCo /** @var BackedEnum[] $only */ $only = method_exists(Enum::class, 'only') ? $this->getProtectedValue($rule, 'only') : []; // @phpstan-ignore function.alreadyNarrowedType - if ($except || $only) { - return $this->createPartialEnum($enumName, $only, $except); + $enumType = ($except || $only) + ? $this->createPartialEnum($enumName, $only, $except) + : $this->openApiTransformer->transform($objectType); + + if ($previous instanceof ArrayType) { + $previous->items = $enumType; + + return $previous; } - return $this->openApiTransformer->transform($objectType); + return $enumType; } /** diff --git a/tests/Support/OperationExtensions/RulesExtractor/RuleSetToSchemaTransformersTest.php b/tests/Support/OperationExtensions/RulesExtractor/RuleSetToSchemaTransformersTest.php index d8e7fe175..e7a5758cd 100644 --- a/tests/Support/OperationExtensions/RulesExtractor/RuleSetToSchemaTransformersTest.php +++ b/tests/Support/OperationExtensions/RulesExtractor/RuleSetToSchemaTransformersTest.php @@ -68,6 +68,60 @@ 'const' => 'bar', ]); })->skip(! method_exists(Enum::class, 'except')); + + test('enum rule with array type places enum on items', function () { + $rules = ['array', Rule::enum(Enum_RuleSetToSchemaTransformerTest::class)]; + + $schema = $this->transformer->transform($rules); + + expect($schema->toArray()) + ->toBe([ + 'type' => 'array', + 'items' => [ + '$ref' => '#/components/schemas/Enum_RuleSetToSchemaTransformerTest', + ], + ]); + }); + + test('enum rule with only and array type places enum on items', function () { + $rules = [ + 'array', + Rule::enum(Enum_RuleSetToSchemaTransformerTest::class)->only([ + Enum_RuleSetToSchemaTransformerTest::FOO, + ]), + ]; + + $schema = $this->transformer->transform($rules); + + expect($schema->toArray()) + ->toBe([ + 'type' => 'array', + 'items' => [ + 'type' => 'string', + 'const' => 'foo', + ], + ]); + })->skip(! method_exists(Enum::class, 'only')); + + test('enum rule with except and array type places enum on items', function () { + $rules = [ + 'array', + Rule::enum(Enum_RuleSetToSchemaTransformerTest::class)->except([ + Enum_RuleSetToSchemaTransformerTest::FOO, + ]), + ]; + + $schema = $this->transformer->transform($rules); + + expect($schema->toArray()) + ->toBe([ + 'type' => 'array', + 'items' => [ + 'type' => 'string', + 'const' => 'bar', + ], + ]); + })->skip(! method_exists(Enum::class, 'except')); }); describe(InRule::class, function () {