@@ -48,14 +48,21 @@ 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" )
5966
6067 def test_access (self , all_dbs : None ) -> None :
6168 Item .objects .create (name = "spam" )
@@ -113,6 +120,51 @@ def test_django_db_reset_sequences_requested(
113120 ["*test_django_db_reset_sequences_requested PASSED*" ]
114121 )
115122
123+ def test_serialized_rollback (self , db : None , django_testdir ) -> None :
124+ django_testdir .create_app_file (
125+ """
126+ from django.db import migrations
127+
128+ def load_data(apps, schema_editor):
129+ Item = apps.get_model("app", "Item")
130+ Item.objects.create(name="loaded-in-migration")
131+
132+ class Migration(migrations.Migration):
133+ dependencies = [
134+ ("app", "0001_initial"),
135+ ]
136+
137+ operations = [
138+ migrations.RunPython(load_data),
139+ ]
140+ """ ,
141+ "migrations/0002_data_migration.py" ,
142+ )
143+
144+ django_testdir .create_test_module (
145+ """
146+ import pytest
147+ from .app.models import Item
148+
149+ @pytest.mark.django_db(transaction=True, serialized_rollback=True)
150+ def test_serialized_rollback_1():
151+ assert Item.objects.filter(name="loaded-in-migration").exists()
152+
153+ @pytest.mark.django_db(transaction=True)
154+ def test_serialized_rollback_2(django_db_serialized_rollback):
155+ assert Item.objects.filter(name="loaded-in-migration").exists()
156+ Item.objects.create(name="test2")
157+
158+ @pytest.mark.django_db(transaction=True, serialized_rollback=True)
159+ def test_serialized_rollback_3():
160+ assert Item.objects.filter(name="loaded-in-migration").exists()
161+ assert not Item.objects.filter(name="test2").exists()
162+ """
163+ )
164+
165+ result = django_testdir .runpytest_subprocess ("-v" )
166+ assert result .ret == 0
167+
116168 @pytest .fixture
117169 def mydb (self , all_dbs : None ) -> None :
118170 # This fixture must be able to access the database
@@ -160,6 +212,10 @@ def fixture_with_transdb(self, transactional_db: None) -> None:
160212 def fixture_with_reset_sequences (self , django_db_reset_sequences : None ) -> None :
161213 Item .objects .create (name = "spam" )
162214
215+ @pytest .fixture
216+ def fixture_with_serialized_rollback (self , django_db_serialized_rollback : None ) -> None :
217+ Item .objects .create (name = "ham" )
218+
163219 def test_trans (self , fixture_with_transdb : None ) -> None :
164220 pass
165221
@@ -180,6 +236,16 @@ def test_reset_sequences(
180236 ) -> None :
181237 pass
182238
239+ # The test works when transactions are not supported, but it interacts
240+ # badly with other tests.
241+ @pytest .mark .skipif ('not connection.features.supports_transactions' )
242+ def test_serialized_rollback (
243+ self ,
244+ fixture_with_serialized_rollback : None ,
245+ fixture_with_db : None ,
246+ ) -> None :
247+ pass
248+
183249
184250class TestDatabaseMarker :
185251 "Tests for the django_db marker."
@@ -264,6 +330,19 @@ def test_all_databases(self, request) -> None:
264330 SecondItem .objects .count ()
265331 SecondItem .objects .create (name = "spam" )
266332
333+ @pytest .mark .django_db
334+ def test_serialized_rollback_disabled (self , request ):
335+ marker = request .node .get_closest_marker ("django_db" )
336+ assert not marker .kwargs
337+
338+ # The test works when transactions are not supported, but it interacts
339+ # badly with other tests.
340+ @pytest .mark .skipif ('not connection.features.supports_transactions' )
341+ @pytest .mark .django_db (serialized_rollback = True )
342+ def test_serialized_rollback_enabled (self , request ):
343+ marker = request .node .get_closest_marker ("django_db" )
344+ assert marker .kwargs ["serialized_rollback" ]
345+
267346
268347def test_unittest_interaction (django_testdir ) -> None :
269348 "Test that (non-Django) unittests cannot access the DB."
0 commit comments