Kaydet (Commit) e80636b6 authored tarafından Łukasz Langa's avatar Łukasz Langa

Added TransRealMixin to fix i18n global state pollution in the test suite

üst 413735b2
from threading import local
class TransRealMixin(object):
"""This is the only way to reset the translation machinery. Otherwise
the test suite occasionally fails because of global state pollution
between tests."""
def flush_caches(self):
from django.utils.translation import trans_real
trans_real._translations = {}
trans_real._active = local()
trans_real._default = None
trans_real._accepted = {}
def tearDown(self):
self.flush_caches()
super(TransRealMixin, self).tearDown()
...@@ -10,6 +10,8 @@ from django.utils._os import upath ...@@ -10,6 +10,8 @@ from django.utils._os import upath
from django.utils import six from django.utils import six
from django.utils import translation from django.utils import translation
from i18n import TransRealMixin
@override_settings( @override_settings(
USE_I18N=True, USE_I18N=True,
...@@ -22,7 +24,7 @@ from django.utils import translation ...@@ -22,7 +24,7 @@ from django.utils import translation
('fr', 'French'), ('fr', 'French'),
), ),
) )
class ContentTypeTests(TestCase): class ContentTypeTests(TransRealMixin, TestCase):
def test_verbose_name(self): def test_verbose_name(self):
company_type = ContentType.objects.get(app_label='i18n', model='company') company_type = ContentType.objects.get(app_label='i18n', model='company')
with translation.override('en'): with translation.override('en'):
......
...@@ -44,6 +44,7 @@ if can_run_compilation_tests: ...@@ -44,6 +44,7 @@ if can_run_compilation_tests:
from .commands.compilation import (PoFileTests, PoFileContentsTests, from .commands.compilation import (PoFileTests, PoFileContentsTests,
PercentRenderingTests, MultipleLocaleCompilationTests, PercentRenderingTests, MultipleLocaleCompilationTests,
CompilationErrorHandling) CompilationErrorHandling)
from . import TransRealMixin
from .forms import I18nForm, SelectDateForm, SelectDateWidget, CompanyForm from .forms import I18nForm, SelectDateForm, SelectDateWidget, CompanyForm
from .models import Company, TestModel from .models import Company, TestModel
...@@ -53,7 +54,8 @@ extended_locale_paths = settings.LOCALE_PATHS + ( ...@@ -53,7 +54,8 @@ extended_locale_paths = settings.LOCALE_PATHS + (
os.path.join(here, 'other', 'locale'), os.path.join(here, 'other', 'locale'),
) )
class TranslationTests(TestCase):
class TranslationTests(TransRealMixin, TestCase):
def test_override(self): def test_override(self):
activate('de') activate('de')
...@@ -335,6 +337,8 @@ class TranslationTests(TestCase): ...@@ -335,6 +337,8 @@ class TranslationTests(TestCase):
class TranslationThreadSafetyTests(TestCase): class TranslationThreadSafetyTests(TestCase):
"""Specifically not using TransRealMixin here to test threading."""
def setUp(self): def setUp(self):
self._old_language = get_language() self._old_language = get_language()
self._translations = trans_real._translations self._translations = trans_real._translations
...@@ -365,9 +369,10 @@ class TranslationThreadSafetyTests(TestCase): ...@@ -365,9 +369,10 @@ class TranslationThreadSafetyTests(TestCase):
@override_settings(USE_L10N=True) @override_settings(USE_L10N=True)
class FormattingTests(TestCase): class FormattingTests(TransRealMixin, TestCase):
def setUp(self): def setUp(self):
super(FormattingTests, self).setUp()
self.n = decimal.Decimal('66666.666') self.n = decimal.Decimal('66666.666')
self.f = 99999.999 self.f = 99999.999
self.d = datetime.date(2009, 12, 31) self.d = datetime.date(2009, 12, 31)
...@@ -769,9 +774,10 @@ class FormattingTests(TestCase): ...@@ -769,9 +774,10 @@ class FormattingTests(TestCase):
self.assertEqual(template2.render(context), output2) self.assertEqual(template2.render(context), output2)
self.assertEqual(template3.render(context), output3) self.assertEqual(template3.render(context), output3)
class MiscTests(TestCase): class MiscTests(TransRealMixin, TestCase):
def setUp(self): def setUp(self):
super(MiscTests, self).setUp()
self.rf = RequestFactory() self.rf = RequestFactory()
def test_parse_spec_http_header(self): def test_parse_spec_http_header(self):
...@@ -915,17 +921,15 @@ class MiscTests(TestCase): ...@@ -915,17 +921,15 @@ class MiscTests(TestCase):
self.assertEqual(t_plur.render(Context({'percent': 42, 'num': 4})), '%(percent)s% represents 4 objects') self.assertEqual(t_plur.render(Context({'percent': 42, 'num': 4})), '%(percent)s% represents 4 objects')
class ResolutionOrderI18NTests(TestCase): class ResolutionOrderI18NTests(TransRealMixin, TestCase):
def setUp(self): def setUp(self):
# Okay, this is brutal, but we have no other choice to fully reset super(ResolutionOrderI18NTests, self).setUp()
# the translation framework
trans_real._active = local()
trans_real._translations = {}
activate('de') activate('de')
def tearDown(self): def tearDown(self):
deactivate() deactivate()
super(ResolutionOrderI18NTests, self).tearDown()
def assertUgettext(self, msgid, msgstr): def assertUgettext(self, msgid, msgstr):
result = ugettext(msgid) result = ugettext(msgid)
...@@ -998,15 +1002,17 @@ class TestLanguageInfo(TestCase): ...@@ -998,15 +1002,17 @@ class TestLanguageInfo(TestCase):
six.assertRaisesRegex(self, KeyError, r"Unknown language code xx-xx and xx\.", get_language_info, 'xx-xx') six.assertRaisesRegex(self, KeyError, r"Unknown language code xx-xx and xx\.", get_language_info, 'xx-xx')
class MultipleLocaleActivationTests(TestCase): class MultipleLocaleActivationTests(TransRealMixin, TestCase):
""" """
Tests for template rendering behavior when multiple locales are activated Tests for template rendering behavior when multiple locales are activated
during the lifetime of the same process. during the lifetime of the same process.
""" """
def setUp(self): def setUp(self):
super(MultipleLocaleActivationTests, self).setUp()
self._old_language = get_language() self._old_language = get_language()
def tearDown(self): def tearDown(self):
super(MultipleLocaleActivationTests, self).tearDown()
activate(self._old_language) activate(self._old_language)
def test_single_locale_activation(self): def test_single_locale_activation(self):
...@@ -1135,7 +1141,7 @@ class MultipleLocaleActivationTests(TestCase): ...@@ -1135,7 +1141,7 @@ class MultipleLocaleActivationTests(TestCase):
'django.middleware.common.CommonMiddleware', 'django.middleware.common.CommonMiddleware',
), ),
) )
class LocaleMiddlewareTests(TestCase): class LocaleMiddlewareTests(TransRealMixin, TestCase):
urls = 'i18n.urls' urls = 'i18n.urls'
...@@ -1157,12 +1163,12 @@ class LocaleMiddlewareTests(TestCase): ...@@ -1157,12 +1163,12 @@ class LocaleMiddlewareTests(TestCase):
'django.middleware.common.CommonMiddleware', 'django.middleware.common.CommonMiddleware',
), ),
) )
class CountrySpecificLanguageTests(TestCase): class CountrySpecificLanguageTests(TransRealMixin, TestCase):
urls = 'i18n.urls' urls = 'i18n.urls'
def setUp(self): def setUp(self):
trans_real._accepted = {} super(CountrySpecificLanguageTests, self).setUp()
self.rf = RequestFactory() self.rf = RequestFactory()
def test_check_for_language(self): def test_check_for_language(self):
...@@ -1172,6 +1178,7 @@ class CountrySpecificLanguageTests(TestCase): ...@@ -1172,6 +1178,7 @@ class CountrySpecificLanguageTests(TestCase):
def test_get_language_from_request(self): def test_get_language_from_request(self):
# issue 19919
r = self.rf.get('/') r = self.rf.get('/')
r.COOKIES = {} r.COOKIES = {}
r.META = {'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.8,bg;q=0.6,ru;q=0.4'} r.META = {'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.8,bg;q=0.6,ru;q=0.4'}
......
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