|
1 | 1 | from unittest.mock import MagicMock, patch |
2 | 2 |
|
3 | | -from django.db import DEFAULT_DB_ALIAS, connection, connections |
| 3 | +from django.db import DEFAULT_DB_ALIAS, connection, connections, transaction |
4 | 4 | from django.db.backends.base.base import BaseDatabaseWrapper |
5 | | -from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature |
| 5 | +from django.test import ( |
| 6 | + SimpleTestCase, |
| 7 | + TestCase, |
| 8 | + TransactionTestCase, |
| 9 | + skipUnlessDBFeature, |
| 10 | +) |
| 11 | +from django.test.utils import CaptureQueriesContext, override_settings |
6 | 12 |
|
7 | | -from ..models import Square |
| 13 | +from ..models import Person, Square |
8 | 14 |
|
9 | 15 |
|
10 | 16 | class DatabaseWrapperTests(SimpleTestCase): |
@@ -55,6 +61,57 @@ def test_check_database_version_supported_with_none_as_database_version(self): |
55 | 61 | connection.check_database_version_supported() |
56 | 62 |
|
57 | 63 |
|
| 64 | +class DatabaseWrapperLoggingTests(TransactionTestCase): |
| 65 | + available_apps = [] |
| 66 | + |
| 67 | + @override_settings(DEBUG=True) |
| 68 | + def test_commit_debug_log(self): |
| 69 | + conn = connections[DEFAULT_DB_ALIAS] |
| 70 | + with CaptureQueriesContext(conn): |
| 71 | + with self.assertLogs("django.db.backends", "DEBUG") as cm: |
| 72 | + with transaction.atomic(): |
| 73 | + Person.objects.create(first_name="first", last_name="last") |
| 74 | + |
| 75 | + self.assertGreaterEqual(len(conn.queries_log), 3) |
| 76 | + self.assertEqual(conn.queries_log[-3]["sql"], "BEGIN") |
| 77 | + self.assertRegex( |
| 78 | + cm.output[0], |
| 79 | + r"DEBUG:django.db.backends:\(\d+.\d{3}\) " |
| 80 | + rf"BEGIN; args=None; alias={DEFAULT_DB_ALIAS}", |
| 81 | + ) |
| 82 | + self.assertEqual(conn.queries_log[-1]["sql"], "COMMIT") |
| 83 | + self.assertRegex( |
| 84 | + cm.output[-1], |
| 85 | + r"DEBUG:django.db.backends:\(\d+.\d{3}\) " |
| 86 | + rf"COMMIT; args=None; alias={DEFAULT_DB_ALIAS}", |
| 87 | + ) |
| 88 | + |
| 89 | + @override_settings(DEBUG=True) |
| 90 | + def test_rollback_debug_log(self): |
| 91 | + conn = connections[DEFAULT_DB_ALIAS] |
| 92 | + with CaptureQueriesContext(conn): |
| 93 | + with self.assertLogs("django.db.backends", "DEBUG") as cm: |
| 94 | + with self.assertRaises(Exception), transaction.atomic(): |
| 95 | + Person.objects.create(first_name="first", last_name="last") |
| 96 | + raise Exception("Force rollback") |
| 97 | + |
| 98 | + self.assertEqual(conn.queries_log[-1]["sql"], "ROLLBACK") |
| 99 | + self.assertRegex( |
| 100 | + cm.output[-1], |
| 101 | + r"DEBUG:django.db.backends:\(\d+.\d{3}\) " |
| 102 | + rf"ROLLBACK; args=None; alias={DEFAULT_DB_ALIAS}", |
| 103 | + ) |
| 104 | + |
| 105 | + def test_no_logs_without_debug(self): |
| 106 | + with self.assertNoLogs("django.db.backends", "DEBUG"): |
| 107 | + with self.assertRaises(Exception), transaction.atomic(): |
| 108 | + Person.objects.create(first_name="first", last_name="last") |
| 109 | + raise Exception("Force rollback") |
| 110 | + |
| 111 | + conn = connections[DEFAULT_DB_ALIAS] |
| 112 | + self.assertEqual(len(conn.queries_log), 0) |
| 113 | + |
| 114 | + |
58 | 115 | class ExecuteWrapperTests(TestCase): |
59 | 116 | @staticmethod |
60 | 117 | def call_execute(connection, params=None): |
|
0 commit comments