Skip to content

Commit e2fc64e

Browse files
authored
Merge pull request graphql-python#87 from graphql-python/feat-nested-relay-query
Feat nested relay query
2 parents 718dad1 + 963db28 commit e2fc64e

File tree

4 files changed

+73
-11
lines changed

4 files changed

+73
-11
lines changed

graphene_mongo/fields.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ def get_queryset(self, model, info, **args):
135135
reference_obj = get_node_from_global_id(reference_fields[arg_name], info, args.pop(arg_name))
136136
hydrated_references[arg_name] = reference_obj
137137
args.update(hydrated_references)
138+
138139
if self._get_queryset:
139140
queryset_or_filters = self._get_queryset(model, info, **args)
140141
if isinstance(queryset_or_filters, mongoengine.QuerySet):
@@ -178,12 +179,15 @@ def default_resolver(self, _root, info, **args):
178179
return connection
179180

180181
def chained_resolver(self, resolver, root, info, **args):
181-
resolved = resolver(root, info, **args)
182-
if resolved is not None:
183-
return resolved
182+
if not bool(args):
183+
# XXX: Filter nested args
184+
resolved = resolver(root, info, **args)
185+
if resolved is not None:
186+
return resolved
184187
return self.default_resolver(root, info, **args)
185188

186189
def get_resolver(self, parent_resolver):
187190
super_resolver = self.resolver or parent_resolver
191+
# print('super_resolver', super_resolver)
188192
resolver = partial(self.chained_resolver, super_resolver)
189193
return partial(self.connection_resolver, resolver, self.type)

graphene_mongo/tests/setup.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ def fixtures():
5757
article2 = Article(headline='World', editor=editor2, pub_date=pub_date)
5858
article2.save()
5959

60+
article3 = Article(headline='Bye', editor=editor2, pub_date=pub_date)
61+
article3.save()
62+
6063
Reporter.drop_collection()
6164
reporter1 = Reporter(
6265
id='1',

graphene_mongo/tests/test_fields.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,4 @@ def test_default_resolver_connection_list_length(fixtures):
5757

5858
connection = field.default_resolver(None, {}, **{'first': 1})
5959
assert hasattr(connection, 'list_length')
60-
assert connection.list_length == 2
60+
assert connection.list_length == 3

graphene_mongo/tests/test_relay_query.py

Lines changed: 62 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ def get_nodes(data, key):
2525
def test_should_query_reporter(fixtures):
2626

2727
class Query(graphene.ObjectType):
28-
node = Node.Field()
2928
reporter = graphene.Field(ReporterNode)
3029

3130
def resolve_reporter(self, *args, **kwargs):
@@ -126,18 +125,74 @@ def resolve_reporter(self, *args, **kwargs):
126125
schema = graphene.Schema(query=Query)
127126
result = schema.execute(query)
128127
assert not result.errors
129-
assert dict(result.data['reporter']) == expected['reporter']
128+
assert result.data['reporter'] == expected['reporter']
129+
130+
131+
def test_should_query_reporters_with_nested_document(fixtures):
132+
133+
class Query(graphene.ObjectType):
134+
reporters = MongoengineConnectionField(ReporterNode)
135+
136+
query = '''
137+
query ReporterQuery {
138+
reporters(firstName: "Allen") {
139+
edges {
140+
node {
141+
firstName,
142+
lastName,
143+
email,
144+
articles(headline: "Hello") {
145+
edges {
146+
node {
147+
headline
148+
}
149+
}
150+
}
151+
}
152+
}
153+
}
154+
}
155+
'''
156+
expected = {
157+
'reporters': {
158+
'edges': [
159+
{
160+
'node': {
161+
'firstName': 'Allen',
162+
'lastName': 'Iverson',
163+
'email': '[email protected]',
164+
'articles': {
165+
'edges': [
166+
{
167+
'node': {
168+
'headline': 'Hello'
169+
}
170+
}
171+
]
172+
}
173+
}
174+
}
175+
]
176+
}
177+
}
178+
179+
# print(query, expected)
180+
schema = graphene.Schema(query=Query)
181+
result = schema.execute(query)
182+
assert not result.errors
183+
# import json
184+
# print(json.dumps(result.data['reporters']))
185+
assert result.data['reporters'] == expected['reporters']
130186

131187

132188
def test_should_query_all_editors(fixtures, fixtures_dirname):
133189

134190
class Query(graphene.ObjectType):
135-
node = Node.Field()
136-
all_editors = MongoengineConnectionField(EditorNode)
191+
editors = MongoengineConnectionField(EditorNode)
137192

138193
query = '''
139194
query EditorQuery {
140-
allEditors {
195+
editors {
141196
edges {
142197
node {
143198
id,
@@ -159,7 +214,7 @@ class Query(graphene.ObjectType):
159214
data = base64.b64encode(f.read())
160215

161216
expected = {
162-
'allEditors': {
217+
'editors': {
163218
'edges': [
164219
{
165220
'node': {
@@ -204,7 +259,7 @@ class Query(graphene.ObjectType):
204259
schema = graphene.Schema(query=Query)
205260
result = schema.execute(query)
206261
assert not result.errors
207-
assert result.data['allEditors'] == expected['allEditors']
262+
assert result.data['editors'] == expected['editors']
208263

209264

210265
def test_should_filter_editors_by_id(fixtures):

0 commit comments

Comments
 (0)