71ef0baa21
While not specified in the spec that the status must be of type str (not unicode on Py27), some WSGI servers can complain when it is not.
168 lines
6.0 KiB
Python
168 lines
6.0 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):
|
|
# NOTE(kgriffs): Test that passing a unicode status string
|
|
# works just fine.
|
|
resp.status = u'500 Internal Server Error'
|
|
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')
|