[PATCH 2/5] tests: ensure we don't see database errors during duplicate insert

Jeremy Kerr jk at ozlabs.org
Thu Apr 16 11:29:25 AEST 2020


Currently, the parser causes IntegrityErrors while inserting duplicate
patches; these tend to pollute database logs.

This change adds a check, which currently fails, to ensure we do not
cause errors during a duplicate patch parse.

Signed-off-by: Jeremy Kerr <jk at ozlabs.org>
---
 patchwork/tests/test_parser.py | 27 +++++++++++++++++++++------
 1 file changed, 21 insertions(+), 6 deletions(-)

diff --git a/patchwork/tests/test_parser.py b/patchwork/tests/test_parser.py
index 3a41000..c7c918a 100644
--- a/patchwork/tests/test_parser.py
+++ b/patchwork/tests/test_parser.py
@@ -15,6 +15,7 @@ import unittest
 from django.test import TestCase
 from django.test import TransactionTestCase
 from django.db.transaction import atomic
+from django.db import connection
 
 from patchwork.models import Comment
 from patchwork.models import Patch
@@ -1091,14 +1092,28 @@ class DuplicateMailTest(TestCase):
         create_state()
 
     def _test_duplicate_mail(self, mail):
+        errors = []
+
+        def log_query_errors(execute, sql, params, many, context):
+            try:
+                result = execute(sql, params, many, context)
+            except Exception as e:
+                errors.append(e)
+                raise
+            return result
+
         _parse_mail(mail)
+
         with self.assertRaises(DuplicateMailError):
-            # If we see any database errors from the duplicate insert
-            # (typically an IntegrityError), the insert will abort the current
-            # transaction. This atomic() ensures that we can recover, and
-            # perform subsequent queries.
-            with atomic():
-                _parse_mail(mail)
+            with connection.execute_wrapper(log_query_errors):
+                # If we see any database errors from the duplicate insert
+                # (typically an IntegrityError), the insert will abort the
+                # current transaction. This atomic() ensures that we can
+                # recover, and perform subsequent queries.
+                with atomic():
+                    _parse_mail(mail)
+
+        self.assertEqual(errors, [])
 
     def test_duplicate_patch(self):
         diff = read_patch('0001-add-line.patch')
-- 
2.17.1



More information about the Patchwork mailing list