Files
edx-platform/lms/djangoapps/courseware/tests/test_context_processor.py
Dillon Dumesnil 31f33da625 fix: Update get user timezone logic
Adds in sanitization of the timezone to ensure the timezone is
formatted correctly and error handling to reasonably fall back to UTC
2022-02-18 13:20:20 -05:00

80 lines
3.5 KiB
Python

"""
Unit tests for courseware context_processor
"""
from pytz import timezone
from unittest.mock import Mock, patch # lint-amnesty, pylint: disable=wrong-import-order
from django.conf import settings
from django.contrib.auth.models import AnonymousUser
from lms.djangoapps.courseware.context_processor import (
get_user_timezone_or_last_seen_timezone_or_utc,
user_timezone_locale_prefs,
)
from openedx.core.djangoapps.user_api.preferences.api import set_user_preference
from common.djangoapps.student.tests.factories import UserFactory
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase # lint-amnesty, pylint: disable=wrong-import-order
from xmodule.modulestore.tests.factories import CourseFactory # lint-amnesty, pylint: disable=wrong-import-order
class UserPrefContextProcessorUnitTest(ModuleStoreTestCase):
"""
Unit test for courseware context_processor
"""
def setUp(self):
super().setUp()
self.user = UserFactory.create(password='foo')
self.request = Mock()
self.request.user = self.user
def test_anonymous_user(self):
self.request.user = AnonymousUser()
context = user_timezone_locale_prefs(self.request)
assert context['user_timezone'] is None
assert context['user_language'] == settings.LANGUAGE_CODE
def test_no_timezone_preference(self):
set_user_preference(self.user, 'pref-lang', 'en')
context = user_timezone_locale_prefs(self.request)
assert context['user_timezone'] is None
assert context['user_language'] is not None
assert context['user_language'] == 'en'
def test_no_language_preference(self):
set_user_preference(self.user, 'time_zone', 'Asia/Tokyo')
context = user_timezone_locale_prefs(self.request)
assert context['user_language'] is None
assert context['user_timezone'] is not None
assert context['user_timezone'] == 'Asia/Tokyo'
@patch("lms.djangoapps.courseware.context_processor.get_value")
def test_site_wide_language_set(self, mock_get_value):
mock_get_value.return_value = 'ar'
set_user_preference(self.user, 'pref-lang', 'en')
context = user_timezone_locale_prefs(self.request)
assert context['user_language'] == 'ar'
def test_get_user_timezone_or_last_seen_timezone_or_utc(self):
# We default to UTC
course = CourseFactory()
time_zone = get_user_timezone_or_last_seen_timezone_or_utc(self.user)
assert time_zone == timezone('UTC')
# We record the timezone when a user hits the courseware api. Also sanitize input test
self.client.login(username=self.user.username, password='foo')
self.client.get(f'/api/courseware/course/{course.id}?browser_timezone=America/New_York\x00')
time_zone = get_user_timezone_or_last_seen_timezone_or_utc(self.user)
assert time_zone == timezone('America/New_York')
# If a user has their timezone set, then we use that setting
set_user_preference(self.user, 'time_zone', 'Asia/Tokyo')
time_zone = get_user_timezone_or_last_seen_timezone_or_utc(self.user)
assert time_zone == timezone('Asia/Tokyo')
# If we do not recognize the user's timezone, we default to UTC
with patch('lms.djangoapps.courseware.context_processor.get_user_preference', return_value='Unknown/Timezone'):
time_zone = get_user_timezone_or_last_seen_timezone_or_utc(self.user)
assert time_zone == timezone('UTC')