From 073e29cc03bc831b4cee5d9a84fb61750a5b5b79 Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Mon, 10 Apr 2017 08:44:40 -0400 Subject: [PATCH] Don't capture browser language into unauthenticated user session [LEARNER-243] --- .../core/djangoapps/lang_pref/middleware.py | 16 -------- .../djangoapps/lang_pref/tests/test_api.py | 30 ++++++++++++-- .../lang_pref/tests/test_middleware.py | 39 ++++--------------- 3 files changed, 35 insertions(+), 50 deletions(-) diff --git a/openedx/core/djangoapps/lang_pref/middleware.py b/openedx/core/djangoapps/lang_pref/middleware.py index 52362d9ad0..e2352f0780 100644 --- a/openedx/core/djangoapps/lang_pref/middleware.py +++ b/openedx/core/djangoapps/lang_pref/middleware.py @@ -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 diff --git a/openedx/core/djangoapps/lang_pref/tests/test_api.py b/openedx/core/djangoapps/lang_pref/tests/test_api.py index ff201e76f4..1238eea674 100644 --- a/openedx/core/djangoapps/lang_pref/tests/test_api.py +++ b/openedx/core/djangoapps/lang_pref/tests/test_api.py @@ -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): diff --git a/openedx/core/djangoapps/lang_pref/tests/test_middleware.py b/openedx/core/djangoapps/lang_pref/tests/test_middleware.py index d1b9a6d8b2..2664073fd4 100644 --- a/openedx/core/djangoapps/lang_pref/tests/test_middleware.py +++ b/openedx/core/djangoapps/lang_pref/tests/test_middleware.py @@ -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