When side-wide language is set via LANGUAGE_CODE site configuration, some elements of legacy UI still use the language set in user preferences (or None, which fallsback to 'en' if nothing is set in preferences). The expectation is that everything should be translated to the language which is set in the site configuration. In legacy UI (i.e. templates) the code of the current language sometimes is needed, and in these cases `user_language` variable from the context is used. The value for that variable is inserted via context processor, which takes the value from the user preferences. The solution modifies the context processor to check if there is a language set in site configuration, and if there is, send that value, instead of whatever value there was in user peferences.
74 lines
2.9 KiB
Python
74 lines
2.9 KiB
Python
"""
|
|
Unit tests for courseware context_processor
|
|
"""
|
|
|
|
from pytz import timezone
|
|
from unittest.mock import Mock, patch
|
|
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
|
|
from xmodule.modulestore.tests.factories import CourseFactory
|
|
|
|
|
|
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'] is None
|
|
|
|
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
|
|
self.client.login(username=self.user.username, password='foo')
|
|
self.client.get(f'/api/courseware/course/{course.id}?browser_timezone=America/New_York')
|
|
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')
|