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