tests.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. from __future__ import with_statement
  2. import os
  3. import warnings
  4. from django.core.exceptions import ImproperlyConfigured
  5. from django.core.urlresolvers import reverse, clear_url_caches
  6. from django.test import TestCase
  7. from django.test.utils import override_settings
  8. from django.template import Template, Context
  9. from django.utils import translation
  10. class URLTestCaseBase(TestCase):
  11. """
  12. TestCase base-class for the URL tests.
  13. """
  14. urls = 'regressiontests.i18n.patterns.urls.default'
  15. def setUp(self):
  16. # Make sure the cache is empty before we are doing our tests.
  17. clear_url_caches()
  18. def tearDown(self):
  19. # Make sure we will leave an empty cache for other testcases.
  20. clear_url_caches()
  21. URLTestCaseBase = override_settings(
  22. USE_I18N=True,
  23. LOCALE_PATHS=(
  24. os.path.join(os.path.dirname(__file__), 'locale'),
  25. ),
  26. TEMPLATE_DIRS=(
  27. os.path.join(os.path.dirname(__file__), 'templates'),
  28. ),
  29. LANGUAGE_CODE='en',
  30. LANGUAGES=(
  31. ('nl', 'Dutch'),
  32. ('en', 'English'),
  33. ('pt-br', 'Brazilian Portuguese'),
  34. ),
  35. MIDDLEWARE_CLASSES=(
  36. 'django.middleware.locale.LocaleMiddleware',
  37. 'django.middleware.common.CommonMiddleware',
  38. ),
  39. )(URLTestCaseBase)
  40. class URLPrefixTests(URLTestCaseBase):
  41. """
  42. Tests if the `i18n_patterns` is adding the prefix correctly.
  43. """
  44. def test_not_prefixed(self):
  45. with translation.override('en'):
  46. self.assertEqual(reverse('not-prefixed'), '/not-prefixed/')
  47. with translation.override('nl'):
  48. self.assertEqual(reverse('not-prefixed'), '/not-prefixed/')
  49. def test_prefixed(self):
  50. with translation.override('en'):
  51. self.assertEqual(reverse('prefixed'), '/en/prefixed/')
  52. with translation.override('nl'):
  53. self.assertEqual(reverse('prefixed'), '/nl/prefixed/')
  54. @override_settings(ROOT_URLCONF='regressiontests.i18n.patterns.urls.wrong')
  55. def test_invalid_prefix_use(self):
  56. self.assertRaises(ImproperlyConfigured, lambda: reverse('account:register'))
  57. class URLDisabledTests(URLTestCaseBase):
  58. urls = 'regressiontests.i18n.patterns.urls.disabled'
  59. @override_settings(USE_I18N=False)
  60. def test_prefixed_i18n_disabled(self):
  61. with translation.override('en'):
  62. self.assertEqual(reverse('prefixed'), '/prefixed/')
  63. with translation.override('nl'):
  64. self.assertEqual(reverse('prefixed'), '/prefixed/')
  65. class PathUnusedTests(URLTestCaseBase):
  66. """
  67. Check that if no i18n_patterns is used in root urlconfs, then no
  68. language activation happens based on url prefix.
  69. """
  70. urls = 'regressiontests.i18n.patterns.urls.path_unused'
  71. def test_no_lang_activate(self):
  72. response = self.client.get('/nl/foo/')
  73. self.assertEqual(response.status_code, 200)
  74. self.assertEqual(response['content-language'], 'en')
  75. self.assertEqual(response.context['LANGUAGE_CODE'], 'en')
  76. class URLTranslationTests(URLTestCaseBase):
  77. """
  78. Tests if the pattern-strings are translated correctly (within the
  79. `i18n_patterns` and the normal `patterns` function).
  80. """
  81. def test_no_prefix_translated(self):
  82. with translation.override('en'):
  83. self.assertEqual(reverse('no-prefix-translated'), '/translated/')
  84. self.assertEqual(reverse('no-prefix-translated-slug', kwargs={'slug': 'yeah'}), '/translated/yeah/')
  85. with translation.override('nl'):
  86. self.assertEqual(reverse('no-prefix-translated'), '/vertaald/')
  87. self.assertEqual(reverse('no-prefix-translated-slug', kwargs={'slug': 'yeah'}), '/vertaald/yeah/')
  88. with translation.override('pt-br'):
  89. self.assertEqual(reverse('no-prefix-translated'), '/traduzidos/')
  90. self.assertEqual(reverse('no-prefix-translated-slug', kwargs={'slug': 'yeah'}), '/traduzidos/yeah/')
  91. def test_users_url(self):
  92. with translation.override('en'):
  93. self.assertEqual(reverse('users'), '/en/users/')
  94. with translation.override('nl'):
  95. self.assertEqual(reverse('users'), '/nl/gebruikers/')
  96. with translation.override('pt-br'):
  97. self.assertEqual(reverse('users'), '/pt-br/usuarios/')
  98. class URLNamespaceTests(URLTestCaseBase):
  99. """
  100. Tests if the translations are still working within namespaces.
  101. """
  102. def test_account_register(self):
  103. with translation.override('en'):
  104. self.assertEqual(reverse('account:register'), '/en/account/register/')
  105. with translation.override('nl'):
  106. self.assertEqual(reverse('account:register'), '/nl/profiel/registeren/')
  107. class URLRedirectTests(URLTestCaseBase):
  108. """
  109. Tests if the user gets redirected to the right URL when there is no
  110. language-prefix in the request URL.
  111. """
  112. def test_no_prefix_response(self):
  113. response = self.client.get('/not-prefixed/')
  114. self.assertEqual(response.status_code, 200)
  115. def test_en_redirect(self):
  116. response = self.client.get('/account/register/', HTTP_ACCEPT_LANGUAGE='en')
  117. self.assertRedirects(response, 'http://testserver/en/account/register/')
  118. response = self.client.get(response['location'])
  119. self.assertEqual(response.status_code, 200)
  120. def test_en_redirect_wrong_url(self):
  121. response = self.client.get('/profiel/registeren/', HTTP_ACCEPT_LANGUAGE='en')
  122. self.assertEqual(response.status_code, 302)
  123. self.assertEqual(response['location'], 'http://testserver/en/profiel/registeren/')
  124. response = self.client.get(response['location'])
  125. self.assertEqual(response.status_code, 404)
  126. def test_nl_redirect(self):
  127. response = self.client.get('/profiel/registeren/', HTTP_ACCEPT_LANGUAGE='nl')
  128. self.assertRedirects(response, 'http://testserver/nl/profiel/registeren/')
  129. response = self.client.get(response['location'])
  130. self.assertEqual(response.status_code, 200)
  131. def test_nl_redirect_wrong_url(self):
  132. response = self.client.get('/account/register/', HTTP_ACCEPT_LANGUAGE='nl')
  133. self.assertEqual(response.status_code, 302)
  134. self.assertEqual(response['location'], 'http://testserver/nl/account/register/')
  135. response = self.client.get(response['location'])
  136. self.assertEqual(response.status_code, 404)
  137. def test_pt_br_redirect(self):
  138. response = self.client.get('/conta/registre-se/', HTTP_ACCEPT_LANGUAGE='pt-br')
  139. self.assertRedirects(response, 'http://testserver/pt-br/conta/registre-se/')
  140. response = self.client.get(response['location'])
  141. self.assertEqual(response.status_code, 200)
  142. class URLRedirectWithoutTrailingSlashTests(URLTestCaseBase):
  143. """
  144. Tests the redirect when the requested URL doesn't end with a slash
  145. (`settings.APPEND_SLASH=True`).
  146. """
  147. def test_not_prefixed_redirect(self):
  148. response = self.client.get('/not-prefixed', HTTP_ACCEPT_LANGUAGE='en')
  149. self.assertEqual(response.status_code, 301)
  150. self.assertEqual(response['location'], 'http://testserver/not-prefixed/')
  151. def test_en_redirect(self):
  152. response = self.client.get('/account/register', HTTP_ACCEPT_LANGUAGE='en')
  153. self.assertEqual(response.status_code, 302)
  154. self.assertEqual(response['location'], 'http://testserver/en/account/register')
  155. response = self.client.get(response['location'])
  156. self.assertEqual(response.status_code, 301)
  157. self.assertEqual(response['location'], 'http://testserver/en/account/register/')
  158. class URLRedirectWithoutTrailingSlashSettingTests(URLTestCaseBase):
  159. """
  160. Tests the redirect when the requested URL doesn't end with a slash
  161. (`settings.APPEND_SLASH=False`).
  162. """
  163. @override_settings(APPEND_SLASH=False)
  164. def test_not_prefixed_redirect(self):
  165. response = self.client.get('/not-prefixed', HTTP_ACCEPT_LANGUAGE='en')
  166. self.assertEqual(response.status_code, 302)
  167. self.assertEqual(response['location'], 'http://testserver/en/not-prefixed')
  168. response = self.client.get(response['location'])
  169. self.assertEqual(response.status_code, 404)
  170. @override_settings(APPEND_SLASH=False)
  171. def test_en_redirect(self):
  172. response = self.client.get('/account/register', HTTP_ACCEPT_LANGUAGE='en')
  173. self.assertEqual(response.status_code, 302)
  174. self.assertEqual(response['location'], 'http://testserver/en/account/register')
  175. response = self.client.get(response['location'])
  176. self.assertEqual(response.status_code, 404)
  177. class URLResponseTests(URLTestCaseBase):
  178. """
  179. Tests if the response has the right language-code.
  180. """
  181. def test_not_prefixed_with_prefix(self):
  182. response = self.client.get('/en/not-prefixed/')
  183. self.assertEqual(response.status_code, 404)
  184. def test_en_url(self):
  185. response = self.client.get('/en/account/register/')
  186. self.assertEqual(response.status_code, 200)
  187. self.assertEqual(response['content-language'], 'en')
  188. self.assertEqual(response.context['LANGUAGE_CODE'], 'en')
  189. def test_nl_url(self):
  190. response = self.client.get('/nl/profiel/registeren/')
  191. self.assertEqual(response.status_code, 200)
  192. self.assertEqual(response['content-language'], 'nl')
  193. self.assertEqual(response.context['LANGUAGE_CODE'], 'nl')
  194. def test_wrong_en_prefix(self):
  195. response = self.client.get('/en/profiel/registeren/')
  196. self.assertEqual(response.status_code, 404)
  197. def test_wrong_nl_prefix(self):
  198. response = self.client.get('/nl/account/register/')
  199. self.assertEqual(response.status_code, 404)
  200. def test_pt_br_url(self):
  201. response = self.client.get('/pt-br/conta/registre-se/')
  202. self.assertEqual(response.status_code, 200)
  203. self.assertEqual(response['content-language'], 'pt-br')
  204. self.assertEqual(response.context['LANGUAGE_CODE'], 'pt-br')
  205. class URLTagTests(URLTestCaseBase):
  206. """
  207. Test if the language tag works.
  208. """
  209. def setUp(self):
  210. self.save_warnings_state()
  211. warnings.filterwarnings('ignore', category=DeprecationWarning,
  212. module='django.template.defaulttags')
  213. def tearDown(self):
  214. self.restore_warnings_state()
  215. def test_strings_only(self):
  216. t = Template("""{% load i18n %}
  217. {% language 'nl' %}{% url no-prefix-translated %}{% endlanguage %}
  218. {% language 'pt-br' %}{% url no-prefix-translated %}{% endlanguage %}""")
  219. self.assertEqual(t.render(Context({})).strip().split(),
  220. [u'/vertaald/', u'/traduzidos/'])
  221. def test_context(self):
  222. ctx = Context({'lang1':'nl', 'lang2':'pt-br'})
  223. tpl = Template("""{% load i18n %}
  224. {% language lang1 %}{% url no-prefix-translated %}{% endlanguage %}
  225. {% language lang2 %}{% url no-prefix-translated %}{% endlanguage %}""")
  226. self.assertEqual(tpl.render(ctx).strip().split(),
  227. [u'/vertaald/', u'/traduzidos/'])
  228. def test_args(self):
  229. tpl = Template("""{% load i18n %}
  230. {% language 'nl' %}{% url no-prefix-translated-slug 'apo' %}{% endlanguage %}
  231. {% language 'pt-br' %}{% url no-prefix-translated-slug 'apo' %}{% endlanguage %}""")
  232. self.assertEqual(tpl.render(Context({})).strip().split(),
  233. [u'/vertaald/apo/', u'/traduzidos/apo/'])
  234. def test_kwargs(self):
  235. tpl = Template("""{% load i18n %}
  236. {% language 'nl' %}{% url no-prefix-translated-slug slug='apo' %}{% endlanguage %}
  237. {% language 'pt-br' %}{% url no-prefix-translated-slug slug='apo' %}{% endlanguage %}""")
  238. self.assertEqual(tpl.render(Context({})).strip().split(),
  239. [u'/vertaald/apo/', u'/traduzidos/apo/'])
  240. def test_future_kwargs(self):
  241. tpl = Template("""{% load i18n %}{% load url from future %}
  242. {% language 'nl' %}{% url 'no-prefix-translated-slug' slug='apo' %}{% endlanguage %}
  243. {% language 'pt-br' %}{% url 'no-prefix-translated-slug' slug='apo' %}{% endlanguage %}""")
  244. self.assertEqual(tpl.render(Context({})).strip().split(),
  245. [u'/vertaald/apo/', u'/traduzidos/apo/'])