8
8
use GraphQL \Error \InvariantViolation ;
9
9
use GraphQL \Executor \Executor ;
10
10
use GraphQL \GraphQL ;
11
+ use GraphQL \Language \AST \FieldDefinitionNode ;
12
+ use GraphQL \Language \AST \FieldNode ;
13
+ use GraphQL \Language \AST \NodeList ;
11
14
use GraphQL \Language \Parser ;
12
15
use GraphQL \Tests \Executor \TestClasses \Cat ;
13
16
use GraphQL \Tests \Executor \TestClasses \Dog ;
14
17
use GraphQL \Tests \Executor \TestClasses \Person ;
15
18
use GraphQL \Type \Definition \InterfaceType ;
19
+ use GraphQL \Type \Definition \ListOfType ;
16
20
use GraphQL \Type \Definition \ObjectType ;
17
21
use GraphQL \Type \Definition \ResolveInfo ;
18
22
use GraphQL \Type \Definition \Type ;
@@ -46,12 +50,32 @@ public function setUp() : void
46
50
],
47
51
]);
48
52
53
+ $ LifeType = new InterfaceType ([
54
+ 'name ' => 'Life ' ,
55
+ 'fields ' => [
56
+ 'progeny ' => ['type ' => new ListOfType (function () use (&$ LifeType ) { return $ LifeType ; })],
57
+ ],
58
+ ]);
59
+
60
+ $ MammalType = new InterfaceType ([
61
+ 'name ' => 'Mammal ' ,
62
+ 'interfaces ' => [$ LifeType ],
63
+ 'fields ' => [
64
+ 'progeny ' => ['type ' => new ListOfType (function () use (&$ MammalType ) { return $ MammalType ; })],
65
+ 'mother ' => ['type ' => &$ MammalType ],
66
+ 'father ' => ['type ' => &$ MammalType ],
67
+ ]
68
+ ]);
69
+
49
70
$ DogType = new ObjectType ([
50
71
'name ' => 'Dog ' ,
51
- 'interfaces ' => [$ NamedType ],
72
+ 'interfaces ' => [$ MammalType , $ LifeType , $ NamedType ],
52
73
'fields ' => [
53
- 'name ' => ['type ' => Type::string ()],
54
- 'woofs ' => ['type ' => Type::boolean ()],
74
+ 'name ' => ['type ' => Type::string ()],
75
+ 'woofs ' => ['type ' => Type::boolean ()],
76
+ 'progeny ' => ['type ' => new ListOfType (function () use (&$ DogType ) {return $ DogType ; })],
77
+ 'mother ' => ['type ' => &$ DogType ],
78
+ 'father ' => ['type ' => &$ DogType ],
55
79
],
56
80
'isTypeOf ' => static function ($ value ) : bool {
57
81
return $ value instanceof Dog;
@@ -60,10 +84,13 @@ public function setUp() : void
60
84
61
85
$ CatType = new ObjectType ([
62
86
'name ' => 'Cat ' ,
63
- 'interfaces ' => [$ NamedType ],
87
+ 'interfaces ' => [$ MammalType , $ LifeType , $ NamedType ],
64
88
'fields ' => [
65
- 'name ' => ['type ' => Type::string ()],
66
- 'meows ' => ['type ' => Type::boolean ()],
89
+ 'name ' => ['type ' => Type::string ()],
90
+ 'meows ' => ['type ' => Type::boolean ()],
91
+ 'progeny ' => ['type ' => new ListOfType (function () use (&$ CatType ) { return $ CatType ; })],
92
+ 'mother ' => ['type ' => &$ CatType ],
93
+ 'father ' => ['type ' => &$ CatType ],
67
94
],
68
95
'isTypeOf ' => static function ($ value ) : bool {
69
96
return $ value instanceof Cat;
@@ -87,11 +114,14 @@ public function setUp() : void
87
114
88
115
$ PersonType = new ObjectType ([
89
116
'name ' => 'Person ' ,
90
- 'interfaces ' => [$ NamedType ],
117
+ 'interfaces ' => [$ NamedType, $ MammalType , $ LifeType ],
91
118
'fields ' => [
92
119
'name ' => ['type ' => Type::string ()],
93
120
'pets ' => ['type ' => Type::listOf ($ PetType )],
94
121
'friends ' => ['type ' => Type::listOf ($ NamedType )],
122
+ 'progeny ' => ['type ' => new ListOfType (function () use (&$ PersonType ) { return $ PersonType ; })],
123
+ 'mother ' => ['type ' => &$ PersonType ],
124
+ 'father ' => ['type ' => &$ PersonType ],
95
125
],
96
126
'isTypeOf ' => static function ($ value ) : bool {
97
127
return $ value instanceof Person;
@@ -103,8 +133,14 @@ public function setUp() : void
103
133
'types ' => [$ PetType ],
104
134
]);
105
135
106
- $ this ->garfield = new Cat ('Garfield ' , false );
107
- $ this ->odie = new Dog ('Odie ' , true );
136
+ $ this ->garfield = new Cat ('Garfield ' , false );
137
+ $ this ->garfield ->mother = new Cat ("Garfield's Mom " , false );
138
+ $ this ->garfield ->mother ->progeny = [$ this ->garfield ];
139
+
140
+ $ this ->odie = new Dog ('Odie ' , true );
141
+ $ this ->odie ->mother = new Dog ("Odie's Mom " , true );
142
+ $ this ->odie ->mother ->progeny = [$ this ->odie ];
143
+
108
144
$ this ->liz = new Person ('Liz ' );
109
145
$ this ->john = new Person ('John ' , [$ this ->garfield , $ this ->odie ], [$ this ->liz , $ this ->odie ]);
110
146
}
@@ -127,6 +163,15 @@ interfaces { name }
127
163
enumValues { name }
128
164
inputFields { name }
129
165
}
166
+ Mammal: __type(name: "Mammal") {
167
+ kind
168
+ name
169
+ fields { name }
170
+ interfaces { name }
171
+ possibleTypes { name }
172
+ enumValues { name }
173
+ inputFields { name }
174
+ }
130
175
Pet: __type(name: "Pet") {
131
176
kind
132
177
name
@@ -156,6 +201,25 @@ enumValues { name }
156
201
'enumValues ' => null ,
157
202
'inputFields ' => null ,
158
203
],
204
+ 'Mammal ' => [
205
+ 'kind ' => 'INTERFACE ' ,
206
+ 'name ' => 'Mammal ' ,
207
+ 'fields ' => [
208
+ ['name ' => 'progeny ' ],
209
+ ['name ' => 'mother ' ],
210
+ ['name ' => 'father ' ],
211
+ ],
212
+ 'interfaces ' => [
213
+ ['name ' => 'Life ' ]
214
+ ],
215
+ 'possibleTypes ' => [
216
+ ['name ' => 'Person ' ],
217
+ ['name ' => 'Dog ' ],
218
+ ['name ' => 'Cat ' ],
219
+ ],
220
+ 'enumValues ' => null ,
221
+ 'inputFields ' => null ,
222
+ ],
159
223
'Pet ' => [
160
224
'kind ' => 'UNION ' ,
161
225
'name ' => 'Pet ' ,
@@ -196,8 +260,16 @@ public function testExecutesUsingUnionTypes() : void
196
260
'__typename ' => 'Person ' ,
197
261
'name ' => 'John ' ,
198
262
'pets ' => [
199
- ['__typename ' => 'Cat ' , 'name ' => 'Garfield ' , 'meows ' => false ],
200
- ['__typename ' => 'Dog ' , 'name ' => 'Odie ' , 'woofs ' => true ],
263
+ [
264
+ '__typename ' => 'Cat ' ,
265
+ 'name ' => 'Garfield ' ,
266
+ 'meows ' => false
267
+ ],
268
+ [
269
+ '__typename ' => 'Dog ' ,
270
+ 'name ' => 'Odie ' ,
271
+ 'woofs ' => true
272
+ ],
201
273
],
202
274
],
203
275
];
@@ -233,8 +305,16 @@ public function testExecutesUnionTypesWithInlineFragments() : void
233
305
'__typename ' => 'Person ' ,
234
306
'name ' => 'John ' ,
235
307
'pets ' => [
236
- ['__typename ' => 'Cat ' , 'name ' => 'Garfield ' , 'meows ' => false ],
237
- ['__typename ' => 'Dog ' , 'name ' => 'Odie ' , 'woofs ' => true ],
308
+ [
309
+ '__typename ' => 'Cat ' ,
310
+ 'name ' => 'Garfield ' ,
311
+ 'meows ' => false
312
+ ],
313
+ [
314
+ '__typename ' => 'Dog ' ,
315
+ 'name ' => 'Odie ' ,
316
+ 'woofs ' => true
317
+ ],
238
318
],
239
319
240
320
],
@@ -293,6 +373,20 @@ public function testExecutesInterfaceTypesWithInlineFragments() : void
293
373
... on Cat {
294
374
meows
295
375
}
376
+
377
+ ... on Mammal {
378
+ mother {
379
+ __typename
380
+ ... on Dog {
381
+ name
382
+ woofs
383
+ }
384
+ ... on Cat {
385
+ name
386
+ meows
387
+ }
388
+ }
389
+ }
296
390
}
297
391
}
298
392
' );
@@ -301,8 +395,21 @@ public function testExecutesInterfaceTypesWithInlineFragments() : void
301
395
'__typename ' => 'Person ' ,
302
396
'name ' => 'John ' ,
303
397
'friends ' => [
304
- ['__typename ' => 'Person ' , 'name ' => 'Liz ' ],
305
- ['__typename ' => 'Dog ' , 'name ' => 'Odie ' , 'woofs ' => true ],
398
+ [
399
+ '__typename ' => 'Person ' ,
400
+ 'name ' => 'Liz ' ,
401
+ 'mother ' => null ,
402
+ ],
403
+ [
404
+ '__typename ' => 'Dog ' ,
405
+ 'name ' => 'Odie ' ,
406
+ 'woofs ' => true ,
407
+ 'mother ' => [
408
+ '__typename ' => 'Dog ' ,
409
+ 'name ' => "Odie's Mom " ,
410
+ 'woofs ' => true ,
411
+ ],
412
+ ],
306
413
],
307
414
],
308
415
];
@@ -319,7 +426,14 @@ public function testAllowsFragmentConditionsToBeAbstractTypes() : void
319
426
{
320
427
__typename
321
428
name
322
- pets { ...PetFields }
429
+ pets {
430
+ ...PetFields,
431
+ ...on Mammal {
432
+ mother {
433
+ ...ProgenyFields
434
+ }
435
+ }
436
+ }
323
437
friends { ...FriendFields }
324
438
}
325
439
@@ -345,19 +459,50 @@ public function testAllowsFragmentConditionsToBeAbstractTypes() : void
345
459
meows
346
460
}
347
461
}
462
+
463
+ fragment ProgenyFields on Life {
464
+ progeny {
465
+ __typename
466
+ }
467
+ }
348
468
' );
349
469
350
470
$ expected = [
351
471
'data ' => [
352
472
'__typename ' => 'Person ' ,
353
473
'name ' => 'John ' ,
354
474
'pets ' => [
355
- ['__typename ' => 'Cat ' , 'name ' => 'Garfield ' , 'meows ' => false ],
356
- ['__typename ' => 'Dog ' , 'name ' => 'Odie ' , 'woofs ' => true ],
475
+ [
476
+ '__typename ' => 'Cat ' ,
477
+ 'name ' => 'Garfield ' ,
478
+ 'meows ' => false ,
479
+ 'mother ' => [
480
+ 'progeny ' => [
481
+ ['__typename ' => 'Cat ' ],
482
+ ],
483
+ ],
484
+ ],
485
+ [
486
+ '__typename ' => 'Dog ' ,
487
+ 'name ' => 'Odie ' ,
488
+ 'woofs ' => true ,
489
+ 'mother ' => [
490
+ 'progeny ' => [
491
+ ['__typename ' => 'Dog ' ],
492
+ ],
493
+ ],
494
+ ],
357
495
],
358
496
'friends ' => [
359
- ['__typename ' => 'Person ' , 'name ' => 'Liz ' ],
360
- ['__typename ' => 'Dog ' , 'name ' => 'Odie ' , 'woofs ' => true ],
497
+ [
498
+ '__typename ' => 'Person ' ,
499
+ 'name ' => 'Liz '
500
+ ],
501
+ [
502
+ '__typename ' => 'Dog ' ,
503
+ 'name ' => 'Odie ' ,
504
+ 'woofs ' => true
505
+ ],
361
506
],
362
507
],
363
508
];
0 commit comments