Opened 2 years ago
Closed 2 years ago
#34181 closed Bug (duplicate)
The active locale context can leak across tests when using LocaleMiddleware
Description ¶
Django's LocaleMiddleware only activates a translation, but doesn't deactivate it since #5241 / https://github.com/django/django/commit/aa089b106b6cfc9a47cd54a0f9eb44bd44811ed9.
This has an unwanted side-effect in tests:
class I18NTests(django.test.TestCase): def test_lang(self): response = self.client.get("/", HTTP_LANGUAGE="fr-FR") def test_unrelated(self): # This value returns a string marked for translation context = some_helper() self.assertEqual("Hello folks", str(context["greeting"]))
If test_lang
runs last, the test suite will succeed.
However, if test_lang
runs before the other, the test suite will fail: the locale context will still be set to fr
from the execution of LocaleMiddleware
.
Most project with i18n enabled assume that all tests run under the project's default locale (i.e LANGUAGE_CODE
), yet running some tests in other languages will fail.
I can think of a few ways to address this:
- Documentation Explain that tests should never check the text value of a returned function without setting an explicit translation context (but that's not exactly intuitive for users);
- Test-side fix Adjust
django.test.Client
to restore the initial process locale after the request — or add that to the defaultTestCase
tear-down; - Server-side fix find a way to deactivate the translation context when it is safe to do so.
Duplicate of #34180