From a0b40cc8aa58c557c30840c906fcba3401bb91cf Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Mon, 12 Jan 2009 05:12:57 +0000 Subject: - An interface specific to the HTTP verb (GET/PUT/POST/DELETE/HEAD) is attached to each request object on ingress. The HTTP-verb-related interfaces are defined in ``repoze.bfg.interfaces`` and are ``IGETRequest``, ``IPOSTRequest``, ``IPUTRequest``, ``IDELETERequest`` and ``IHEADRequest``. These interfaces can be specified as the ``request_type`` attribute of a bfg view declaration. A view naming a specific HTTP-verb-matching interface will be found only if the view is defined with a request_type that matches the HTTP verb in the incoming request. The more general ``IRequest`` interface can be used as the request_type to catch all requests (and this is indeed the default). All requests implement ``IRequest``. The HTTP-verb-matching idea was pioneered by `repoze.bfg.restrequest `_ . That package is no longer required, but still functions fine. --- repoze/bfg/tests/test_router.py | 54 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) (limited to 'repoze/bfg/tests') diff --git a/repoze/bfg/tests/test_router.py b/repoze/bfg/tests/test_router.py index 35ab21f9c..298065d9b 100644 --- a/repoze/bfg/tests/test_router.py +++ b/repoze/bfg/tests/test_router.py @@ -440,6 +440,60 @@ class RouterTests(unittest.TestCase, PlacelessSetup): self.assertEqual(request_events[0].request.environ, environ) self.assertEqual(len(response_events), 1) self.assertEqual(response_events[0].response, response) + + def test_call_post_method(self): + from repoze.bfg.interfaces import INewRequest + from repoze.bfg.interfaces import IPOSTRequest + from repoze.bfg.interfaces import IPUTRequest + from repoze.bfg.interfaces import IRequest + rootfactory = make_rootfactory(None) + context = DummyContext() + traversalfactory = make_traversal_factory(context, '', []) + response = DummyResponse() + response.app_iter = ['Hello world'] + view = make_view(response) + environ = self._makeEnviron(REQUEST_METHOD='POST') + self._registerTraverserFactory(traversalfactory, '', None) + self._registerView(view, '', None, None) + self._registerRootFactory(rootfactory) + router = self._makeOne(None) + start_response = DummyStartResponse() + request_events = [] + def handle_request(event): + request_events.append(event) + self._registerEventListener(handle_request, INewRequest) + result = router(environ, start_response) + request = request_events[0].request + self.failUnless(IPOSTRequest.providedBy(request)) + self.failIf(IPUTRequest.providedBy(request)) + self.failUnless(IRequest.providedBy(request)) + + def test_call_put_method(self): + from repoze.bfg.interfaces import INewRequest + from repoze.bfg.interfaces import IPUTRequest + from repoze.bfg.interfaces import IPOSTRequest + from repoze.bfg.interfaces import IRequest + rootfactory = make_rootfactory(None) + context = DummyContext() + traversalfactory = make_traversal_factory(context, '', []) + response = DummyResponse() + response.app_iter = ['Hello world'] + view = make_view(response) + environ = self._makeEnviron(REQUEST_METHOD='PUT') + self._registerTraverserFactory(traversalfactory, '', None) + self._registerView(view, '', None, None) + self._registerRootFactory(rootfactory) + router = self._makeOne(None) + start_response = DummyStartResponse() + request_events = [] + def handle_request(event): + request_events.append(event) + self._registerEventListener(handle_request, INewRequest) + result = router(environ, start_response) + request = request_events[0].request + self.failUnless(IPUTRequest.providedBy(request)) + self.failIf(IPOSTRequest.providedBy(request)) + self.failUnless(IRequest.providedBy(request)) class MakeAppTests(unittest.TestCase, PlacelessSetup): def setUp(self): -- cgit v1.2.3