Commit 073e29cc by Calen Pennington

Don't capture browser language into unauthenticated user session

[LEARNER-243]
parent 58f1ce0a
......@@ -35,19 +35,3 @@ class LanguagePreferenceMiddleware(object):
request.session[LANGUAGE_SESSION_KEY] = user_pref
else:
delete_user_preference(request.user, LANGUAGE_KEY)
else:
preferred_language = request.META.get('HTTP_ACCEPT_LANGUAGE', '')
lang_headers = [seq[0] for seq in parse_accept_lang_header(preferred_language)]
prefixes = [prefix.split("-")[0] for prefix in system_released_languages]
# Setting the session language to the browser language, if it is supported.
for browser_lang in lang_headers:
if browser_lang in system_released_languages:
pass
elif browser_lang in prefixes:
browser_lang = system_released_languages[prefixes.index(browser_lang)]
else:
continue
if request.session.get(LANGUAGE_SESSION_KEY, None) is None:
request.session[LANGUAGE_SESSION_KEY] = unicode(browser_lang)
break
......@@ -4,20 +4,44 @@
from django.test import TestCase
from django.test.utils import override_settings
from django.utils import translation
from django.contrib.auth.models import User
import ddt
from openedx.core.djangoapps.dark_lang.models import DarkLangConfig
from openedx.core.djangoapps.lang_pref import api as language_api
EN = language_api.Language('en', 'English')
ES_419 = language_api.Language('es-419', u'Español (Latinoamérica)')
@ddt.ddt
class LanguageApiTest(TestCase):
"""
Tests of the language APIs.
"""
def test_released_languages(self):
@ddt.data(*[
('en', [], [], []),
('en', [EN], [], [EN]),
('en', [EN, ES_419], [], [EN]),
('en', [EN, ES_419], ['es-419'], [EN, ES_419]),
('es-419', [EN, ES_419], ['es-419'], [ES_419]),
('en', [EN, ES_419], ['es'], [EN]),
])
@ddt.unpack
def test_released_languages(self, default_lang, languages, dark_lang_released, expected_languages):
"""
Tests for the released languages.
"""
released_languages = language_api.released_languages()
self.assertGreaterEqual(len(released_languages), 1)
with override_settings(LANGUAGES=languages, LANGUAGE_CODE=default_lang):
user = User()
user.save()
DarkLangConfig(
released_languages=', '.join(dark_lang_released),
changed_by=user,
enabled=True
).save()
released_languages = language_api.released_languages()
self.assertEqual(released_languages, expected_languages)
@override_settings(ALL_LANGUAGES=[[u"cs", u"Czech"], [u"nl", u"Dutch"]])
def test_all_languages(self):
......
......@@ -4,6 +4,7 @@ Tests for lang_pref middleware.
import mock
import ddt
from django.test import TestCase
from django.test.client import RequestFactory
from django.contrib.sessions.middleware import SessionMiddleware
......@@ -16,6 +17,7 @@ from student.tests.factories import UserFactory
from student.tests.factories import AnonymousUserFactory
@ddt.ddt
class TestUserPreferenceMiddleware(TestCase):
"""
Tests to make sure user preferences are getting properly set in the middleware.
......@@ -66,15 +68,17 @@ class TestUserPreferenceMiddleware(TestCase):
@mock.patch(
'openedx.core.djangoapps.lang_pref.middleware.released_languages',
mock.Mock(return_value=[('eo', 'dummy Esperanto'), ('ar', 'arabic')])
mock.Mock(return_value=[('eo', 'dummy Esperanto'), ('ar', 'arabic'), ('eu-es', 'euskara (Espainia)')])
)
def test_supported_browser_language_in_session(self):
@ddt.data('ar;q=1.0', 'eu;q=1.0', 'es-419;q=1.0')
def test_browser_language_in_session_for_unauthenticated_user(self, accept_language):
"""
test: browser language should be set in user session if it is supported by system for unauthenticated user.
test: browser language should not be set in user session for unauthenticated user.
"""
self.request.META['HTTP_ACCEPT_LANGUAGE'] = accept_language # pylint: disable=no-member
self.request.user = self.anonymous_user
self.middleware.process_request(self.request)
self.assertEqual(self.request.session[LANGUAGE_SESSION_KEY], 'ar') # pylint: disable=no-member
self.assertNotIn(LANGUAGE_SESSION_KEY, self.request.session) # pylint: disable=no-member
@mock.patch(
'openedx.core.djangoapps.lang_pref.middleware.released_languages',
......@@ -100,30 +104,3 @@ class TestUserPreferenceMiddleware(TestCase):
set_user_preference(self.user, LANGUAGE_KEY, 'eo')
self.middleware.process_request(self.request)
self.assertEqual(get_user_preference(self.request.user, LANGUAGE_KEY), None)
@mock.patch(
'openedx.core.djangoapps.lang_pref.middleware.released_languages',
mock.Mock(return_value=[('eu-es', 'euskara (Espainia)'), ('en', 'english')])
)
def test_supported_browser_language_prefix_in_session(self):
"""
test: browser language should be set in user session if it's prefix is supported by system for
unathenticated users
"""
self.request.META['HTTP_ACCEPT_LANGUAGE'] = 'eu;q=1.0' # pylint: disable=no-member
self.request.user = self.anonymous_user
self.middleware.process_request(self.request)
self.assertEqual(self.request.session.get(LANGUAGE_SESSION_KEY), 'eu-es') # pylint: disable=no-member
@mock.patch(
'openedx.core.djangoapps.lang_pref.middleware.released_languages',
mock.Mock(return_value=[('en', 'english')])
)
def test_unsupported_browser_language_prefix(self):
"""
test: browser language should not be set in user session if it's prefix is not supported by system.
"""
self.request.META['HTTP_ACCEPT_LANGUAGE'] = 'eu;q=1.0' # pylint: disable=no-member
self.request.user = self.anonymous_user
self.middleware.process_request(self.request)
self.assertNotEqual(self.request.session.get(LANGUAGE_SESSION_KEY), 'eu-es') # pylint: disable=no-member
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment