Skip to content

Commit 4406e7c

Browse files
committed
Merge branch 'develop'
2 parents 75a8b3e + c47745e commit 4406e7c

17 files changed

+277
-60
lines changed

Tests/DataProvider/TestScalarDataProvider.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -104,23 +104,23 @@ public static function getIdTestData()
104104
public static function getDatetimeTestData()
105105
{
106106
return [
107-
[null, null, false],
107+
[null, null, true],
108108
[new \DateTime('now'), date('Y-m-d H:i:s'), true],
109109
];
110110
}
111111

112112
public static function getDatetimetzTestData()
113113
{
114114
return [
115-
[null, null, false],
115+
[null, null, true],
116116
[new \DateTime('now'), date('r'), true],
117117
];
118118
}
119119

120120
public static function getDateTestData()
121121
{
122122
return [
123-
[null, null, false],
123+
[null, null, true],
124124
[new \DateTime('now'), date('Y-m-d'), true],
125125
];
126126
}
@@ -130,7 +130,7 @@ public static function getTimestampTestData()
130130
{
131131
return [
132132
[new \DateTime('now'), time(), true],
133-
[null, null, false],
133+
[null, null, true],
134134
];
135135
}
136136

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
namespace Youshido\Tests\Issues\Issue90;
3+
4+
use Youshido\GraphQL\Config\Schema\SchemaConfig;
5+
use Youshido\GraphQL\Schema\AbstractSchema;
6+
use Youshido\GraphQL\Type\Object\ObjectType;
7+
use Youshido\GraphQL\Type\Scalar\DateTimeType;
8+
9+
class Issue90Schema extends AbstractSchema
10+
{
11+
12+
public function build(SchemaConfig $config)
13+
{
14+
$config->setQuery(
15+
new ObjectType([
16+
'name' => 'QueryType',
17+
'fields' => [
18+
'echo' => [
19+
'type' => new DateTimeType('Y-m-d H:ia'),
20+
'args' => [
21+
'date' => new DateTimeType('Y-m-d H:ia')
22+
],
23+
'resolve' => function ($value, $args, $info) {
24+
25+
if (isset($args['date'])) {
26+
return $args['date'];
27+
}
28+
29+
return null;
30+
}
31+
]
32+
]
33+
])
34+
);
35+
36+
$config->setMutation(
37+
new ObjectType([
38+
'name' => 'MutationType',
39+
'fields' => [
40+
'echo' => [
41+
'type' => new DateTimeType('Y-m-d H:ia'),
42+
'args' => [
43+
'date' => new DateTimeType('Y-m-d H:ia')
44+
],
45+
'resolve' => function ($value, $args, $info) {
46+
47+
if (isset($args['date'])) {
48+
return $args['date'];
49+
}
50+
51+
return null;
52+
}
53+
]
54+
]
55+
])
56+
);
57+
}
58+
59+
}

Tests/Issues/Issue90/Issue90Test.php

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
3+
namespace Youshido\Tests\Issues\Issue90;
4+
5+
use Youshido\GraphQL\Execution\Processor;
6+
use Youshido\Tests\Issues\Issue90\Issue90Schema;
7+
8+
/**
9+
* User: stefano.corallo
10+
* Date: 25/11/16
11+
* Time: 9.39
12+
*/
13+
class Issue90Test extends \PHPUnit_Framework_TestCase
14+
{
15+
16+
public function testQueryDateTimeTypeWithDateParameter()
17+
{
18+
$schema = new Issue90Schema();
19+
$processor = new Processor($schema);
20+
$processor->processPayload("query{ echo(date: \"2016-11-25 09:53am\") }");
21+
$res = $processor->getResponseData();
22+
23+
self::assertCount(1, $res, "Invalid response array received"); //only data expected
24+
25+
self::assertNotNull($res['data']['echo'], "Invalid echo response received");
26+
27+
self::assertEquals("2016-11-25 09:53am", $res['data']['echo']);
28+
}
29+
30+
public function testQueryDateTimeTypeWithoutParameter()
31+
{
32+
$processor = new Processor(new Issue90Schema());
33+
$processor->processPayload("query{ echo }");
34+
$res = $processor->getResponseData();
35+
36+
self::assertCount(1, $res, "Invalid response array received"); //only data expected
37+
38+
self::assertNull($res['data']['echo']);
39+
}
40+
41+
public function testQueryDateTimeTypeWithNullParameter()
42+
{
43+
$processor = new Processor(new Issue90Schema());
44+
$processor->processPayload("query{ echo(date: null) }");
45+
$res = $processor->getResponseData();
46+
47+
self::assertCount(1, $res, "Invalid response array received"); //only data expected
48+
49+
self::assertNull($res['data']['echo'], "Error Quering with explicit date null parameter ");
50+
}
51+
52+
public function testMutatingDateTimeWithParameter()
53+
{
54+
$schema = new Issue90Schema();
55+
$processor = new Processor($schema);
56+
$processor->processPayload("mutation{ echo(date: \"2016-11-25 09:53am\") }");
57+
$res = $processor->getResponseData();
58+
59+
self::assertCount(1, $res, "Invalid response array received"); //only data expected
60+
61+
self::assertNotNull($res['data']['echo'], "Invalid echo response received during mutation of date parameter");
62+
63+
self::assertEquals("2016-11-25 09:53am", $res['data']['echo']);
64+
}
65+
66+
public function testMutatingDateTimeWithExplicitNullParameter()
67+
{
68+
$schema = new Issue90Schema();
69+
$processor = new Processor($schema);
70+
$processor->processPayload("mutation{ echo(date: null) }");
71+
$res = $processor->getResponseData();
72+
73+
self::assertCount(1, $res, "Invalid response array received"); //only data expected
74+
self::assertNull($res['data']['echo'], "Invalid echo response received during mutation of date parameter with explicit null value");
75+
}
76+
}

