diff options
| author | Adam Chainz <adam@adamj.eu> | 2015-07-26 17:42:21 +0100 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2015-08-01 07:33:22 -0400 |
| commit | 0abb06930fc0686cb35079934e5bb40df66f5691 (patch) | |
| tree | a523f5041fadd03f24384b95e6038b73538991cd /tests/test_utils | |
| parent | f4afa699b6b47e523f9e88e9637b3322f84b1103 (diff) | |
Fixed #25176 -- Prevented TestCase.setUpTestData() exception from leaking transaction.
Diffstat (limited to 'tests/test_utils')
| -rw-r--r-- | tests/test_utils/tests.py | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/tests/test_utils/tests.py b/tests/test_utils/tests.py index a02bfb6397..d7f12d76ba 100644 --- a/tests/test_utils/tests.py +++ b/tests/test_utils/tests.py @@ -944,6 +944,39 @@ class OverrideSettingsTests(SimpleTestCase): self.assertIn(expected_location, finder.locations) +class TestBadSetUpTestData(TestCase): + """ + An exception in setUpTestData() shouldn't leak a transaction which would + cascade across the rest of the test suite. + """ + class MyException(Exception): + pass + + @classmethod + def setUpClass(cls): + try: + super(TestBadSetupTestData, cls).setUpClass() + except cls.MyException: + cls._in_atomic_block = connection.in_atomic_block + + @classmethod + def tearDownClass(Cls): + # override to avoid a second cls._rollback_atomics() which would fail. + # Normal setUpClass() methods won't have exception handling so this + # method wouldn't typically be run. + pass + + @classmethod + def setUpTestData(cls): + # Simulate a broken setUpTestData() method. + raise cls.MyException() + + def test_failure_in_setUpTestData_should_rollback_transaction(self): + # setUpTestData() should call _rollback_atomics() so that the + # transaction doesn't leak. + self.assertFalse(self._in_atomic_block) + + class DisallowedDatabaseQueriesTests(SimpleTestCase): def test_disallowed_database_queries(self): expected_message = ( |
