Skip to content

Commit f6fc12a

Browse files
committed
Add test for PostgreSQL transaction tracking
1 parent 6e5322d commit f6fc12a

File tree

1 file changed

+74
-1
lines changed

1 file changed

+74
-1
lines changed

tests/panels/test_sql.py

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import django
88
from asgiref.sync import sync_to_async
99
from django.contrib.auth.models import User
10-
from django.db import connection
10+
from django.db import connection, transaction
1111
from django.db.models import Count
1212
from django.db.utils import DatabaseError
1313
from django.shortcuts import render
@@ -527,3 +527,76 @@ def test_aliases(self):
527527

528528
query = self.panel._queries[-1]
529529
self.assertEqual(query[0], "replica")
530+
531+
@unittest.skipUnless(
532+
connection.vendor == "postgresql", "Test valid only on PostgreSQL"
533+
)
534+
def test_transaction_status(self):
535+
"""
536+
Test case for tracking the transaction status is properly associated
537+
with queries.
538+
"""
539+
self.assertEqual(len(self.panel._queries), 0)
540+
541+
with transaction.atomic():
542+
list(User.objects.all())
543+
list(User.objects.using("replica").all())
544+
545+
with transaction.atomic(using="replica"):
546+
list(User.objects.all())
547+
list(User.objects.using("replica").all())
548+
549+
with transaction.atomic():
550+
list(User.objects.all())
551+
552+
list(User.objects.using("replica").all())
553+
554+
response = self.panel.process_request(self.request)
555+
self.panel.generate_stats(self.request, response)
556+
557+
self.assertEqual(len(self.panel._queries), 6)
558+
559+
query = self.panel._queries[0]
560+
self.assertEqual(query[0], "default")
561+
self.assertIsNotNone(query[1]["trans_id"])
562+
self.assertTrue(query[1].get("starts_trans", False))
563+
self.assertTrue(query[1].get("in_trans", False))
564+
self.assertFalse(query[1].get("ends_trans", False))
565+
566+
query = self.panel._queries[-1]
567+
self.assertEqual(query[0], "replica")
568+
self.assertIsNone(query[1]["trans_id"])
569+
self.assertFalse(query[1].get("starts_trans", False))
570+
self.assertFalse(query[1].get("in_trans", False))
571+
self.assertFalse(query[1].get("ends_trans", False))
572+
self.assertFalse(query[1].get("ends_trans", False))
573+
574+
query = self.panel._queries[2]
575+
self.assertEqual(query[0], "default")
576+
self.assertEqual(query[1]["trans_id"], self.panel._queries[0][1]["trans_id"])
577+
self.assertFalse(query[1].get("starts_trans", False))
578+
self.assertTrue(query[1].get("in_trans", False))
579+
self.assertTrue(query[1].get("ends_trans", False))
580+
581+
query = self.panel._queries[3]
582+
self.assertEqual(query[0], "replica")
583+
self.assertNotEqual(query[1]["trans_id"], self.panel._queries[0][1]["trans_id"])
584+
self.assertTrue(query[1].get("starts_trans", False))
585+
self.assertTrue(query[1].get("in_trans", False))
586+
self.assertTrue(query[1].get("ends_trans", False))
587+
588+
query = self.panel._queries[4]
589+
self.assertEqual(query[0], "default")
590+
self.assertNotEqual(query[1]["trans_id"], self.panel._queries[0][1]["trans_id"])
591+
self.assertNotEqual(query[1]["trans_id"], self.panel._queries[3][1]["trans_id"])
592+
self.assertTrue(query[1].get("starts_trans", False))
593+
self.assertTrue(query[1].get("in_trans", False))
594+
self.assertTrue(query[1].get("ends_trans", False))
595+
596+
query = self.panel._queries[5]
597+
self.assertEqual(query[0], "replica")
598+
self.assertIsNone(query[1]["trans_id"])
599+
self.assertFalse(query[1].get("starts_trans", False))
600+
self.assertFalse(query[1].get("in_trans", False))
601+
self.assertFalse(query[1].get("ends_trans", False))
602+
self.assertFalse(query[1].get("ends_trans", False))

0 commit comments

Comments
 (0)