@@ -48,14 +48,23 @@ def non_zero_sequences_counter(db: None) -> None:
48
48
class TestDatabaseFixtures :
49
49
"""Tests for the different database fixtures."""
50
50
51
- @pytest .fixture (params = ["db" , "transactional_db" , "django_db_reset_sequences" ])
51
+ @pytest .fixture (params = [
52
+ "db" ,
53
+ "transactional_db" ,
54
+ "django_db_reset_sequences" ,
55
+ "django_db_serialized_rollback" ,
56
+ ])
52
57
def all_dbs (self , request ) -> None :
53
58
if request .param == "django_db_reset_sequences" :
54
59
return request .getfixturevalue ("django_db_reset_sequences" )
55
60
elif request .param == "transactional_db" :
56
61
return request .getfixturevalue ("transactional_db" )
57
62
elif request .param == "db" :
58
63
return request .getfixturevalue ("db" )
64
+ elif request .param == "django_db_serialized_rollback" :
65
+ return request .getfixturevalue ("django_db_serialized_rollback" )
66
+ else :
67
+ assert False # pragma: no cover
59
68
60
69
def test_access (self , all_dbs : None ) -> None :
61
70
Item .objects .create (name = "spam" )
@@ -113,6 +122,51 @@ def test_django_db_reset_sequences_requested(
113
122
["*test_django_db_reset_sequences_requested PASSED*" ]
114
123
)
115
124
125
+ def test_serialized_rollback (self , db : None , django_testdir ) -> None :
126
+ django_testdir .create_app_file (
127
+ """
128
+ from django.db import migrations
129
+
130
+ def load_data(apps, schema_editor):
131
+ Item = apps.get_model("app", "Item")
132
+ Item.objects.create(name="loaded-in-migration")
133
+
134
+ class Migration(migrations.Migration):
135
+ dependencies = [
136
+ ("app", "0001_initial"),
137
+ ]
138
+
139
+ operations = [
140
+ migrations.RunPython(load_data),
141
+ ]
142
+ """ ,
143
+ "migrations/0002_data_migration.py" ,
144
+ )
145
+
146
+ django_testdir .create_test_module (
147
+ """
148
+ import pytest
149
+ from .app.models import Item
150
+
151
+ @pytest.mark.django_db(transaction=True, serialized_rollback=True)
152
+ def test_serialized_rollback_1():
153
+ assert Item.objects.filter(name="loaded-in-migration").exists()
154
+
155
+ @pytest.mark.django_db(transaction=True)
156
+ def test_serialized_rollback_2(django_db_serialized_rollback):
157
+ assert Item.objects.filter(name="loaded-in-migration").exists()
158
+ Item.objects.create(name="test2")
159
+
160
+ @pytest.mark.django_db(transaction=True, serialized_rollback=True)
161
+ def test_serialized_rollback_3():
162
+ assert Item.objects.filter(name="loaded-in-migration").exists()
163
+ assert not Item.objects.filter(name="test2").exists()
164
+ """
165
+ )
166
+
167
+ result = django_testdir .runpytest_subprocess ("-v" )
168
+ assert result .ret == 0
169
+
116
170
@pytest .fixture
117
171
def mydb (self , all_dbs : None ) -> None :
118
172
# This fixture must be able to access the database
@@ -160,6 +214,10 @@ def fixture_with_transdb(self, transactional_db: None) -> None:
160
214
def fixture_with_reset_sequences (self , django_db_reset_sequences : None ) -> None :
161
215
Item .objects .create (name = "spam" )
162
216
217
+ @pytest .fixture
218
+ def fixture_with_serialized_rollback (self , django_db_serialized_rollback : None ) -> None :
219
+ Item .objects .create (name = "ham" )
220
+
163
221
def test_trans (self , fixture_with_transdb : None ) -> None :
164
222
pass
165
223
@@ -180,6 +238,16 @@ def test_reset_sequences(
180
238
) -> None :
181
239
pass
182
240
241
+ # The test works when transactions are not supported, but it interacts
242
+ # badly with other tests.
243
+ @pytest .mark .skipif ('not connection.features.supports_transactions' )
244
+ def test_serialized_rollback (
245
+ self ,
246
+ fixture_with_serialized_rollback : None ,
247
+ fixture_with_db : None ,
248
+ ) -> None :
249
+ pass
250
+
183
251
184
252
class TestDatabaseMarker :
185
253
"Tests for the django_db marker."
@@ -264,6 +332,19 @@ def test_all_databases(self, request) -> None:
264
332
SecondItem .objects .count ()
265
333
SecondItem .objects .create (name = "spam" )
266
334
335
+ @pytest .mark .django_db
336
+ def test_serialized_rollback_disabled (self , request ):
337
+ marker = request .node .get_closest_marker ("django_db" )
338
+ assert not marker .kwargs
339
+
340
+ # The test works when transactions are not supported, but it interacts
341
+ # badly with other tests.
342
+ @pytest .mark .skipif ('not connection.features.supports_transactions' )
343
+ @pytest .mark .django_db (serialized_rollback = True )
344
+ def test_serialized_rollback_enabled (self , request ):
345
+ marker = request .node .get_closest_marker ("django_db" )
346
+ assert marker .kwargs ["serialized_rollback" ]
347
+
267
348
268
349
def test_unittest_interaction (django_testdir ) -> None :
269
350
"Test that (non-Django) unittests cannot access the DB."
0 commit comments