From ef274c5d148257dcdb48755b9b9a3a4d405e5eb3 Mon Sep 17 00:00:00 2001 From: Kira Date: Sat, 18 Mar 2023 13:39:45 +0800 Subject: [PATCH 01/13] Support `override_api_settings` as decorator --- tests/utils.py | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/tests/utils.py b/tests/utils.py index c3d710a2e..9e4c2c4cb 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -62,23 +62,25 @@ def override_api_settings(**settings): except AttributeError: pass - yield - - for k in settings.keys(): - # Delete temporary settings - api_settings.user_settings.pop(k) - - # Restore saved settings - try: - api_settings.user_settings[k] = old_settings[k] - except KeyError: - pass - - # Delete any cached settings - try: - delattr(api_settings, k) - except AttributeError: - pass + try: + yield + + finally: + for k in settings.keys(): + # Delete temporary settings + api_settings.user_settings.pop(k) + + # Restore saved settings + try: + api_settings.user_settings[k] = old_settings[k] + except KeyError: + pass + + # Delete any cached settings + try: + delattr(api_settings, k) + except AttributeError: + pass class MigrationTestCase(TransactionTestCase): From 4bf328e1133f9dfef96abfa2eddffa8fd787e0b0 Mon Sep 17 00:00:00 2001 From: Kira Date: Sat, 18 Mar 2023 13:40:22 +0800 Subject: [PATCH 02/13] Update test_authentication --- tests/test_authentication.py | 100 +++++++++++++++++++---------------- 1 file changed, 53 insertions(+), 47 deletions(-) diff --git a/tests/test_authentication.py b/tests/test_authentication.py index 917f3993d..b71d29b4f 100644 --- a/tests/test_authentication.py +++ b/tests/test_authentication.py @@ -40,25 +40,21 @@ def test_get_header(self): ) self.assertEqual(self.backend.get_header(request), self.fake_header) - # Should work with the x_access_token - with override_api_settings(AUTH_HEADER_NAME="HTTP_X_ACCESS_TOKEN"): - # Should pull correct header off request when using X_ACCESS_TOKEN - request = self.factory.get( - "/test-url/", HTTP_X_ACCESS_TOKEN=self.fake_header - ) - self.assertEqual(self.backend.get_header(request), self.fake_header) - - # Should work for unicode headers when using - request = self.factory.get( - "/test-url/", HTTP_X_ACCESS_TOKEN=self.fake_header.decode("utf-8") - ) - self.assertEqual(self.backend.get_header(request), self.fake_header) + @override_api_settings(AUTH_HEADER_NAME="HTTP_X_ACCESS_TOKEN") + def test_get_header_x_access_token(self): + # Should pull correct header off request when using X_ACCESS_TOKEN + request = self.factory.get( + "/test-url/", HTTP_X_ACCESS_TOKEN=self.fake_header + ) + self.assertEqual(self.backend.get_header(request), self.fake_header) + + # Should work for unicode headers when using + request = self.factory.get( + "/test-url/", HTTP_X_ACCESS_TOKEN=self.fake_header.decode("utf-8") + ) + self.assertEqual(self.backend.get_header(request), self.fake_header) def test_get_raw_token(self): - # Should return None if header lacks correct type keyword - with override_api_settings(AUTH_HEADER_TYPES="JWT"): - reload(authentication) - self.assertIsNone(self.backend.get_raw_token(self.fake_header)) reload(authentication) # Should return None if an empty AUTHORIZATION header is sent @@ -74,14 +70,21 @@ def test_get_raw_token(self): # Otherwise, should return unvalidated token in header self.assertEqual(self.backend.get_raw_token(self.fake_header), self.fake_token) + @override_api_settings(AUTH_HEADER_TYPES="JWT") + def test_get_raw_token_incorrect_header_keyword(self): + # Should return None if header lacks correct type keyword + # AUTH_HEADER_TYPES is "JWT", but header is "Bearer" + reload(authentication) + self.assertIsNone(self.backend.get_raw_token(self.fake_header)) + + @override_api_settings(AUTH_HEADER_TYPES=("JWT", "Bearer")) + def test_get_raw_token_multi_header_keyword(self): # Should return token if header has one of many valid token types - with override_api_settings(AUTH_HEADER_TYPES=("JWT", "Bearer")): - reload(authentication) - self.assertEqual( - self.backend.get_raw_token(self.fake_header), - self.fake_token, - ) reload(authentication) + self.assertEqual( + self.backend.get_raw_token(self.fake_header), + self.fake_token, + ) def test_get_validated_token(self): # Should raise InvalidToken if token not valid @@ -96,36 +99,39 @@ def test_get_validated_token(self): self.backend.get_validated_token(str(token)).payload, token.payload ) + @override_api_settings( + AUTH_TOKEN_CLASSES=("rest_framework_simplejwt.tokens.AccessToken",), + ) + def test_get_validated_token_reject_unknown_token(self): # Should not accept tokens not included in AUTH_TOKEN_CLASSES sliding_token = SlidingToken() - with override_api_settings( - AUTH_TOKEN_CLASSES=("rest_framework_simplejwt.tokens.AccessToken",) - ): - with self.assertRaises(InvalidToken) as e: - self.backend.get_validated_token(str(sliding_token)) - - messages = e.exception.detail["messages"] - self.assertEqual(1, len(messages)) - self.assertEqual( - { - "token_class": "AccessToken", - "token_type": "access", - "message": "Token has wrong type", - }, - messages[0], - ) + with self.assertRaises(InvalidToken) as e: + self.backend.get_validated_token(str(sliding_token)) + messages = e.exception.detail["messages"] + self.assertEqual(1, len(messages)) + self.assertEqual( + { + "token_class": "AccessToken", + "token_type": "access", + "message": "Token has wrong type", + }, + messages[0], + ) + + @override_api_settings( + AUTH_TOKEN_CLASSES=( + "rest_framework_simplejwt.tokens.AccessToken", + "rest_framework_simplejwt.tokens.SlidingToken", + ), + ) + def test_get_validated_token_accept_known_token(self): # Should accept tokens included in AUTH_TOKEN_CLASSES access_token = AccessToken() sliding_token = SlidingToken() - with override_api_settings( - AUTH_TOKEN_CLASSES=( - "rest_framework_simplejwt.tokens.AccessToken", - "rest_framework_simplejwt.tokens.SlidingToken", - ) - ): - self.backend.get_validated_token(str(access_token)) - self.backend.get_validated_token(str(sliding_token)) + + self.backend.get_validated_token(str(access_token)) + self.backend.get_validated_token(str(sliding_token)) def test_get_user(self): payload = {"some_other_id": "foo"} From 00a3d54e51c6a8c34cd330b6d5ed849f622fe67c Mon Sep 17 00:00:00 2001 From: Kira Date: Sat, 18 Mar 2023 14:03:43 +0800 Subject: [PATCH 03/13] black formatting test_authentication --- tests/test_authentication.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/test_authentication.py b/tests/test_authentication.py index b71d29b4f..9fa645c2c 100644 --- a/tests/test_authentication.py +++ b/tests/test_authentication.py @@ -43,9 +43,7 @@ def test_get_header(self): @override_api_settings(AUTH_HEADER_NAME="HTTP_X_ACCESS_TOKEN") def test_get_header_x_access_token(self): # Should pull correct header off request when using X_ACCESS_TOKEN - request = self.factory.get( - "/test-url/", HTTP_X_ACCESS_TOKEN=self.fake_header - ) + request = self.factory.get("/test-url/", HTTP_X_ACCESS_TOKEN=self.fake_header) self.assertEqual(self.backend.get_header(request), self.fake_header) # Should work for unicode headers when using From 47e14ff6916bbbf337732b2134cce8456aa7c050 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sat, 18 Mar 2023 06:49:09 +0000 Subject: [PATCH 04/13] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/test_authentication.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/test_authentication.py b/tests/test_authentication.py index b71d29b4f..9fa645c2c 100644 --- a/tests/test_authentication.py +++ b/tests/test_authentication.py @@ -43,9 +43,7 @@ def test_get_header(self): @override_api_settings(AUTH_HEADER_NAME="HTTP_X_ACCESS_TOKEN") def test_get_header_x_access_token(self): # Should pull correct header off request when using X_ACCESS_TOKEN - request = self.factory.get( - "/test-url/", HTTP_X_ACCESS_TOKEN=self.fake_header - ) + request = self.factory.get("/test-url/", HTTP_X_ACCESS_TOKEN=self.fake_header) self.assertEqual(self.backend.get_header(request), self.fake_header) # Should work for unicode headers when using From 640589878f72054ec1600dc5a9f6141aa686b868 Mon Sep 17 00:00:00 2001 From: Kira Date: Sat, 18 Mar 2023 14:29:19 +0800 Subject: [PATCH 05/13] Use drf status instead of literal status --- tests/test_integration.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tests/test_integration.py b/tests/test_integration.py index 54786d87a..1b0db2ab2 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -2,6 +2,7 @@ from django.contrib.auth import get_user_model from django.urls import reverse +from rest_framework.status import HTTP_200_OK, HTTP_401_UNAUTHORIZED from rest_framework_simplejwt.settings import api_settings from rest_framework_simplejwt.tokens import AccessToken @@ -26,7 +27,7 @@ def setUp(self): def test_no_authorization(self): res = self.view_get() - self.assertEqual(res.status_code, 401) + self.assertEqual(res.status_code, HTTP_401_UNAUTHORIZED) self.assertIn("credentials were not provided", res.data["detail"]) def test_wrong_auth_type(self): @@ -43,7 +44,7 @@ def test_wrong_auth_type(self): res = self.view_get() - self.assertEqual(res.status_code, 401) + self.assertEqual(res.status_code, HTTP_401_UNAUTHORIZED) self.assertIn("credentials were not provided", res.data["detail"]) def test_expired_token(self): @@ -68,7 +69,7 @@ def test_expired_token(self): ): res = self.view_get() - self.assertEqual(res.status_code, 401) + self.assertEqual(res.status_code, HTTP_401_UNAUTHORIZED) self.assertEqual("token_not_valid", res.data["code"]) def test_user_can_get_sliding_token_and_use_it(self): @@ -88,7 +89,7 @@ def test_user_can_get_sliding_token_and_use_it(self): ): res = self.view_get() - self.assertEqual(res.status_code, 200) + self.assertEqual(res.status_code, HTTP_200_OK) self.assertEqual(res.data["foo"], "bar") def test_user_can_get_access_and_refresh_tokens_and_use_them(self): @@ -110,7 +111,7 @@ def test_user_can_get_access_and_refresh_tokens_and_use_them(self): ): res = self.view_get() - self.assertEqual(res.status_code, 200) + self.assertEqual(res.status_code, HTTP_200_OK) self.assertEqual(res.data["foo"], "bar") res = self.client.post( @@ -127,5 +128,5 @@ def test_user_can_get_access_and_refresh_tokens_and_use_them(self): ): res = self.view_get() - self.assertEqual(res.status_code, 200) + self.assertEqual(res.status_code, HTTP_200_OK) self.assertEqual(res.data["foo"], "bar") From 3da895fe17d638147a22e5a86eb4715b338590bc Mon Sep 17 00:00:00 2001 From: Kira Date: Sat, 18 Mar 2023 14:50:14 +0800 Subject: [PATCH 06/13] Update test_integration --- tests/test_integration.py | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/tests/test_integration.py b/tests/test_integration.py index 1b0db2ab2..ff0fac6e5 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -64,14 +64,14 @@ def test_expired_token(self): access = res.data["access"] self.authenticate_with_token(api_settings.AUTH_HEADER_TYPES[0], access) - with override_api_settings( - AUTH_TOKEN_CLASSES=("rest_framework_simplejwt.tokens.AccessToken",) - ): - res = self.view_get() + res = self.view_get() self.assertEqual(res.status_code, HTTP_401_UNAUTHORIZED) self.assertEqual("token_not_valid", res.data["code"]) + @override_api_settings( + AUTH_TOKEN_CLASSES=("rest_framework_simplejwt.tokens.SlidingToken",), + ) def test_user_can_get_sliding_token_and_use_it(self): res = self.client.post( reverse("token_obtain_sliding"), @@ -84,10 +84,7 @@ def test_user_can_get_sliding_token_and_use_it(self): token = res.data["token"] self.authenticate_with_token(api_settings.AUTH_HEADER_TYPES[0], token) - with override_api_settings( - AUTH_TOKEN_CLASSES=("rest_framework_simplejwt.tokens.SlidingToken",) - ): - res = self.view_get() + res = self.view_get() self.assertEqual(res.status_code, HTTP_200_OK) self.assertEqual(res.data["foo"], "bar") @@ -106,10 +103,7 @@ def test_user_can_get_access_and_refresh_tokens_and_use_them(self): self.authenticate_with_token(api_settings.AUTH_HEADER_TYPES[0], access) - with override_api_settings( - AUTH_TOKEN_CLASSES=("rest_framework_simplejwt.tokens.AccessToken",) - ): - res = self.view_get() + res = self.view_get() self.assertEqual(res.status_code, HTTP_200_OK) self.assertEqual(res.data["foo"], "bar") @@ -123,10 +117,7 @@ def test_user_can_get_access_and_refresh_tokens_and_use_them(self): self.authenticate_with_token(api_settings.AUTH_HEADER_TYPES[0], access) - with override_api_settings( - AUTH_TOKEN_CLASSES=("rest_framework_simplejwt.tokens.AccessToken",) - ): - res = self.view_get() + res = self.view_get() self.assertEqual(res.status_code, HTTP_200_OK) self.assertEqual(res.data["foo"], "bar") From 62f2b96ec5be23ff0e1744e7d214969dcb0af55f Mon Sep 17 00:00:00 2001 From: Kira Date: Sat, 18 Mar 2023 15:00:22 +0800 Subject: [PATCH 07/13] Update test_serializers --- tests/test_serializers.py | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/tests/test_serializers.py b/tests/test_serializers.py index 530f689cd..6db0e3998 100644 --- a/tests/test_serializers.py +++ b/tests/test_serializers.py @@ -285,6 +285,10 @@ def test_it_should_return_access_token_if_everything_ok(self): access["exp"], datetime_to_epoch(now + api_settings.ACCESS_TOKEN_LIFETIME) ) + @override_api_settings( + ROTATE_REFRESH_TOKENS=True, + BLACKLIST_AFTER_ROTATION=False, + ) def test_it_should_return_refresh_token_if_tokens_should_be_rotated(self): refresh = RefreshToken() @@ -298,14 +302,9 @@ def test_it_should_return_refresh_token_if_tokens_should_be_rotated(self): now = aware_utcnow() - api_settings.ACCESS_TOKEN_LIFETIME / 2 - with override_api_settings( - ROTATE_REFRESH_TOKENS=True, BLACKLIST_AFTER_ROTATION=False - ): - with patch( - "rest_framework_simplejwt.tokens.aware_utcnow" - ) as fake_aware_utcnow: - fake_aware_utcnow.return_value = now - self.assertTrue(ser.is_valid()) + with patch("rest_framework_simplejwt.tokens.aware_utcnow") as fake_aware_utcnow: + fake_aware_utcnow.return_value = now + self.assertTrue(ser.is_valid()) access = AccessToken(ser.validated_data["access"]) new_refresh = RefreshToken(ser.validated_data["refresh"]) @@ -324,6 +323,10 @@ def test_it_should_return_refresh_token_if_tokens_should_be_rotated(self): datetime_to_epoch(now + api_settings.REFRESH_TOKEN_LIFETIME), ) + @override_api_settings( + ROTATE_REFRESH_TOKENS=True, + BLACKLIST_AFTER_ROTATION=True, + ) def test_it_should_blacklist_refresh_token_if_tokens_should_be_rotated_and_blacklisted( self, ): @@ -342,14 +345,9 @@ def test_it_should_blacklist_refresh_token_if_tokens_should_be_rotated_and_black now = aware_utcnow() - api_settings.ACCESS_TOKEN_LIFETIME / 2 - with override_api_settings( - ROTATE_REFRESH_TOKENS=True, BLACKLIST_AFTER_ROTATION=True - ): - with patch( - "rest_framework_simplejwt.tokens.aware_utcnow" - ) as fake_aware_utcnow: - fake_aware_utcnow.return_value = now - self.assertTrue(ser.is_valid()) + with patch("rest_framework_simplejwt.tokens.aware_utcnow") as fake_aware_utcnow: + fake_aware_utcnow.return_value = now + self.assertTrue(ser.is_valid()) access = AccessToken(ser.validated_data["access"]) new_refresh = RefreshToken(ser.validated_data["refresh"]) From f00195cd944387e693909794431e61fa50641126 Mon Sep 17 00:00:00 2001 From: Kira Date: Sat, 18 Mar 2023 15:07:24 +0800 Subject: [PATCH 08/13] Update test_integration --- tests/test_integration.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/test_integration.py b/tests/test_integration.py index ff0fac6e5..beee3d552 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -47,6 +47,9 @@ def test_wrong_auth_type(self): self.assertEqual(res.status_code, HTTP_401_UNAUTHORIZED) self.assertIn("credentials were not provided", res.data["detail"]) + @override_api_settings( + AUTH_TOKEN_CLASSES=("rest_framework_simplejwt.tokens.AccessToken",), + ) def test_expired_token(self): old_lifetime = AccessToken.lifetime AccessToken.lifetime = timedelta(seconds=0) @@ -89,6 +92,9 @@ def test_user_can_get_sliding_token_and_use_it(self): self.assertEqual(res.status_code, HTTP_200_OK) self.assertEqual(res.data["foo"], "bar") + @override_api_settings( + AUTH_TOKEN_CLASSES=("rest_framework_simplejwt.tokens.AccessToken",), + ) def test_user_can_get_access_and_refresh_tokens_and_use_them(self): res = self.client.post( reverse("token_obtain_pair"), From 872f476793a91b704c16109802ca64d980697560 Mon Sep 17 00:00:00 2001 From: Kira Date: Sat, 18 Mar 2023 15:11:37 +0800 Subject: [PATCH 09/13] Update test_token_blacklist --- tests/test_token_blacklist.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/test_token_blacklist.py b/tests/test_token_blacklist.py index 67ea7fada..824808145 100644 --- a/tests/test_token_blacklist.py +++ b/tests/test_token_blacklist.py @@ -237,25 +237,25 @@ def setUp(self): super().setUp() + @override_api_settings(BLACKLIST_AFTER_ROTATION=True) def test_token_verify_serializer_should_honour_blacklist_if_blacklisting_enabled( self, ): - with override_api_settings(BLACKLIST_AFTER_ROTATION=True): - refresh_token = RefreshToken.for_user(self.user) - refresh_token.blacklist() + refresh_token = RefreshToken.for_user(self.user) + refresh_token.blacklist() - serializer = TokenVerifySerializer(data={"token": str(refresh_token)}) - self.assertFalse(serializer.is_valid()) + serializer = TokenVerifySerializer(data={"token": str(refresh_token)}) + self.assertFalse(serializer.is_valid()) + @override_api_settings(BLACKLIST_AFTER_ROTATION=False) def test_token_verify_serializer_should_not_honour_blacklist_if_blacklisting_not_enabled( self, ): - with override_api_settings(BLACKLIST_AFTER_ROTATION=False): - refresh_token = RefreshToken.for_user(self.user) - refresh_token.blacklist() + refresh_token = RefreshToken.for_user(self.user) + refresh_token.blacklist() - serializer = TokenVerifySerializer(data={"token": str(refresh_token)}) - self.assertTrue(serializer.is_valid()) + serializer = TokenVerifySerializer(data={"token": str(refresh_token)}) + self.assertTrue(serializer.is_valid()) class TestBigAutoFieldIDMigration(MigrationTestCase): From bcd4fde271638a295349f385cafb9a1e0fff6000 Mon Sep 17 00:00:00 2001 From: Kira Date: Sat, 18 Mar 2023 15:26:38 +0800 Subject: [PATCH 10/13] Update test_tokens --- tests/test_tokens.py | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/tests/test_tokens.py b/tests/test_tokens.py index bc06997d9..53a3bf909 100644 --- a/tests/test_tokens.py +++ b/tests/test_tokens.py @@ -30,6 +30,11 @@ class MyToken(Token): class TestToken(TestCase): def setUp(self): self.token = MyToken() + self.username = "test_user" + self.user = User.objects.create_user( + username=self.username, + password="test_password", + ) def test_init_no_token_type_or_lifetime(self): class MyTestToken(Token): @@ -225,14 +230,14 @@ def test_set_jti(self): self.assertIn("jti", token) self.assertNotEqual(old_jti, token["jti"]) + @override_api_settings(JTI_CLAIM=None) def test_optional_jti(self): - with override_api_settings(JTI_CLAIM=None): - token = MyToken() + token = MyToken() self.assertNotIn("jti", token) + @override_api_settings(TOKEN_TYPE_CLAIM=None) def test_optional_type_token(self): - with override_api_settings(TOKEN_TYPE_CLAIM=None): - token = MyToken() + token = MyToken() self.assertNotIn("type", token) def test_set_exp(self): @@ -355,25 +360,19 @@ def test_check_token_if_wrong_type_leeway(self): token.token_backend.leeway = 0 def test_for_user(self): - username = "test_user" - user = User.objects.create_user( - username=username, - password="test_password", - ) + token = MyToken.for_user(self.user) - token = MyToken.for_user(user) - - user_id = getattr(user, api_settings.USER_ID_FIELD) + user_id = getattr(self.user, api_settings.USER_ID_FIELD) if not isinstance(user_id, int): user_id = str(user_id) self.assertEqual(token[api_settings.USER_ID_CLAIM], user_id) + @override_api_settings(USER_ID_FIELD="username") + def test_for_user_with_username(self): # Test with non-int user id - with override_api_settings(USER_ID_FIELD="username"): - token = MyToken.for_user(user) - - self.assertEqual(token[api_settings.USER_ID_CLAIM], username) + token = MyToken.for_user(self.user) + self.assertEqual(token[api_settings.USER_ID_CLAIM], self.username) def test_get_token_backend(self): token = MyToken() From 096ffa68609e9de4f8bda2419c2271b74c96c9ec Mon Sep 17 00:00:00 2001 From: Kira Date: Sat, 18 Mar 2023 16:12:50 +0800 Subject: [PATCH 11/13] Update test_views --- tests/test_views.py | 49 ++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/tests/test_views.py b/tests/test_views.py index 8a9e16f26..b1fc80113 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -1,5 +1,4 @@ from datetime import timedelta -from importlib import reload from unittest.mock import patch from django.contrib.auth import get_user_model @@ -93,20 +92,18 @@ def test_update_last_login(self): user = User.objects.get(username=self.username) self.assertEqual(user.last_login, None) + @override_api_settings(UPDATE_LAST_LOGIN=True) + def test_update_last_login_updated(self): # verify last_login is updated - with override_api_settings(UPDATE_LAST_LOGIN=True): - reload(serializers) - self.view_post( - data={ - User.USERNAME_FIELD: self.username, - "password": self.password, - } - ) - user = User.objects.get(username=self.username) - self.assertIsNotNone(user.last_login) - self.assertGreaterEqual(timezone.now(), user.last_login) - - reload(serializers) + self.view_post( + data={ + User.USERNAME_FIELD: self.username, + "password": self.password, + } + ) + user = User.objects.get(username=self.username) + self.assertIsNotNone(user.last_login) + self.assertGreaterEqual(timezone.now(), user.last_login) class TestTokenRefreshView(APIViewTestCase): @@ -233,20 +230,18 @@ def test_update_last_login(self): user = User.objects.get(username=self.username) self.assertEqual(user.last_login, None) + @override_api_settings(UPDATE_LAST_LOGIN=True) + def test_update_last_login_updated(self): # verify last_login is updated - with override_api_settings(UPDATE_LAST_LOGIN=True): - reload(serializers) - self.view_post( - data={ - User.USERNAME_FIELD: self.username, - "password": self.password, - } - ) - user = User.objects.get(username=self.username) - self.assertIsNotNone(user.last_login) - self.assertGreaterEqual(timezone.now(), user.last_login) - - reload(serializers) + self.view_post( + data={ + User.USERNAME_FIELD: self.username, + "password": self.password, + } + ) + user = User.objects.get(username=self.username) + self.assertIsNotNone(user.last_login) + self.assertGreaterEqual(timezone.now(), user.last_login) class TestTokenRefreshSlidingView(APIViewTestCase): From 3d1e359f9367a924818de2a3526450c147c6a2b9 Mon Sep 17 00:00:00 2001 From: Kira Date: Tue, 21 Mar 2023 20:41:22 +0800 Subject: [PATCH 12/13] add `setUpTestData` to `TestToken` --- tests/test_tokens.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/test_tokens.py b/tests/test_tokens.py index 53a3bf909..493e021e6 100644 --- a/tests/test_tokens.py +++ b/tests/test_tokens.py @@ -30,8 +30,11 @@ class MyToken(Token): class TestToken(TestCase): def setUp(self): self.token = MyToken() - self.username = "test_user" - self.user = User.objects.create_user( + + @classmethod + def setUpTestData(cls): + cls.username = "test_user" + cls.user = User.objects.create_user( username=self.username, password="test_password", ) From 940ef69e24580be027fb8f3a7d4bf6e837364320 Mon Sep 17 00:00:00 2001 From: Kira Date: Sun, 11 Jun 2023 20:11:18 +0800 Subject: [PATCH 13/13] fix typo `self` should be `cls` --- tests/test_tokens.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_tokens.py b/tests/test_tokens.py index 493e021e6..9f81a1a76 100644 --- a/tests/test_tokens.py +++ b/tests/test_tokens.py @@ -35,7 +35,7 @@ def setUp(self): def setUpTestData(cls): cls.username = "test_user" cls.user = User.objects.create_user( - username=self.username, + username=cls.username, password="test_password", )