mirror of
https://github.com/graphql-python/graphene.git
synced 2024-11-22 17:46:57 +03:00
Add tests for interface and union support
This commit is contained in:
parent
8f7f2dc559
commit
2fbe0a67af
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"}}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user