112 lines
2.7 KiB
Python
112 lines
2.7 KiB
Python
import pytest
|
|
import six
|
|
|
|
import falcon
|
|
from falcon import errors, media, testing
|
|
|
|
|
|
def create_client(handlers=None):
|
|
res = testing.SimpleTestResource()
|
|
|
|
app = falcon.API()
|
|
app.add_route('/', res)
|
|
|
|
if handlers:
|
|
app.resp_options.media_handlers.update(handlers)
|
|
|
|
client = testing.TestClient(app)
|
|
client.resource = res
|
|
|
|
return client
|
|
|
|
|
|
@pytest.mark.parametrize('media_type', [
|
|
('*/*'),
|
|
('application/json'),
|
|
('application/json; charset=utf-8'),
|
|
])
|
|
def test_json(media_type):
|
|
client = create_client()
|
|
client.simulate_get('/')
|
|
|
|
resp = client.resource.captured_resp
|
|
resp.content_type = media_type
|
|
resp.media = {'something': True}
|
|
|
|
assert resp.data == b'{"something": true}'
|
|
|
|
|
|
@pytest.mark.parametrize('media_type', [
|
|
('application/msgpack'),
|
|
('application/msgpack; charset=utf-8'),
|
|
('application/x-msgpack'),
|
|
])
|
|
def test_msgpack(media_type):
|
|
client = create_client({
|
|
'application/msgpack': media.MessagePackHandler(),
|
|
'application/x-msgpack': media.MessagePackHandler(),
|
|
})
|
|
client.simulate_get('/')
|
|
|
|
resp = client.resource.captured_resp
|
|
resp.content_type = media_type
|
|
|
|
# Bytes
|
|
resp.media = {b'something': True}
|
|
assert resp.data == b'\x81\xc4\tsomething\xc3'
|
|
|
|
# Unicode
|
|
resp.media = {u'something': True}
|
|
assert resp.data == b'\x81\xa9something\xc3'
|
|
|
|
|
|
def test_unknown_media_type():
|
|
client = create_client()
|
|
client.simulate_get('/')
|
|
|
|
resp = client.resource.captured_resp
|
|
with pytest.raises(errors.HTTPUnsupportedMediaType) as err:
|
|
resp.content_type = 'nope/json'
|
|
resp.media = {'something': True}
|
|
|
|
assert err.value.description == 'nope/json is an unsupported media type.'
|
|
|
|
|
|
def test_use_cached_media():
|
|
expected = {'something': True}
|
|
|
|
client = create_client()
|
|
client.simulate_get('/')
|
|
|
|
resp = client.resource.captured_resp
|
|
resp._media = expected
|
|
|
|
assert resp.media == expected
|
|
|
|
|
|
@pytest.mark.parametrize('media_type', [
|
|
(''),
|
|
pytest.mark.skipif(six.PY2, reason='PY3 only')(None),
|
|
])
|
|
def test_default_media_type(media_type):
|
|
client = create_client()
|
|
client.simulate_get('/')
|
|
|
|
resp = client.resource.captured_resp
|
|
resp.content_type = media_type
|
|
resp.media = {'something': True}
|
|
|
|
assert resp.data == b'{"something": true}'
|
|
assert resp.content_type == 'application/json; charset=UTF-8'
|
|
|
|
|
|
@pytest.mark.skipif(six.PY3, reason='Python 2 edge-case only')
|
|
def test_mimeparse_edgecases():
|
|
client = create_client()
|
|
client.simulate_get('/')
|
|
|
|
resp = client.resource.captured_resp
|
|
with pytest.raises(errors.HTTPUnsupportedMediaType):
|
|
resp.content_type = None
|
|
resp.media = {'something': True}
|