|
4 | 4 | from django_webtest import WebTest
|
5 | 5 | from django.contrib.admin import AdminSite
|
6 | 6 | from django.contrib.messages.storage.fallback import FallbackStorage
|
| 7 | +from django.db.transaction import atomic |
7 | 8 | from django.test.utils import override_settings
|
8 | 9 | from django.test.client import RequestFactory
|
9 | 10 | from django import VERSION
|
@@ -184,19 +185,66 @@ def test_history_user_not_saved(self):
|
184 | 185 | )
|
185 | 186 |
|
186 | 187 | def test_middleware_saves_user(self):
|
| 188 | + Book.objects.all().delete() |
187 | 189 | overridden_settings = {
|
188 | 190 | 'MIDDLEWARE_CLASSES':
|
189 | 191 | settings.MIDDLEWARE_CLASSES
|
190 | 192 | + ['simple_history.middleware.HistoryRequestMiddleware'],
|
191 | 193 | }
|
192 | 194 | with override_settings(**overridden_settings):
|
193 | 195 | self.login()
|
194 |
| - poll = Poll.objects.create(question="why?", pub_date=today) |
195 |
| - historical_poll = poll.history.all()[0] |
196 |
| - self.assertEqual(historical_poll.history_user, self.user, |
| 196 | + form = self.app.get(reverse('admin:tests_book_add')).form |
| 197 | + form["isbn"] = "9780147_513731" |
| 198 | + form.submit() |
| 199 | + book = Book.objects.get() |
| 200 | + historical_book = book.history.all()[0] |
| 201 | + |
| 202 | + self.assertEqual(historical_book.history_user, self.user, |
197 | 203 | "Middleware should make the request available to "
|
198 | 204 | "retrieve history_user.")
|
199 | 205 |
|
| 206 | + def test_middleware_unsets_request(self): |
| 207 | + overridden_settings = { |
| 208 | + 'MIDDLEWARE_CLASSES': |
| 209 | + settings.MIDDLEWARE_CLASSES |
| 210 | + + ['simple_history.middleware.HistoryRequestMiddleware'], |
| 211 | + } |
| 212 | + with override_settings(**overridden_settings): |
| 213 | + self.login() |
| 214 | + self.app.get(reverse('admin:tests_book_add')) |
| 215 | + self.assertFalse(hasattr(HistoricalRecords.thread, 'request')) |
| 216 | + |
| 217 | + def test_rolled_back_user_does_not_lead_to_foreign_key_error(self): |
| 218 | + # This test simulates the rollback of a user after a request (which |
| 219 | + # happens, e.g. in test cases), and verifies that subsequently |
| 220 | + # creating a new entry does not fail with a foreign key error. |
| 221 | + |
| 222 | + class Rollback(Exception): |
| 223 | + pass |
| 224 | + |
| 225 | + overridden_settings = { |
| 226 | + 'MIDDLEWARE_CLASSES': |
| 227 | + settings.MIDDLEWARE_CLASSES |
| 228 | + + ['simple_history.middleware.HistoryRequestMiddleware'], |
| 229 | + } |
| 230 | + with override_settings(**overridden_settings): |
| 231 | + try: |
| 232 | + with atomic(): |
| 233 | + user = User.objects.create_superuser( |
| 234 | + 'tmp', '[email protected]', 'pass') |
| 235 | + self.assertTrue(self.client.login(username='tmp', password='pass')) |
| 236 | + self.app.get(reverse('admin:tests_book_add')) |
| 237 | + raise Rollback() |
| 238 | + except Rollback: |
| 239 | + pass |
| 240 | + |
| 241 | + book = Book.objects.create(isbn="9780147_513731") |
| 242 | + historical_book = book.history.all()[0] |
| 243 | + self.assertIsNone( |
| 244 | + historical_book.history_user, |
| 245 | + "No way to know of request, history_user should be unset.", |
| 246 | + ) |
| 247 | + |
200 | 248 | def test_middleware_anonymous_user(self):
|
201 | 249 | overridden_settings = {
|
202 | 250 | 'MIDDLEWARE_CLASSES':
|
|
0 commit comments