/pyramid/tests/test_config/test_util.py

https://github.com/cameronr/pyramid · Python · 338 lines · 313 code · 25 blank · 0 comment · 2 complexity · 5392990f71a5d7e12ef35714eeae2b2e MD5 · raw file

  1. import unittest
  2. class Test__make_predicates(unittest.TestCase):
  3. def _callFUT(self, **kw):
  4. from pyramid.config.util import make_predicates
  5. return make_predicates(**kw)
  6. def test_ordering_xhr_and_request_method_trump_only_containment(self):
  7. order1, _, _ = self._callFUT(xhr=True, request_method='GET')
  8. order2, _, _ = self._callFUT(containment=True)
  9. self.assertTrue(order1 < order2)
  10. def test_ordering_number_of_predicates(self):
  11. order1, _, _ = self._callFUT(
  12. xhr='xhr',
  13. request_method='request_method',
  14. path_info='path_info',
  15. request_param='param',
  16. match_param='foo=bar',
  17. header='header',
  18. accept='accept',
  19. containment='containment',
  20. request_type='request_type',
  21. custom=(DummyCustomPredicate(),),
  22. )
  23. order2, _, _ = self._callFUT(
  24. xhr='xhr',
  25. request_method='request_method',
  26. path_info='path_info',
  27. request_param='param',
  28. match_param='foo=bar',
  29. header='header',
  30. accept='accept',
  31. containment='containment',
  32. request_type='request_type',
  33. custom=(DummyCustomPredicate(),),
  34. )
  35. order3, _, _ = self._callFUT(
  36. xhr='xhr',
  37. request_method='request_method',
  38. path_info='path_info',
  39. request_param='param',
  40. match_param='foo=bar',
  41. header='header',
  42. accept='accept',
  43. containment='containment',
  44. request_type='request_type',
  45. )
  46. order4, _, _ = self._callFUT(
  47. xhr='xhr',
  48. request_method='request_method',
  49. path_info='path_info',
  50. request_param='param',
  51. match_param='foo=bar',
  52. header='header',
  53. accept='accept',
  54. containment='containment',
  55. )
  56. order5, _, _ = self._callFUT(
  57. xhr='xhr',
  58. request_method='request_method',
  59. path_info='path_info',
  60. request_param='param',
  61. match_param='foo=bar',
  62. header='header',
  63. accept='accept',
  64. )
  65. order6, _, _ = self._callFUT(
  66. xhr='xhr',
  67. request_method='request_method',
  68. path_info='path_info',
  69. request_param='param',
  70. match_param='foo=bar',
  71. header='header',
  72. )
  73. order7, _, _ = self._callFUT(
  74. xhr='xhr',
  75. request_method='request_method',
  76. path_info='path_info',
  77. request_param='param',
  78. match_param='foo=bar',
  79. )
  80. order8, _, _ = self._callFUT(
  81. xhr='xhr',
  82. request_method='request_method',
  83. path_info='path_info',
  84. request_param='param',
  85. )
  86. order9, _, _ = self._callFUT(
  87. xhr='xhr',
  88. request_method='request_method',
  89. path_info='path_info',
  90. )
  91. order10, _, _ = self._callFUT(
  92. xhr='xhr',
  93. request_method='request_method',
  94. )
  95. order11, _, _ = self._callFUT(
  96. xhr='xhr',
  97. )
  98. order12, _, _ = self._callFUT(
  99. )
  100. self.assertEqual(order1, order2)
  101. self.assertTrue(order3 > order2)
  102. self.assertTrue(order4 > order3)
  103. self.assertTrue(order5 > order4)
  104. self.assertTrue(order6 > order5)
  105. self.assertTrue(order7 > order6)
  106. self.assertTrue(order8 > order7)
  107. self.assertTrue(order9 > order8)
  108. self.assertTrue(order10 > order9)
  109. self.assertTrue(order11 > order10)
  110. self.assertTrue(order12 > order10)
  111. def test_ordering_importance_of_predicates(self):
  112. order1, _, _ = self._callFUT(
  113. xhr='xhr',
  114. )
  115. order2, _, _ = self._callFUT(
  116. request_method='request_method',
  117. )
  118. order3, _, _ = self._callFUT(
  119. path_info='path_info',
  120. )
  121. order4, _, _ = self._callFUT(
  122. request_param='param',
  123. )
  124. order5, _, _ = self._callFUT(
  125. header='header',
  126. )
  127. order6, _, _ = self._callFUT(
  128. accept='accept',
  129. )
  130. order7, _, _ = self._callFUT(
  131. containment='containment',
  132. )
  133. order8, _, _ = self._callFUT(
  134. request_type='request_type',
  135. )
  136. order9, _, _ = self._callFUT(
  137. match_param='foo=bar',
  138. )
  139. order10, _, _ = self._callFUT(
  140. custom=(DummyCustomPredicate(),),
  141. )
  142. self.assertTrue(order1 > order2)
  143. self.assertTrue(order2 > order3)
  144. self.assertTrue(order3 > order4)
  145. self.assertTrue(order4 > order5)
  146. self.assertTrue(order5 > order6)
  147. self.assertTrue(order6 > order7)
  148. self.assertTrue(order7 > order8)
  149. self.assertTrue(order8 > order9)
  150. self.assertTrue(order9 > order10)
  151. def test_ordering_importance_and_number(self):
  152. order1, _, _ = self._callFUT(
  153. xhr='xhr',
  154. request_method='request_method',
  155. )
  156. order2, _, _ = self._callFUT(
  157. custom=(DummyCustomPredicate(),),
  158. )
  159. self.assertTrue(order1 < order2)
  160. order1, _, _ = self._callFUT(
  161. xhr='xhr',
  162. request_method='request_method',
  163. )
  164. order2, _, _ = self._callFUT(
  165. request_method='request_method',
  166. custom=(DummyCustomPredicate(),),
  167. )
  168. self.assertTrue(order1 > order2)
  169. order1, _, _ = self._callFUT(
  170. xhr='xhr',
  171. request_method='request_method',
  172. path_info='path_info',
  173. )
  174. order2, _, _ = self._callFUT(
  175. request_method='request_method',
  176. custom=(DummyCustomPredicate(),),
  177. )
  178. self.assertTrue(order1 < order2)
  179. order1, _, _ = self._callFUT(
  180. xhr='xhr',
  181. request_method='request_method',
  182. path_info='path_info',
  183. )
  184. order2, _, _ = self._callFUT(
  185. xhr='xhr',
  186. request_method='request_method',
  187. custom=(DummyCustomPredicate(),),
  188. )
  189. self.assertTrue(order1 > order2)
  190. def test_different_custom_predicates_with_same_hash(self):
  191. class PredicateWithHash(object):
  192. def __hash__(self):
  193. return 1
  194. a = PredicateWithHash()
  195. b = PredicateWithHash()
  196. _, _, a_phash = self._callFUT(custom=(a,))
  197. _, _, b_phash = self._callFUT(custom=(b,))
  198. self.assertEqual(a_phash, b_phash)
  199. def test_traverse_has_remainder_already(self):
  200. order, predicates, phash = self._callFUT(traverse='/1/:a/:b')
  201. self.assertEqual(len(predicates), 1)
  202. pred = predicates[0]
  203. info = {'traverse':'abc'}
  204. request = DummyRequest()
  205. result = pred(info, request)
  206. self.assertEqual(result, True)
  207. self.assertEqual(info, {'traverse':'abc'})
  208. def test_traverse_matches(self):
  209. order, predicates, phash = self._callFUT(traverse='/1/:a/:b')
  210. self.assertEqual(len(predicates), 1)
  211. pred = predicates[0]
  212. info = {'match':{'a':'a', 'b':'b'}}
  213. request = DummyRequest()
  214. result = pred(info, request)
  215. self.assertEqual(result, True)
  216. self.assertEqual(info, {'match':
  217. {'a':'a', 'b':'b', 'traverse':('1', 'a', 'b')}})
  218. def test_custom_predicates_can_affect_traversal(self):
  219. def custom(info, request):
  220. m = info['match']
  221. m['dummy'] = 'foo'
  222. return True
  223. _, predicates, _ = self._callFUT(custom=(custom,),
  224. traverse='/1/:dummy/:a')
  225. self.assertEqual(len(predicates), 2)
  226. info = {'match':{'a':'a'}}
  227. request = DummyRequest()
  228. self.assertTrue(all([p(info, request) for p in predicates]))
  229. self.assertEqual(info, {'match':
  230. {'a':'a', 'dummy':'foo',
  231. 'traverse':('1', 'foo', 'a')}})
  232. def test_predicate_text_is_correct(self):
  233. _, predicates, _ = self._callFUT(
  234. xhr='xhr',
  235. request_method='request_method',
  236. path_info='path_info',
  237. request_param='param',
  238. header='header',
  239. accept='accept',
  240. containment='containment',
  241. request_type='request_type',
  242. custom=(DummyCustomPredicate(),
  243. DummyCustomPredicate.classmethod_predicate,
  244. DummyCustomPredicate.classmethod_predicate_no_text),
  245. match_param='foo=bar')
  246. self.assertEqual(predicates[0].__text__, 'xhr = True')
  247. self.assertEqual(predicates[1].__text__,
  248. "request method = ['request_method']")
  249. self.assertEqual(predicates[2].__text__, 'path_info = path_info')
  250. self.assertEqual(predicates[3].__text__, 'request_param param')
  251. self.assertEqual(predicates[4].__text__, 'header header')
  252. self.assertEqual(predicates[5].__text__, 'accept = accept')
  253. self.assertEqual(predicates[6].__text__, 'containment = containment')
  254. self.assertEqual(predicates[7].__text__, 'request_type = request_type')
  255. self.assertEqual(predicates[8].__text__, "match_param {'foo': 'bar'}")
  256. self.assertEqual(predicates[9].__text__, 'custom predicate')
  257. self.assertEqual(predicates[10].__text__, 'classmethod predicate')
  258. self.assertEqual(predicates[11].__text__, '<unknown custom predicate>')
  259. def test_match_param_from_string(self):
  260. _, predicates, _ = self._callFUT(match_param='foo=bar')
  261. request = DummyRequest()
  262. request.matchdict = {'foo':'bar', 'baz':'bum'}
  263. self.assertTrue(predicates[0](Dummy(), request))
  264. def test_match_param_from_string_fails(self):
  265. _, predicates, _ = self._callFUT(match_param='foo=bar')
  266. request = DummyRequest()
  267. request.matchdict = {'foo':'bum', 'baz':'bum'}
  268. self.assertFalse(predicates[0](Dummy(), request))
  269. def test_match_param_from_dict(self):
  270. _, predicates, _ = self._callFUT(match_param={'foo':'bar','baz':'bum'})
  271. request = DummyRequest()
  272. request.matchdict = {'foo':'bar', 'baz':'bum'}
  273. self.assertTrue(predicates[0](Dummy(), request))
  274. def test_match_param_from_dict_fails(self):
  275. _, predicates, _ = self._callFUT(match_param={'foo':'bar','baz':'bum'})
  276. request = DummyRequest()
  277. request.matchdict = {'foo':'bar', 'baz':'foo'}
  278. self.assertFalse(predicates[0](Dummy(), request))
  279. def test_request_method_sequence(self):
  280. _, predicates, _ = self._callFUT(request_method=('GET', 'HEAD'))
  281. request = DummyRequest()
  282. request.method = 'HEAD'
  283. self.assertTrue(predicates[0](Dummy(), request))
  284. request.method = 'GET'
  285. self.assertTrue(predicates[0](Dummy(), request))
  286. request.method = 'POST'
  287. self.assertFalse(predicates[0](Dummy(), request))
  288. def test_request_method_ordering_hashes_same(self):
  289. hash1, _, __= self._callFUT(request_method=('GET', 'HEAD'))
  290. hash2, _, __= self._callFUT(request_method=('HEAD', 'GET'))
  291. self.assertEqual(hash1, hash2)
  292. hash1, _, __= self._callFUT(request_method=('GET',))
  293. hash2, _, __= self._callFUT(request_method='GET')
  294. self.assertEqual(hash1, hash2)
  295. class DummyCustomPredicate(object):
  296. def __init__(self):
  297. self.__text__ = 'custom predicate'
  298. def classmethod_predicate(*args): pass
  299. classmethod_predicate.__text__ = 'classmethod predicate'
  300. classmethod_predicate = classmethod(classmethod_predicate)
  301. @classmethod
  302. def classmethod_predicate_no_text(*args): pass # pragma: no cover
  303. class Dummy:
  304. pass
  305. class DummyRequest:
  306. subpath = ()
  307. matchdict = None
  308. def __init__(self, environ=None):
  309. if environ is None:
  310. environ = {}
  311. self.environ = environ
  312. self.params = {}
  313. self.cookies = {}