|
2 | 2 | from datetime import datetime, timedelta |
3 | 3 |
|
4 | 4 | from django.contrib.auth import get_user_model |
| 5 | +from django.db import DatabaseError |
5 | 6 | from django.test import override_settings |
6 | 7 | from django.utils.six.moves import reload_module |
7 | 8 | from freezegun import freeze_time |
| 9 | +from rest_framework.exceptions import AuthenticationFailed |
8 | 10 | from rest_framework.serializers import DateTimeField |
9 | 11 | from rest_framework.test import APIRequestFactory, APITestCase as TestCase |
10 | 12 |
|
|
15 | 17 | from knox.settings import CONSTANTS, knox_settings |
16 | 18 | from knox.signals import token_expired |
17 | 19 |
|
| 20 | +try: |
| 21 | + # Python 3 |
| 22 | + from unittest import mock |
| 23 | +except ImportError: |
| 24 | + # Python 2 |
| 25 | + import mock |
| 26 | + |
18 | 27 | try: |
19 | 28 | # For django >= 2.0 |
20 | 29 | from django.urls import reverse |
@@ -396,3 +405,13 @@ def test_expiry_is_present(self): |
396 | 405 | response.data['expiry'], |
397 | 406 | DateTimeField().to_representation(AuthToken.objects.first().expiry) |
398 | 407 | ) |
| 408 | + |
| 409 | + def test_authenticate_credentials_handle_database_error_on_renew_token(self): |
| 410 | + instance, token = AuthToken.objects.create(user=self.user) |
| 411 | + with override_settings(REST_KNOX=auto_refresh_knox): |
| 412 | + reload_module(auth) |
| 413 | + token_auth = TokenAuthentication() |
| 414 | + with mock.patch.object(token_auth, 'renew_token') as m: |
| 415 | + m.side_effect = DatabaseError() |
| 416 | + with self.assertRaises(AuthenticationFailed): |
| 417 | + token_auth.authenticate_credentials(token.encode('utf-8')) |
0 commit comments