From 7dd72360a2ab3a3a7ca74922da670c7361a9abb3 Mon Sep 17 00:00:00 2001 From: Jannis Leidel Date: Fri, 6 May 2011 13:29:44 +0000 Subject: [PATCH] Make use of new translation and settings context manager in the tests. git-svn-id: http://code.djangoproject.com/svn/django/trunk@16167 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- tests/regressiontests/admin_views/tests.py | 40 +- tests/regressiontests/admin_widgets/tests.py | 23 +- tests/regressiontests/defaultfilters/tests.py | 49 ++- .../forms/tests/regressions.py | 18 +- tests/regressiontests/i18n/tests.py | 352 +++++++----------- tests/regressiontests/text/tests.py | 7 +- tests/regressiontests/views/tests/i18n.py | 98 ++--- 7 files changed, 240 insertions(+), 347 deletions(-) diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py index 25740bccea..fe6e2ff6a5 100644 --- a/tests/regressiontests/admin_views/tests.py +++ b/tests/regressiontests/admin_views/tests.py @@ -22,12 +22,11 @@ from django.forms.util import ErrorList import django.template.context from django.template.response import TemplateResponse from django.test import TestCase -from django.utils import formats +from django.utils import formats, translation from django.utils.cache import get_max_age from django.utils.encoding import iri_to_uri from django.utils.html import escape from django.utils.http import urlencode -from django.utils.translation import activate, deactivate from django.utils import unittest # local test models @@ -361,42 +360,31 @@ class AdminViewBasicTest(TestCase): if the default language is non-English but the selected language is English. See #13388 and #3594 for more details. """ - try: - settings.LANGUAGE_CODE = 'fr' - activate('en-us') - response = self.client.get('/test_admin/admin/jsi18n/') - self.assertNotContains(response, 'Choisir une heure') - finally: - deactivate() + with self.settings(LANGUAGE_CODE='fr'): + with translation.override('en-us'): + response = self.client.get('/test_admin/admin/jsi18n/') + self.assertNotContains(response, 'Choisir une heure') def testI18NLanguageNonEnglishFallback(self): """ Makes sure that the fallback language is still working properly in cases where the selected language cannot be found. """ - try: - settings.LANGUAGE_CODE = 'fr' - activate('none') - response = self.client.get('/test_admin/admin/jsi18n/') - self.assertContains(response, 'Choisir une heure') - finally: - deactivate() + with self.settings(LANGUAGE_CODE='fr'): + with translation.override('none'): + response = self.client.get('/test_admin/admin/jsi18n/') + self.assertContains(response, 'Choisir une heure') def testL10NDeactivated(self): """ Check if L10N is deactivated, the Javascript i18n view doesn't return localized date/time formats. Refs #14824. """ - try: - settings.LANGUAGE_CODE = 'ru' - settings.USE_L10N = False - activate('ru') - response = self.client.get('/test_admin/admin/jsi18n/') - self.assertNotContains(response, '%d.%m.%Y %H:%M:%S') - self.assertContains(response, '%Y-%m-%d %H:%M:%S') - finally: - deactivate() - + with self.settings(LANGUAGE_CODE='ru', USE_L10N=False): + with translation.override('none'): + response = self.client.get('/test_admin/admin/jsi18n/') + self.assertNotContains(response, '%d.%m.%Y %H:%M:%S') + self.assertContains(response, '%Y-%m-%d %H:%M:%S') def test_disallowed_filtering(self): self.assertRaises(SuspiciousOperation, diff --git a/tests/regressiontests/admin_widgets/tests.py b/tests/regressiontests/admin_widgets/tests.py index 9fde201366..b498525a91 100644 --- a/tests/regressiontests/admin_widgets/tests.py +++ b/tests/regressiontests/admin_widgets/tests.py @@ -14,8 +14,8 @@ from django.core.files.storage import default_storage from django.core.files.uploadedfile import SimpleUploadedFile from django.db.models import DateField from django.test import TestCase as DjangoTestCase +from django.utils import translation from django.utils.html import conditional_escape -from django.utils.translation import activate, deactivate from django.utils.unittest import TestCase import models @@ -204,7 +204,7 @@ class FilteredSelectMultipleWidgetTest(TestCase): ) -class AdminSplitDateTimeWidgetTest(TestCase): +class AdminSplitDateTimeWidgetTest(DjangoTestCase): def test_render(self): w = AdminSplitDateTime() self.assertEqual( @@ -215,18 +215,13 @@ class AdminSplitDateTimeWidgetTest(TestCase): def test_localization(self): w = AdminSplitDateTime() - activate('de-at') - old_USE_L10N = settings.USE_L10N - try: - settings.USE_L10N = True - w.is_localized = True - self.assertEqual( - conditional_escape(w.render('test', datetime(2007, 12, 1, 9, 30))), - '

Datum:
Zeit:

', - ) - finally: - deactivate() - settings.USE_L10N = old_USE_L10N + with self.settings(USE_L10N=True): + with translation.override('de-at'): + w.is_localized = True + self.assertEqual( + conditional_escape(w.render('test', datetime(2007, 12, 1, 9, 30))), + '

Datum:
Zeit:

