@@ -62,6 +62,7 @@ def resolve_pet_type(value, info):
6262 if isinstance (value , Cat ):
6363 return CatType
6464
65+
6566PetType = GraphQLUnionType ('Pet' , [DogType , CatType ],
6667 resolve_type = resolve_pet_type )
6768
@@ -83,11 +84,53 @@ def resolve_pet_type(value, info):
8384liz = Person ('Liz' , [], [])
8485john = Person ('John' , [garfield , odie ], [liz , odie ])
8586
87+
8688# Execute: Union and intersection types
8789
88- def test_can_introspect_on_union_and_intersetion_types ():
89- # TODO
90- pass
90+ def test_can_introspect_on_union_and_intersection_types ():
91+ ast = parse ('''
92+ {
93+ Named: __type(name: "Named") {
94+ kind
95+ name
96+ fields { name }
97+ interfaces { name }
98+ possibleTypes { name }
99+ enumValues { name }
100+ inputFields { name }
101+ }
102+ Pet: __type(name: "Pet") {
103+ kind
104+ name
105+ fields { name }
106+ interfaces { name }
107+ possibleTypes { name }
108+ enumValues { name }
109+ inputFields { name }
110+ }
111+ }''' )
112+
113+ result = execute (schema , None , ast )
114+ assert result .data == {
115+ 'Named' : {
116+ 'enumValues' : None ,
117+ 'name' : 'Named' ,
118+ 'kind' : 'INTERFACE' ,
119+ 'interfaces' : None ,
120+ 'fields' : [{'name' : 'name' }],
121+ 'possibleTypes' : [{'name' : 'Dog' }, {'name' : 'Cat' }, {'name' : 'Person' }],
122+ 'inputFields' : None
123+ },
124+ 'Pet' : {
125+ 'enumValues' : None ,
126+ 'name' : 'Pet' ,
127+ 'kind' : 'UNION' ,
128+ 'interfaces' : None ,
129+ 'fields' : None ,
130+ 'possibleTypes' : [{'name' : 'Dog' }, {'name' : 'Cat' }],
131+ 'inputFields' : None
132+ }
133+ }
91134
92135
93136def test_executes_using_union_types ():
@@ -113,7 +156,7 @@ def test_executes_using_union_types():
113156 {'__typename' : 'Cat' , 'name' : 'Garfield' , 'meows' : False },
114157 {'__typename' : 'Dog' , 'name' : 'Odie' , 'barks' : True }
115158 ]
116- }
159+ }
117160
118161
119162def test_executes_union_types_with_inline_fragment ():
@@ -269,3 +312,42 @@ def test_only_include_fields_from_matching_fragment_condition():
269312 {'__typename' : 'Dog' , 'name' : 'Odie' }
270313 ],
271314 }
315+
316+
317+ def test_gets_execution_info_in_resolver ():
318+ encountered_schema = [None ]
319+ encountered_root_value = [None ]
320+
321+ def resolve_type (obj , info ):
322+ encountered_schema [0 ] = info .schema
323+ encountered_root_value [0 ] = info .root_value
324+ return PersonType2
325+
326+ NamedType2 = GraphQLInterfaceType (
327+ name = 'Named' ,
328+ fields = {
329+ 'name' : GraphQLField (GraphQLString )
330+ },
331+ resolve_type = resolve_type
332+ )
333+
334+ PersonType2 = GraphQLObjectType (
335+ name = 'Person' ,
336+ interfaces = [NamedType2 ],
337+ fields = {
338+ 'name' : GraphQLField (GraphQLString ),
339+ 'friends' : GraphQLField (GraphQLList (NamedType2 ))
340+ }
341+ )
342+
343+ schema2 = GraphQLSchema (query = PersonType2 )
344+ john2 = Person ('John' , [], [liz ])
345+ ast = parse ('''{ name, friends { name } }''' )
346+
347+ result = execute (schema2 , john2 , ast )
348+ assert result .data == {
349+ 'name' : 'John' , 'friends' : [{'name' : 'Liz' }]
350+ }
351+
352+ assert encountered_schema [0 ] == schema2
353+ assert encountered_root_value [0 ] == john2
0 commit comments