def test_multipart_encode(): data = { "a": "1", "b": b"C", "c": ["11", "22", "33"], "d": { "ff": ["1", b"2", "3"], "fff": ["11", b"22", "33"] }, "f": "", } files = {"file": ("name.txt", io.BytesIO(b"<file content>"))} with mock.patch("os.urandom", return_value=os.urandom(16)): boundary = binascii.hexlify(os.urandom(16)).decode("ascii") body, content_type = multipart.multipart_encode(data=data, files=files) assert content_type == f"multipart/form-data; boundary={boundary}" assert body == ( '--{0}\r\nContent-Disposition: form-data; name="a"\r\n\r\n1\r\n' '--{0}\r\nContent-Disposition: form-data; name="b"\r\n\r\nC\r\n' '--{0}\r\nContent-Disposition: form-data; name="c"\r\n\r\n11\r\n' '--{0}\r\nContent-Disposition: form-data; name="c"\r\n\r\n22\r\n' '--{0}\r\nContent-Disposition: form-data; name="c"\r\n\r\n33\r\n' '--{0}\r\nContent-Disposition: form-data; name="d"\r\n\r\nff\r\n' '--{0}\r\nContent-Disposition: form-data; name="d"\r\n\r\nfff\r\n' '--{0}\r\nContent-Disposition: form-data; name="f"\r\n\r\n\r\n' '--{0}\r\nContent-Disposition: form-data; name="file";' ' filename="name.txt"\r\n' "Content-Type: text/plain\r\n\r\n<file content>\r\n" "--{0}--\r\n" "".format(boundary).encode("ascii"))
def test_multipart_encode_files_allows_filenames_as_none(): files = {"file": (None, io.BytesIO(b"<file content>"))} with mock.patch("os.urandom", return_value=os.urandom(16)): boundary = binascii.hexlify(os.urandom(16)).decode("ascii") body, content_type = multipart_encode(data={}, files=files) assert content_type == f"multipart/form-data; boundary={boundary}" assert body == ( '--{0}\r\nContent-Disposition: form-data; name="file"\r\n\r\n' "<file content>\r\n--{0}--\r\n" "".format(boundary).encode("ascii"))
def test_multipart_encode_files_allows_str_content(): files = {"file": ("test.txt", "<string content>", "text/plain")} with mock.patch("os.urandom", return_value=os.urandom(16)): boundary = binascii.hexlify(os.urandom(16)).decode("ascii") body, content_type = multipart.multipart_encode(data={}, files=files) assert content_type == f"multipart/form-data; boundary={boundary}" assert body == ( '--{0}\r\nContent-Disposition: form-data; name="file"; ' 'filename="test.txt"\r\n' "Content-Type: text/plain\r\n\r\n<string content>\r\n" "--{0}--\r\n" "".format(boundary).encode("ascii"))
def test_multipart_encode_files_guesses_correct_content_type( file_name, expected_content_type): files = {"file": (file_name, io.BytesIO(b"<file content>"))} with mock.patch("os.urandom", return_value=os.urandom(16)): boundary = binascii.hexlify(os.urandom(16)).decode("ascii") body, content_type = multipart_encode(data={}, files=files) assert content_type == f"multipart/form-data; boundary={boundary}" assert body == ( f'--{boundary}\r\nContent-Disposition: form-data; name="file"; ' f'filename="{file_name}"\r\nContent-Type: ' f"{expected_content_type}\r\n\r\n<file content>\r\n--{boundary}--\r\n" "".encode("ascii"))