From 822b030938533d4b2b182bd6bf64172f8816c0f4 Mon Sep 17 00:00:00 2001 From: Markus Padourek Date: Thu, 13 Oct 2016 14:47:43 +0100 Subject: [PATCH 1/2] Added tests for dynamic field and make more consistent. --- graphene/types/tests/test_dynamic.py | 27 +++++++++++++++++++++++++++ graphene/types/tests/test_query.py | 14 ++++++++++++++ graphene/types/typemap.py | 4 +++- 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 graphene/types/tests/test_dynamic.py diff --git a/graphene/types/tests/test_dynamic.py b/graphene/types/tests/test_dynamic.py new file mode 100644 index 00000000..61dcbd81 --- /dev/null +++ b/graphene/types/tests/test_dynamic.py @@ -0,0 +1,27 @@ +from ..structures import List, NonNull +from ..scalars import String +from ..dynamic import Dynamic + + +def test_dynamic(): + dynamic = Dynamic(lambda: String) + assert dynamic.get_type() == String + assert str(dynamic.get_type()) == 'String' + + +def test_nonnull(): + dynamic = Dynamic(lambda: NonNull(String)) + assert dynamic.get_type().of_type == String + assert str(dynamic.get_type()) == 'String!' + + +def test_list(): + dynamic = Dynamic(lambda: List(String)) + assert dynamic.get_type().of_type == String + assert str(dynamic.get_type()) == '[String]' + + +def test_list_non_null(): + dynamic = Dynamic(lambda: List(NonNull(String))) + assert dynamic.get_type().of_type.of_type == String + assert str(dynamic.get_type()) == '[String!]' diff --git a/graphene/types/tests/test_query.py b/graphene/types/tests/test_query.py index 4f9d8810..b1c5d112 100644 --- a/graphene/types/tests/test_query.py +++ b/graphene/types/tests/test_query.py @@ -10,6 +10,7 @@ from ..objecttype import ObjectType from ..scalars import Int, String from ..schema import Schema from ..structures import List +from ..dynamic import Dynamic def test_query(): @@ -23,6 +24,19 @@ def test_query(): assert executed.data == {'hello': 'World'} +def test_query_dynamic(): + class Query(ObjectType): + hello = Dynamic(lambda: String(resolver=lambda *_: 'World')) + hellos = Dynamic(lambda: List(String, resolver=lambda *_: ['Worlds'])) + hello_field = Dynamic(lambda: Field(String, resolver=lambda *_: 'Field World')) + + hello_schema = Schema(Query) + + executed = hello_schema.execute('{ hello hellos helloField }') + assert not executed.errors + assert executed.data == {'hello': 'World', 'hellos': ['Worlds'], 'helloField': 'Field World'} + + def test_query_default_value(): class MyType(ObjectType): field = String() diff --git a/graphene/types/typemap.py b/graphene/types/typemap.py index c2b47279..d7a7f23e 100644 --- a/graphene/types/typemap.py +++ b/graphene/types/typemap.py @@ -13,12 +13,14 @@ from ..utils.str_converters import to_camel_case from ..utils.get_unbound_function import get_unbound_function from .dynamic import Dynamic from .enum import Enum +from .field import Field from .inputobjecttype import InputObjectType from .interface import Interface from .objecttype import ObjectType from .scalars import ID, Boolean, Float, Int, Scalar, String from .structures import List, NonNull from .union import Union +from .utils import get_field_as def is_graphene_type(_type): @@ -202,7 +204,7 @@ class TypeMap(GraphQLTypeMap): fields = OrderedDict() for name, field in type._meta.fields.items(): if isinstance(field, Dynamic): - field = field.get_type() + field = get_field_as(field.get_type(), _as=Field) if not field: continue map = self.reducer(map, field.type) From 04085911410f247a918b017d2d4d62910f4dbe0e Mon Sep 17 00:00:00 2001 From: Markus Padourek Date: Thu, 13 Oct 2016 16:54:54 +0100 Subject: [PATCH 2/2] Added additional tests. --- graphene/types/argument.py | 4 ++++ graphene/types/tests/test_mutation.py | 12 +++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/graphene/types/argument.py b/graphene/types/argument.py index 49784b10..ead2c005 100644 --- a/graphene/types/argument.py +++ b/graphene/types/argument.py @@ -3,6 +3,7 @@ from itertools import chain from ..utils.orderedtype import OrderedType from .structures import NonNull +from .dynamic import Dynamic class Argument(OrderedType): @@ -33,6 +34,9 @@ def to_arguments(args, extra_args): iter_arguments = chain(args.items(), extra_args) arguments = OrderedDict() for default_name, arg in iter_arguments: + if isinstance(arg, Dynamic): + arg = arg.get_type() + if isinstance(arg, UnmountedType): arg = arg.Argument() diff --git a/graphene/types/tests/test_mutation.py b/graphene/types/tests/test_mutation.py index 2af6f4fd..24096161 100644 --- a/graphene/types/tests/test_mutation.py +++ b/graphene/types/tests/test_mutation.py @@ -4,6 +4,7 @@ from ..mutation import Mutation from ..objecttype import ObjectType from ..schema import Schema from ..scalars import String +from ..dynamic import Dynamic def test_generate_mutation_no_args(): @@ -47,12 +48,15 @@ def test_mutation_execution(): class CreateUser(Mutation): class Input: name = String() + dynamic = Dynamic(lambda: String()) name = String() + dynamic = Dynamic(lambda: String()) def mutate(self, args, context, info): name = args.get('name') - return CreateUser(name=name) + dynamic = args.get('dynamic') + return CreateUser(name=name, dynamic=dynamic) class Query(ObjectType): a = String() @@ -62,14 +66,16 @@ def test_mutation_execution(): schema = Schema(query=Query, mutation=MyMutation) result = schema.execute(''' mutation mymutation { - createUser(name:"Peter") { + createUser(name:"Peter", dynamic: "dynamic") { name + dynamic } } ''') assert not result.errors assert result.data == { 'createUser': { - 'name': "Peter" + 'name': 'Peter', + 'dynamic': 'dynamic', } }