Opened 3 years ago
Closed 3 years ago
#34181 closed Bug (duplicate)
The active locale context can leak across tests when using LocaleMiddleware
| Reported by: | Raphaël Barrois | Owned by: | nobody |
|---|---|---|---|
| Component: | Internationalization | Version: | 4.1 |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
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.Clientto restore the initial process locale after the request — or add that to the defaultTestCasetear-down; - Server-side fix find a way to deactivate the translation context when it is safe to do so.
Duplicate of #34180