Tests/Library/Type/EnumTypeTest.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public function testNormalCreatingParams()
120120
$this->assertEquals($enumType->getNamedType(), $enumType);
121121

122122
$this->assertFalse($enumType->isValidValue($enumType));
123-
$this->assertFalse($enumType->isValidValue(null));
123+
$this->assertTrue($enumType->isValidValue(null));
124124

125125
$this->assertTrue($enumType->isValidValue(true));
126126
$this->assertTrue($enumType->isValidValue('disable'));

Tests/Library/Type/ScalarTypeTest.php

+7-3
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public function testScalarPrimitives()
3636
foreach (call_user_func(['Youshido\Tests\DataProvider\TestScalarDataProvider', $testDataMethod]) as list($data, $serialized, $isValid)) {
3737

3838
$this->assertSerialization($scalarType, $data, $serialized);
39-
$this->assertParse($scalarType, $data, $serialized);
39+
$this->assertParse($scalarType, $data, $serialized, $typeName);
4040

4141
if ($isValid) {
4242
$this->assertTrue($scalarType->isValidValue($data), $typeName . ' validation for :' . serialize($data));
@@ -65,9 +65,13 @@ private function assertSerialization(AbstractScalarType $object, $input, $expect
6565
$this->assertEquals($expected, $object->serialize($input), $object->getName() . ' serialize for: ' . serialize($input));
6666
}
6767

68-
private function assertParse(AbstractScalarType $object, $input, $expected)
68+
private function assertParse(AbstractScalarType $object, $input, $expected, $typeName)
6969
{
70-
$this->assertEquals($expected, $object->parseValue($input), $object->getName() . ' serialize for: ' . serialize($input));
70+
$parsed = $object->parseValue($input);
71+
if ($parsed instanceof \DateTime) {
72+
$expected = \DateTime::createFromFormat($typeName == 'datetime' ? 'Y-m-d H:i:s' : 'D, d M Y H:i:s O', $expected);
73+
}
74+
$this->assertEquals($expected, $parsed, $object->getName() . ' parse for: ' . serialize($input));
7175
}
7276

7377
}

Tests/Schema/InputObjectDefaultValuesTest.php

+37-8
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ public function testDefaultEnum()
2222
'name' => 'InternalStatus',
2323
'values' => [
2424
[
25-
'name' => 1,
26-
'value' => 'ACTIVE'
25+
'name' => 'ACTIVE',
26+
'value' => 1,
2727
],
2828
[
29-
'name' => 0,
30-
'value' => 'DISABLED'
29+
'name' => 'DISABLED',
30+
'value' => 0,
3131
],
3232
]
3333
]);
@@ -36,8 +36,8 @@ public function testDefaultEnum()
3636
'name' => 'RootQuery',
3737
'fields' => [
3838
'stringQuery' => [
39-
'type' => new StringType(),
40-
'args' => [
39+
'type' => new StringType(),
40+
'args' => [
4141
'statObject' => new InputObjectType([
4242
'name' => 'StatObjectType',
4343
'fields' => [
@@ -49,22 +49,51 @@ public function testDefaultEnum()
4949
]
5050
])
5151
],
52-
'resolve' => function ($source, $args) {
52+
'resolve' => function ($source, $args) {
5353
return sprintf('Result with level %s and status %s',
5454
$args['statObject']['level'], $args['statObject']['status']
5555
);
5656
},
5757
],
58+
'enumObject' => [
59+
'type' => new ObjectType([
60+
'name' => 'EnumObject',
61+
'fields' => [
62+
'status' => $enumType
63+
]
64+
]),
65+
'resolve' => function() {
66+
return [
67+
'status' => null
68+
];
69+
}
70+
],
71+
5872
]
5973
])
6074
]);
6175