', + ) class AdminFileWidgetTest(DjangoTestCase): diff --git a/tests/regressiontests/defaultfilters/tests.py b/tests/regressiontests/defaultfilters/tests.py index 286c7f8c01..80424a8234 100644 --- a/tests/regressiontests/defaultfilters/tests.py +++ b/tests/regressiontests/defaultfilters/tests.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- import datetime -from django.utils import unittest +from django.test import TestCase +from django.utils import unittest, translation from django.template.defaultfilters import * -class DefaultFiltersTests(unittest.TestCase): +class DefaultFiltersTests(TestCase): def test_floatformat(self): self.assertEqual(floatformat(7.7), u'7.7') @@ -458,31 +459,25 @@ class DefaultFiltersTests(unittest.TestCase): u'0 bytes') def test_localized_filesizeformat(self): - from django.utils.translation import activate, deactivate - old_localize = settings.USE_L10N - try: - activate('de') - settings.USE_L10N = True - self.assertEqual(filesizeformat(1023), u'1023 Bytes') - self.assertEqual(filesizeformat(1024), u'1,0 KB') - self.assertEqual(filesizeformat(10*1024), u'10,0 KB') - self.assertEqual(filesizeformat(1024*1024-1), u'1024,0 KB') - self.assertEqual(filesizeformat(1024*1024), u'1,0 MB') - self.assertEqual(filesizeformat(1024*1024*50), u'50,0 MB') - self.assertEqual(filesizeformat(1024*1024*1024-1), u'1024,0 MB') - self.assertEqual(filesizeformat(1024*1024*1024), u'1,0 GB') - self.assertEqual(filesizeformat(1024*1024*1024*1024), u'1,0 TB') - self.assertEqual(filesizeformat(1024*1024*1024*1024*1024), - u'1,0 PB') - self.assertEqual(filesizeformat(1024*1024*1024*1024*1024*2000), - u'2000,0 PB') - self.assertEqual(filesizeformat(complex(1,-1)), u'0 Bytes') - self.assertEqual(filesizeformat(""), u'0 Bytes') - self.assertEqual(filesizeformat(u"\N{GREEK SMALL LETTER ALPHA}"), - u'0 Bytes') - finally: - deactivate() - settings.USE_L10N = old_localize + with self.settings(USE_L10N=True): + with translation.override('de', deactivate=True): + self.assertEqual(filesizeformat(1023), u'1023 Bytes') + self.assertEqual(filesizeformat(1024), u'1,0 KB') + self.assertEqual(filesizeformat(10*1024), u'10,0 KB') + self.assertEqual(filesizeformat(1024*1024-1), u'1024,0 KB') + self.assertEqual(filesizeformat(1024*1024), u'1,0 MB') + self.assertEqual(filesizeformat(1024*1024*50), u'50,0 MB') + self.assertEqual(filesizeformat(1024*1024*1024-1), u'1024,0 MB') + self.assertEqual(filesizeformat(1024*1024*1024), u'1,0 GB') + self.assertEqual(filesizeformat(1024*1024*1024*1024), u'1,0 TB') + self.assertEqual(filesizeformat(1024*1024*1024*1024*1024), + u'1,0 PB') + self.assertEqual(filesizeformat(1024*1024*1024*1024*1024*2000), + u'2000,0 PB') + self.assertEqual(filesizeformat(complex(1,-1)), u'0 Bytes') + self.assertEqual(filesizeformat(""), u'0 Bytes') + self.assertEqual(filesizeformat(u"\N{GREEK SMALL LETTER ALPHA}"), + u'0 Bytes') def test_pluralize(self): self.assertEqual(pluralize(1), u'') diff --git a/tests/regressiontests/forms/tests/regressions.py b/tests/regressiontests/forms/tests/regressions.py index 26569565e3..1f8f5a49ea 100644 --- a/tests/regressiontests/forms/tests/regressions.py +++ b/tests/regressiontests/forms/tests/regressions.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from django.forms import * from django.utils.unittest import TestCase -from django.utils.translation import ugettext_lazy, activate, deactivate +from django.utils.translation import ugettext_lazy, override from regressiontests.forms.models import Cheese @@ -28,11 +28,10 @@ class FormsRegressionsTestCase(TestCase): self.assertEqual(f.as_p(), '

') # Translations are done at rendering time, so multi-lingual apps can define forms) - activate('de') - self.assertEqual(f.as_p(), '

') - activate('pl') - self.assertEqual(f.as_p(), u'

') - deactivate() + with override('de'): + self.assertEqual(f.as_p(), '

') + with override('pl', deactivate=True): + self.assertEqual(f.as_p(), u'

') def test_regression_5216(self): # There was some problems with form translations in #5216 @@ -61,10 +60,9 @@ class FormsRegressionsTestCase(TestCase): self.assertEqual(f.clean('\xd1\x88\xd1\x82.'), u'\u0448\u0442.') # Translated error messages used to be buggy. - activate('ru') - f = SomeForm({}) - self.assertEqual(f.as_p(), u'\n

') - deactivate() + with override('ru'): + f = SomeForm({}) + self.assertEqual(f.as_p(), u'\n

