summaryrefslogtreecommitdiff
path: root/tests/test_utils
diff options
context:
space:
mode:
authorAdam Johnson <me@adamj.eu>2020-05-20 11:04:36 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-07-13 11:56:46 +0200
commite906ff6fca291fc0bfa0d52f05817ee9dae0335d (patch)
tree23f2d6788f6fb7b95b9bb3809f4c48138910373f /tests/test_utils
parentca6c5e5fc23f2855a7094d195f09975b21a7ec3f (diff)
Fixed #30457 -- Added TestCase.captureOnCommitCallbacks().
Diffstat (limited to 'tests/test_utils')
-rw-r--r--tests/test_utils/tests.py69
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 = (