test_locale_model.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from django.conf import settings
  2. from django.test import TestCase, override_settings
  3. from django.utils import translation
  4. from django.utils.translation import gettext_lazy as _
  5. from wagtail.core.models import Locale, Page
  6. from wagtail.tests.i18n.models import TestPage
  7. def make_test_page(**kwargs):
  8. root_page = Page.objects.get(id=1)
  9. kwargs.setdefault("title", "Test page")
  10. return root_page.add_child(instance=TestPage(**kwargs))
  11. class TestLocaleModel(TestCase):
  12. def setUp(self):
  13. language_codes = dict(settings.LANGUAGES).keys()
  14. for language_code in language_codes:
  15. Locale.objects.get_or_create(language_code=language_code)
  16. def test_default(self):
  17. locale = Locale.get_default()
  18. self.assertEqual(locale.language_code, "en")
  19. @override_settings(LANGUAGE_CODE="fr-ca")
  20. def test_default_doesnt_have_to_be_english(self):
  21. locale = Locale.get_default()
  22. self.assertEqual(locale.language_code, "fr")
  23. def test_get_active_default(self):
  24. self.assertEqual(Locale.get_active().language_code, "en")
  25. def test_get_active_overridden(self):
  26. with translation.override("fr"):
  27. self.assertEqual(Locale.get_active().language_code, "fr")
  28. def test_get_display_name(self):
  29. locale = Locale.objects.get(language_code="en")
  30. self.assertEqual(locale.get_display_name(), "English")
  31. def test_get_display_name_for_unconfigured_language(self):
  32. # This language is not in LANGUAGES so it should just return the language code
  33. locale = Locale.objects.create(language_code="foo")
  34. self.assertIsNone(locale.get_display_name())
  35. def test_str(self):
  36. locale = Locale.objects.get(language_code="en")
  37. self.assertEqual(str(locale), "English")
  38. def test_str_for_unconfigured_language(self):
  39. # This language is not in LANGUAGES so it should just return the language code
  40. locale = Locale.objects.create(language_code="foo")
  41. self.assertEqual(str(locale), "foo")
  42. @override_settings(LANGUAGES=[("en", _("English")), ("fr", _("French"))])
  43. def test_str_when_languages_uses_gettext(self):
  44. locale = Locale.objects.get(language_code="en")
  45. self.assertIsInstance(locale.__str__(), str)
  46. @override_settings(LANGUAGE_CODE="fr")
  47. def test_change_root_page_locale_on_locale_deletion(self):
  48. """
  49. On deleting the locale used for the root page (but no 'real' pages), the
  50. root page should be reassigned to a new locale (the default one, if possible)
  51. """
  52. # change 'real' pages first
  53. Page.objects.filter(depth__gt=1).update(locale=Locale.objects.get(language_code="fr"))
  54. self.assertEqual(Page.get_first_root_node().locale.language_code, "en")
  55. Locale.objects.get(language_code="en").delete()
  56. self.assertEqual(Page.get_first_root_node().locale.language_code, "fr")