8
9
from django.conf import settings
9
10
from django.core import mail
11
from django.db import (transaction, connections, DEFAULT_DB_ALIAS,
10
13
from django.http import HttpRequest
11
14
from django.http import HttpResponse
12
15
from django.middleware.clickjacking import XFrameOptionsMiddleware
13
16
from django.middleware.common import CommonMiddleware
14
17
from django.middleware.http import ConditionalGetMiddleware
15
18
from django.middleware.gzip import GZipMiddleware
16
from django.test import TestCase, RequestFactory
19
from django.middleware.transaction import TransactionMiddleware
20
from django.test import TransactionTestCase, TestCase, RequestFactory
17
21
from django.test.utils import override_settings
23
from .models import Band
19
25
class CommonMiddlewareTest(TestCase):
21
27
self.append_slash = settings.APPEND_SLASH
613
619
ETagGZipMiddlewareTest = override_settings(
615
621
)(ETagGZipMiddlewareTest)
623
class TransactionMiddlewareTest(TransactionTestCase):
625
Test the transaction middleware.
628
self.request = HttpRequest()
629
self.request.META = {
630
'SERVER_NAME': 'testserver',
633
self.request.path = self.request.path_info = "/"
634
self.response = HttpResponse()
635
self.response.status_code = 200
637
def test_request(self):
638
TransactionMiddleware().process_request(self.request)
639
self.assertTrue(transaction.is_managed())
641
def test_managed_response(self):
642
transaction.enter_transaction_management()
643
transaction.managed(True)
644
Band.objects.create(name='The Beatles')
645
self.assertTrue(transaction.is_dirty())
646
TransactionMiddleware().process_response(self.request, self.response)
647
self.assertFalse(transaction.is_dirty())
648
self.assertEqual(Band.objects.count(), 1)
650
def test_unmanaged_response(self):
651
transaction.managed(False)
652
TransactionMiddleware().process_response(self.request, self.response)
653
self.assertFalse(transaction.is_managed())
654
self.assertFalse(transaction.is_dirty())
656
def test_exception(self):
657
transaction.enter_transaction_management()
658
transaction.managed(True)
659
Band.objects.create(name='The Beatles')
660
self.assertTrue(transaction.is_dirty())
661
TransactionMiddleware().process_exception(self.request, None)
662
self.assertEqual(Band.objects.count(), 0)
663
self.assertFalse(transaction.is_dirty())
665
def test_failing_commit(self):
666
# It is possible that connection.commit() fails. Check that
667
# TransactionMiddleware handles such cases correctly.
669
def raise_exception():
670
raise IntegrityError()
671
connections[DEFAULT_DB_ALIAS].commit = raise_exception
672
transaction.enter_transaction_management()
673
transaction.managed(True)
674
Band.objects.create(name='The Beatles')
675
self.assertTrue(transaction.is_dirty())
676
with self.assertRaises(IntegrityError):
677
TransactionMiddleware().process_response(self.request, None)
678
self.assertEqual(Band.objects.count(), 0)
679
self.assertFalse(transaction.is_dirty())
680
self.assertFalse(transaction.is_managed())
682
del connections[DEFAULT_DB_ALIAS].commit