Michael Merickel
2018-10-15 2b024920847481592b1a13d4006d2a9fa8881d72
commit | author | age
de61f4 1 import unittest
MM 2 from pyramid import testing
3
4 class Test_excview_tween_factory(unittest.TestCase):
5     def setUp(self):
6         self.config = testing.setUp()
7
8     def tearDown(self):
9         testing.tearDown()
10
11     def _makeOne(self, handler, registry=None):
12         from pyramid.tweens import excview_tween_factory
13         if registry is None:
14             registry = self.config.registry
15         return excview_tween_factory(handler, registry)
16
17     def test_it_passthrough_no_exception(self):
18         dummy_response = DummyResponse()
19         def handler(request):
20             return dummy_response
21         tween = self._makeOne(handler)
22         request = DummyRequest()
23         result = tween(request)
24         self.assertTrue(result is dummy_response)
793621 25         self.assertIsNone(request.exception)
MM 26         self.assertIsNone(request.exc_info)
de61f4 27
MM 28     def test_it_catches_notfound(self):
29         from pyramid.request import Request
30         from pyramid.httpexceptions import HTTPNotFound
31         self.config.add_notfound_view(lambda exc, request: exc)
32         def handler(request):
33             raise HTTPNotFound
34         tween = self._makeOne(handler)
35         request = Request.blank('/')
793621 36         request.registry = self.config.registry
de61f4 37         result = tween(request)
MM 38         self.assertEqual(result.status, '404 Not Found')
793621 39         self.assertIsInstance(request.exception, HTTPNotFound)
MM 40         self.assertEqual(request.exception, request.exc_info[1])
de61f4 41
MM 42     def test_it_catches_with_predicate(self):
43         from pyramid.request import Request
44         from pyramid.response import Response
45         def excview(request):
46             return Response('foo')
47         self.config.add_view(excview, context=ValueError, request_method='GET')
48         def handler(request):
49             raise ValueError
50         tween = self._makeOne(handler)
51         request = Request.blank('/')
793621 52         request.registry = self.config.registry
de61f4 53         result = tween(request)
MM 54         self.assertTrue(b'foo' in result.body)
793621 55         self.assertIsInstance(request.exception, ValueError)
MM 56         self.assertEqual(request.exception, request.exc_info[1])
de61f4 57
MM 58     def test_it_reraises_on_mismatch(self):
59         from pyramid.request import Request
60         def excview(request): pass
61         self.config.add_view(excview, context=ValueError, request_method='GET')
62         def handler(request):
63             raise ValueError
64         tween = self._makeOne(handler)
65         request = Request.blank('/')
793621 66         request.registry = self.config.registry
de61f4 67         request.method = 'POST'
MM 68         self.assertRaises(ValueError, lambda: tween(request))
793621 69         self.assertIsNone(request.exception)
MM 70         self.assertIsNone(request.exc_info)
de61f4 71
MM 72     def test_it_reraises_on_no_match(self):
73         from pyramid.request import Request
74         def handler(request):
75             raise ValueError
76         tween = self._makeOne(handler)
77         request = Request.blank('/')
793621 78         request.registry = self.config.registry
de61f4 79         self.assertRaises(ValueError, lambda: tween(request))
793621 80         self.assertIsNone(request.exception)
MM 81         self.assertIsNone(request.exc_info)
de61f4 82
MM 83 class DummyRequest:
793621 84     exception = None
MM 85     exc_info = None
de61f4 86
MM 87 class DummyResponse:
88     pass