test_localeregexprovider.py 2.4 KB

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