diff --git a/src/Definition/PhpEnumType.php b/src/Definition/PhpEnumType.php index 3705da0..2328667 100644 --- a/src/Definition/PhpEnumType.php +++ b/src/Definition/PhpEnumType.php @@ -4,53 +4,57 @@ namespace Worksome\GraphQLHelpers\Definition; +use BackedEnum; use GraphQL\Error\SerializationError; use GraphQL\Type\Definition\Deprecated; use GraphQL\Type\Definition\Description; use GraphQL\Type\Definition\EnumType; use GraphQL\Utils\PhpDoc; use GraphQL\Utils\Utils; -use Illuminate\Support\Str; +use Illuminate\Support\Collection; use Jawira\CaseConverter\Convert; +use ReflectionEnumBackedCase; +use ReflectionEnumPureCase; +use UnitEnum; /** * @phpstan-import-type PartialEnumValueConfig from EnumType */ class PhpEnumType extends EnumType { + public const MULTIPLE_DESCRIPTIONS_DISALLOWED = 'Using more than 1 Description attribute is not supported.'; public const MULTIPLE_DEPRECATIONS_DISALLOWED = 'Using more than 1 Deprecated attribute is not supported.'; /** - * @var class-string<\UnitEnum> + * @var class-string */ protected string $enumClass; /** - * @param class-string<\UnitEnum> $enum + * @param class-string $enum */ public function __construct(string $enum, string $name = null) { $this->enumClass = $enum; $reflection = new \ReflectionEnum($enum); - /** * @var array $enumDefinitions */ $enumDefinitions = []; foreach ($reflection->getCases() as $case) { $enumDefinitions[(new Convert($case->name))->toMacro()] = [ - 'value' => $case->getValue(), + 'value' => $case->getBackingValue(), 'description' => $this->extractDescription($case), 'deprecationReason' => $this->deprecationReason($case), ]; } parent::__construct([ - 'name' => $name ?? $this->baseName($enum), - 'values' => $enumDefinitions, - 'description' => $this->extractDescription($reflection), - ]); + 'name' => $name ?? $this->baseName($enum), + 'values' => $enumDefinitions, + 'description' => $this->extractDescription($reflection), + ]); } public function serialize($value): string diff --git a/tests/PhpEnumTypeTest.php b/tests/PhpEnumTypeTest.php new file mode 100644 index 0000000..4a7e9a7 --- /dev/null +++ b/tests/PhpEnumTypeTest.php @@ -0,0 +1,83 @@ +name)->toBe("DummyEnum"); + + $name = Collection::make($type->getValues()) + ->map(fn(EnumValueDefinition $definition) => $definition->name) + ->all(); + expect($name)->toBe( + [ + 'PASCAL_CASE', + 'SCREAMING_SNAKE_CASE', + 'SNAKE_CASE', + ], + ); + }, +); + +it( + 'generates correct GQL value from enum cases', + function () { + $type = new PhpEnumType(DummyEnum::class); + + $values = Collection::make($type->getValues()) + ->map(fn(EnumValueDefinition $definition) => $definition->value) + ->all(); + + expect($values)->toBe( + [ + DummyEnum::PascalCase->value, + DummyEnum::SCREAMING_SNAKE_CASE->value, + DummyEnum::snake_case->value, + ], + ); + }, +); + +it( + 'extracts description from php attribute', + function () { + $type = new PhpEnumType(DummyEnum::class); + + $descriptions = Collection::make($type->getValues())->map( + fn(EnumValueDefinition $definition) => $definition->description, + )->all(); + + expect($type->description)->toBe('Dummy enum description') + ->and($descriptions)->toBe( + [ + 'PascalCase description', + 'SCREAMING_SNAKE_CASE description', + 'snake_case description', + ], + ); + }, +);