1
1
import { expect } from 'chai' ;
2
2
import { describe , it } from 'mocha' ;
3
3
4
+ import { expectJSON } from '../../__testUtils__/expectJSON' ;
5
+
4
6
import { parse } from '../../language/parser' ;
5
7
6
8
import {
@@ -12,7 +14,7 @@ import {
12
14
import { GraphQLBoolean , GraphQLString } from '../../type/scalars' ;
13
15
import { GraphQLSchema } from '../../type/schema' ;
14
16
15
- import { executeSync } from '../execute' ;
17
+ import { execute , executeSync } from '../execute' ;
16
18
17
19
class Dog {
18
20
name : string ;
@@ -42,19 +44,30 @@ class Cat {
42
44
}
43
45
}
44
46
47
+ class Plant {
48
+ name : string ;
49
+
50
+ constructor ( name : string ) {
51
+ this . name = name ;
52
+ }
53
+ }
54
+
45
55
class Person {
46
56
name : string ;
47
57
pets ?: ReadonlyArray < Dog | Cat > ;
48
58
friends ?: ReadonlyArray < Dog | Cat | Person > ;
59
+ responsibilities ?: ReadonlyArray < Dog | Cat | Plant > ;
49
60
50
61
constructor (
51
62
name : string ,
52
63
pets ?: ReadonlyArray < Dog | Cat > ,
53
64
friends ?: ReadonlyArray < Dog | Cat | Person > ,
65
+ responsibilities ?: ReadonlyArray < Dog | Cat | Plant > ,
54
66
) {
55
67
this . name = name ;
56
68
this . pets = pets ;
57
69
this . friends = friends ;
70
+ this . responsibilities = responsibilities ;
58
71
}
59
72
}
60
73
@@ -108,6 +121,18 @@ const CatType: GraphQLObjectType = new GraphQLObjectType({
108
121
isTypeOf : ( value ) => value instanceof Cat ,
109
122
} ) ;
110
123
124
+ const PlantType : GraphQLObjectType = new GraphQLObjectType ( {
125
+ name : 'Plant' ,
126
+ interfaces : [ NamedType ] ,
127
+ fields : ( ) => ( {
128
+ name : { type : GraphQLString } ,
129
+ } ) ,
130
+ // eslint-disable-next-line @typescript-eslint/require-await
131
+ isTypeOf : async ( ) => {
132
+ throw new Error ( 'Not sure if this is a plant' ) ;
133
+ } ,
134
+ } ) ;
135
+
111
136
const PetType = new GraphQLUnionType ( {
112
137
name : 'Pet' ,
113
138
types : [ DogType , CatType ] ,
@@ -124,12 +149,18 @@ const PetType = new GraphQLUnionType({
124
149
} ,
125
150
} ) ;
126
151
152
+ const PetOrPlantType = new GraphQLUnionType ( {
153
+ name : 'PetOrPlantType' ,
154
+ types : [ PlantType , DogType , CatType ] ,
155
+ } ) ;
156
+
127
157
const PersonType : GraphQLObjectType = new GraphQLObjectType ( {
128
158
name : 'Person' ,
129
159
interfaces : [ NamedType , MammalType , LifeType ] ,
130
160
fields : ( ) => ( {
131
161
name : { type : GraphQLString } ,
132
162
pets : { type : new GraphQLList ( PetType ) } ,
163
+ responsibilities : { type : new GraphQLList ( PetOrPlantType ) } ,
133
164
friends : { type : new GraphQLList ( NamedType ) } ,
134
165
progeny : { type : new GraphQLList ( PersonType ) } ,
135
166
mother : { type : PersonType } ,
@@ -151,8 +182,15 @@ const odie = new Dog('Odie', true);
151
182
odie . mother = new Dog ( "Odie's Mom" , true ) ;
152
183
odie . mother . progeny = [ odie ] ;
153
184
185
+ const fern = new Plant ( 'Fern' ) ;
186
+
154
187
const liz = new Person ( 'Liz' ) ;
155
- const john = new Person ( 'John' , [ garfield , odie ] , [ liz , odie ] ) ;
188
+ const john = new Person (
189
+ 'John' ,
190
+ [ garfield , odie ] ,
191
+ [ liz , odie ] ,
192
+ [ garfield , fern ] ,
193
+ ) ;
156
194
157
195
describe ( 'Execute: Union and intersection types' , ( ) => {
158
196
it ( 'can introspect on union and intersection types' , ( ) => {
@@ -195,7 +233,12 @@ describe('Execute: Union and intersection types', () => {
195
233
name : 'Named' ,
196
234
fields : [ { name : 'name' } ] ,
197
235
interfaces : [ ] ,
198
- possibleTypes : [ { name : 'Dog' } , { name : 'Cat' } , { name : 'Person' } ] ,
236
+ possibleTypes : [
237
+ { name : 'Dog' } ,
238
+ { name : 'Cat' } ,
239
+ { name : 'Person' } ,
240
+ { name : 'Plant' } ,
241
+ ] ,
199
242
enumValues : null ,
200
243
inputFields : null ,
201
244
} ,
@@ -545,4 +588,54 @@ describe('Execute: Union and intersection types', () => {
545
588
expect ( encounteredRootValue ) . to . equal ( rootValue ) ;
546
589
expect ( encounteredContext ) . to . equal ( contextValue ) ;
547
590
} ) ;
591
+
592
+ it ( 'it rejects if isTypeOf check rejects in defaultResolveType' , async ( ) => {
593
+ const document = parse ( `
594
+ {
595
+ responsibilities {
596
+ __typename
597
+ ... on Dog {
598
+ name
599
+ barks
600
+ }
601
+ ... on Cat {
602
+ name
603
+ meows
604
+ }
605
+ }
606
+ }
607
+ ` ) ;
608
+
609
+ const rootValue = new Person ( 'John' , [ ] , [ liz ] , [ garfield ] ) ;
610
+ const contextValue = { authToken : '123abc' } ;
611
+
612
+ process . on ( 'unhandledRejection' , ( ) => {
613
+ expect . fail ( 'Unhandled rejection' ) ;
614
+ } ) ;
615
+
616
+ const result = await execute ( {
617
+ schema,
618
+ document,
619
+ rootValue,
620
+ contextValue,
621
+ } ) ;
622
+
623
+ expectJSON ( result ) . toDeepEqual ( {
624
+ data : {
625
+ responsibilities : [ null ] ,
626
+ } ,
627
+ errors : [
628
+ {
629
+ message : 'Not sure if this is a plant' ,
630
+ locations : [
631
+ {
632
+ column : 9 ,
633
+ line : 3 ,
634
+ } ,
635
+ ] ,
636
+ path : [ 'responsibilities' , 0 ] ,
637
+ } ,
638
+ ] ,
639
+ } ) ;
640
+ } ) ;
548
641
} ) ;
0 commit comments