@@ -32,6 +32,20 @@ def sql_call(*, use_iterator=False):
3232 return list (qs )
3333
3434
35+ async def async_sql_call (* , use_iterator = False ):
36+ qs = User .objects .all ()
37+ if use_iterator :
38+ qs = qs .iterator ()
39+ return await sync_to_async (list )(qs )
40+
41+
42+ async def concurrent_async_sql_call (* , use_iterator = False ):
43+ qs = User .objects .all ()
44+ if use_iterator :
45+ qs = qs .iterator ()
46+ return await asyncio .gather (sync_to_async (list )(qs ), User .objects .acount ())
47+
48+
3549class SQLPanelTestCase (BaseTestCase ):
3650 panel_id = "SQLPanel"
3751
@@ -57,6 +71,39 @@ def test_recording(self):
5771 # ensure the stacktrace is populated
5872 self .assertTrue (len (query ["stacktrace" ]) > 0 )
5973
74+ async def test_recording_async (self ):
75+ self .assertEqual (len (self .panel ._queries ), 0 )
76+
77+ await async_sql_call ()
78+
79+ # ensure query was logged
80+ self .assertEqual (len (self .panel ._queries ), 1 )
81+ query = self .panel ._queries [0 ]
82+ self .assertEqual (query ["alias" ], "default" )
83+ self .assertTrue ("sql" in query )
84+ self .assertTrue ("duration" in query )
85+ self .assertTrue ("stacktrace" in query )
86+
87+ # ensure the stacktrace is populated
88+ self .assertTrue (len (query ["stacktrace" ]) > 0 )
89+
90+ async def test_recording_concurrent_async (self ):
91+ self .assertEqual (len (self .panel ._queries ), 0 )
92+
93+ await concurrent_async_sql_call ()
94+
95+ # ensure query was logged
96+ self .assertEqual (len (self .panel ._queries ), 2 )
97+ query = self .panel ._queries [0 ]
98+ self .assertEqual (query ["alias" ], "default" )
99+ self .assertTrue ("sql" in query )
100+ self .assertTrue ("duration" in query )
101+ self .assertTrue ("stacktrace" in query )
102+
103+ # ensure the stacktrace is populated
104+ self .assertTrue (len (query ["stacktrace" ]) > 0 )
105+
106+
60107 @unittest .skipUnless (
61108 connection .vendor == "postgresql" , "Test valid only on PostgreSQL"
62109 )
0 commit comments