diff options
| author | Tim Graham <timograham@gmail.com> | 2024-02-14 01:57:38 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-14 07:57:38 +0100 |
| commit | bf692b2fdcb5e55fafa5d3d38e286407eeef2ef4 (patch) | |
| tree | d1c2f0282252da91310e928beadaa0d40d58a834 /django/test/testcases.py | |
| parent | cf107fe255dbc4e1619c0985e4becdd9cabe8235 (diff) | |
Fixed #28263 -- Fixed TestCase setup for databases that don't support savepoints.
Diffstat (limited to 'django/test/testcases.py')
| -rw-r--r-- | django/test/testcases.py | 35 |
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(): |
