def test_deserialization_raises(asgi): app = create_app(asgi) class SuchException(Exception): pass class FaultyHandler(media.BaseHandler): def deserialize(self, stream, content_type, content_length): raise SuchException('Wow such error.') def deserialize_async(self, stream, content_type, content_length): raise SuchException('Wow such error.') def serialize(self, media, content_type): raise SuchException('Wow such error.') handlers = media.Handlers({'application/json': FaultyHandler()}) app.req_options.media_handlers = handlers app.resp_options.media_handlers = handlers class Resource: def on_get(self, req, resp): resp.media = {} def on_post(self, req, resp): req.media class ResourceAsync: async def on_get(self, req, resp): resp.media = {} async def on_post(self, req, resp): # NOTE(kgriffs): In this one case we use the property # instead of get_media(), in order to test that the # alias works as expected. await req.media app.add_route('/', ResourceAsync() if asgi else Resource()) # NOTE(kgriffs): Now that we install a default handler for # Exception, we have to clear them to test the path we want # to trigger. # TODO(kgriffs): Since we always add a default error handler # for Exception, should we take out the checks in the WSGI/ASGI # callable and just always assume it will be handled? If so, # it makes testing that the right exception is propagated harder; # I suppose we'll have to look at what is logged. app._error_handlers.clear() with pytest.raises(SuchException): testing.simulate_get(app, '/') with pytest.raises(SuchException): testing.simulate_post(app, '/', json={})
def test_sync_methods_not_overridden(asgi): app = create_app(asgi) class FaultyHandler(media.BaseHandler): pass handlers = media.Handlers({'application/json': FaultyHandler()}) app.req_options.media_handlers = handlers app.resp_options.media_handlers = handlers class Resource: def on_get(self, req, resp): resp.media = {} def on_post(self, req, resp): req.media class ResourceAsync: async def on_get(self, req, resp): resp.media = {} async def on_post(self, req, resp): await req.get_media() app.add_route('/', ResourceAsync() if asgi else Resource()) # NOTE(caselit): force serialization in xml, since error.to_json uses the faulty handler result = testing.simulate_get(app, '/', headers={'Accept': 'text/xml'}) assert result.status_code == 500 result = testing.simulate_post(app, '/', json={}, headers={'Accept': 'text/xml'}) assert result.status_code == 500
def test_sync_methods_not_overridden(asgi): app = create_app(asgi) class FaultyHandler(media.BaseHandler): pass handlers = media.Handlers({'application/json': FaultyHandler()}) app.req_options.media_handlers = handlers app.resp_options.media_handlers = handlers class Resource: def on_get(self, req, resp): resp.media = {} def on_post(self, req, resp): req.media class ResourceAsync: async def on_get(self, req, resp): resp.media = {} async def on_post(self, req, resp): await req.get_media() app.add_route('/', ResourceAsync() if asgi else Resource()) result = testing.simulate_get(app, '/') assert result.status_code == 500 result = testing.simulate_post(app, '/', json={}) assert result.status_code == 500
def test_simulate_request_content_type(): class Foo: def on_post(self, req, resp): resp.text = req.content_type app = App() app.add_route('/', Foo()) headers = {'Content-Type': falcon.MEDIA_TEXT} result = testing.simulate_post(app, '/', headers=headers) assert result.text == falcon.MEDIA_TEXT result = testing.simulate_post(app, '/', content_type=falcon.MEDIA_HTML) assert result.text == falcon.MEDIA_HTML result = testing.simulate_post( app, '/', content_type=falcon.MEDIA_HTML, headers=headers ) assert result.text == falcon.MEDIA_HTML result = testing.simulate_post(app, '/', json={}) assert result.text == falcon.MEDIA_JSON result = testing.simulate_post(app, '/', json={}, content_type=falcon.MEDIA_HTML) assert result.text == falcon.MEDIA_JSON result = testing.simulate_post(app, '/', json={}, headers=headers) assert result.text == falcon.MEDIA_JSON result = testing.simulate_post( app, '/', json={}, headers=headers, content_type=falcon.MEDIA_HTML ) assert result.text == falcon.MEDIA_JSON
def test_async_handler_returning_none(): app = create_app(asgi=True) class SimpleHandler(media.BaseHandler): def serialize(self, media, content_type): return json.dumps(media).encode() def deserialize(self, stream, content_type, content_length): return None handlers = media.Handlers({'application/json': SimpleHandler()}) app.req_options.media_handlers = handlers app.resp_options.media_handlers = handlers class ResourceAsync: async def on_post(self, req, resp): resp.media = [await req.get_media()] app.add_route('/', ResourceAsync()) doc = {'event': 'serialized'} result = testing.simulate_post(app, '/', json=doc) assert result.status_code == 200 assert result.json == [None]
def test_deserialization_raises(asgi, handler_mt, monkeypatch_resolver): app = create_app(asgi) class SuchException(Exception): pass class FaultyHandler(media.BaseHandler): def deserialize(self, stream, content_type, content_length): raise SuchException('Wow such error.') def deserialize_async(self, stream, content_type, content_length): raise SuchException('Wow such error.') def serialize(self, media, content_type): raise SuchException('Wow such error.') handlers = media.Handlers({handler_mt: FaultyHandler()}) # NOTE(kgriffs): Test the pre-3.0 method. Although undocumented, it was # technically a public method, and so we make sure it still works here. if monkeypatch_resolver: def _resolve(media_type, default, raise_not_found=True): with pytest.warns(DeprecatedWarning, match='This undocumented method'): h = handlers.find_by_media_type( media_type, default, raise_not_found=raise_not_found) return h, None, None handlers._resolve = _resolve app.req_options.media_handlers = handlers app.resp_options.media_handlers = handlers class Resource: def on_get(self, req, resp): resp.media = {} def on_post(self, req, resp): req.media class ResourceAsync: async def on_get(self, req, resp): resp.media = {} async def on_post(self, req, resp): # NOTE(kgriffs): In this one case we use the property # instead of get_media(), in order to test that the # alias works as expected. await req.media app.add_route('/', ResourceAsync() if asgi else Resource()) # NOTE(kgriffs): Now that we install a default handler for # Exception, we have to clear them to test the path we want # to trigger. # TODO(kgriffs): Since we always add a default error handler # for Exception, should we take out the checks in the WSGI/ASGI # callable and just always assume it will be handled? If so, # it makes testing that the right exception is propagated harder; # I suppose we'll have to look at what is logged. app._error_handlers.clear() with pytest.raises(SuchException): testing.simulate_get(app, '/') with pytest.raises(SuchException): testing.simulate_post(app, '/', json={})