From 58f1ce0a7a96e40dcdb437a54c821d33d05887bb Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Mon, 10 Apr 2017 08:42:35 -0400 Subject: [PATCH 1/4] Add language tests for student_account (logistration) [LEARNER-243] --- .../student_account/test/test_views.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/lms/djangoapps/student_account/test/test_views.py b/lms/djangoapps/student_account/test/test_views.py index bdaef6c667..71b0ae0c60 100644 --- a/lms/djangoapps/student_account/test/test_views.py +++ b/lms/djangoapps/student_account/test/test_views.py @@ -35,6 +35,7 @@ from commerce.models import CommerceConfiguration from commerce.tests import factories from commerce.tests.mocks import mock_get_orders 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.programs.tests.mixins import ProgramsApiConfigMixin from openedx.core.djangoapps.user_api.accounts.api import activate_account, create_account @@ -521,6 +522,26 @@ class StudentAccountLoginAndRegistrationTest(ThirdPartyAuthTestMixin, UrlResetMi '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): """ Tests for the account settings view. """ From 073e29cc03bc831b4cee5d9a84fb61750a5b5b79 Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Mon, 10 Apr 2017 08:44:40 -0400 Subject: [PATCH 2/4] 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 From 32491f3c5edbe06cf8d4f71128ed3f30f57ffebc Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Mon, 10 Apr 2017 08:51:10 -0400 Subject: [PATCH 3/4] Make test settings configurable --- pavelib/utils/test/suites/nose_suite.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pavelib/utils/test/suites/nose_suite.py b/pavelib/utils/test/suites/nose_suite.py index 571e2eeb9e..412b3ea661 100644 --- a/pavelib/utils/test/suites/nose_suite.py +++ b/pavelib/utils/test/suites/nose_suite.py @@ -119,6 +119,7 @@ class SystemTestSuite(NoseTestSuite): self.processes = kwargs.get('processes', None) self.randomize = kwargs.get('randomize', None) + self.settings = kwargs.get('settings', 'test') if self.processes is None: # Don't use multiprocessing by default @@ -148,7 +149,7 @@ class SystemTestSuite(NoseTestSuite): '--verbosity={}'.format(self.verbosity), self.test_id, ] + self.test_options_flags + [ - '--settings=test', + '--settings', self.settings, self.extra_args, '--xunitmp-file={}'.format(self.report_dir / "nosetests.xml"), '--with-database-isolation', From b2bf3ce60d8a3fc7b08c21b4c4091ccae16a9b69 Mon Sep 17 00:00:00 2001 From: Calen Pennington Date: Mon, 10 Apr 2017 12:57:56 -0400 Subject: [PATCH 4/4] fixup! Don't capture browser language into unauthenticated user session --- openedx/core/djangoapps/lang_pref/tests/test_api.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openedx/core/djangoapps/lang_pref/tests/test_api.py b/openedx/core/djangoapps/lang_pref/tests/test_api.py index 1238eea674..cc5826e2b5 100644 --- a/openedx/core/djangoapps/lang_pref/tests/test_api.py +++ b/openedx/core/djangoapps/lang_pref/tests/test_api.py @@ -14,6 +14,7 @@ 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): """