Opened 2 years ago

Closed 2 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.Client to restore the initial process locale after the request — or add that to the default TestCase tear-down;
  • Server-side fix find a way to deactivate the translation context when it is safe to do so.

Change History (1)

comment:1 by Carlton Gibson, 2 years ago

Resolution: duplicate
Status: newclosed

Duplicate of #34180

Note: See TracTickets for help on using tickets.
Back to Top