diff options
author | Ilya Bass <ilya.bass@pathai.com> | 2022-10-20 15:14:35 -0700 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-11-21 09:10:14 +0100 |
commit | 798e38c2b9c46ab72e2ee8c33dc822f01b194b1e (patch) | |
tree | 32e558e0f86e04f9198646bffa11c08198dfe43c /tests/backends | |
parent | c0a93d39411004300dfda2deb3dc093b69ac6368 (diff) | |
download | django-798e38c2b9c46ab72e2ee8c33dc822f01b194b1e.tar.gz |
Fixed #31090 -- Logged transaction management queries.
Thanks to Petter Strandmark for the original idea and Mariusz Felisiak
for advice during the DjangoConUS 2022 Sprint!
Diffstat (limited to 'tests/backends')
-rw-r--r-- | tests/backends/base/test_base.py | 63 |
1 files changed, 60 insertions, 3 deletions
diff --git a/tests/backends/base/test_base.py b/tests/backends/base/test_base.py index 57d22ce269..ada2cc33c9 100644 --- a/tests/backends/base/test_base.py +++ b/tests/backends/base/test_base.py @@ -1,10 +1,16 @@ from unittest.mock import MagicMock, patch -from django.db import DEFAULT_DB_ALIAS, connection, connections +from django.db import DEFAULT_DB_ALIAS, connection, connections, transaction from django.db.backends.base.base import BaseDatabaseWrapper -from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature +from django.test import ( + SimpleTestCase, + TestCase, + TransactionTestCase, + skipUnlessDBFeature, +) +from django.test.utils import CaptureQueriesContext, override_settings -from ..models import Square +from ..models import Person, Square class DatabaseWrapperTests(SimpleTestCase): @@ -55,6 +61,57 @@ class DatabaseWrapperTests(SimpleTestCase): connection.check_database_version_supported() +class DatabaseWrapperLoggingTests(TransactionTestCase): + available_apps = [] + + @override_settings(DEBUG=True) + def test_commit_debug_log(self): + conn = connections[DEFAULT_DB_ALIAS] + with CaptureQueriesContext(conn): + with self.assertLogs("django.db.backends", "DEBUG") as cm: + with transaction.atomic(): + Person.objects.create(first_name="first", last_name="last") + + self.assertGreaterEqual(len(conn.queries_log), 3) + self.assertEqual(conn.queries_log[-3]["sql"], "BEGIN") + self.assertRegex( + cm.output[0], + r"DEBUG:django.db.backends:\(\d+.\d{3}\) " + rf"BEGIN; args=None; alias={DEFAULT_DB_ALIAS}", + ) + self.assertEqual(conn.queries_log[-1]["sql"], "COMMIT") + self.assertRegex( + cm.output[-1], + r"DEBUG:django.db.backends:\(\d+.\d{3}\) " + rf"COMMIT; args=None; alias={DEFAULT_DB_ALIAS}", + ) + + @override_settings(DEBUG=True) + def test_rollback_debug_log(self): + conn = connections[DEFAULT_DB_ALIAS] + with CaptureQueriesContext(conn): + with self.assertLogs("django.db.backends", "DEBUG") as cm: + with self.assertRaises(Exception), transaction.atomic(): + Person.objects.create(first_name="first", last_name="last") + raise Exception("Force rollback") + + self.assertEqual(conn.queries_log[-1]["sql"], "ROLLBACK") + self.assertRegex( + cm.output[-1], + r"DEBUG:django.db.backends:\(\d+.\d{3}\) " + rf"ROLLBACK; args=None; alias={DEFAULT_DB_ALIAS}", + ) + + def test_no_logs_without_debug(self): + with self.assertNoLogs("django.db.backends", "DEBUG"): + with self.assertRaises(Exception), transaction.atomic(): + Person.objects.create(first_name="first", last_name="last") + raise Exception("Force rollback") + + conn = connections[DEFAULT_DB_ALIAS] + self.assertEqual(len(conn.queries_log), 0) + + class ExecuteWrapperTests(TestCase): @staticmethod def call_execute(connection, params=None): |