Skip to content

Commit 11605dc

Browse files
ktosiekjkimbo
authored andcommitted
Make DjangoDebugContext wait for nested fields (#591)
* 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. * Run format
1 parent 6e137da commit 11605dc

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-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: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,73 @@ def resolve_reporter(self, info, **args):
6060
assert result.data == expected
6161

6262

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

0 commit comments

Comments
 (0)