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

This commit is contained in:
Łukasz Langa 2013-05-19 11:44:46 +02:00
parent 413735b239
commit e80636b668
3 changed files with 39 additions and 13 deletions

View File

@ -0,0 +1,17 @@
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()

View File

@ -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
('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'):

View File

@ -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 + (
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):
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):
@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):
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):
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):
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):
'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):
'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):
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'}