|
12 | 12 | from django.contrib.sessions.middleware import SessionMiddleware |
13 | 13 | from django.http import HttpRequest |
14 | 14 | from django.test.utils import override_settings |
| 15 | +from django.utils import timezone as dj_timezone |
15 | 16 |
|
16 | 17 | from bkpaas_auth.backends import UniversalAuthBackend |
17 | 18 | from bkpaas_auth.core.constants import ACCESS_PERMISSION_DENIED_CODE, ProviderType |
18 | 19 | from bkpaas_auth.core.exceptions import AccessPermissionDenied |
19 | 20 | from bkpaas_auth.core.token import LoginToken |
20 | | -from bkpaas_auth.middlewares import CookieLoginMiddleware, auth |
| 21 | +from bkpaas_auth.middlewares import CookieLoginMiddleware, auth, UserTimezoneMiddleware |
21 | 22 | from bkpaas_auth.models import User |
22 | 23 | from tests.utils import generate_random_string |
23 | 24 |
|
@@ -182,3 +183,69 @@ def test_auth(self, db, bk_token, dj_request): |
182 | 183 | assert isinstance(user, UserModel) |
183 | 184 | assert not isinstance(user, User) |
184 | 185 | assert isinstance(user.pk, int) |
| 186 | + |
| 187 | + |
| 188 | +class TestUserTimezoneMiddleware: |
| 189 | + """Test cases for UserTimezoneMiddleware""" |
| 190 | + |
| 191 | + @pytest.fixture |
| 192 | + def middleware(self): |
| 193 | + return UserTimezoneMiddleware(MagicMock()) |
| 194 | + |
| 195 | + @pytest.fixture |
| 196 | + def authenticated_user(self): |
| 197 | + """Create a mock authenticated user""" |
| 198 | + user = MagicMock() |
| 199 | + user.is_authenticated = True |
| 200 | + return user |
| 201 | + |
| 202 | + @pytest.fixture(autouse=True) |
| 203 | + def setup_timezone(self): |
| 204 | + """Reset timezone before and after each test to avoid pollution""" |
| 205 | + with override_settings(TIME_ZONE="UTC"): |
| 206 | + dj_timezone.deactivate() |
| 207 | + yield |
| 208 | + dj_timezone.deactivate() |
| 209 | + |
| 210 | + def test_skip_request_without_user_attr(self, rf, middleware): |
| 211 | + """Test that requests without user attribute don't change timezone""" |
| 212 | + middleware.process_request(rf.get("/")) |
| 213 | + assert dj_timezone.get_current_timezone_name() == "UTC" |
| 214 | + |
| 215 | + def test_skip_anonymous_user(self, rf, middleware): |
| 216 | + """Test that anonymous users don't change timezone""" |
| 217 | + request = rf.get("/") |
| 218 | + request.user = AnonymousUser() |
| 219 | + middleware.process_request(request) |
| 220 | + assert dj_timezone.get_current_timezone_name() == "UTC" |
| 221 | + |
| 222 | + def test_activate_valid_user_timezone(self, rf, middleware, authenticated_user): |
| 223 | + """Test that valid user timezone is actually activated""" |
| 224 | + request = rf.get("/") |
| 225 | + authenticated_user.time_zone = "America/New_York" |
| 226 | + request.user = authenticated_user |
| 227 | + middleware.process_request(request) |
| 228 | + assert dj_timezone.get_current_timezone_name() == "America/New_York" |
| 229 | + |
| 230 | + @pytest.mark.parametrize( |
| 231 | + ("time_zone_value", "has_attr"), |
| 232 | + [ |
| 233 | + ("Invalid/Timezone", True), |
| 234 | + ("", True), |
| 235 | + (None, True), |
| 236 | + (None, False), |
| 237 | + (123, True), |
| 238 | + ], |
| 239 | + ids=["invalid_timezone", "empty_string", "none_value", "no_attr", "non_string_type"], |
| 240 | + ) |
| 241 | + @override_settings(TIME_ZONE="Asia/Shanghai") |
| 242 | + def test_fallback_to_default_timezone(self, rf, middleware, authenticated_user, time_zone_value, has_attr): |
| 243 | + """Test fallback to default timezone for various edge cases""" |
| 244 | + request = rf.get("/") |
| 245 | + if has_attr: |
| 246 | + authenticated_user.time_zone = time_zone_value |
| 247 | + else: |
| 248 | + del authenticated_user.time_zone |
| 249 | + request.user = authenticated_user |
| 250 | + middleware.process_request(request) |
| 251 | + assert dj_timezone.get_current_timezone_name() == "Asia/Shanghai" |
0 commit comments