@@ -48,14 +48,23 @@ def non_zero_sequences_counter(db: None) -> None:
4848class TestDatabaseFixtures :
4949 """Tests for the different database fixtures."""
5050
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+ ])
5257 def all_dbs (self , request ) -> None :
5358 if request .param == "django_db_reset_sequences" :
5459 return request .getfixturevalue ("django_db_reset_sequences" )
5560 elif request .param == "transactional_db" :
5661 return request .getfixturevalue ("transactional_db" )
5762 elif request .param == "db" :
5863 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
5968
6069 def test_access (self , all_dbs : None ) -> None :
6170 Item .objects .create (name = "spam" )
@@ -113,6 +122,51 @@ def test_django_db_reset_sequences_requested(
113122 ["*test_django_db_reset_sequences_requested PASSED*" ]
114123 )
115124
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+
116170 @pytest .fixture
117171 def mydb (self , all_dbs : None ) -> None :
118172 # This fixture must be able to access the database
@@ -160,6 +214,10 @@ def fixture_with_transdb(self, transactional_db: None) -> None:
160214 def fixture_with_reset_sequences (self , django_db_reset_sequences : None ) -> None :
161215 Item .objects .create (name = "spam" )
162216
217+ @pytest .fixture
218+ def fixture_with_serialized_rollback (self , django_db_serialized_rollback : None ) -> None :
219+ Item .objects .create (name = "ham" )
220+
163221 def test_trans (self , fixture_with_transdb : None ) -> None :
164222 pass
165223
@@ -180,6 +238,16 @@ def test_reset_sequences(
180238 ) -> None :
181239 pass
182240
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+
183251
184252class TestDatabaseMarker :
185253 "Tests for the django_db marker."
@@ -264,6 +332,19 @@ def test_all_databases(self, request) -> None:
264332 SecondItem .objects .count ()
265333 SecondItem .objects .create (name = "spam" )
266334
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+
267348
268349def test_unittest_interaction (django_testdir ) -> None :
269350 "Test that (non-Django) unittests cannot access the DB."
0 commit comments