Files
edx-platform/lms/djangoapps/courseware/tests/test_context_processor.py
Maxim Beder ec1e3b6e74 fix: fix side-wide language for legacy UI
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.
2021-11-09 00:37:43 +01:00

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')