test_localeregexdescriptor.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import os
  2. from unittest import mock
  3. from django.core.exceptions import ImproperlyConfigured
  4. from django.test import SimpleTestCase, override_settings
  5. from django.urls.resolvers import LocaleRegexDescriptor, RegexPattern
  6. from django.utils import translation
  7. here = os.path.dirname(os.path.abspath(__file__))
  8. @override_settings(LOCALE_PATHS=[os.path.join(here, 'translations', 'locale')])
  9. class LocaleRegexDescriptorTests(SimpleTestCase):
  10. def setUp(self):
  11. translation.trans_real._translations = {}
  12. def tearDown(self):
  13. translation.trans_real._translations = {}
  14. def test_translated_regex_compiled_per_language(self):
  15. provider = RegexPattern(translation.gettext_lazy('^foo/$'))
  16. with translation.override('de'):
  17. de_compiled = provider.regex
  18. # compiled only once per language
  19. error = AssertionError('tried to compile url regex twice for the same language')
  20. with mock.patch('django.urls.resolvers.re.compile', side_effect=error):
  21. de_compiled_2 = provider.regex
  22. with translation.override('fr'):
  23. fr_compiled = provider.regex
  24. self.assertEqual(fr_compiled.pattern, '^foo-fr/$')
  25. self.assertEqual(de_compiled.pattern, '^foo-de/$')
  26. self.assertEqual(de_compiled, de_compiled_2)
  27. def test_nontranslated_regex_compiled_once(self):
  28. provider = RegexPattern('^foo/$')
  29. with translation.override('de'):
  30. de_compiled = provider.regex
  31. with translation.override('fr'):
  32. # compiled only once, regardless of language
  33. error = AssertionError('tried to compile non-translated url regex twice')
  34. with mock.patch('django.urls.resolvers.re.compile', side_effect=error):
  35. fr_compiled = provider.regex
  36. self.assertEqual(de_compiled.pattern, '^foo/$')
  37. self.assertEqual(fr_compiled.pattern, '^foo/$')
  38. def test_regex_compile_error(self):
  39. """Regex errors are re-raised as ImproperlyConfigured."""
  40. provider = RegexPattern('*')
  41. msg = '"*" is not a valid regular expression: nothing to repeat'
  42. with self.assertRaisesMessage(ImproperlyConfigured, msg):
  43. provider.regex
  44. def test_access_locale_regex_descriptor(self):
  45. self.assertIsInstance(RegexPattern.regex, LocaleRegexDescriptor)