diff options
| author | Ian Foote <python@ian.feete.org> | 2020-11-22 16:20:56 +0000 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2020-11-27 21:43:15 +0100 |
| commit | 3828879eee09da95bf99886c1ae182a36b1d89b3 (patch) | |
| tree | e0520c84e22ab5f275b30648f64149d46531dc47 /django/test/testcases.py | |
| parent | 8b040e3cbbb2e81420e777afc3ca48a1c8f4dd5a (diff) | |
Fixed #32220 -- Added durable argument to transaction.atomic().
Diffstat (limited to 'django/test/testcases.py')
| -rw-r--r-- | django/test/testcases.py | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/django/test/testcases.py b/django/test/testcases.py index 716eef5e42..114ca85012 100644 --- a/django/test/testcases.py +++ b/django/test/testcases.py @@ -1181,29 +1181,37 @@ class TestCase(TransactionTestCase): super().setUpClass() if not cls._databases_support_transactions(): return - cls.cls_atomics = cls._enter_atomics() - - if cls.fixtures: - for db_name in cls._databases_names(include_mirrors=False): - try: - call_command('loaddata', *cls.fixtures, **{'verbosity': 0, 'database': db_name}) - except Exception: - cls._rollback_atomics(cls.cls_atomics) - cls._remove_databases_failures() - raise - pre_attrs = cls.__dict__.copy() + # Disable the durability check to allow testing durable atomic blocks + # in a transaction for performance reasons. + transaction.Atomic._ensure_durability = False try: - cls.setUpTestData() + cls.cls_atomics = cls._enter_atomics() + + if cls.fixtures: + for db_name in cls._databases_names(include_mirrors=False): + try: + call_command('loaddata', *cls.fixtures, **{'verbosity': 0, 'database': db_name}) + except Exception: + cls._rollback_atomics(cls.cls_atomics) + cls._remove_databases_failures() + raise + pre_attrs = cls.__dict__.copy() + try: + cls.setUpTestData() + except Exception: + cls._rollback_atomics(cls.cls_atomics) + cls._remove_databases_failures() + raise + for name, value in cls.__dict__.items(): + if value is not pre_attrs.get(name): + setattr(cls, name, TestData(name, value)) except Exception: - cls._rollback_atomics(cls.cls_atomics) - cls._remove_databases_failures() + transaction.Atomic._ensure_durability = True raise - for name, value in cls.__dict__.items(): - if value is not pre_attrs.get(name): - setattr(cls, name, TestData(name, value)) @classmethod def tearDownClass(cls): + transaction.Atomic._ensure_durability = True if cls._databases_support_transactions(): cls._rollback_atomics(cls.cls_atomics) for conn in connections.all(): |
