2
2
import datetime
3
3
import os
4
4
import unittest
5
- from unittest .mock import patch
5
+ from unittest .mock import call , patch
6
6
7
7
import django
8
8
from asgiref .sync import sync_to_async
9
9
from django .contrib .auth .models import User
10
10
from django .db import connection , transaction
11
+ from django .db .backends .utils import CursorDebugWrapper , CursorWrapper
11
12
from django .db .models import Count
12
13
from django .db .utils import DatabaseError
13
14
from django .shortcuts import render
@@ -68,39 +69,59 @@ def test_recording_chunked_cursor(self):
68
69
self .assertEqual (len (self .panel ._queries ), 1 )
69
70
70
71
@patch (
71
- "debug_toolbar.panels.sql.tracking.NormalCursorWrapper " ,
72
- wraps = sql_tracking .NormalCursorWrapper ,
72
+ "debug_toolbar.panels.sql.tracking.patch_cursor_wrapper_with_mixin " ,
73
+ wraps = sql_tracking .patch_cursor_wrapper_with_mixin ,
73
74
)
74
- def test_cursor_wrapper_singleton (self , mock_wrapper ):
75
+ def test_cursor_wrapper_singleton (self , mock_patch_cursor_wrapper ):
75
76
sql_call ()
76
-
77
77
# ensure that cursor wrapping is applied only once
78
- self .assertEqual (mock_wrapper .call_count , 1 )
78
+ self .assertIn (
79
+ mock_patch_cursor_wrapper .mock_calls ,
80
+ [
81
+ [call (CursorWrapper , sql_tracking .NormalCursorMixin )],
82
+ # CursorDebugWrapper is used if the test is called with `--debug-sql`
83
+ [call (CursorDebugWrapper , sql_tracking .NormalCursorMixin )],
84
+ ],
85
+ )
79
86
80
87
@patch (
81
- "debug_toolbar.panels.sql.tracking.NormalCursorWrapper " ,
82
- wraps = sql_tracking .NormalCursorWrapper ,
88
+ "debug_toolbar.panels.sql.tracking.patch_cursor_wrapper_with_mixin " ,
89
+ wraps = sql_tracking .patch_cursor_wrapper_with_mixin ,
83
90
)
84
- def test_chunked_cursor_wrapper_singleton (self , mock_wrapper ):
91
+ def test_chunked_cursor_wrapper_singleton (self , mock_patch_cursor_wrapper ):
85
92
sql_call (use_iterator = True )
86
93
87
94
# ensure that cursor wrapping is applied only once
88
- self .assertEqual (mock_wrapper .call_count , 1 )
95
+ self .assertIn (
96
+ mock_patch_cursor_wrapper .mock_calls ,
97
+ [
98
+ [call (CursorWrapper , sql_tracking .NormalCursorMixin )],
99
+ # CursorDebugWrapper is used if the test is called with `--debug-sql`
100
+ [call (CursorDebugWrapper , sql_tracking .NormalCursorMixin )],
101
+ ],
102
+ )
89
103
90
104
@patch (
91
- "debug_toolbar.panels.sql.tracking.NormalCursorWrapper " ,
92
- wraps = sql_tracking .NormalCursorWrapper ,
105
+ "debug_toolbar.panels.sql.tracking.patch_cursor_wrapper_with_mixin " ,
106
+ wraps = sql_tracking .patch_cursor_wrapper_with_mixin ,
93
107
)
94
- async def test_cursor_wrapper_async (self , mock_wrapper ):
108
+ async def test_cursor_wrapper_async (self , mock_patch_cursor_wrapper ):
95
109
await sync_to_async (sql_call )()
96
110
97
- self .assertEqual (mock_wrapper .call_count , 1 )
111
+ self .assertIn (
112
+ mock_patch_cursor_wrapper .mock_calls ,
113
+ [
114
+ [call (CursorWrapper , sql_tracking .NormalCursorMixin )],
115
+ # CursorDebugWrapper is used if the test is called with `--debug-sql`
116
+ [call (CursorDebugWrapper , sql_tracking .NormalCursorMixin )],
117
+ ],
118
+ )
98
119
99
120
@patch (
100
- "debug_toolbar.panels.sql.tracking.NormalCursorWrapper " ,
101
- wraps = sql_tracking .NormalCursorWrapper ,
121
+ "debug_toolbar.panels.sql.tracking.patch_cursor_wrapper_with_mixin " ,
122
+ wraps = sql_tracking .patch_cursor_wrapper_with_mixin ,
102
123
)
103
- async def test_cursor_wrapper_asyncio_ctx (self , mock_wrapper ):
124
+ async def test_cursor_wrapper_asyncio_ctx (self , mock_patch_cursor_wrapper ):
104
125
self .assertTrue (sql_tracking .allow_sql .get ())
105
126
await sync_to_async (sql_call )()
106
127
@@ -116,7 +137,21 @@ async def task():
116
137
await asyncio .create_task (task ())
117
138
# Because it was called in another context, it should not have affected ours
118
139
self .assertTrue (sql_tracking .allow_sql .get ())
119
- self .assertEqual (mock_wrapper .call_count , 1 )
140
+
141
+ self .assertIn (
142
+ mock_patch_cursor_wrapper .mock_calls ,
143
+ [
144
+ [
145
+ call (CursorWrapper , sql_tracking .NormalCursorMixin ),
146
+ call (CursorWrapper , sql_tracking .ExceptionCursorMixin ),
147
+ ],
148
+ # CursorDebugWrapper is used if the test is called with `--debug-sql`
149
+ [
150
+ call (CursorDebugWrapper , sql_tracking .NormalCursorMixin ),
151
+ call (CursorDebugWrapper , sql_tracking .ExceptionCursorMixin ),
152
+ ],
153
+ ],
154
+ )
120
155
121
156
def test_generate_server_timing (self ):
122
157
self .assertEqual (len (self .panel ._queries ), 0 )
0 commit comments