|
15 | 15 | from mocket.mocks.mockhttp import Entry, Response |
16 | 16 |
|
17 | 17 |
|
| 18 | +@pytest.mark.parametrize( |
| 19 | + ("query", "expected"), |
| 20 | + [ |
| 21 | + ("q=one%26two", {"q": ["one&two"]}), |
| 22 | + ("q=one%2Btwo", {"q": ["one+two"]}), |
| 23 | + ("q=%2526", {"q": ["%26"]}), |
| 24 | + ("field%26name=value", {"field&name": ["value"]}), |
| 25 | + ("field%3Dname=value", {"field=name": ["value"]}), |
| 26 | + ("q=%25E2%2582%25AC", {"q": ["%E2%82%AC"]}), |
| 27 | + ("q=one+two", {"q": ["one two"]}), |
| 28 | + ("q=one%20two", {"q": ["one two"]}), |
| 29 | + ("q=%E2%82%AC", {"q": ["\u20ac"]}), |
| 30 | + ("q=&q=next&bare&empty=", {"q": ["", "next"], "bare": [""], "empty": [""]}), |
| 31 | + ("", {}), |
| 32 | + (None, {}), |
| 33 | + ], |
| 34 | +) |
| 35 | +def test_request_querystring_uses_form_urlencoded_semantics(query, expected): |
| 36 | + path = "/" if query is None else f"/?{query}" |
| 37 | + url = f"http://testme.org{path}" |
| 38 | + with Mocketizer(strict_mode=True): |
| 39 | + Entry.single_register(Entry.GET, url, body="ok") |
| 40 | + with requests.get(url, timeout=5) as response: |
| 41 | + assert response.content == b"ok" |
| 42 | + assert Mocket.last_request().querystring == expected |
| 43 | + |
| 44 | + |
| 45 | +@pytest.mark.parametrize("scheme", ["http", "https"]) |
| 46 | +def test_recorded_querystring(scheme): |
| 47 | + parameters = [("field&name", "a+b&c=%26"), ("q", ""), ("q", "\u20ac")] |
| 48 | + url = f"{scheme}://testme.org/?{urlencode(parameters)}" |
| 49 | + |
| 50 | + with Mocketizer(strict_mode=True): |
| 51 | + Entry.single_register(Entry.GET, url, body="ok") |
| 52 | + with requests.get(url, timeout=5) as response: |
| 53 | + assert response.content == b"ok" |
| 54 | + |
| 55 | + assert Mocket.last_request().querystring == { |
| 56 | + "field&name": ["a+b&c=%26"], |
| 57 | + "q": ["", "\u20ac"], |
| 58 | + } |
| 59 | + |
| 60 | + |
18 | 61 | class HttpTestCase(TestCase): |
19 | 62 | def assertEqualHeaders(self, first, second, msg=None): |
20 | 63 | first = {k.lower(): v for k, v in first.items()} |
|
0 commit comments