PageRenderTime 38ms CodeModel.GetById 11ms RepoModel.GetById 1ms app.codeStats 0ms

/pyramid/tests/test_config/test_routes.py

https://gitlab.com/goolic/pyramid
Python | 255 lines | 226 code | 29 blank | 0 comment | 14 complexity | 50175922a53760cc42ab8581e3f21174 MD5 | raw file
  1. import unittest
  2. from pyramid.tests.test_config import dummyfactory
  3. from pyramid.tests.test_config import DummyContext
  4. from pyramid.compat import text_
  5. class RoutesConfiguratorMixinTests(unittest.TestCase):
  6. def _makeOne(self, *arg, **kw):
  7. from pyramid.config import Configurator
  8. config = Configurator(*arg, **kw)
  9. return config
  10. def _assertRoute(self, config, name, path, num_predicates=0):
  11. from pyramid.interfaces import IRoutesMapper
  12. mapper = config.registry.getUtility(IRoutesMapper)
  13. routes = mapper.get_routes()
  14. route = routes[0]
  15. self.assertEqual(len(routes), 1)
  16. self.assertEqual(route.name, name)
  17. self.assertEqual(route.path, path)
  18. self.assertEqual(len(routes[0].predicates), num_predicates)
  19. return route
  20. def _makeRequest(self, config):
  21. request = DummyRequest()
  22. request.registry = config.registry
  23. return request
  24. def test_get_routes_mapper_not_yet_registered(self):
  25. config = self._makeOne()
  26. mapper = config.get_routes_mapper()
  27. self.assertEqual(mapper.routelist, [])
  28. def test_get_routes_mapper_already_registered(self):
  29. from pyramid.interfaces import IRoutesMapper
  30. config = self._makeOne()
  31. mapper = object()
  32. config.registry.registerUtility(mapper, IRoutesMapper)
  33. result = config.get_routes_mapper()
  34. self.assertEqual(result, mapper)
  35. def test_add_route_defaults(self):
  36. config = self._makeOne(autocommit=True)
  37. config.add_route('name', 'path')
  38. self._assertRoute(config, 'name', 'path')
  39. def test_add_route_with_route_prefix(self):
  40. config = self._makeOne(autocommit=True)
  41. config.route_prefix = 'root'
  42. config.add_route('name', 'path')
  43. self._assertRoute(config, 'name', 'root/path')
  44. def test_add_route_discriminator(self):
  45. config = self._makeOne()
  46. config.add_route('name', 'path')
  47. self.assertEqual(config.action_state.actions[-1]['discriminator'],
  48. ('route', 'name'))
  49. def test_add_route_with_factory(self):
  50. config = self._makeOne(autocommit=True)
  51. factory = object()
  52. config.add_route('name', 'path', factory=factory)
  53. route = self._assertRoute(config, 'name', 'path')
  54. self.assertEqual(route.factory, factory)
  55. def test_add_route_with_static(self):
  56. config = self._makeOne(autocommit=True)
  57. config.add_route('name', 'path/{foo}', static=True)
  58. mapper = config.get_routes_mapper()
  59. self.assertEqual(len(mapper.get_routes()), 0)
  60. self.assertEqual(mapper.generate('name', {"foo":"a"}), '/path/a')
  61. def test_add_route_with_factory_dottedname(self):
  62. config = self._makeOne(autocommit=True)
  63. config.add_route(
  64. 'name', 'path',
  65. factory='pyramid.tests.test_config.dummyfactory')
  66. route = self._assertRoute(config, 'name', 'path')
  67. self.assertEqual(route.factory, dummyfactory)
  68. def test_add_route_with_xhr(self):
  69. config = self._makeOne(autocommit=True)
  70. config.add_route('name', 'path', xhr=True)
  71. route = self._assertRoute(config, 'name', 'path', 1)
  72. predicate = route.predicates[0]
  73. request = self._makeRequest(config)
  74. request.is_xhr = True
  75. self.assertEqual(predicate(None, request), True)
  76. request = self._makeRequest(config)
  77. request.is_xhr = False
  78. self.assertEqual(predicate(None, request), False)
  79. def test_add_route_with_request_method(self):
  80. config = self._makeOne(autocommit=True)
  81. config.add_route('name', 'path', request_method='GET')
  82. route = self._assertRoute(config, 'name', 'path', 1)
  83. predicate = route.predicates[0]
  84. request = self._makeRequest(config)
  85. request.method = 'GET'
  86. self.assertEqual(predicate(None, request), True)
  87. request = self._makeRequest(config)
  88. request.method = 'POST'
  89. self.assertEqual(predicate(None, request), False)
  90. def test_add_route_with_path_info(self):
  91. config = self._makeOne(autocommit=True)
  92. config.add_route('name', 'path', path_info='/foo')
  93. route = self._assertRoute(config, 'name', 'path', 1)
  94. predicate = route.predicates[0]
  95. request = self._makeRequest(config)
  96. request.upath_info = '/foo'
  97. self.assertEqual(predicate(None, request), True)
  98. request = self._makeRequest(config)
  99. request.upath_info = '/'
  100. self.assertEqual(predicate(None, request), False)
  101. def test_add_route_with_path_info_highorder(self):
  102. config = self._makeOne(autocommit=True)
  103. config.add_route('name', 'path',
  104. path_info=text_(b'/La Pe\xc3\xb1a', 'utf-8'))
  105. route = self._assertRoute(config, 'name', 'path', 1)
  106. predicate = route.predicates[0]
  107. request = self._makeRequest(config)
  108. request.upath_info = text_(b'/La Pe\xc3\xb1a', 'utf-8')
  109. self.assertEqual(predicate(None, request), True)
  110. request = self._makeRequest(config)
  111. request.upath_info = text_('/')
  112. self.assertEqual(predicate(None, request), False)
  113. def test_add_route_with_path_info_regex(self):
  114. config = self._makeOne(autocommit=True)
  115. config.add_route('name', 'path',
  116. path_info=text_(br'/La Pe\w*', 'utf-8'))
  117. route = self._assertRoute(config, 'name', 'path', 1)
  118. predicate = route.predicates[0]
  119. request = self._makeRequest(config)
  120. request.upath_info = text_(b'/La Pe\xc3\xb1a', 'utf-8')
  121. self.assertEqual(predicate(None, request), True)
  122. request = self._makeRequest(config)
  123. request.upath_info = text_('/')
  124. self.assertEqual(predicate(None, request), False)
  125. def test_add_route_with_request_param(self):
  126. config = self._makeOne(autocommit=True)
  127. config.add_route('name', 'path', request_param='abc')
  128. route = self._assertRoute(config, 'name', 'path', 1)
  129. predicate = route.predicates[0]
  130. request = self._makeRequest(config)
  131. request.params = {'abc':'123'}
  132. self.assertEqual(predicate(None, request), True)
  133. request = self._makeRequest(config)
  134. request.params = {}
  135. self.assertEqual(predicate(None, request), False)
  136. def test_add_route_with_custom_predicates(self):
  137. import warnings
  138. config = self._makeOne(autocommit=True)
  139. def pred1(context, request): pass
  140. def pred2(context, request): pass
  141. with warnings.catch_warnings(record=True) as w:
  142. warnings.filterwarnings('always')
  143. config.add_route('name', 'path', custom_predicates=(pred1, pred2))
  144. self.assertEqual(len(w), 1)
  145. route = self._assertRoute(config, 'name', 'path', 2)
  146. self.assertEqual(len(route.predicates), 2)
  147. def test_add_route_with_header(self):
  148. config = self._makeOne(autocommit=True)
  149. config.add_route('name', 'path', header='Host')
  150. route = self._assertRoute(config, 'name', 'path', 1)
  151. predicate = route.predicates[0]
  152. request = self._makeRequest(config)
  153. request.headers = {'Host':'example.com'}
  154. self.assertEqual(predicate(None, request), True)
  155. request = self._makeRequest(config)
  156. request.headers = {}
  157. self.assertEqual(predicate(None, request), False)
  158. def test_add_route_with_accept(self):
  159. config = self._makeOne(autocommit=True)
  160. config.add_route('name', 'path', accept='text/xml')
  161. route = self._assertRoute(config, 'name', 'path', 1)
  162. predicate = route.predicates[0]
  163. request = self._makeRequest(config)
  164. request.accept = ['text/xml']
  165. self.assertEqual(predicate(None, request), True)
  166. request = self._makeRequest(config)
  167. request.accept = ['text/html']
  168. self.assertEqual(predicate(None, request), False)
  169. def test_add_route_no_pattern_with_path(self):
  170. config = self._makeOne(autocommit=True)
  171. config.add_route('name', path='path')
  172. self._assertRoute(config, 'name', 'path')
  173. def test_add_route_no_path_no_pattern(self):
  174. from pyramid.exceptions import ConfigurationError
  175. config = self._makeOne()
  176. self.assertRaises(ConfigurationError, config.add_route, 'name')
  177. def test_add_route_with_pregenerator(self):
  178. config = self._makeOne(autocommit=True)
  179. config.add_route('name', 'pattern', pregenerator='123')
  180. route = self._assertRoute(config, 'name', 'pattern')
  181. self.assertEqual(route.pregenerator, '123')
  182. def test_add_route_no_view_with_view_attr(self):
  183. config = self._makeOne(autocommit=True)
  184. from pyramid.exceptions import ConfigurationError
  185. try:
  186. config.add_route('name', '/pattern', view_attr='abc')
  187. except ConfigurationError:
  188. pass
  189. else: # pragma: no cover
  190. raise AssertionError
  191. def test_add_route_no_view_with_view_context(self):
  192. config = self._makeOne(autocommit=True)
  193. from pyramid.exceptions import ConfigurationError
  194. try:
  195. config.add_route('name', '/pattern', view_context=DummyContext)
  196. except ConfigurationError:
  197. pass
  198. else: # pragma: no cover
  199. raise AssertionError
  200. def test_add_route_no_view_with_view_permission(self):
  201. config = self._makeOne(autocommit=True)
  202. from pyramid.exceptions import ConfigurationError
  203. try:
  204. config.add_route('name', '/pattern', view_permission='edit')
  205. except ConfigurationError:
  206. pass
  207. else: # pragma: no cover
  208. raise AssertionError
  209. def test_add_route_no_view_with_view_renderer(self):
  210. config = self._makeOne(autocommit=True)
  211. from pyramid.exceptions import ConfigurationError
  212. try:
  213. config.add_route('name', '/pattern', view_renderer='json')
  214. except ConfigurationError:
  215. pass
  216. else: # pragma: no cover
  217. raise AssertionError
  218. class DummyRequest:
  219. subpath = ()
  220. matchdict = None
  221. def __init__(self, environ=None):
  222. if environ is None:
  223. environ = {}
  224. self.environ = environ
  225. self.params = {}
  226. self.cookies = {}