From d8fac587018b8a99bd0d5c4f05e81f580d28344d Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 1 Aug 2017 13:59:18 -0700 Subject: [PATCH] Fixed source resolver and added tests for it --- graphene/types/field.py | 2 +- graphene/types/tests/test_query.py | 62 ++++++++++++++++++++++-------- 2 files changed, 48 insertions(+), 16 deletions(-) diff --git a/graphene/types/field.py b/graphene/types/field.py index 9e699a12..4a79fcac 100644 --- a/graphene/types/field.py +++ b/graphene/types/field.py @@ -11,7 +11,7 @@ from .utils import get_type base_type = type -def source_resolver(source, root, args, context, info): +def source_resolver(source, root, info, **args): resolved = getattr(root, source, None) if inspect.isfunction(resolved) or inspect.ismethod(resolved): return resolved() diff --git a/graphene/types/tests/test_query.py b/graphene/types/tests/test_query.py index acaef0a1..95e626ef 100644 --- a/graphene/types/tests/test_query.py +++ b/graphene/types/tests/test_query.py @@ -27,6 +27,23 @@ def test_query(): assert executed.data == {'hello': 'World'} +def test_query_source(): + class Root(object): + _hello = "World" + + def hello(self): + return self._hello + + class Query(ObjectType): + hello = String(source="hello") + + hello_schema = Schema(Query) + + executed = hello_schema.execute('{ hello }', Root()) + assert not executed.errors + assert executed.data == {'hello': 'World'} + + def test_query_union(): class one_object(object): pass @@ -127,13 +144,15 @@ 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_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'} + assert executed.data == {'hello': 'World', 'hellos': [ + 'Worlds'], 'helloField': 'Field World'} def test_query_default_value(): @@ -165,7 +184,8 @@ def test_query_wrong_default_value(): executed = hello_schema.execute('{ hello { field } }') assert len(executed.errors) == 1 - assert executed.errors[0].message == GraphQLError('Expected value of type "MyType" but got: str.').message + assert executed.errors[0].message == GraphQLError( + 'Expected value of type "MyType" but got: str.').message assert executed.data == {'hello': None} @@ -174,7 +194,8 @@ def test_query_default_value_ignored_by_resolver(): field = String() class Query(ObjectType): - hello = Field(MyType, default_value='hello', resolver=lambda *_: MyType(field='no default.')) + hello = Field(MyType, default_value='hello', + resolver=lambda *_: MyType(field='no default.')) hello_schema = Schema(Query) @@ -214,7 +235,8 @@ def test_query_arguments(): assert not result.errors assert result.data == {'test': '["Source!",{"a_str":"String!"}]'} - result = test_schema.execute('{ test(aInt: -123, aStr: "String!") }', 'Source!') + result = test_schema.execute( + '{ test(aInt: -123, aStr: "String!") }', 'Source!') assert not result.errors assert result.data in [ {'test': '["Source!",{"a_str":"String!","a_int":-123}]'}, @@ -239,13 +261,17 @@ def test_query_input_field(): assert not result.errors assert result.data == {'test': '[null,{}]'} - result = test_schema.execute('{ test(aInput: {aField: "String!"} ) }', 'Source!') + result = test_schema.execute( + '{ test(aInput: {aField: "String!"} ) }', 'Source!') assert not result.errors - assert result.data == {'test': '["Source!",{"a_input":{"a_field":"String!"}}]'} + assert result.data == { + 'test': '["Source!",{"a_input":{"a_field":"String!"}}]'} - result = test_schema.execute('{ test(aInput: {recursiveField: {aField: "String!"}}) }', 'Source!') + result = test_schema.execute( + '{ test(aInput: {recursiveField: {aField: "String!"}}) }', 'Source!') assert not result.errors - assert result.data == {'test': '["Source!",{"a_input":{"recursive_field":{"a_field":"String!"}}}]'} + assert result.data == { + 'test': '["Source!",{"a_input":{"recursive_field":{"a_field":"String!"}}}]'} def test_query_middlewares(): @@ -265,7 +291,8 @@ def test_query_middlewares(): hello_schema = Schema(Query) - executed = hello_schema.execute('{ hello, other }', middleware=[reversed_middleware]) + executed = hello_schema.execute( + '{ hello, other }', middleware=[reversed_middleware]) assert not executed.errors assert executed.data == {'hello': 'dlroW', 'other': 'rehto'} @@ -348,7 +375,8 @@ def test_big_list_of_containers_query_benchmark(benchmark): big_list_query = partial(hello_schema.execute, '{ allContainers { x } }') result = benchmark(big_list_query) assert not result.errors - assert result.data == {'allContainers': [{'x': c.x} for c in big_container_list]} + assert result.data == {'allContainers': [ + {'x': c.x} for c in big_container_list]} def test_big_list_of_containers_multiple_fields_query_benchmark(benchmark): @@ -368,10 +396,12 @@ def test_big_list_of_containers_multiple_fields_query_benchmark(benchmark): hello_schema = Schema(Query) - big_list_query = partial(hello_schema.execute, '{ allContainers { x, y, z, o } }') + big_list_query = partial(hello_schema.execute, + '{ allContainers { x, y, z, o } }') result = benchmark(big_list_query) assert not result.errors - assert result.data == {'allContainers': [{'x': c.x, 'y': c.y, 'z': c.z, 'o': c.o} for c in big_container_list]} + assert result.data == {'allContainers': [ + {'x': c.x, 'y': c.y, 'z': c.z, 'o': c.o} for c in big_container_list]} def test_big_list_of_containers_multiple_fields_custom_resolvers_query_benchmark(benchmark): @@ -403,10 +433,12 @@ def test_big_list_of_containers_multiple_fields_custom_resolvers_query_benchmark hello_schema = Schema(Query) - big_list_query = partial(hello_schema.execute, '{ allContainers { x, y, z, o } }') + big_list_query = partial(hello_schema.execute, + '{ allContainers { x, y, z, o } }') result = benchmark(big_list_query) assert not result.errors - assert result.data == {'allContainers': [{'x': c.x, 'y': c.y, 'z': c.z, 'o': c.o} for c in big_container_list]} + assert result.data == {'allContainers': [ + {'x': c.x, 'y': c.y, 'z': c.z, 'o': c.o} for c in big_container_list]} def test_query_annotated_resolvers():