test_url.py 11 KB

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