6276
$processor = new Processor($schema);
6377
$processor->processPayload('{ stringQuery(statObject: { level: 1 }) }');
6478
$result = $processor->getResponseData();
79+
$this->assertEquals(['data' => [
80+
'stringQuery' => 'Result with level 1 and status 1'
81+
]], $result);
82+
83+
$processor->processPayload('{ stringQuery(statObject: { level: 1, status: DISABLED }) }');
84+
$result = $processor->getResponseData();
6585

6686
$this->assertEquals(['data' => [
67-
'stringQuery' => 'Result with level 1 and status ACTIVE'
87+
'stringQuery' => 'Result with level 1 and status 0'
88+
]], $result);
89+
90+
$processor->processPayload('{ enumObject { status } }');
91+
$result = $processor->getResponseData();
92+
93+
$this->assertEquals(['data' => [
94+
'enumObject' => [
95+
'status' => null
96+
]
6897
]], $result);
6998
}
7099

Tests/Schema/InputParseTest.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@ public function testDateInput($query, $expected)
2727
'stringQuery' => [
2828
'type' => new StringType(),
2929
'args' => [
30-
'from' => new DateTimeType(),
30+
'from' => new DateTimeType('Y-m-d H:i:s'),
3131
'fromtz' => new DateTimeTzType(),
3232
],
3333
'resolve' => function ($source, $args) {
3434
return sprintf('Result with %s date and %s tz',
35-
empty($args['from']) ? 'default' : $args['from'],
36-
empty($args['fromtz']) ? 'default' : $args['fromtz']
35+
empty($args['from']) ? 'default' : $args['from']->format('Y-m-d H:i:s'),
36+
empty($args['fromtz']) ? 'default' : $args['fromtz']->format('r')
3737
);
3838
},
3939
],

examples/js/index.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,12 @@ const blogSchema = new GraphQLSchema({
180180
return [DataProvider.getPost(2), DataProvider.getBanner(3)];
181181
}
182182
},
183+
enumNull: {
184+
type: postStatus,
185+
resolve: () => {
186+
return null;
187+
}
188+
},
183189
scalarList: {
184190
type: new GraphQLList(new GraphQLObjectType({
185191
name: 'scalarObject',
@@ -224,7 +230,7 @@ const blogSchema = new GraphQLSchema({
224230
})
225231
});
226232

227-
var query = '{ scalarList(count: 12) { id, cost } }';
233+
var query = '{ enumNull }';
228234
graphql(blogSchema, query).then(result => {
229235
console.log(JSON.stringify(result, null, 5));
230236
process.exit(0);

src/Execution/Processor.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ private function prepareArgumentValue($argumentValue, AbstractType $argumentType
249249
foreach($argumentType->getFields() as $field) {
250250
/** @var $field Field */
251251
if ($field->getConfig()->has('default')) {
252-
$result[$field->getName()] = $field->getConfig()->get('default');
252+
$result[$field->getName()] = $field->getType()->getNullableType()->parseInputValue($field->getConfig()->get('default'));
253253
}
254254
}
255255
foreach ($argumentValue->getValue() as $key => $item) {

src/Field/AbstractField.php

-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ abstract class AbstractField implements FieldInterface
2626
}
2727
protected $isFinal = false;
2828

29-
private $resolveFunctionCache = null;
3029
private $nameCache = null;
3130

3231
public function __construct(array $config = [])

src/Type/AbstractType.php

+5
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ public function parseValue($value)
5353
return $value;
5454
}
5555

56+
public function parseInputValue($value)
57+
{
58+
return $this->parseValue($value);
59+
}
60+
5661
public function serialize($value)
5762
{
5863
return $value;

src/Type/Enum/AbstractEnumType.php

+12
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public function getKind()
4848
*/
4949
public function isValidValue($value)
5050
{
51+
if (is_null($value)) return true;
5152
foreach ($this->getConfig()->get('values') as $item) {
5253
if ($value === $item['name'] || $value === $item['value']) {
5354
return true;
@@ -84,4 +85,15 @@ public function parseValue($value)
8485
return null;
8586
}
8687

88+
public function parseInputValue($value)
89+
{
90+
foreach ($this->getConfig()->get('values') as $valueItem) {
91+
if ($value === $valueItem['value']) {
92+
return $valueItem['name'];
93+
}
94+
}
95+
96+
return null;
97+
}
98+
8799
}

0 commit comments

Comments
 (0)