|
1 | 1 | from __future__ import unicode_literals
|
2 | 2 |
|
| 3 | +from django.conf.urls import patterns, url |
3 | 4 | from django.db import connection, connections, transaction
|
4 |
| -from django.test import TestCase |
| 5 | +from django.test import TestCase, TransactionTestCase |
| 6 | +from django.http import Http404 |
| 7 | +from django.utils.decorators import method_decorator |
5 | 8 | from django.utils.unittest import skipUnless
|
6 | 9 | from rest_framework import status
|
7 | 10 | from rest_framework.exceptions import APIException
|
@@ -108,3 +111,37 @@ def test_api_exception_rollback_transaction(self):
|
108 | 111 | self.assertEqual(response.status_code,
|
109 | 112 | status.HTTP_500_INTERNAL_SERVER_ERROR)
|
110 | 113 | assert BasicModel.objects.count() == 0
|
| 114 | + |
| 115 | + |
| 116 | +@skipUnless(connection.features.uses_savepoints, |
| 117 | + "'atomic' requires transactions and savepoints.") |
| 118 | +class NonAtomicDBTransactionAPIExceptionTests(TransactionTestCase): |
| 119 | + @property |
| 120 | + def urls(self): |
| 121 | + class NonAtomicAPIExceptionView(APIView): |
| 122 | + @method_decorator(transaction.non_atomic_requests) |
| 123 | + def dispatch(self, *args, **kwargs): |
| 124 | + return super(NonAtomicAPIExceptionView, self).dispatch(*args, **kwargs) |
| 125 | + |
| 126 | + def get(self, request, *args, **kwargs): |
| 127 | + BasicModel.objects.all() |
| 128 | + raise Http404 |
| 129 | + |
| 130 | + return patterns( |
| 131 | + '', |
| 132 | + url(r'^$', NonAtomicAPIExceptionView.as_view()) |
| 133 | + ) |
| 134 | + |
| 135 | + def setUp(self): |
| 136 | + connections.databases['default']['ATOMIC_REQUESTS'] = True |
| 137 | + |
| 138 | + def tearDown(self): |
| 139 | + connections.databases['default']['ATOMIC_REQUESTS'] = False |
| 140 | + |
| 141 | + def test_api_exception_rollback_transaction_non_atomic_view(self): |
| 142 | + response = self.client.get('/') |
| 143 | + |
| 144 | + # without checking connection.in_atomic_block view raises 500 |
| 145 | + # due attempt to rollback without transaction |
| 146 | + self.assertEqual(response.status_code, |
| 147 | + status.HTTP_404_NOT_FOUND) |
0 commit comments