File: test_media_urlencoded.py

package info (click to toggle)
python-falcon 4.0.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,172 kB
  • sloc: python: 33,608; javascript: 92; sh: 50; makefile: 50
file content (83 lines) | stat: -rw-r--r-- 2,310 bytes parent folder | download
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