@@ -19,20 +19,32 @@ import { execute } from '../execute';
19
19
class Dog {
20
20
name : string ;
21
21
barks : boolean ;
22
+ mother : ?Dog ;
23
+ father : ?Dog ;
24
+ progeny : Array < Dog > ;
22
25
23
26
constructor ( name , barks ) {
24
27
this . name = name ;
25
28
this . barks = barks ;
29
+ this . mother = null ;
30
+ this . father = null ;
31
+ this . progeny = [ ] ;
26
32
}
27
33
}
28
34
29
35
class Cat {
30
36
name : string ;
31
37
meows : boolean ;
38
+ mother : ?Cat ;
39
+ father : ?Cat ;
40
+ progeny : Array < Cat > ;
32
41
33
42
constructor ( name , meows ) {
34
43
this . name = name ;
35
44
this . meows = meows ;
45
+ this . mother = null ;
46
+ this . father = null ;
47
+ this . progeny = [ ] ;
36
48
}
37
49
}
38
50
@@ -55,23 +67,46 @@ const NamedType = new GraphQLInterfaceType({
55
67
} ,
56
68
} ) ;
57
69
70
+ const LifeType = new GraphQLInterfaceType ( {
71
+ name : 'Life' ,
72
+ fields : ( ) => ( {
73
+ progeny : { type : GraphQLList ( LifeType ) } ,
74
+ } ) ,
75
+ } ) ;
76
+
77
+ const MammalType = new GraphQLInterfaceType ( {
78
+ name : 'Mammal' ,
79
+ interfaces : [ LifeType ] ,
80
+ fields : ( ) => ( {
81
+ progeny : { type : GraphQLList ( MammalType ) } ,
82
+ mother : { type : MammalType } ,
83
+ father : { type : MammalType } ,
84
+ } ) ,
85
+ } ) ;
86
+
58
87
const DogType = new GraphQLObjectType ( {
59
88
name : 'Dog' ,
60
- interfaces : [ NamedType ] ,
61
- fields : {
89
+ interfaces : [ MammalType , LifeType , NamedType ] ,
90
+ fields : ( ) => ( {
62
91
name : { type : GraphQLString } ,
63
92
barks : { type : GraphQLBoolean } ,
64
- } ,
93
+ progeny : { type : GraphQLList ( DogType ) } ,
94
+ mother : { type : DogType } ,
95
+ father : { type : DogType } ,
96
+ } ) ,
65
97
isTypeOf : value => value instanceof Dog ,
66
98
} ) ;
67
99
68
100
const CatType = new GraphQLObjectType ( {
69
101
name : 'Cat' ,
70
- interfaces : [ NamedType ] ,
71
- fields : {
102
+ interfaces : [ MammalType , LifeType , NamedType ] ,
103
+ fields : ( ) => ( {
72
104
name : { type : GraphQLString } ,
73
105
meows : { type : GraphQLBoolean } ,
74
- } ,
106
+ progeny : { type : GraphQLList ( CatType ) } ,
107
+ mother : { type : CatType } ,
108
+ father : { type : CatType } ,
109
+ } ) ,
75
110
isTypeOf : value => value instanceof Cat ,
76
111
} ) ;
77
112
@@ -90,12 +125,15 @@ const PetType = new GraphQLUnionType({
90
125
91
126
const PersonType = new GraphQLObjectType ( {
92
127
name : 'Person' ,
93
- interfaces : [ NamedType ] ,
94
- fields : {
128
+ interfaces : [ NamedType , MammalType , LifeType ] ,
129
+ fields : ( ) => ( {
95
130
name : { type : GraphQLString } ,
96
131
pets : { type : GraphQLList ( PetType ) } ,
97
132
friends : { type : GraphQLList ( NamedType ) } ,
98
- } ,
133
+ progeny : { type : GraphQLList ( PersonType ) } ,
134
+ mother : { type : PersonType } ,
135
+ father : { type : PersonType } ,
136
+ } ) ,
99
137
isTypeOf : value => value instanceof Person ,
100
138
} ) ;
101
139
@@ -105,7 +143,13 @@ const schema = new GraphQLSchema({
105
143
} ) ;
106
144
107
145
const garfield = new Cat ( 'Garfield' , false ) ;
146
+ garfield . mother = new Cat ( "Garfield's Mom" , false ) ;
147
+ garfield . mother . progeny = [ garfield ] ;
148
+
108
149
const odie = new Dog ( 'Odie' , true ) ;
150
+ odie . mother = new Dog ( "Odie's Mom" , true ) ;
151
+ odie . mother . progeny = [ odie ] ;
152
+
109
153
const liz = new Person ( 'Liz' ) ;
110
154
const john = new Person ( 'John' , [ garfield , odie ] , [ liz , odie ] ) ;
111
155
@@ -122,6 +166,15 @@ describe('Execute: Union and intersection types', () => {
122
166
enumValues { name }
123
167
inputFields { name }
124
168
}
169
+ Mammal: __type(name: "Mammal") {
170
+ kind
171
+ name
172
+ fields { name }
173
+ interfaces { name }
174
+ possibleTypes { name }
175
+ enumValues { name }
176
+ inputFields { name }
177
+ }
125
178
Pet: __type(name: "Pet") {
126
179
kind
127
180
name
@@ -140,7 +193,16 @@ describe('Execute: Union and intersection types', () => {
140
193
kind : 'INTERFACE' ,
141
194
name : 'Named' ,
142
195
fields : [ { name : 'name' } ] ,
143
- interfaces : null ,
196
+ interfaces : [ ] ,
197
+ possibleTypes : [ { name : 'Person' } , { name : 'Dog' } , { name : 'Cat' } ] ,
198
+ enumValues : null ,
199
+ inputFields : null ,
200
+ } ,
201
+ Mammal : {
202
+ kind : 'INTERFACE' ,
203
+ name : 'Mammal' ,
204
+ fields : [ { name : 'progeny' } , { name : 'mother' } , { name : 'father' } ] ,
205
+ interfaces : [ { name : 'Life' } ] ,
144
206
possibleTypes : [ { name : 'Person' } , { name : 'Dog' } , { name : 'Cat' } ] ,
145
207
enumValues : null ,
146
208
inputFields : null ,
@@ -178,8 +240,16 @@ describe('Execute: Union and intersection types', () => {
178
240
__typename : 'Person' ,
179
241
name : 'John' ,
180
242
pets : [
181
- { __typename : 'Cat' , name : 'Garfield' , meows : false } ,
182
- { __typename : 'Dog' , name : 'Odie' , barks : true } ,
243
+ {
244
+ __typename : 'Cat' ,
245
+ name : 'Garfield' ,
246
+ meows : false ,
247
+ } ,
248
+ {
249
+ __typename : 'Dog' ,
250
+ name : 'Odie' ,
251
+ barks : true ,
252
+ } ,
183
253
] ,
184
254
} ,
185
255
} ) ;
@@ -210,8 +280,16 @@ describe('Execute: Union and intersection types', () => {
210
280
__typename : 'Person' ,
211
281
name : 'John' ,
212
282
pets : [
213
- { __typename : 'Cat' , name : 'Garfield' , meows : false } ,
214
- { __typename : 'Dog' , name : 'Odie' , barks : true } ,
283
+ {
284
+ __typename : 'Cat' ,
285
+ name : 'Garfield' ,
286
+ meows : false ,
287
+ } ,
288
+ {
289
+ __typename : 'Dog' ,
290
+ name : 'Odie' ,
291
+ barks : true ,
292
+ } ,
215
293
] ,
216
294
} ,
217
295
} ) ;
@@ -259,6 +337,20 @@ describe('Execute: Union and intersection types', () => {
259
337
... on Cat {
260
338
meows
261
339
}
340
+
341
+ ... on Mammal {
342
+ mother {
343
+ __typename
344
+ ... on Dog {
345
+ name
346
+ barks
347
+ }
348
+ ... on Cat {
349
+ name
350
+ meows
351
+ }
352
+ }
353
+ }
262
354
}
263
355
}
264
356
` ) ;
@@ -268,8 +360,17 @@ describe('Execute: Union and intersection types', () => {
268
360
__typename : 'Person' ,
269
361
name : 'John' ,
270
362
friends : [
271
- { __typename : 'Person' , name : 'Liz' } ,
272
- { __typename : 'Dog' , name : 'Odie' , barks : true } ,
363
+ {
364
+ __typename : 'Person' ,
365
+ name : 'Liz' ,
366
+ mother : null ,
367
+ } ,
368
+ {
369
+ __typename : 'Dog' ,
370
+ name : 'Odie' ,
371
+ barks : true ,
372
+ mother : { __typename : 'Dog' , name : "Odie's Mom" , barks : true } ,
373
+ } ,
273
374
] ,
274
375
} ,
275
376
} ) ;
@@ -280,7 +381,14 @@ describe('Execute: Union and intersection types', () => {
280
381
{
281
382
__typename
282
383
name
283
- pets { ...PetFields }
384
+ pets {
385
+ ...PetFields,
386
+ ...on Mammal {
387
+ mother {
388
+ ...ProgenyFields
389
+ }
390
+ }
391
+ }
284
392
friends { ...FriendFields }
285
393
}
286
394
@@ -306,19 +414,42 @@ describe('Execute: Union and intersection types', () => {
306
414
meows
307
415
}
308
416
}
417
+
418
+ fragment ProgenyFields on Life {
419
+ progeny {
420
+ __typename
421
+ }
422
+ }
309
423
` ) ;
310
424
311
425
expect ( execute ( schema , ast , john ) ) . to . deep . equal ( {
312
426
data : {
313
427
__typename : 'Person' ,
314
428
name : 'John' ,
315
429
pets : [
316
- { __typename : 'Cat' , name : 'Garfield' , meows : false } ,
317
- { __typename : 'Dog' , name : 'Odie' , barks : true } ,
430
+ {
431
+ __typename : 'Cat' ,
432
+ name : 'Garfield' ,
433
+ meows : false ,
434
+ mother : { progeny : [ { __typename : 'Cat' } ] } ,
435
+ } ,
436
+ {
437
+ __typename : 'Dog' ,
438
+ name : 'Odie' ,
439
+ barks : true ,
440
+ mother : { progeny : [ { __typename : 'Dog' } ] } ,
441
+ } ,
318
442
] ,
319
443
friends : [
320
- { __typename : 'Person' , name : 'Liz' } ,
321
- { __typename : 'Dog' , name : 'Odie' , barks : true } ,
444
+ {
445
+ __typename : 'Person' ,
446
+ name : 'Liz' ,
447
+ } ,
448
+ {
449
+ __typename : 'Dog' ,
450
+ name : 'Odie' ,
451
+ barks : true ,
452
+ } ,
322
453
] ,
323
454
} ,
324
455
} ) ;
0 commit comments