diff --git a/stripe/multipart_data_generator.py b/stripe/multipart_data_generator.py index 801d3e241..9e5f03c3f 100644 --- a/stripe/multipart_data_generator.py +++ b/stripe/multipart_data_generator.py @@ -3,7 +3,7 @@ import random import io -from stripe import six +import stripe class MultipartDataGenerator(object): @@ -14,7 +14,10 @@ def __init__(self, chunk_size=1028): self.chunk_size = chunk_size def add_params(self, params): - for key, value in six.iteritems(params): + # Flatten parameters first + params = dict(stripe.api_requestor._api_encode(params)) + + for key, value in stripe.six.iteritems(params): if value is None: continue @@ -45,7 +48,7 @@ def add_params(self, params): self._write('"') self._write(self.line_break) self._write(self.line_break) - self._write(value) + self._write(str(value)) self._write(self.line_break) @@ -58,9 +61,9 @@ def get_post_data(self): return self.data.getvalue() def _write(self, value): - if isinstance(value, six.binary_type): + if isinstance(value, stripe.six.binary_type): array = bytearray(value) - elif isinstance(value, six.text_type): + elif isinstance(value, stripe.six.text_type): array = bytearray(value, encoding="utf-8") else: raise TypeError( diff --git a/tests/api_resources/test_file.py b/tests/api_resources/test_file.py index ae2c9515c..b8e3891bd 100644 --- a/tests/api_resources/test_file.py +++ b/tests/api_resources/test_file.py @@ -36,7 +36,9 @@ def test_is_creatable(self, setup_upload_api_base, request_mock): ) test_file = tempfile.TemporaryFile() resource = stripe.File.create( - purpose="dispute_evidence", file=test_file + purpose="dispute_evidence", + file=test_file, + file_link_data={"create": True}, ) request_mock.assert_api_base(stripe.upload_api_base) request_mock.assert_requested( diff --git a/tests/api_resources/test_file_upload.py b/tests/api_resources/test_file_upload.py index d1e72b078..faec4b5a5 100644 --- a/tests/api_resources/test_file_upload.py +++ b/tests/api_resources/test_file_upload.py @@ -36,7 +36,9 @@ def test_is_creatable(self, setup_upload_api_base, request_mock): ) test_file = tempfile.TemporaryFile() resource = stripe.FileUpload.create( - purpose="dispute_evidence", file=test_file + purpose="dispute_evidence", + file=test_file, + file_link_data={"create": True}, ) request_mock.assert_api_base(stripe.upload_api_base) request_mock.assert_requested( diff --git a/tests/test_multipart_data_generator.py b/tests/test_multipart_data_generator.py index 07e762e98..26cf77aaf 100644 --- a/tests/test_multipart_data_generator.py +++ b/tests/test_multipart_data_generator.py @@ -14,6 +14,13 @@ def run_test_multipart_data_with_file(self, test_file): "key1": b"ASCII value", "key2": u"Üñìçôdé value", "key3": test_file, + "key4": { + "string": "Hello!", + "int": 234, + "float": 3.14159, + "bool": True, + "dict": {"foo": "bar"}, + }, } generator = MultipartDataGenerator() generator.add_params(params) @@ -36,6 +43,29 @@ def run_test_multipart_data_with_file(self, test_file): http_body, ) assert re.search(r"Content-Type: application/octet-stream", http_body) + assert re.search( + r"Content-Disposition: form-data; name=\"key4\[string\]\"", + http_body, + ) + assert re.search(r"Hello!", http_body) + assert re.search( + r"Content-Disposition: form-data; name=\"key4\[int\]\"", http_body + ) + assert re.search(r"234", http_body) + assert re.search( + r"Content-Disposition: form-data; name=\"key4\[float\]\"", + http_body, + ) + assert re.search(r"3.14159", http_body) + assert re.search( + r"Content-Disposition: form-data; name=\"key4\[bool\]\"", http_body + ) + assert re.search(r"True", http_body) + assert re.search( + r"Content-Disposition: form-data; name=\"key4\[dict\]\[foo\]\"", + http_body, + ) + assert re.search(r"bar", http_body) test_file.seek(0) file_contents = test_file.read()