summaryrefslogtreecommitdiff
path: root/django/test
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2024-02-14 01:57:38 -0500
committerGitHub <noreply@github.com>2024-02-14 07:57:38 +0100
commitbf692b2fdcb5e55fafa5d3d38e286407eeef2ef4 (patch)
treed1c2f0282252da91310e928beadaa0d40d58a834 /django/test
parentcf107fe255dbc4e1619c0985e4becdd9cabe8235 (diff)
Fixed #28263 -- Fixed TestCase setup for databases that don't support savepoints.
Diffstat (limited to 'django/test')
-rw-r--r--django/test/testcases.py35
1 files changed, 33 insertions, 2 deletions
diff --git a/django/test/testcases.py b/django/test/testcases.py
index ce681f287c..51b07ae50d 100644
--- a/django/test/testcases.py
+++ b/django/test/testcases.py
@@ -1251,6 +1251,18 @@ def connections_support_transactions(aliases=None):
return all(conn.features.supports_transactions for conn in conns)
+def connections_support_savepoints(aliases=None):
+ """
+ Return whether or not all (or specified) connections support savepoints.
+ """
+ conns = (
+ connections.all()
+ if aliases is None
+ else (connections[alias] for alias in aliases)
+ )
+ return all(conn.features.uses_savepoints for conn in conns)
+
+
class TestData:
"""
Descriptor to provide TestCase instance isolation for attributes assigned
@@ -1326,9 +1338,16 @@ class TestCase(TransactionTestCase):
return connections_support_transactions(cls.databases)
@classmethod
+ def _databases_support_savepoints(cls):
+ return connections_support_savepoints(cls.databases)
+
+ @classmethod
def setUpClass(cls):
super().setUpClass()
- if not cls._databases_support_transactions():
+ if not (
+ cls._databases_support_transactions()
+ and cls._databases_support_savepoints()
+ ):
return
cls.cls_atomics = cls._enter_atomics()
@@ -1356,7 +1375,10 @@ class TestCase(TransactionTestCase):
@classmethod
def tearDownClass(cls):
- if cls._databases_support_transactions():
+ if (
+ cls._databases_support_transactions()
+ and cls._databases_support_savepoints()
+ ):
cls._rollback_atomics(cls.cls_atomics)
for conn in connections.all(initialized_only=True):
conn.close()
@@ -1382,6 +1404,15 @@ class TestCase(TransactionTestCase):
if self.reset_sequences:
raise TypeError("reset_sequences cannot be used on TestCase instances")
self.atomics = self._enter_atomics()
+ if not self._databases_support_savepoints():
+ if self.fixtures:
+ for db_name in self._databases_names(include_mirrors=False):
+ call_command(
+ "loaddata",
+ *self.fixtures,
+ **{"verbosity": 0, "database": db_name},
+ )
+ self.setUpTestData()
def _fixture_teardown(self):
if not self._databases_support_transactions():