summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAymeric Augustin <aymeric.augustin@m4x.org>2014-03-23 21:45:31 +0100
committerAymeric Augustin <aymeric.augustin@m4x.org>2014-04-10 23:18:35 +0200
commit2e42c859da42a871244aca36162a0aad2b63c02b (patch)
tree1b46659d6318532b84445f66dc14d1ec6ce4bce7 /tests
parent5f22bda3827f32289793b90a387d8c77d602a859 (diff)
[1.7.x] Fixed #21239 -- Maintained atomicity when closing the connection.
Refs #15802 -- Reverted #7c657b24 as BaseDatabaseWrapper.close() now has a proper "finally" clause that may need to preserve self.connection. Backport of 25860096 from master.
Diffstat (limited to 'tests')
-rw-r--r--tests/transactions/tests.py16
1 files changed, 15 insertions, 1 deletions
diff --git a/tests/transactions/tests.py b/tests/transactions/tests.py
index 94763a17a2..e33c1535b9 100644
--- a/tests/transactions/tests.py
+++ b/tests/transactions/tests.py
@@ -9,7 +9,7 @@ import time
from unittest import skipIf, skipUnless
from django.db import (connection, transaction,
- DatabaseError, IntegrityError, OperationalError)
+ DatabaseError, Error, IntegrityError, OperationalError)
from django.test import TransactionTestCase, skipIfDBFeature, skipUnlessDBFeature
from django.test.utils import IgnoreDeprecationWarningsMixin
from django.utils import six
@@ -360,6 +360,20 @@ class AtomicErrorsTests(TransactionTestCase):
r2.save(force_update=True)
self.assertEqual(Reporter.objects.get(pk=r1.pk).last_name, "Calculus")
+ @skipUnlessDBFeature('test_db_allows_multiple_connections')
+ def test_atomic_prevents_queries_in_broken_transaction_after_client_close(self):
+ with transaction.atomic():
+ Reporter.objects.create(first_name="Archibald", last_name="Haddock")
+ connection.close()
+ # The connection is closed and the transaction is marked as
+ # needing rollback. This will raise an InterfaceError on databases
+ # that refuse to create cursors on closed connections (PostgreSQL)
+ # and a TransactionManagementError on other databases.
+ with self.assertRaises(Error):
+ Reporter.objects.create(first_name="Cuthbert", last_name="Calculus")
+ # The connection is usable again .
+ self.assertEqual(Reporter.objects.count(), 0)
+
@skipUnless(connection.vendor == 'mysql', "MySQL-specific behaviors")
class AtomicMySQLTests(TransactionTestCase):