summaryrefslogtreecommitdiff
path: root/tests/backends
diff options
context:
space:
mode:
authorIlya Bass <ilya.bass@pathai.com>2022-10-20 15:14:35 -0700
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-11-21 09:10:14 +0100
commit798e38c2b9c46ab72e2ee8c33dc822f01b194b1e (patch)
tree32e558e0f86e04f9198646bffa11c08198dfe43c /tests/backends
parentc0a93d39411004300dfda2deb3dc093b69ac6368 (diff)
downloaddjango-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.py63
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):