Skip to content

Commit 37e5f7b

Browse files
committed
Fixed #28263 -- Fixed TestCase setup for databases that don't support savepoints.
1 parent 267ca71 commit 37e5f7b

File tree

1 file changed

+33
-2
lines changed

1 file changed

+33
-2
lines changed

django/test/testcases.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1192,6 +1192,18 @@ def connections_support_transactions(aliases=None):
11921192
return all(conn.features.supports_transactions for conn in conns)
11931193

11941194

1195+
def connections_support_savepoints(aliases=None):
1196+
"""
1197+
Return whether or not all (or specified) connections support savepoints.
1198+
"""
1199+
conns = (
1200+
connections.all()
1201+
if aliases is None
1202+
else (connections[alias] for alias in aliases)
1203+
)
1204+
return all(conn.features.uses_savepoints for conn in conns)
1205+
1206+
11951207
class TestData:
11961208
"""
11971209
Descriptor to provide TestCase instance isolation for attributes assigned
@@ -1266,10 +1278,17 @@ def _rollback_atomics(cls, atomics):
12661278
def _databases_support_transactions(cls):
12671279
return connections_support_transactions(cls.databases)
12681280

1281+
@classmethod
1282+
def _databases_support_savepoints(cls):
1283+
return connections_support_savepoints(cls.databases)
1284+
12691285
@classmethod
12701286
def setUpClass(cls):
12711287
super().setUpClass()
1272-
if not cls._databases_support_transactions():
1288+
if not (
1289+
cls._databases_support_transactions()
1290+
and cls._databases_support_savepoints()
1291+
):
12731292
return
12741293
cls.cls_atomics = cls._enter_atomics()
12751294

@@ -1297,7 +1316,10 @@ def setUpClass(cls):
12971316

12981317
@classmethod
12991318
def tearDownClass(cls):
1300-
if cls._databases_support_transactions():
1319+
if (
1320+
cls._databases_support_transactions()
1321+
and cls._databases_support_savepoints()
1322+
):
13011323
cls._rollback_atomics(cls.cls_atomics)
13021324
for conn in connections.all(initialized_only=True):
13031325
conn.close()
@@ -1323,6 +1345,15 @@ def _fixture_setup(self):
13231345
if self.reset_sequences:
13241346
raise TypeError("reset_sequences cannot be used on TestCase instances")
13251347
self.atomics = self._enter_atomics()
1348+
if not self._databases_support_savepoints():
1349+
if self.fixtures:
1350+
for db_name in self._databases_names(include_mirrors=False):
1351+
call_command(
1352+
"loaddata",
1353+
*self.fixtures,
1354+
**{"verbosity": 0, "database": db_name},
1355+
)
1356+
self.setUpTestData()
13261357

13271358
def _fixture_teardown(self):
13281359
if not self._databases_support_transactions():

0 commit comments

Comments
 (0)