Skip to content

Commit 5c81e58

Browse files
authored
Fix List with NonNull items (#23)
* Created test to replicate problem * Fix response * Fix list with non nullable items
1 parent 6ad0aa4 commit 5c81e58

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

gql/query_parser.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,10 @@ def __scalar_type_to_python(scalar):
183183

184184
if isinstance(scalar, GraphQLList):
185185
scalar = scalar.of_type
186+
if isinstance(scalar, GraphQLNonNull):
187+
scalar = scalar.of_type
188+
nullable = False
189+
186190
mapping = f'List[{mapping.get(str(scalar), str(scalar))}]'
187191
else:
188192
mapping = mapping.get(str(scalar), str(scalar))

tests/test_renderer_dataclasses.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,3 +431,66 @@ def test_simple_query_with_datetime(swapi_dataclass_renderer, swapi_parser, modu
431431
assert data.returnOfTheJedi.title == 'Return of the Jedi'
432432
assert data.returnOfTheJedi.director == 'George Lucas'
433433
assert data.returnOfTheJedi.releaseDate == now
434+
435+
436+
def test_non_nullable_list(module_compiler, mocker):
437+
from gql.query_parser import QueryParser
438+
from graphql import (
439+
GraphQLSchema, GraphQLObjectType, GraphQLField, GraphQLString, GraphQLList, GraphQLNonNull)
440+
441+
PersonType = GraphQLObjectType('Person', lambda: {
442+
'name': GraphQLField(GraphQLString),
443+
})
444+
445+
schema = GraphQLSchema(
446+
query=GraphQLObjectType(
447+
name='RootQueryType',
448+
fields={
449+
'people': GraphQLField(
450+
GraphQLList(GraphQLNonNull(PersonType)),
451+
resolve=lambda obj, info: {'name':'eran'}
452+
)
453+
}))
454+
455+
query = """
456+
query GetPeople {
457+
people {
458+
name
459+
}
460+
}
461+
"""
462+
463+
parser = QueryParser(schema)
464+
dataclass_renderer = DataclassesRenderer(schema, Config(schema='schemaurl', endpoint='schemaurl', documents=''))
465+
466+
parsed = parser.parse(query)
467+
rendered = dataclass_renderer.render(parsed)
468+
469+
m = module_compiler(rendered)
470+
471+
now = datetime.now()
472+
473+
call_mock = mocker.patch.object(m.Client, 'call')
474+
call_mock.return_value = """
475+
{
476+
"data": {
477+
"people": [
478+
{
479+
"name": "eran"
480+
},
481+
{
482+
"name": "eran1"
483+
}
484+
]
485+
}
486+
}
487+
"""
488+
489+
result = m.GetPeople.execute()
490+
assert result
491+
assert isinstance(result, m.GetPeople)
492+
493+
data = result.data
494+
assert len(data.people) == 2
495+
assert data.people[0].name == 'eran'
496+
assert data.people[1].name == 'eran1'

0 commit comments

Comments
 (0)