test_url.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. # coding: utf-8
  2. from django.core.urlresolvers import NoReverseMatch, resolve
  3. from django.template import RequestContext, TemplateSyntaxError
  4. from django.test import (
  5. RequestFactory, SimpleTestCase, ignore_warnings, override_settings,
  6. )
  7. from django.utils.deprecation import RemovedInDjango110Warning
  8. from ..utils import setup
  9. @override_settings(ROOT_URLCONF='template_tests.urls')
  10. class UrlTagTests(SimpleTestCase):
  11. # Successes
  12. @ignore_warnings(category=RemovedInDjango110Warning)
  13. @setup({'url01': '{% url "template_tests.views.client" client.id %}'})
  14. def test_url01(self):
  15. output = self.engine.render_to_string('url01', {'client': {'id': 1}})
  16. self.assertEqual(output, '/client/1/')
  17. @ignore_warnings(category=RemovedInDjango110Warning)
  18. @setup({'url02': '{% url "template_tests.views.client_action" id=client.id action="update" %}'})
  19. def test_url02(self):
  20. output = self.engine.render_to_string('url02', {'client': {'id': 1}})
  21. self.assertEqual(output, '/client/1/update/')
  22. @ignore_warnings(category=RemovedInDjango110Warning)
  23. @setup({'url02a': '{% url "template_tests.views.client_action" client.id "update" %}'})
  24. def test_url02a(self):
  25. output = self.engine.render_to_string('url02a', {'client': {'id': 1}})
  26. self.assertEqual(output, '/client/1/update/')
  27. @ignore_warnings(category=RemovedInDjango110Warning)
  28. @setup({'url02b': "{% url 'template_tests.views.client_action' id=client.id action='update' %}"})
  29. def test_url02b(self):
  30. output = self.engine.render_to_string('url02b', {'client': {'id': 1}})
  31. self.assertEqual(output, '/client/1/update/')
  32. @ignore_warnings(category=RemovedInDjango110Warning)
  33. @setup({'url02c': "{% url 'template_tests.views.client_action' client.id 'update' %}"})
  34. def test_url02c(self):
  35. output = self.engine.render_to_string('url02c', {'client': {'id': 1}})
  36. self.assertEqual(output, '/client/1/update/')
  37. @ignore_warnings(category=RemovedInDjango110Warning)
  38. @setup({'url03': '{% url "template_tests.views.index" %}'})
  39. def test_url03(self):
  40. output = self.engine.render_to_string('url03')
  41. self.assertEqual(output, '/')
  42. @setup({'url04': '{% url "named.client" client.id %}'})
  43. def test_url04(self):
  44. output = self.engine.render_to_string('url04', {'client': {'id': 1}})
  45. self.assertEqual(output, '/named-client/1/')
  46. @setup({'url05': '{% url "метка_оператора" v %}'})
  47. def test_url05(self):
  48. output = self.engine.render_to_string('url05', {'v': 'Ω'})
  49. self.assertEqual(output, '/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/')
  50. @setup({'url06': '{% url "метка_оператора_2" tag=v %}'})
  51. def test_url06(self):
  52. output = self.engine.render_to_string('url06', {'v': 'Ω'})
  53. self.assertEqual(output, '/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/')
  54. @ignore_warnings(category=RemovedInDjango110Warning)
  55. @setup({'url07': '{% url "template_tests.views.client2" tag=v %}'})
  56. def test_url07(self):
  57. output = self.engine.render_to_string('url07', {'v': 'Ω'})
  58. self.assertEqual(output, '/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/')
  59. @setup({'url08': '{% url "метка_оператора" v %}'})
  60. def test_url08(self):
  61. output = self.engine.render_to_string('url08', {'v': 'Ω'})
  62. self.assertEqual(output, '/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/')
  63. @setup({'url09': '{% url "метка_оператора_2" tag=v %}'})
  64. def test_url09(self):
  65. output = self.engine.render_to_string('url09', {'v': 'Ω'})
  66. self.assertEqual(output, '/%D0%AE%D0%BD%D0%B8%D0%BA%D0%BE%D0%B4/%CE%A9/')
  67. @ignore_warnings(category=RemovedInDjango110Warning)
  68. @setup({'url10': '{% url "template_tests.views.client_action" id=client.id action="two words" %}'})
  69. def test_url10(self):
  70. output = self.engine.render_to_string('url10', {'client': {'id': 1}})
  71. self.assertEqual(output, '/client/1/two%20words/')
  72. @ignore_warnings(category=RemovedInDjango110Warning)
  73. @setup({'url11': '{% url "template_tests.views.client_action" id=client.id action="==" %}'})
  74. def test_url11(self):
  75. output = self.engine.render_to_string('url11', {'client': {'id': 1}})
  76. self.assertEqual(output, '/client/1/==/')
  77. @setup({'url12': '{% url "template_tests.views.client_action" '
  78. 'id=client.id action="!$&\'()*+,;=~:@," %}'})
  79. @ignore_warnings(category=RemovedInDjango110Warning)
  80. def test_url12(self):
  81. output = self.engine.render_to_string('url12', {'client': {'id': 1}})
  82. self.assertEqual(output, '/client/1/!$&'()*+,;=~:@,/')
  83. @ignore_warnings(category=RemovedInDjango110Warning)
  84. @setup({'url13': '{% url "template_tests.views.client_action" '
  85. 'id=client.id action=arg|join:"-" %}'})
  86. def test_url13(self):
  87. output = self.engine.render_to_string('url13', {'client': {'id': 1}, 'arg': ['a', 'b']})
  88. self.assertEqual(output, '/client/1/a-b/')
  89. @ignore_warnings(category=RemovedInDjango110Warning)
  90. @setup({'url14': '{% url "template_tests.views.client_action" client.id arg|join:"-" %}'})
  91. def test_url14(self):
  92. output = self.engine.render_to_string('url14', {'client': {'id': 1}, 'arg': ['a', 'b']})
  93. self.assertEqual(output, '/client/1/a-b/')
  94. @ignore_warnings(category=RemovedInDjango110Warning)
  95. @setup({'url15': '{% url "template_tests.views.client_action" 12 "test" %}'})
  96. def test_url15(self):
  97. output = self.engine.render_to_string('url15')
  98. self.assertEqual(output, '/client/12/test/')
  99. @ignore_warnings(category=RemovedInDjango110Warning)
  100. @setup({'url18': '{% url "template_tests.views.client" "1,2" %}'})
  101. def test_url18(self):
  102. output = self.engine.render_to_string('url18')
  103. self.assertEqual(output, '/client/1,2/')
  104. @ignore_warnings(category=RemovedInDjango110Warning)
  105. @setup({'url19': '{% url named_url client.id %}'})
  106. def test_url19(self):
  107. output = self.engine.render_to_string('url19', {'client': {'id': 1}, 'named_url': 'template_tests.views.client'})
  108. self.assertEqual(output, '/client/1/')
  109. @setup({'url20': '{% url url_name_in_var client.id %}'})
  110. def test_url20(self):
  111. output = self.engine.render_to_string('url20', {'client': {'id': 1}, 'url_name_in_var': 'named.client'})
  112. self.assertEqual(output, '/named-client/1/')
  113. @setup({'url21': '{% autoescape off %}'
  114. '{% url "template_tests.views.client_action" '
  115. 'id=client.id action="!$&\'()*+,;=~:@," %}'
  116. '{% endautoescape %}'})
  117. @ignore_warnings(category=RemovedInDjango110Warning)
  118. def test_url21(self):
  119. output = self.engine.render_to_string('url21', {'client': {'id': 1}})
  120. self.assertEqual(output, '/client/1/!$&\'()*+,;=~:@,/')
  121. # Failures
  122. @setup({'url-fail01': '{% url %}'})
  123. def test_url_fail01(self):
  124. with self.assertRaises(TemplateSyntaxError):
  125. self.engine.get_template('url-fail01')
  126. @setup({'url-fail02': '{% url "no_such_view" %}'})
  127. def test_url_fail02(self):
  128. with self.assertRaises(NoReverseMatch):
  129. self.engine.render_to_string('url-fail02')
  130. @ignore_warnings(category=RemovedInDjango110Warning)
  131. @setup({'url-fail03': '{% url "template_tests.views.client" %}'})
  132. def test_url_fail03(self):
  133. with self.assertRaises(NoReverseMatch):
  134. self.engine.render_to_string('url-fail03')
  135. @setup({'url-fail04': '{% url "view" id, %}'})
  136. def test_url_fail04(self):
  137. with self.assertRaises(TemplateSyntaxError):
  138. self.engine.get_template('url-fail04')
  139. @setup({'url-fail05': '{% url "view" id= %}'})
  140. def test_url_fail05(self):
  141. with self.assertRaises(TemplateSyntaxError):
  142. self.engine.get_template('url-fail05')
  143. @setup({'url-fail06': '{% url "view" a.id=id %}'})
  144. def test_url_fail06(self):
  145. with self.assertRaises(TemplateSyntaxError):
  146. self.engine.get_template('url-fail06')
  147. @setup({'url-fail07': '{% url "view" a.id!id %}'})
  148. def test_url_fail07(self):
  149. with self.assertRaises(TemplateSyntaxError):
  150. self.engine.get_template('url-fail07')
  151. @setup({'url-fail08': '{% url "view" id="unterminatedstring %}'})
  152. def test_url_fail08(self):
  153. with self.assertRaises(TemplateSyntaxError):
  154. self.engine.get_template('url-fail08')
  155. @setup({'url-fail09': '{% url "view" id=", %}'})
  156. def test_url_fail09(self):
  157. with self.assertRaises(TemplateSyntaxError):
  158. self.engine.get_template('url-fail09')
  159. @setup({'url-fail11': '{% url named_url %}'})
  160. def test_url_fail11(self):
  161. with self.assertRaises(NoReverseMatch):
  162. self.engine.render_to_string('url-fail11')
  163. @setup({'url-fail12': '{% url named_url %}'})
  164. def test_url_fail12(self):
  165. with self.assertRaises(NoReverseMatch):
  166. self.engine.render_to_string('url-fail12', {'named_url': 'no_such_view'})
  167. @ignore_warnings(category=RemovedInDjango110Warning)
  168. @setup({'url-fail13': '{% url named_url %}'})
  169. def test_url_fail13(self):
  170. with self.assertRaises(NoReverseMatch):
  171. self.engine.render_to_string('url-fail13', {'named_url': 'template_tests.views.client'})
  172. @setup({'url-fail14': '{% url named_url id, %}'})
  173. def test_url_fail14(self):
  174. with self.assertRaises(TemplateSyntaxError):
  175. self.engine.render_to_string('url-fail14', {'named_url': 'view'})
  176. @setup({'url-fail15': '{% url named_url id= %}'})
  177. def test_url_fail15(self):
  178. with self.assertRaises(TemplateSyntaxError):
  179. self.engine.render_to_string('url-fail15', {'named_url': 'view'})
  180. @setup({'url-fail16': '{% url named_url a.id=id %}'})
  181. def test_url_fail16(self):
  182. with self.assertRaises(TemplateSyntaxError):
  183. self.engine.render_to_string('url-fail16', {'named_url': 'view'})
  184. @setup({'url-fail17': '{% url named_url a.id!id %}'})
  185. def test_url_fail17(self):
  186. with self.assertRaises(TemplateSyntaxError):
  187. self.engine.render_to_string('url-fail17', {'named_url': 'view'})
  188. @setup({'url-fail18': '{% url named_url id="unterminatedstring %}'})
  189. def test_url_fail18(self):
  190. with self.assertRaises(TemplateSyntaxError):
  191. self.engine.render_to_string('url-fail18', {'named_url': 'view'})
  192. @setup({'url-fail19': '{% url named_url id=", %}'})
  193. def test_url_fail19(self):
  194. with self.assertRaises(TemplateSyntaxError):
  195. self.engine.render_to_string('url-fail19', {'named_url': 'view'})
  196. # {% url ... as var %}
  197. @ignore_warnings(category=RemovedInDjango110Warning)
  198. @setup({'url-asvar01': '{% url "template_tests.views.index" as url %}'})
  199. def test_url_asvar01(self):
  200. output = self.engine.render_to_string('url-asvar01')
  201. self.assertEqual(output, '')
  202. @ignore_warnings(category=RemovedInDjango110Warning)
  203. @setup({'url-asvar02': '{% url "template_tests.views.index" as url %}{{ url }}'})
  204. def test_url_asvar02(self):
  205. output = self.engine.render_to_string('url-asvar02')
  206. self.assertEqual(output, '/')
  207. @setup({'url-asvar03': '{% url "no_such_view" as url %}{{ url }}'})
  208. def test_url_asvar03(self):
  209. output = self.engine.render_to_string('url-asvar03')
  210. self.assertEqual(output, '')
  211. @setup({'url-namespace01': '{% url "app:named.client" 42 %}'})
  212. def test_url_namespace01(self):
  213. request = RequestFactory().get('/')
  214. request.resolver_match = resolve('/ns1/')
  215. template = self.engine.get_template('url-namespace01')
  216. context = RequestContext(request)
  217. output = template.render(context)
  218. self.assertEqual(output, '/ns1/named-client/42/')
  219. @setup({'url-namespace02': '{% url "app:named.client" 42 %}'})
  220. def test_url_namespace02(self):
  221. request = RequestFactory().get('/')
  222. request.resolver_match = resolve('/ns2/')
  223. template = self.engine.get_template('url-namespace02')
  224. context = RequestContext(request)
  225. output = template.render(context)
  226. self.assertEqual(output, '/ns2/named-client/42/')
  227. @setup({'url-namespace03': '{% url "app:named.client" 42 %}'})
  228. def test_url_namespace03(self):
  229. request = RequestFactory().get('/')
  230. template = self.engine.get_template('url-namespace03')
  231. context = RequestContext(request)
  232. output = template.render(context)
  233. self.assertEqual(output, '/ns2/named-client/42/')