diff options
| author | Adam Johnson <me@adamj.eu> | 2020-05-20 11:04:36 +0100 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2020-07-13 11:56:46 +0200 |
| commit | e906ff6fca291fc0bfa0d52f05817ee9dae0335d (patch) | |
| tree | 23f2d6788f6fb7b95b9bb3809f4c48138910373f /tests/test_utils | |
| parent | ca6c5e5fc23f2855a7094d195f09975b21a7ec3f (diff) | |
Fixed #30457 -- Added TestCase.captureOnCommitCallbacks().
Diffstat (limited to 'tests/test_utils')
| -rw-r--r-- | tests/test_utils/tests.py | 69 |
1 files changed, 68 insertions, 1 deletions
diff --git a/tests/test_utils/tests.py b/tests/test_utils/tests.py index 4e90d720ee..a82dadceaa 100644 --- a/tests/test_utils/tests.py +++ b/tests/test_utils/tests.py @@ -9,7 +9,9 @@ from django.contrib.staticfiles.finders import get_finder, get_finders from django.contrib.staticfiles.storage import staticfiles_storage from django.core.exceptions import ImproperlyConfigured from django.core.files.storage import default_storage -from django.db import connection, connections, models, router +from django.db import ( + IntegrityError, connection, connections, models, router, transaction, +) from django.forms import EmailField, IntegerField from django.http import HttpResponse from django.template.loader import render_to_string @@ -1273,6 +1275,71 @@ class TestBadSetUpTestData(TestCase): self.assertFalse(self._in_atomic_block) +class CaptureOnCommitCallbacksTests(TestCase): + databases = {'default', 'other'} + callback_called = False + + def enqueue_callback(self, using='default'): + def hook(): + self.callback_called = True + + transaction.on_commit(hook, using=using) + + def test_no_arguments(self): + with self.captureOnCommitCallbacks() as callbacks: + self.enqueue_callback() + + self.assertEqual(len(callbacks), 1) + self.assertIs(self.callback_called, False) + callbacks[0]() + self.assertIs(self.callback_called, True) + + def test_using(self): + with self.captureOnCommitCallbacks(using='other') as callbacks: + self.enqueue_callback(using='other') + + self.assertEqual(len(callbacks), 1) + self.assertIs(self.callback_called, False) + callbacks[0]() + self.assertIs(self.callback_called, True) + + def test_different_using(self): + with self.captureOnCommitCallbacks(using='default') as callbacks: + self.enqueue_callback(using='other') + + self.assertEqual(callbacks, []) + + def test_execute(self): + with self.captureOnCommitCallbacks(execute=True) as callbacks: + self.enqueue_callback() + + self.assertEqual(len(callbacks), 1) + self.assertIs(self.callback_called, True) + + def test_pre_callback(self): + def pre_hook(): + pass + + transaction.on_commit(pre_hook, using='default') + with self.captureOnCommitCallbacks() as callbacks: + self.enqueue_callback() + + self.assertEqual(len(callbacks), 1) + self.assertNotEqual(callbacks[0], pre_hook) + + def test_with_rolled_back_savepoint(self): + with self.captureOnCommitCallbacks() as callbacks: + try: + with transaction.atomic(): + self.enqueue_callback() + raise IntegrityError + except IntegrityError: + # Inner transaction.atomic() has been rolled back. + pass + + self.assertEqual(callbacks, []) + + class DisallowedDatabaseQueriesTests(SimpleTestCase): def test_disallowed_database_connections(self): expected_message = ( |
