Skip to content

Commit 20706dd

Browse files
jorritmghoneimy
authored andcommitted
Properly encode enum values when used as arguments
1 parent 4f78465 commit 20706dd

File tree

5 files changed

+93
-0
lines changed

5 files changed

+93
-0
lines changed

src/SchemaGenerator/CodeGenerator/ArgumentsObjectClassBuilder.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,17 @@ public function addListArgument(string $argumentName, string $typeName)
5252
$this->addListSetter($argumentName, $upperCamelCaseArg, $typeName);
5353
}
5454

55+
/**
56+
* @param string $argumentName
57+
* @param string $typeName
58+
*/
59+
public function addInputEnumArgument(string $argumentName, string $typeName)
60+
{
61+
$upperCamelCaseArg = StringLiteralFormatter::formatUpperCamelCase($argumentName);
62+
$this->addProperty($argumentName);
63+
$this->addEnumSetter($argumentName, $upperCamelCaseArg, $typeName);
64+
}
65+
5566
/**
5667
* @param string $argumentName
5768
* @param string $typeName

src/SchemaGenerator/CodeGenerator/ObjectClassBuilder.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,24 @@ protected function addListSetter(string $propertyName, string $upperCamelName, s
5757
$this->classFile->addMethod($method);
5858
}
5959

60+
/**
61+
* @param string $propertyName
62+
* @param string $upperCamelName
63+
* @param string $objectClass
64+
*/
65+
protected function addEnumSetter(string $propertyName, string $upperCamelName, string $objectClass)
66+
{
67+
$lowerCamelName = lcfirst(str_replace('_', '', $objectClass));
68+
$method = "public function set$upperCamelName($$lowerCamelName)
69+
{
70+
\$this->$propertyName = new RawObject($$lowerCamelName);
71+
72+
return \$this;
73+
}";
74+
$this->classFile->addMethod($method);
75+
$this->classFile->addImport('GraphQL\\RawObject');
76+
}
77+
6078
/**
6179
* @param string $propertyName
6280
* @param string $upperCamelName

src/SchemaGenerator/SchemaClassGenerator.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,8 @@ protected function generateArgumentsObject(string $argsObjectName, array $argume
255255
} else {
256256
if ($typeKind === FieldTypeKindEnum::SCALAR) {
257257
$objectBuilder->addScalarArgument($name);
258+
} elseif ($typeKind === FieldTypeKindEnum::ENUM_OBJECT) {
259+
$objectBuilder->addInputEnumArgument($name, $typeName);
258260
} else {
259261
$objectBuilder->addInputObjectArgument($name, $typeName);
260262
}

tests/SchemaClassGeneratorTest.php

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,50 @@ public function testGenerateArgumentsObjectWithScalarArgs()
446446
);
447447
}
448448

449+
/**
450+
* @covers \GraphQL\SchemaGenerator\SchemaClassGenerator::generateArgumentsObject
451+
* @covers \GraphQL\SchemaGenerator\SchemaClassGenerator::generateObject
452+
*/
453+
public function testGenerateArgumentsObjectWithEnumArg()
454+
{
455+
$objectName = 'WithMultipleEnumArg';
456+
// Add mock responses
457+
$this->mockHandler->append(new Response(200, [], json_encode([
458+
'data' => [
459+
'__type' => [
460+
'name' => 'Some',
461+
'kind' => FieldTypeKindEnum::ENUM_OBJECT,
462+
'enumValues' => [
463+
[
464+
'name' => 'some_value',
465+
'description' => null,
466+
]
467+
]
468+
]
469+
]
470+
])));
471+
$argsArray = [
472+
[
473+
'name' => 'enumProperty',
474+
'description' => null,
475+
'defaultValue' => null,
476+
'type' => [
477+
'name' => 'Some',
478+
'kind' => FieldTypeKindEnum::ENUM_OBJECT,
479+
'description' => null,
480+
'ofType' => null,
481+
]
482+
]
483+
];
484+
$this->classGenerator->generateArgumentsObject('WithMultipleEnumArg', $argsArray);
485+
486+
$objectName .= 'ArgumentsObject';
487+
$this->assertFileEquals(
488+
static::getExpectedFilesDir() . "/arguments_objects/$objectName.php",
489+
static::getGeneratedFilesDir() . "/$objectName.php"
490+
);
491+
}
492+
449493
/**
450494
* @covers \GraphQL\SchemaGenerator\SchemaClassGenerator::generateArgumentsObject
451495
* @covers \GraphQL\SchemaGenerator\SchemaClassGenerator::generateObject
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace GraphQL\Tests\SchemaObject;
4+
5+
use GraphQL\SchemaObject\ArgumentsObject;
6+
use GraphQL\RawObject;
7+
8+
class WithMultipleEnumArgArgumentsObject extends ArgumentsObject
9+
{
10+
protected $enumProperty;
11+
12+
public function setEnumProperty($some)
13+
{
14+
$this->enumProperty = new RawObject($some);
15+
16+
return $this;
17+
}
18+
}

0 commit comments

Comments
 (0)