Commit 5726265c by Calen Pennington Committed by GitHub

Merge pull request #14849 from cpennington/learner-243

Learner 243: Unauthenticated User Language Settings
parents 1ff2be0d b2bf3ce6
...@@ -35,6 +35,7 @@ from commerce.models import CommerceConfiguration ...@@ -35,6 +35,7 @@ from commerce.models import CommerceConfiguration
from commerce.tests import factories from commerce.tests import factories
from commerce.tests.mocks import mock_get_orders from commerce.tests.mocks import mock_get_orders
from course_modes.models import CourseMode from course_modes.models import CourseMode
from edxmako.shortcuts import render_to_response
from openedx.core.djangoapps.oauth_dispatch.tests import factories as dot_factories from openedx.core.djangoapps.oauth_dispatch.tests import factories as dot_factories
from openedx.core.djangoapps.programs.tests.mixins import ProgramsApiConfigMixin from openedx.core.djangoapps.programs.tests.mixins import ProgramsApiConfigMixin
from openedx.core.djangoapps.user_api.accounts.api import activate_account, create_account from openedx.core.djangoapps.user_api.accounts.api import activate_account, create_account
...@@ -521,6 +522,26 @@ class StudentAccountLoginAndRegistrationTest(ThirdPartyAuthTestMixin, UrlResetMi ...@@ -521,6 +522,26 @@ class StudentAccountLoginAndRegistrationTest(ThirdPartyAuthTestMixin, UrlResetMi
'next': '/account/finish_auth?{}'.format(urlencode(params)) 'next': '/account/finish_auth?{}'.format(urlencode(params))
}) })
def test_english_by_default(self):
response = self.client.get(reverse('signin_user'), [], HTTP_ACCEPT="text/html")
self.assertEqual(response['Content-Language'], 'en')
def test_unsupported_language(self):
response = self.client.get(reverse('signin_user'), [], HTTP_ACCEPT="text/html", HTTP_ACCEPT_LANGUAGE="ts-zx")
self.assertEqual(response['Content-Language'], 'en')
def test_browser_language(self):
response = self.client.get(reverse('signin_user'), [], HTTP_ACCEPT="text/html", HTTP_ACCEPT_LANGUAGE="es")
self.assertEqual(response['Content-Language'], 'es-419')
def test_browser_language_dialent(self):
response = self.client.get(reverse('signin_user'), [], HTTP_ACCEPT="text/html", HTTP_ACCEPT_LANGUAGE="es-es")
self.assertEqual(response['Content-Language'], 'es-es')
class AccountSettingsViewTest(ThirdPartyAuthTestMixin, TestCase, ProgramsApiConfigMixin): class AccountSettingsViewTest(ThirdPartyAuthTestMixin, TestCase, ProgramsApiConfigMixin):
""" Tests for the account settings view. """ """ Tests for the account settings view. """
......
...@@ -35,19 +35,3 @@ class LanguagePreferenceMiddleware(object): ...@@ -35,19 +35,3 @@ class LanguagePreferenceMiddleware(object):
request.session[LANGUAGE_SESSION_KEY] = user_pref request.session[LANGUAGE_SESSION_KEY] = user_pref
else: else:
delete_user_preference(request.user, LANGUAGE_KEY) 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,45 @@ ...@@ -4,20 +4,45 @@
from django.test import TestCase from django.test import TestCase
from django.test.utils import override_settings from django.test.utils import override_settings
from django.utils import translation 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 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): class LanguageApiTest(TestCase):
""" """
Tests of the language APIs. 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. Tests for the released languages.
""" """
released_languages = language_api.released_languages() with override_settings(LANGUAGES=languages, LANGUAGE_CODE=default_lang):
self.assertGreaterEqual(len(released_languages), 1) 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"]]) @override_settings(ALL_LANGUAGES=[[u"cs", u"Czech"], [u"nl", u"Dutch"]])
def test_all_languages(self): def test_all_languages(self):
......
...@@ -4,6 +4,7 @@ Tests for lang_pref middleware. ...@@ -4,6 +4,7 @@ Tests for lang_pref middleware.
import mock import mock
import ddt
from django.test import TestCase from django.test import TestCase
from django.test.client import RequestFactory from django.test.client import RequestFactory
from django.contrib.sessions.middleware import SessionMiddleware from django.contrib.sessions.middleware import SessionMiddleware
...@@ -16,6 +17,7 @@ from student.tests.factories import UserFactory ...@@ -16,6 +17,7 @@ from student.tests.factories import UserFactory
from student.tests.factories import AnonymousUserFactory from student.tests.factories import AnonymousUserFactory
@ddt.ddt
class TestUserPreferenceMiddleware(TestCase): class TestUserPreferenceMiddleware(TestCase):
""" """
Tests to make sure user preferences are getting properly set in the middleware. Tests to make sure user preferences are getting properly set in the middleware.
...@@ -66,15 +68,17 @@ class TestUserPreferenceMiddleware(TestCase): ...@@ -66,15 +68,17 @@ class TestUserPreferenceMiddleware(TestCase):
@mock.patch( @mock.patch(
'openedx.core.djangoapps.lang_pref.middleware.released_languages', '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.request.user = self.anonymous_user
self.middleware.process_request(self.request) 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( @mock.patch(
'openedx.core.djangoapps.lang_pref.middleware.released_languages', 'openedx.core.djangoapps.lang_pref.middleware.released_languages',
...@@ -100,30 +104,3 @@ class TestUserPreferenceMiddleware(TestCase): ...@@ -100,30 +104,3 @@ class TestUserPreferenceMiddleware(TestCase):
set_user_preference(self.user, LANGUAGE_KEY, 'eo') set_user_preference(self.user, LANGUAGE_KEY, 'eo')
self.middleware.process_request(self.request) self.middleware.process_request(self.request)
self.assertEqual(get_user_preference(self.request.user, LANGUAGE_KEY), None) 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
...@@ -119,6 +119,7 @@ class SystemTestSuite(NoseTestSuite): ...@@ -119,6 +119,7 @@ class SystemTestSuite(NoseTestSuite):
self.processes = kwargs.get('processes', None) self.processes = kwargs.get('processes', None)
self.randomize = kwargs.get('randomize', None) self.randomize = kwargs.get('randomize', None)
self.settings = kwargs.get('settings', 'test')
if self.processes is None: if self.processes is None:
# Don't use multiprocessing by default # Don't use multiprocessing by default
...@@ -148,7 +149,7 @@ class SystemTestSuite(NoseTestSuite): ...@@ -148,7 +149,7 @@ class SystemTestSuite(NoseTestSuite):
'--verbosity={}'.format(self.verbosity), '--verbosity={}'.format(self.verbosity),
self.test_id, self.test_id,
] + self.test_options_flags + [ ] + self.test_options_flags + [
'--settings=test', '--settings', self.settings,
self.extra_args, self.extra_args,
'--xunitmp-file={}'.format(self.report_dir / "nosetests.xml"), '--xunitmp-file={}'.format(self.report_dir / "nosetests.xml"),
'--with-database-isolation', '--with-database-isolation',
......
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