') # Deep copying translated text shouldn't raise an error) from django.utils.translation import gettext_lazy diff --git a/tests/regressiontests/i18n/tests.py b/tests/regressiontests/i18n/tests.py index 8a8e4dc430..8a37c6e046 100644 --- a/tests/regressiontests/i18n/tests.py +++ b/tests/regressiontests/i18n/tests.py @@ -14,10 +14,10 @@ from django.utils.formats import (get_format, date_format, time_format, from django.utils.importlib import import_module from django.utils.numberformat import format as nformat from django.utils.safestring import mark_safe, SafeString, SafeUnicode +from django.utils import translation from django.utils.translation import (ugettext, ugettext_lazy, activate, deactivate, gettext_lazy, pgettext, npgettext, to_locale, get_language_info, get_language) -from django.utils.unittest import TestCase from forms import I18nForm, SelectDateForm, SelectDateWidget, CompanyForm @@ -43,13 +43,10 @@ class TranslationTests(TestCase): s = ugettext_lazy('Add %(name)s') d = {'name': 'Ringo'} self.assertEqual(u'Add Ringo', s % d) - activate('de') - try: + with translation.override('de', deactivate=True): self.assertEqual(u'Ringo hinzuf\xfcgen', s % d) - activate('pl') - self.assertEqual(u'Dodaj Ringo', s % d) - finally: - deactivate() + with translation.override('pl'): + self.assertEqual(u'Dodaj Ringo', s % d) # It should be possible to compare *_lazy objects. s1 = ugettext_lazy('Add %(name)s') @@ -69,19 +66,18 @@ class TranslationTests(TestCase): def test_pgettext(self): # Reset translation catalog to include other/locale/de - self.old_locale_paths = settings.LOCALE_PATHS - settings.LOCALE_PATHS += (os.path.join(os.path.dirname(os.path.abspath(__file__)), 'other', 'locale'),) - from django.utils.translation import trans_real - trans_real._active = local() - trans_real._translations = {} - activate('de') - - self.assertEqual(pgettext("unexisting", "May"), u"May") - self.assertEqual(pgettext("month name", "May"), u"Mai") - self.assertEqual(pgettext("verb", "May"), u"Kann") - self.assertEqual(npgettext("search", "%d result", "%d results", 4) % 4, u"4 Resultate") - - settings.LOCALE_PATHS = self.old_locale_paths + extended_locale_paths = settings.LOCALE_PATHS + ( + os.path.join(os.path.dirname(os.path.abspath(__file__)), 'other', 'locale'), + ) + with self.settings(LOCALE_PATHS=extended_locale_paths): + from django.utils.translation import trans_real + trans_real._active = local() + trans_real._translations = {} + with translation.override('de'): + self.assertEqual(pgettext("unexisting", "May"), u"May") + self.assertEqual(pgettext("month name", "May"), u"Mai") + self.assertEqual(pgettext("verb", "May"), u"Kann") + self.assertEqual(npgettext("search", "%d result", "%d results", 4) % 4, u"4 Resultate") def test_string_concat(self): """ @@ -96,11 +92,8 @@ class TranslationTests(TestCase): """ s = mark_safe('Password') self.assertEqual(SafeString, type(s)) - activate('de') - try: + with translation.override('de', deactivate=True): self.assertEqual(SafeUnicode, type(ugettext(s))) - finally: - deactivate() self.assertEqual('aPassword', SafeString('a') + s) self.assertEqual('Passworda', s + SafeString('a')) self.assertEqual('Passworda', s + mark_safe('a')) @@ -112,16 +105,13 @@ class TranslationTests(TestCase): Translations on files with mac or dos end of lines will be converted to unix eof in .po catalogs, and they have to match when retrieved """ - from django.utils.translation.trans_real import translation - ca_translation = translation('ca') + from django.utils.translation.trans_real import translation as Trans + ca_translation = Trans('ca') ca_translation._catalog[u'Mac\nEOF\n'] = u'Catalan Mac\nEOF\n' ca_translation._catalog[u'Win\nEOF\n'] = u'Catalan Win\nEOF\n' - activate('ca') - try: + with translation.override('ca', deactivate=True): self.assertEqual(u'Catalan Mac\nEOF\n', ugettext(u'Mac\rEOF\r')) self.assertEqual(u'Catalan Win\nEOF\n', ugettext(u'Win\r\nEOF\r\n')) - finally: - deactivate() def test_to_locale(self): """ @@ -175,22 +165,21 @@ class FormattingTests(TestCase): """ Localization of numbers """ - settings.USE_L10N = True - settings.USE_THOUSAND_SEPARATOR = False - self.assertEqual(u'66666.66', nformat(self.n, decimal_sep='.', decimal_pos=2, grouping=3, thousand_sep=',')) - self.assertEqual(u'66666A6', nformat(self.n, decimal_sep='A', decimal_pos=1, grouping=1, thousand_sep='B')) - self.assertEqual(u'66666', nformat(self.n, decimal_sep='X', decimal_pos=0, grouping=1, thousand_sep='Y')) + with self.settings(USE_L10N=True, USE_THOUSAND_SEPARATOR=False): + self.assertEqual(u'66666.66', nformat(self.n, decimal_sep='.', decimal_pos=2, grouping=3, thousand_sep=',')) + self.assertEqual(u'66666A6', nformat(self.n, decimal_sep='A', decimal_pos=1, grouping=1, thousand_sep='B')) + self.assertEqual(u'66666', nformat(self.n, decimal_sep='X', decimal_pos=0, grouping=1, thousand_sep='Y')) - settings.USE_THOUSAND_SEPARATOR = True - self.assertEqual(u'66,666.66', nformat(self.n, decimal_sep='.', decimal_pos=2, grouping=3, thousand_sep=',')) - self.assertEqual(u'6B6B6B6B6A6', nformat(self.n, decimal_sep='A', decimal_pos=1, grouping=1, thousand_sep='B')) - self.assertEqual(u'-66666.6', nformat(-66666.666, decimal_sep='.', decimal_pos=1)) - self.assertEqual(u'-66666.0', nformat(int('-66666'), decimal_sep='.', decimal_pos=1)) - self.assertEqual(u'10000.0', nformat(self.l, decimal_sep='.', decimal_pos=1)) + with self.settings(USE_L10N=True, USE_THOUSAND_SEPARATOR=True): + self.assertEqual(u'66,666.66', nformat(self.n, decimal_sep='.', decimal_pos=2, grouping=3, thousand_sep=',')) + self.assertEqual(u'6B6B6B6B6A6', nformat(self.n, decimal_sep='A', decimal_pos=1, grouping=1, thousand_sep='B')) + self.assertEqual(u'-66666.6', nformat(-66666.666, decimal_sep='.', decimal_pos=1)) + self.assertEqual(u'-66666.0', nformat(int('-66666'), decimal_sep='.', decimal_pos=1)) + self.assertEqual(u'10000.0', nformat(self.l, decimal_sep='.', decimal_pos=1)) - # date filter - self.assertEqual(u'31.12.2009 в 20:50', Template('{{ dt|date:"d.m.Y в H:i" }}').render(self.ctxt)) - self.assertEqual(u'⌚ 10:15', Template('{{ t|time:"⌚ H:i" }}').render(self.ctxt)) + # date filter + self.assertEqual(u'31.12.2009 в 20:50', Template('{{ dt|date:"d.m.Y в H:i" }}').render(self.ctxt)) + self.assertEqual(u'⌚ 10:15', Template('{{ t|time:"⌚ H:i" }}').render(self.ctxt)) def test_l10n_disabled(self): """ @@ -198,8 +187,7 @@ class FormattingTests(TestCase): but not formats """ settings.USE_L10N = False - activate('ca') - try: + with translation.override('ca', deactivate=True): self.assertEqual(u'N j, Y', get_format('DATE_FORMAT')) self.assertEqual(0, get_format('FIRST_DAY_OF_WEEK')) self.assertEqual(u'.', get_format('DECIMAL_SEPARATOR')) @@ -254,19 +242,15 @@ class FormattingTests(TestCase): # thousand separator and grouping when USE_L10N is False even # if the USE_THOUSAND_SEPARATOR, NUMBER_GROUPING and # THOUSAND_SEPARATOR settings are specified - settings.USE_THOUSAND_SEPARATOR = True - settings.NUMBER_GROUPING = 1 - settings.THOUSAND_SEPARATOR = '!' - self.assertEqual(u'66666.67', Template('{{ n|floatformat:2 }}').render(self.ctxt)) - self.assertEqual(u'100000.0', Template('{{ f|floatformat }}').render(self.ctxt)) - finally: - deactivate() + with self.settings(USE_THOUSAND_SEPARATOR=True, + NUMBER_GROUPING=1, THOUSAND_SEPARATOR='!'): + self.assertEqual(u'66666.67', Template('{{ n|floatformat:2 }}').render(self.ctxt)) + self.assertEqual(u'100000.0', Template('{{ f|floatformat }}').render(self.ctxt)) def test_l10n_enabled(self): settings.USE_L10N = True # Catalan locale - activate('ca') - try: + with translation.override('ca', deactivate=True): self.assertEqual('j \de F \de Y', get_format('DATE_FORMAT')) self.assertEqual(1, get_format('FIRST_DAY_OF_WEEK')) self.assertEqual(',', get_format('DECIMAL_SEPARATOR')) @@ -348,22 +332,16 @@ class FormattingTests(TestCase): u'\n\n', SelectDateWidget(years=range(2009, 2019)).render('mydate', datetime.date(2009, 12, 31)) ) - finally: - deactivate() # Russian locale (with E as month) - activate('ru') - try: + with translation.override('ru', deactivate=True): self.assertEqual( u'\n\n', SelectDateWidget(years=range(2009, 2019)).render('mydate', datetime.date(2009, 12, 31)) ) - finally: - deactivate() # English locale - activate('en') - try: + with translation.override('en', deactivate=True): self.assertEqual('N j, Y', get_format('DATE_FORMAT')) self.assertEqual(0, get_format('FIRST_DAY_OF_WEEK')) self.assertEqual('.', get_format('DECIMAL_SEPARATOR')) @@ -426,34 +404,23 @@ class FormattingTests(TestCase): u'\n\n', SelectDateWidget(years=range(2009, 2019)).render('mydate', datetime.date(2009, 12, 31)) ) - finally: - deactivate() def test_sub_locales(self): """ Check if sublocales fall back to the main locale """ - settings.USE_L10N = True - activate('de-at') - settings.USE_THOUSAND_SEPARATOR = True - try: - self.assertEqual(u'66.666,666', Template('{{ n }}').render(self.ctxt)) - finally: - deactivate() - - activate('es-us') - try: - self.assertEqual(u'31 de diciembre de 2009', date_format(self.d)) - finally: - deactivate() + with self.settings(USE_L10N=True, USE_THOUSAND_SEPARATOR=True): + with translation.override('de-at', deactivate=True): + self.assertEqual(u'66.666,666', Template('{{ n }}').render(self.ctxt)) + with translation.override('es-us', deactivate=True): + self.assertEqual(u'31 de diciembre de 2009', date_format(self.d)) def test_localized_input(self): """ Tests if form input is correctly localized """ settings.USE_L10N = True - activate('de-at') - try: + with translation.override('de-at', deactivate=True): form6 = CompanyForm({ 'name': u'acme', 'date_added': datetime.datetime(2009, 12, 31, 6, 0, 0), @@ -467,28 +434,21 @@ class FormattingTests(TestCase): ) self.assertEqual(localize_input(datetime.datetime(2009, 12, 31, 6, 0, 0)), '31.12.2009 06:00:00') self.assertEqual(datetime.datetime(2009, 12, 31, 6, 0, 0), form6.cleaned_data['date_added']) - settings.USE_THOUSAND_SEPARATOR = True - # Checking for the localized "products_delivered" field - self.assertTrue(u'' in form6.as_ul()) - finally: - deactivate() + with self.settings(USE_THOUSAND_SEPARATOR=True): + # Checking for the localized "products_delivered" field + self.assertTrue(u'' in form6.as_ul()) def test_iter_format_modules(self): """ Tests the iter_format_modules function. """ - activate('de-at') - old_format_module_path = settings.FORMAT_MODULE_PATH - try: - settings.USE_L10N = True + settings.USE_L10N = True + with translation.override('de-at', deactivate=True): de_format_mod = import_module('django.conf.locale.de.formats') self.assertEqual(list(iter_format_modules('de')), [de_format_mod]) - settings.FORMAT_MODULE_PATH = 'regressiontests.i18n.other.locale' - test_de_format_mod = import_module('regressiontests.i18n.other.locale.de.formats') - self.assertEqual(list(iter_format_modules('de')), [test_de_format_mod, de_format_mod]) - finally: - settings.FORMAT_MODULE_PATH = old_format_module_path - deactivate() + with self.settings(FORMAT_MODULE_PATH='regressiontests.i18n.other.locale'): + test_de_format_mod = import_module('regressiontests.i18n.other.locale.de.formats') + self.assertEqual(list(iter_format_modules('de')), [test_de_format_mod, de_format_mod]) def test_iter_format_modules_stability(self): """ @@ -501,17 +461,12 @@ class FormattingTests(TestCase): self.assertEqual(list(iter_format_modules('en-gb')), [en_gb_format_mod, en_format_mod]) def test_get_format_modules_stability(self): - activate('de') - old_format_module_path = settings.FORMAT_MODULE_PATH - settings.FORMAT_MODULE_PATH = 'regressiontests.i18n.other.locale' - try: - settings.USE_L10N = True - old = "%r" % get_format_modules(reverse=True) - new = "%r" % get_format_modules(reverse=True) # second try - self.assertEqual(new, old, 'Value returned by get_formats_modules() must be preserved between calls.') - finally: - settings.FORMAT_MODULE_PATH = old_format_module_path - deactivate() + with self.settings(USE_L10N=True, + FORMAT_MODULE_PATH='regressiontests.i18n.other.locale'): + with translation.override('de', deactivate=True): + old = "%r" % get_format_modules(reverse=True) + new = "%r" % get_format_modules(reverse=True) # second try + self.assertEqual(new, old, 'Value returned by get_formats_modules() must be preserved between calls.') def test_localize_templatetag_and_filter(self): """ @@ -526,19 +481,14 @@ class FormattingTests(TestCase): output2 = '3,14;3.14;3,14' output3 = '3,14;3.14' output4 = '3.14;3,14' - old_localize = settings.USE_L10N - try: - activate('de') - settings.USE_L10N = False - self.assertEqual(template1.render(context), output1) - self.assertEqual(template4.render(context), output4) - settings.USE_L10N = True - self.assertEqual(template1.render(context), output1) - self.assertEqual(template2.render(context), output2) - self.assertEqual(template3.render(context), output3) - finally: - deactivate() - settings.USE_L10N = old_localize + with translation.override('de', deactivate=True): + with self.settings(USE_L10N=False): + self.assertEqual(template1.render(context), output1) + self.assertEqual(template4.render(context), output4) + with self.settings(USE_L10N=True): + self.assertEqual(template1.render(context), output1) + self.assertEqual(template2.render(context), output2) + self.assertEqual(template3.render(context), output3) class MiscTests(TestCase): @@ -696,20 +646,13 @@ class LocalePathsResolutionOrderI18NTests(ResolutionOrderI18NTests): self.assertUgettext('Time', 'LOCALE_PATHS') def test_locale_paths_override_app_translation(self): - old_installed_apps = settings.INSTALLED_APPS - settings.INSTALLED_APPS = list(settings.INSTALLED_APPS) + ['regressiontests.i18n.resolution'] - try: + extended_apps = list(settings.INSTALLED_APPS) + ['regressiontests.i18n.resolution'] + with self.settings(INSTALLED_APPS=extended_apps): self.assertUgettext('Time', 'LOCALE_PATHS') - finally: - settings.INSTALLED_APPS = old_installed_apps def test_locale_paths_override_project_translation(self): - old_settings_module = settings.SETTINGS_MODULE - settings.SETTINGS_MODULE = 'regressiontests' - try: + with self.settings(SETTINGS_MODULE='regressiontests'): self.assertUgettext('Date/time', 'LOCALE_PATHS') - finally: - settings.SETTINGS_MODULE = old_settings_module class ProjectResolutionOrderI18NTests(ResolutionOrderI18NTests): @@ -726,12 +669,9 @@ class ProjectResolutionOrderI18NTests(ResolutionOrderI18NTests): self.assertUgettext('Date/time', 'PROJECT') def test_project_override_app_translation(self): - old_installed_apps = settings.INSTALLED_APPS - settings.INSTALLED_APPS = list(settings.INSTALLED_APPS) + ['regressiontests.i18n.resolution'] - try: + extended_apps = list(settings.INSTALLED_APPS) + ['regressiontests.i18n.resolution'] + with self.settings(INSTALLED_APPS=extended_apps): self.assertUgettext('Date/time', 'PROJECT') - finally: - settings.INSTALLED_APPS = old_installed_apps class DjangoFallbackResolutionOrderI18NTests(ResolutionOrderI18NTests): @@ -776,117 +716,113 @@ class MultipleLocaleActivationTests(TestCase): """ Simple baseline behavior with one locale for all the supported i18n constructs. """ - activate('fr') - self.assertEqual(Template("{{ _('Yes') }}").render(Context({})), 'Oui') - self.assertEqual(Template("{% load i18n %}{% trans 'Yes' %}").render(Context({})), 'Oui') - self.assertEqual(Template("{% load i18n %}{% blocktrans %}Yes{% endblocktrans %}").render(Context({})), 'Oui') + with translation.override('fr'): + self.assertEqual(Template("{{ _('Yes') }}").render(Context({})), 'Oui') + self.assertEqual(Template("{% load i18n %}{% trans 'Yes' %}").render(Context({})), 'Oui') + self.assertEqual(Template("{% load i18n %}{% blocktrans %}Yes{% endblocktrans %}").render(Context({})), 'Oui') # Literal marked up with _() in a filter expression def test_multiple_locale_filter(self): - activate('de') - t = Template("{% load i18n %}{{ 0|yesno:_('yes,no,maybe') }}") - activate(self._old_language) - activate('nl') - self.assertEqual(t.render(Context({})), 'nee') + with translation.override('de'): + t = Template("{% load i18n %}{{ 0|yesno:_('yes,no,maybe') }}") + with translation.override(self._old_language): + with translation.override('nl'): + self.assertEqual(t.render(Context({})), 'nee') def test_multiple_locale_filter_deactivate(self): - activate('de') - t = Template("{% load i18n %}{{ 0|yesno:_('yes,no,maybe') }}") - deactivate() - activate('nl') - self.assertEqual(t.render(Context({})), 'nee') + with translation.override('de', deactivate=True): + t = Template("{% load i18n %}{{ 0|yesno:_('yes,no,maybe') }}") + with translation.override('nl'): + self.assertEqual(t.render(Context({})), 'nee') def test_multiple_locale_filter_direct_switch(self): - activate('de') - t = Template("{% load i18n %}{{ 0|yesno:_('yes,no,maybe') }}") - activate('nl') - self.assertEqual(t.render(Context({})), 'nee') + with translation.override('de'): + t = Template("{% load i18n %}{{ 0|yesno:_('yes,no,maybe') }}") + with translation.override('nl'): + self.assertEqual(t.render(Context({})), 'nee') # Literal marked up with _() def test_multiple_locale(self): - activate('de') - t = Template("{{ _('No') }}") - activate(self._old_language) - activate('nl') - self.assertEqual(t.render(Context({})), 'Nee') + with translation.override('de'): + t = Template("{{ _('No') }}") + with translation.override(self._old_language): + with translation.override('nl'): + self.assertEqual(t.render(Context({})), 'Nee') def test_multiple_locale_deactivate(self): - activate('de') - t = Template("{{ _('No') }}") - deactivate() - activate('nl') - self.assertEqual(t.render(Context({})), 'Nee') + with translation.override('de', deactivate=True): + t = Template("{{ _('No') }}") + with translation.override('nl'): + self.assertEqual(t.render(Context({})), 'Nee') def test_multiple_locale_direct_switch(self): - activate('de') - t = Template("{{ _('No') }}") - activate('nl') - self.assertEqual(t.render(Context({})), 'Nee') + with translation.override('de'): + t = Template("{{ _('No') }}") + with translation.override('nl'): + self.assertEqual(t.render(Context({})), 'Nee') # Literal marked up with _(), loading the i18n template tag library def test_multiple_locale_loadi18n(self): - activate('de') - t = Template("{% load i18n %}{{ _('No') }}") - activate(self._old_language) - activate('nl') - self.assertEqual(t.render(Context({})), 'Nee') + with translation.override('de'): + t = Template("{% load i18n %}{{ _('No') }}") + with translation.override(self._old_language): + with translation.override('nl'): + self.assertEqual(t.render(Context({})), 'Nee') def test_multiple_locale_loadi18n_deactivate(self): - activate('de') - t = Template("{% load i18n %}{{ _('No') }}") - deactivate() - activate('nl') - self.assertEqual(t.render(Context({})), 'Nee') + with translation.override('de', deactivate=True): + t = Template("{% load i18n %}{{ _('No') }}") + with translation.override('nl'): + self.assertEqual(t.render(Context({})), 'Nee') def test_multiple_locale_loadi18n_direct_switch(self): - activate('de') - t = Template("{% load i18n %}{{ _('No') }}") - activate('nl') - self.assertEqual(t.render(Context({})), 'Nee') + with translation.override('de'): + t = Template("{% load i18n %}{{ _('No') }}") + with translation.override('nl'): + self.assertEqual(t.render(Context({})), 'Nee') # trans i18n tag def test_multiple_locale_trans(self): - activate('de') - t = Template("{% load i18n %}{% trans 'No' %}") - activate(self._old_language) - activate('nl') - self.assertEqual(t.render(Context({})), 'Nee') + with translation.override('de'): + t = Template("{% load i18n %}{% trans 'No' %}") + with translation.override(self._old_language): + with translation.override('nl'): + self.assertEqual(t.render(Context({})), 'Nee') def test_multiple_locale_deactivate_trans(self): - activate('de') - t = Template("{% load i18n %}{% trans 'No' %}") - deactivate() - activate('nl') - self.assertEqual(t.render(Context({})), 'Nee') + with translation.override('de', deactivate=True): + t = Template("{% load i18n %}{% trans 'No' %}") + with translation.override('nl'): + self.assertEqual(t.render(Context({})), 'Nee') def test_multiple_locale_direct_switch_trans(self): - activate('de') - t = Template("{% load i18n %}{% trans 'No' %}") - activate('nl') - self.assertEqual(t.render(Context({})), 'Nee') + with translation.override('de'): + t = Template("{% load i18n %}{% trans 'No' %}") + with translation.override('nl'): + self.assertEqual(t.render(Context({})), 'Nee') # blocktrans i18n tag def test_multiple_locale_btrans(self): - activate('de') - t = Template("{% load i18n %}{% blocktrans %}No{% endblocktrans %}") - activate(self._old_language) - activate('nl') - self.assertEqual(t.render(Context({})), 'Nee') + with translation.override('de'): + t = Template("{% load i18n %}{% blocktrans %}No{% endblocktrans %}") + with translation.override(self._old_language): + with translation.override('nl'): + self.assertEqual(t.render(Context({})), 'Nee') def test_multiple_locale_deactivate_btrans(self): - activate('de') - t = Template("{% load i18n %}{% blocktrans %}No{% endblocktrans %}") - deactivate() - activate('nl') - self.assertEqual(t.render(Context({})), 'Nee') + with translation.override('de', deactivate=True): + t = Template("{% load i18n %}{% blocktrans %}No{% endblocktrans %}") + with translation.override('nl'): + self.assertEqual(t.render(Context({})), 'Nee') def test_multiple_locale_direct_switch_btrans(self): - activate('de') - t = Template("{% load i18n %}{% blocktrans %}No{% endblocktrans %}") - activate('nl') - self.assertEqual(t.render(Context({})), 'Nee') + with translation.override('de'): + t = Template("{% load i18n %}{% blocktrans %}No{% endblocktrans %}") + with translation.override('nl'): + self.assertEqual(t.render(Context({})), 'Nee') + diff --git a/tests/regressiontests/text/tests.py b/tests/regressiontests/text/tests.py index 98f4398717..6395d2363e 100644 --- a/tests/regressiontests/text/tests.py +++ b/tests/regressiontests/text/tests.py @@ -4,7 +4,7 @@ from django.test import TestCase from django.utils.text import * from django.utils.http import urlquote, urlquote_plus, cookie_date, http_date from django.utils.encoding import iri_to_uri -from django.utils.translation import activate, deactivate +from django.utils.translation import override class TextTests(TestCase): """ @@ -17,9 +17,8 @@ class TextTests(TestCase): self.assertEqual(get_text_list(['a', 'b'], 'and'), u'a and b') self.assertEqual(get_text_list(['a']), u'a') self.assertEqual(get_text_list([]), u'') - activate('ar') - self.assertEqual(get_text_list(['a', 'b', 'c']), u"a، b أو c") - deactivate() + with override('ar'): + self.assertEqual(get_text_list(['a', 'b', 'c']), u"a، b أو c") def test_smart_split(self): diff --git a/tests/regressiontests/views/tests/i18n.py b/tests/regressiontests/views/tests/i18n.py index 97a0a5b511..ce40448393 100644 --- a/tests/regressiontests/views/tests/i18n.py +++ b/tests/regressiontests/views/tests/i18n.py @@ -4,7 +4,7 @@ from os import path from django.conf import settings from django.test import TestCase -from django.utils.translation import activate, deactivate +from django.utils.translation import override, activate from django.utils.text import javascript_quote from regressiontests.views.urls import locale_dir @@ -42,15 +42,6 @@ class JsI18NTests(TestCase): settings.LANGUAGE_CODE. """ - def setUp(self): - self.old_language_code = settings.LANGUAGE_CODE - self.old_installed_apps = settings.INSTALLED_APPS - - def tearDown(self): - deactivate() - settings.LANGUAGE_CODE = self.old_language_code - settings.INSTALLED_APPS = self.old_installed_apps - def test_jsi18n_with_missing_en_files(self): """ The javascript_catalog shouldn't load the fallback language in the @@ -61,20 +52,20 @@ class JsI18NTests(TestCase): languages and you've set settings.LANGUAGE_CODE to some other language than English. """ - settings.LANGUAGE_CODE = 'es' - activate('en-us') - response = self.client.get('/views/jsi18n/') - self.assertNotContains(response, 'esto tiene que ser traducido') + with self.settings(LANGUAGE_CODE='es'): + with override('en-us'): + response = self.client.get('/views/jsi18n/') + self.assertNotContains(response, 'esto tiene que ser traducido') def test_jsi18n_fallback_language(self): """ Let's make sure that the fallback language is still working properly in cases where the selected language cannot be found. """ - settings.LANGUAGE_CODE = 'fr' - activate('fi') - response = self.client.get('/views/jsi18n/') - self.assertContains(response, 'il faut le traduire') + with self.settings(LANGUAGE_CODE='fr'): + with override('fi'): + response = self.client.get('/views/jsi18n/') + self.assertContains(response, 'il faut le traduire') def testI18NLanguageNonEnglishDefault(self): """ @@ -83,10 +74,10 @@ class JsI18NTests(TestCase): is English and there is not 'en' translation available. See #13388, #3594 and #13726 for more details. """ - settings.LANGUAGE_CODE = 'fr' - activate('en-us') - response = self.client.get('/views/jsi18n/') - self.assertNotContains(response, 'Choisir une heure') + with self.settings(LANGUAGE_CODE='fr'): + with override('en-us'): + response = self.client.get('/views/jsi18n/') + self.assertNotContains(response, 'Choisir une heure') def test_nonenglish_default_english_userpref(self): """ @@ -94,21 +85,21 @@ class JsI18NTests(TestCase): available. The Javascript i18n view must return a NON empty language catalog with the proper English translations. See #13726 for more details. """ - settings.LANGUAGE_CODE = 'fr' - settings.INSTALLED_APPS = list(settings.INSTALLED_APPS) + ['regressiontests.views.app0'] - activate('en-us') - response = self.client.get('/views/jsi18n_english_translation/') - self.assertContains(response, javascript_quote('this app0 string is to be translated')) + extended_apps = list(settings.INSTALLED_APPS) + ['regressiontests.views.app0'] + with self.settings(LANGUAGE_CODE='fr', INSTALLED_APPS=extended_apps): + with override('en-us'): + response = self.client.get('/views/jsi18n_english_translation/') + self.assertContains(response, javascript_quote('this app0 string is to be translated')) def testI18NLanguageNonEnglishFallback(self): """ Makes sure that the fallback language is still working properly in cases where the selected language cannot be found. """ - settings.LANGUAGE_CODE = 'fr' - activate('none') - response = self.client.get('/views/jsi18n/') - self.assertContains(response, 'Choisir une heure') + with self.settings(LANGUAGE_CODE='fr'): + with override('none'): + response = self.client.get('/views/jsi18n/') + self.assertContains(response, 'Choisir une heure') class JsI18NTestsMultiPackage(TestCase): @@ -116,15 +107,6 @@ class JsI18NTestsMultiPackage(TestCase): Tests for django views in django/views/i18n.py that need to change settings.LANGUAGE_CODE and merge JS translation from several packages. """ - - def setUp(self): - self.old_language_code = settings.LANGUAGE_CODE - self.old_installed_apps = settings.INSTALLED_APPS - - def tearDown(self): - settings.LANGUAGE_CODE = self.old_language_code - settings.INSTALLED_APPS = self.old_installed_apps - def testI18NLanguageEnglishDefault(self): """ Check if the JavaScript i18n view returns a complete language catalog @@ -133,29 +115,29 @@ class JsI18NTestsMultiPackage(TestCase): translations of multiple Python packages is requested. See #13388, #3594 and #13514 for more details. """ - settings.LANGUAGE_CODE = 'en-us' - settings.INSTALLED_APPS = list(settings.INSTALLED_APPS) + ['regressiontests.views.app1', 'regressiontests.views.app2'] - activate('fr') - response = self.client.get('/views/jsi18n_multi_packages1/') - self.assertContains(response, javascript_quote('il faut traduire cette chaîne de caractères de app1')) - deactivate() + extended_apps = list(settings.INSTALLED_APPS) + ['regressiontests.views.app1', 'regressiontests.views.app2'] + with self.settings(LANGUAGE_CODE='en-us', INSTALLED_APPS=extended_apps): + with override('fr'): + response = self.client.get('/views/jsi18n_multi_packages1/') + self.assertContains(response, javascript_quote('il faut traduire cette chaîne de caractères de app1')) def testI18NDifferentNonEnLangs(self): """ Similar to above but with neither default or requested language being English. """ - settings.LANGUAGE_CODE = 'fr' - settings.INSTALLED_APPS = list(settings.INSTALLED_APPS) + ['regressiontests.views.app3', 'regressiontests.views.app4'] - activate('es-ar') - response = self.client.get('/views/jsi18n_multi_packages2/') - self.assertContains(response, javascript_quote('este texto de app3 debe ser traducido')) - deactivate() + extended_apps = list(settings.INSTALLED_APPS) + ['regressiontests.views.app3', 'regressiontests.views.app4'] + with self.settings(LANGUAGE_CODE='fr', INSTALLED_APPS=extended_apps): + with override('es-ar'): + response = self.client.get('/views/jsi18n_multi_packages2/') + self.assertContains(response, javascript_quote('este texto de app3 debe ser traducido')) def testI18NWithLocalePaths(self): - settings.LANGUAGE_CODE = 'es-ar' - self.old_locale_paths = settings.LOCALE_PATHS - settings.LOCALE_PATHS += (path.join(path.dirname(path.dirname(path.abspath(__file__))), 'app3', 'locale'),) - response = self.client.get('/views/jsi18n/') - self.assertContains(response, javascript_quote('este texto de app3 debe ser traducido')) - settings.LOCALE_PATHS = self.old_locale_paths + extended_locale_paths = settings.LOCALE_PATHS + ( + path.join(path.dirname( + path.dirname(path.abspath(__file__))), 'app3', 'locale'),) + with self.settings(LANGUAGE_CODE='es-ar', LOCALE_PATHS=extended_locale_paths): + with override('es-ar'): + response = self.client.get('/views/jsi18n/') + self.assertContains(response, + javascript_quote('este texto de app3 debe ser traducido'))