166 lines
5.9 KiB
Python
166 lines
5.9 KiB
Python
# -*- coding: utf-8
|
|
|
|
import falcon
|
|
from falcon.http_status import HTTPStatus
|
|
import falcon.testing as testing
|
|
|
|
|
|
def before_hook(req, resp, params):
|
|
raise HTTPStatus(falcon.HTTP_200,
|
|
headers={'X-Failed': 'False'},
|
|
body='Pass')
|
|
|
|
|
|
def after_hook(req, resp, resource):
|
|
resp.status = falcon.HTTP_200
|
|
resp.set_header('X-Failed', 'False')
|
|
resp.body = 'Pass'
|
|
|
|
|
|
def noop_after_hook(req, resp, resource):
|
|
pass
|
|
|
|
|
|
class TestStatusResource:
|
|
|
|
@falcon.before(before_hook)
|
|
def on_get(self, req, resp):
|
|
resp.status = falcon.HTTP_500
|
|
resp.set_header('X-Failed', 'True')
|
|
resp.body = 'Fail'
|
|
|
|
def on_post(self, req, resp):
|
|
resp.status = falcon.HTTP_500
|
|
resp.set_header('X-Failed', 'True')
|
|
resp.body = 'Fail'
|
|
|
|
raise HTTPStatus(falcon.HTTP_200,
|
|
headers={'X-Failed': 'False'},
|
|
body='Pass')
|
|
|
|
@falcon.after(after_hook)
|
|
def on_put(self, req, resp):
|
|
resp.status = falcon.HTTP_500
|
|
resp.set_header('X-Failed', 'True')
|
|
resp.body = 'Fail'
|
|
|
|
def on_patch(self, req, resp):
|
|
raise HTTPStatus(falcon.HTTP_200,
|
|
body=None)
|
|
|
|
@falcon.after(noop_after_hook)
|
|
def on_delete(self, req, resp):
|
|
raise HTTPStatus(falcon.HTTP_200,
|
|
headers={'X-Failed': 'False'},
|
|
body='Pass')
|
|
|
|
|
|
class TestHookResource:
|
|
|
|
def on_get(self, req, resp):
|
|
resp.status = falcon.HTTP_500
|
|
resp.set_header('X-Failed', 'True')
|
|
resp.body = 'Fail'
|
|
|
|
def on_patch(self, req, resp):
|
|
raise HTTPStatus(falcon.HTTP_200,
|
|
body=None)
|
|
|
|
def on_delete(self, req, resp):
|
|
raise HTTPStatus(falcon.HTTP_200,
|
|
headers={'X-Failed': 'False'},
|
|
body='Pass')
|
|
|
|
|
|
class TestHTTPStatus(testing.TestBase):
|
|
def before(self):
|
|
self.resource = TestStatusResource()
|
|
self.api.add_route('/status', self.resource)
|
|
|
|
def test_raise_status_in_before_hook(self):
|
|
""" Make sure we get the 200 raised by before hook """
|
|
body = self.simulate_request('/status', method='GET', decode='utf-8')
|
|
self.assertEqual(self.srmock.status, falcon.HTTP_200)
|
|
self.assertIn(('x-failed', 'False'), self.srmock.headers)
|
|
self.assertEqual(body, 'Pass')
|
|
|
|
def test_raise_status_in_responder(self):
|
|
""" Make sure we get the 200 raised by responder """
|
|
body = self.simulate_request('/status', method='POST', decode='utf-8')
|
|
self.assertEqual(self.srmock.status, falcon.HTTP_200)
|
|
self.assertIn(('x-failed', 'False'), self.srmock.headers)
|
|
self.assertEqual(body, 'Pass')
|
|
|
|
def test_raise_status_runs_after_hooks(self):
|
|
""" Make sure after hooks still run """
|
|
body = self.simulate_request('/status', method='PUT', decode='utf-8')
|
|
self.assertEqual(self.srmock.status, falcon.HTTP_200)
|
|
self.assertIn(('x-failed', 'False'), self.srmock.headers)
|
|
self.assertEqual(body, 'Pass')
|
|
|
|
def test_raise_status_survives_after_hooks(self):
|
|
""" Make sure after hook doesn't overwrite our status """
|
|
body = self.simulate_request('/status', method='DELETE',
|
|
decode='utf-8')
|
|
self.assertEqual(self.srmock.status, falcon.HTTP_200)
|
|
self.assertIn(('x-failed', 'False'), self.srmock.headers)
|
|
self.assertEqual(body, 'Pass')
|
|
|
|
def test_raise_status_empty_body(self):
|
|
""" Make sure passing None to body results in empty body """
|
|
body = self.simulate_request('/status', method='PATCH', decode='utf-8')
|
|
self.assertEqual(body, '')
|
|
|
|
|
|
class TestHTTPStatusWithMiddleware(testing.TestBase):
|
|
def before(self):
|
|
self.resource = TestHookResource()
|
|
|
|
def test_raise_status_in_process_request(self):
|
|
""" Make sure we can raise status from middleware process request """
|
|
class TestMiddleware:
|
|
def process_request(self, req, resp):
|
|
raise HTTPStatus(falcon.HTTP_200,
|
|
headers={'X-Failed': 'False'},
|
|
body='Pass')
|
|
|
|
self.api = falcon.API(middleware=TestMiddleware())
|
|
self.api.add_route('/status', self.resource)
|
|
|
|
body = self.simulate_request('/status', method='GET', decode='utf-8')
|
|
self.assertEqual(self.srmock.status, falcon.HTTP_200)
|
|
self.assertIn(('x-failed', 'False'), self.srmock.headers)
|
|
self.assertEqual(body, 'Pass')
|
|
|
|
def test_raise_status_in_process_resource(self):
|
|
""" Make sure we can raise status from middleware process resource """
|
|
class TestMiddleware:
|
|
def process_resource(self, req, resp, resource, params):
|
|
raise HTTPStatus(falcon.HTTP_200,
|
|
headers={'X-Failed': 'False'},
|
|
body='Pass')
|
|
|
|
self.api = falcon.API(middleware=TestMiddleware())
|
|
self.api.add_route('/status', self.resource)
|
|
|
|
body = self.simulate_request('/status', method='GET', decode='utf-8')
|
|
self.assertEqual(self.srmock.status, falcon.HTTP_200)
|
|
self.assertIn(('x-failed', 'False'), self.srmock.headers)
|
|
self.assertEqual(body, 'Pass')
|
|
|
|
def test_raise_status_runs_process_response(self):
|
|
""" Make sure process_response still runs """
|
|
class TestMiddleware:
|
|
def process_response(self, req, resp, response):
|
|
resp.status = falcon.HTTP_200
|
|
resp.set_header('X-Failed', 'False')
|
|
resp.body = 'Pass'
|
|
|
|
self.api = falcon.API(middleware=TestMiddleware())
|
|
self.api.add_route('/status', self.resource)
|
|
|
|
body = self.simulate_request('/status', method='GET', decode='utf-8')
|
|
self.assertEqual(self.srmock.status, falcon.HTTP_200)
|
|
self.assertIn(('x-failed', 'False'), self.srmock.headers)
|
|
self.assertEqual(body, 'Pass')
|