Improved relay coverage

This commit is contained in:
Syrus Akbary 2017-08-01 23:55:39 -07:00
parent 7e901f83ae
commit 0a97deaa4d
5 changed files with 51 additions and 8 deletions

View File

@ -9,7 +9,6 @@ from ..types import (Boolean, Enum, Int, Interface, List, NonNull, Scalar,
String, Union) String, Union)
from ..types.field import Field from ..types.field import Field
from ..types.objecttype import ObjectType, ObjectTypeOptions from ..types.objecttype import ObjectType, ObjectTypeOptions
from ..utils.deprecated import warn_deprecation
from .node import is_node from .node import is_node
@ -101,7 +100,7 @@ class IterableConnectionField(Field):
type = super(IterableConnectionField, self).type type = super(IterableConnectionField, self).type
connection_type = type connection_type = type
if is_node(type): if is_node(type):
warn_deprecation( raise Exception(
"ConnectionField's now need a explicit ConnectionType for Nodes.\n" "ConnectionField's now need a explicit ConnectionType for Nodes.\n"
"Read more: https://github.com/graphql-python/graphene/blob/2.0/UPGRADE-v2.0.md#node-connections" "Read more: https://github.com/graphql-python/graphene/blob/2.0/UPGRADE-v2.0.md#node-connections"
) )

View File

@ -14,10 +14,7 @@ class ClientIDMutation(Mutation):
@classmethod @classmethod
def __init_subclass_with_meta__(cls, output=None, input_fields=None, def __init_subclass_with_meta__(cls, output=None, input_fields=None,
arguments=None, name=None, abstract=False, **options): arguments=None, name=None, **options):
if abstract:
return
input_class = getattr(cls, 'Input', None) input_class = getattr(cls, 'Input', None)
base_name = re.sub('Payload$', '', name or cls.__name__) base_name = re.sub('Payload$', '', name or cls.__name__)

View File

@ -1,3 +1,4 @@
import pytest
from ...types import Argument, Field, Int, List, NonNull, ObjectType, String from ...types import Argument, Field, Int, List, NonNull, ObjectType, String
from ..connection import Connection, ConnectionField, PageInfo from ..connection import Connection, ConnectionField, PageInfo
@ -117,6 +118,13 @@ def test_connectionfield():
} }
def test_connectionfield_node_deprecated():
field = ConnectionField(MyObject)
with pytest.raises(Exception) as exc_info:
field.type
assert "ConnectionField's now need a explicit ConnectionType for Nodes." in str(exc_info.value)
def test_connectionfield_custom_args(): def test_connectionfield_custom_args():
class MyObjectConnection(Connection): class MyObjectConnection(Connection):

View File

@ -31,6 +31,25 @@ class SaySomething(ClientIDMutation):
return SaySomething(phrase=str(what)) return SaySomething(phrase=str(what))
class FixedSaySomething(object):
__slots__ = 'phrase',
def __init__(self, phrase):
self.phrase = phrase
class SaySomethingFixed(ClientIDMutation):
class Input:
what = String()
phrase = String()
@staticmethod
def mutate_and_get_payload(self, info, what, client_mutation_id=None):
return FixedSaySomething(phrase=str(what))
class SaySomethingPromise(ClientIDMutation): class SaySomethingPromise(ClientIDMutation):
class Input: class Input:
@ -71,6 +90,7 @@ class RootQuery(ObjectType):
class Mutation(ObjectType): class Mutation(ObjectType):
say = SaySomething.Field() say = SaySomething.Field()
say_fixed = SaySomethingFixed.Field()
say_promise = SaySomethingPromise.Field() say_promise = SaySomethingPromise.Field()
other = OtherMutation.Field() other = OtherMutation.Field()
@ -152,7 +172,14 @@ def test_node_query():
assert executed.data == {'say': {'phrase': 'hello'}} assert executed.data == {'say': {'phrase': 'hello'}}
def test_node_query(): def test_node_query_fixed():
executed = schema.execute(
'mutation a { sayFixed(input: {what:"hello", clientMutationId:"1"}) { phrase } }'
)
assert "Cannot set client_mutation_id in the payload object" in str(executed.errors[0])
def test_node_query_promise():
executed = schema.execute( executed = schema.execute(
'mutation a { sayPromise(input: {what:"hello", clientMutationId:"1"}) { phrase } }' 'mutation a { sayPromise(input: {what:"hello", clientMutationId:"1"}) { phrase } }'
) )

View File

@ -3,7 +3,7 @@ from collections import OrderedDict
from graphql_relay import to_global_id from graphql_relay import to_global_id
from ...types import ObjectType, Schema, String from ...types import ObjectType, Schema, String
from ..node import Node from ..node import Node, is_node
class SharedNodeFields(object): class SharedNodeFields(object):
@ -46,11 +46,14 @@ class RootQuery(ObjectType):
only_node = Node.Field(MyNode) only_node = Node.Field(MyNode)
only_node_lazy = Node.Field(lambda: MyNode) only_node_lazy = Node.Field(lambda: MyNode)
schema = Schema(query=RootQuery, types=[MyNode, MyOtherNode]) schema = Schema(query=RootQuery, types=[MyNode, MyOtherNode])
def test_node_good(): def test_node_good():
assert 'id' in MyNode._meta.fields assert 'id' in MyNode._meta.fields
assert is_node(MyNode)
assert not is_node(object)
def test_node_query(): def test_node_query():
@ -70,6 +73,15 @@ def test_subclassed_node_query():
[('shared', '1'), ('extraField', 'extra field info.'), ('somethingElse', '----')])}) [('shared', '1'), ('extraField', 'extra field info.'), ('somethingElse', '----')])})
def test_node_requesting_non_node():
executed = schema.execute(
'{ node(id:"%s") { __typename } } ' % Node.to_global_id("RootQuery", 1)
)
assert executed.data == {
'node': None
}
def test_node_query_incorrect_id(): def test_node_query_incorrect_id():
executed = schema.execute( executed = schema.execute(
'{ node(id:"%s") { ... on MyNode { name } } }' % "something:2" '{ node(id:"%s") { ... on MyNode { name } } }' % "something:2"