-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
/
Copy pathtest_formdata.py
101 lines (70 loc) · 2.73 KB
/
test_formdata.py
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# type: ignore
from typing import Any
from unittest import mock
import pytest
from aiohttp import ClientSession, FormData
@pytest.fixture
def buf():
return bytearray()
@pytest.fixture
def writer(buf: Any):
writer = mock.Mock()
async def write(chunk):
buf.extend(chunk)
writer.write.side_effect = write
return writer
def test_formdata_multipart(buf: Any, writer: Any) -> None:
form = FormData()
assert not form.is_multipart
form.add_field("test", b"test", filename="test.txt")
assert form.is_multipart
def test_invalid_formdata_payload() -> None:
form = FormData()
form.add_field("test", object(), filename="test.txt")
with pytest.raises(TypeError):
form()
def test_invalid_formdata_params() -> None:
with pytest.raises(TypeError):
FormData("asdasf")
def test_invalid_formdata_params2() -> None:
with pytest.raises(TypeError):
FormData("as") # 2-char str is not allowed
def test_invalid_formdata_content_type() -> None:
form = FormData()
invalid_vals = [0, 0.1, {}, [], b"foo"]
for invalid_val in invalid_vals:
with pytest.raises(TypeError):
form.add_field("foo", "bar", content_type=invalid_val)
def test_invalid_formdata_filename() -> None:
form = FormData()
invalid_vals = [0, 0.1, {}, [], b"foo"]
for invalid_val in invalid_vals:
with pytest.raises(TypeError):
form.add_field("foo", "bar", filename=invalid_val)
def test_invalid_formdata_content_transfer_encoding() -> None:
form = FormData()
invalid_vals = [0, 0.1, {}, [], b"foo"]
for invalid_val in invalid_vals:
with pytest.raises(TypeError):
form.add_field("foo", "bar", content_transfer_encoding=invalid_val)
async def test_formdata_field_name_is_quoted(buf: Any, writer: Any) -> None:
form = FormData(charset="ascii")
form.add_field("email 1", "[email protected]", content_type="multipart/form-data")
payload = form()
await payload.write(writer)
assert b'name="email\\ 1"' in buf
async def test_formdata_field_name_is_not_quoted(buf: Any, writer: Any) -> None:
form = FormData(quote_fields=False, charset="ascii")
form.add_field("email 1", "[email protected]", content_type="multipart/form-data")
payload = form()
await payload.write(writer)
assert b'name="email 1"' in buf
async def test_mark_formdata_as_processed() -> None:
async with ClientSession() as session:
url = "http://httpbin.org/anything"
data = FormData()
data.add_field("test", "test_value", content_type="application/json")
await session.post(url, data=data)
assert len(data._writer._parts) == 1
with pytest.raises(RuntimeError):
await session.post(url, data=data)