1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
import io
import pytest
import falcon
from falcon import media
from falcon import testing
def test_deserialize_empty_form():
handler = media.URLEncodedFormHandler()
stream = io.BytesIO(b'')
assert handler.deserialize(stream, falcon.MEDIA_URLENCODED, 0) == {}
def test_deserialize_invalid_unicode():
handler = media.URLEncodedFormHandler()
stream = io.BytesIO('spade=♠'.encode())
with pytest.raises(falcon.MediaMalformedError) as err:
handler.deserialize(stream, falcon.MEDIA_URLENCODED, 9)
assert isinstance(err.value.__cause__, UnicodeDecodeError)
@pytest.mark.parametrize(
'data,expected',
[
({'hello': 'world'}, b'hello=world'),
({'number': [1, 2]}, b'number=1&number=2'),
],
)
def test_urlencoded_form_handler_serialize(data, expected):
handler = media.URLEncodedFormHandler()
assert handler.serialize(data, falcon.MEDIA_URLENCODED) == expected
value = falcon.async_to_sync(handler.serialize_async, data, falcon.MEDIA_URLENCODED)
assert value == expected
class MediaMirror:
def on_post(self, req, resp):
resp.media = req.get_media()
class MediaMirrorAsync:
async def on_post(self, req, resp):
resp.media = await req.get_media()
@pytest.fixture
def client(asgi, util):
app = util.create_app(asgi)
app.add_route('/media', MediaMirrorAsync() if asgi else MediaMirror())
return testing.TestClient(app)
def test_empty_form(client):
resp = client.simulate_post(
'/media', headers={'Content-Type': 'application/x-www-form-urlencoded'}
)
assert resp.content == b'{}'
@pytest.mark.parametrize(
'body,expected',
[
('a=1&b=&c=3', {'a': '1', 'b': '', 'c': '3'}),
('param=undefined', {'param': 'undefined'}),
('color=green&color=black', {'color': ['green', 'black']}),
(
'food=hamburger+%28%F0%9F%8D%94%29&sauce=BBQ',
{'food': 'hamburger (🍔)', 'sauce': 'BBQ'},
),
('flag%1&flag%2&flag%1&flag%2', {'flag%1': ['', ''], 'flag%2': ['', '']}),
],
)
def test_urlencoded_form(client, body, expected):
resp = client.simulate_post(
'/media',
body=body,
headers={'Content-Type': 'application/x-www-form-urlencoded'},
)
assert resp.json == expected
|