Add tests for interface and union support

This commit is contained in:
Jonathan Kim 2020-07-14 17:22:27 +01:00
parent 8f7f2dc559
commit 2fbe0a67af
3 changed files with 84 additions and 2 deletions

View File

@ -1,3 +1,5 @@
import inspect
from .base import BaseOptions, BaseType, BaseTypeMeta from .base import BaseOptions, BaseType, BaseTypeMeta
from .field import Field from .field import Field
from .interface import Interface from .interface import Interface
@ -137,7 +139,7 @@ class ObjectType(BaseType, metaclass=ObjectTypeMeta):
fields = {} fields = {}
for interface in interfaces: for interface in interfaces:
assert issubclass( assert inspect.isclass(interface) and issubclass(
interface, Interface interface, Interface
), f'All interfaces of {cls.__name__} must be a subclass of Interface. Received "{interface}".' ), f'All interfaces of {cls.__name__} must be a subclass of Interface. Received "{interface}".'
fields.update(interface._meta.fields) fields.update(interface._meta.fields)

View File

@ -258,6 +258,7 @@ class TypeMap(dict):
union_types = [] union_types = []
for graphene_objecttype in graphene_type._meta.types: for graphene_objecttype in graphene_type._meta.types:
object_type = create_graphql_type(graphene_objecttype) object_type = create_graphql_type(graphene_objecttype)
if hasattr(object_type, "graphene_type"):
assert object_type.graphene_type == graphene_objecttype assert object_type.graphene_type == graphene_objecttype
union_types.append(object_type) union_types.append(object_type)
return union_types return union_types

View File

@ -1,5 +1,6 @@
from textwrap import dedent from textwrap import dedent
import pytest
from graphql.type import ( from graphql.type import (
GraphQLArgument, GraphQLArgument,
GraphQLEnumType, GraphQLEnumType,
@ -22,6 +23,7 @@ from ..objecttype import ObjectType
from ..scalars import Int, String from ..scalars import Int, String
from ..structures import List, NonNull from ..structures import List, NonNull
from ..schema import Schema from ..schema import Schema
from ..union import Union
def create_type_map(types, auto_camelcase=True): def create_type_map(types, auto_camelcase=True):
@ -313,3 +315,80 @@ def test_graphql_type():
) )
assert not results.errors assert not results.errors
assert results.data == {"graphqlType": {"hello": "world"}} assert results.data == {"graphqlType": {"hello": "world"}}
def test_graphql_type_interface():
MyGraphQLInterface = GraphQLInterfaceType(
name="MyGraphQLType",
fields={
"hello": GraphQLField(GraphQLString, resolve=lambda obj, info: "world")
},
)
with pytest.raises(AssertionError) as error:
class MyGrapheneType(ObjectType):
class Meta:
interfaces = (MyGraphQLInterface,)
assert str(error.value) == (
"All interfaces of MyGrapheneType must be a subclass of Interface. "
'Received "MyGraphQLType".'
)
def test_graphql_type_union():
MyGraphQLType = GraphQLObjectType(
name="MyGraphQLType",
fields={
"hello": GraphQLField(GraphQLString, resolve=lambda obj, info: "world")
},
)
class MyGrapheneType(ObjectType):
hi = String(default_value="world")
class MyUnion(Union):
class Meta:
types = (MyGraphQLType, MyGrapheneType)
@classmethod
def resolve_type(cls, instance, info):
return MyGraphQLType
class Query(ObjectType):
my_union = Field(MyUnion)
def resolve_my_union(root, info):
return {}
schema = Schema(query=Query)
assert str(schema) == dedent(
"""\
type Query {
myUnion: MyUnion
}
union MyUnion = MyGraphQLType | MyGrapheneType
type MyGraphQLType {
hello: String
}
type MyGrapheneType {
hi: String
}
"""
)
results = schema.execute(
"""
query {
myUnion {
__typename
}
}
"""
)
assert not results.errors
assert results.data == {"myUnion": {"__typename": "MyGraphQLType"}}