Skip to content

Commit 88643c7

Browse files
committed
Make DjangoDebugContext wait for nested fields
This commit makes DjangoDebugContext wait for all field's promises, even for fields that only started their resolvers after __debug was resolved. Fixes #293.
1 parent 8759239 commit 88643c7

File tree

2 files changed

+68
-1
lines changed

2 files changed

+68
-1
lines changed

graphene_django/debug/middleware.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,18 @@ def __init__(self):
1616
def get_debug_promise(self):
1717
if not self.debug_promise:
1818
self.debug_promise = Promise.all(self.promises)
19+
self.promises = []
1920
return self.debug_promise.then(self.on_resolve_all_promises)
2021

2122
def on_resolve_all_promises(self, values):
23+
if self.promises:
24+
self.debug_promise = None
25+
return self.get_debug_promise()
2226
self.disable_instrumentation()
2327
return self.object
2428

2529
def add_promise(self, promise):
26-
if self.debug_promise and not self.debug_promise.is_fulfilled:
30+
if self.debug_promise:
2731
self.promises.append(promise)
2832

2933
def enable_instrumentation(self):

graphene_django/debug/tests/test_query.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,69 @@ def resolve_reporter(self, info, **args):
6262
assert result.data == expected
6363

6464

65+
def test_should_query_nested_field():
66+
r1 = Reporter(last_name="ABA")
67+
r1.save()
68+
r2 = Reporter(last_name="Griffin")
69+
r2.save()
70+
r2.pets.add(r1)
71+
r1.pets.add(r2)
72+
73+
class ReporterType(DjangoObjectType):
74+
class Meta:
75+
model = Reporter
76+
interfaces = (Node,)
77+
78+
class Query(graphene.ObjectType):
79+
reporter = graphene.Field(ReporterType)
80+
debug = graphene.Field(DjangoDebug, name="__debug")
81+
82+
def resolve_reporter(self, info, **args):
83+
return Reporter.objects.first()
84+
85+
query = """
86+
query ReporterQuery {
87+
reporter {
88+
lastName
89+
pets { edges { node {
90+
lastName
91+
pets { edges { node { lastName } } }
92+
} } }
93+
}
94+
__debug {
95+
sql {
96+
rawSql
97+
}
98+
}
99+
}
100+
"""
101+
expected = {
102+
"reporter": {
103+
"lastName": "ABA",
104+
'pets': {'edges': [{'node': {
105+
'lastName': 'Griffin',
106+
'pets': {'edges': [{'node': {
107+
'lastName': 'ABA',
108+
} } ] }
109+
} } ] },
110+
},
111+
}
112+
schema = graphene.Schema(query=Query)
113+
result = schema.execute(
114+
query, context_value=context(), middleware=[DjangoDebugMiddleware()]
115+
)
116+
assert not result.errors
117+
query = str(Reporter.objects.order_by("pk")[:1].query)
118+
assert result.data["__debug"]["sql"][0]["rawSql"] == query
119+
assert "COUNT" in result.data["__debug"]["sql"][1]["rawSql"]
120+
assert "tests_reporter_pets" in result.data["__debug"]["sql"][2]["rawSql"]
121+
assert "COUNT" in result.data["__debug"]["sql"][3]["rawSql"]
122+
assert "tests_reporter_pets" in result.data["__debug"]["sql"][4]["rawSql"]
123+
assert len(result.data["__debug"]["sql"]) == 5
124+
125+
assert result.data["reporter"] == expected["reporter"]
126+
127+
65128
def test_should_query_list():
66129
r1 = Reporter(last_name="ABA")
67130
r1.save()

0 commit comments

Comments
 (0)