Skip to content

Commit

Permalink
Re-add tests for multiple and mixed file uploads (#1642)
Browse files Browse the repository at this point in the history
Fixes #992

This PR re-adds tests that were removed when dropping aiohttp, as raised
in
#1395 (comment).
  • Loading branch information
RobbeSneyders committed Feb 21, 2023
2 parents ecfde3d + a8a7e51 commit 05c32d5
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 10 deletions.
2 changes: 1 addition & 1 deletion connexion/decorators/parameter.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ def prep_kwargs(
arguments=arguments,
has_kwargs=has_kwargs,
sanitize=sanitize,
content_type=request.content_type,
content_type=request.mimetype,
)

# optionally convert parameter variable names to un-shadowed, snake_case form
Expand Down
33 changes: 33 additions & 0 deletions tests/api/test_parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,39 @@ def test_formdata_file_upload(simple_app):
assert resp.json() == {"filename.txt": "file contents"}


def test_formdata_multiple_file_upload(simple_app):
app_client = simple_app.test_client()
resp = app_client.post(
"/v1.0/test-formData-file-upload",
files=[
("fileData", ("filename.txt", BytesIO(b"file contents"))),
("fileData", ("filename2.txt", BytesIO(b"file2 contents"))),
],
)
assert resp.status_code == 200
assert resp.json() == {
"filename.txt": "file contents",
"filename2.txt": "file2 contents",
}


def test_mixed_formdata(simple_app):
app_client = simple_app.test_client()
resp = app_client.post(
"/v1.0/test-mixed-formData",
data={"formData": "test"},
files={"fileData": ("filename.txt", BytesIO(b"file contents"))},
)

assert resp.status_code == 200
assert resp.json() == {
"data": {"formData": "test"},
"files": {
"filename.txt": "file contents",
},
}


def test_formdata_file_upload_bad_request(simple_app):
app_client = simple_app.test_client()
resp = app_client.post("/v1.0/test-formData-file-upload")
Expand Down
47 changes: 38 additions & 9 deletions tests/fakeapi/hello/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -322,16 +322,45 @@ def test_formdata_missing_param():

async def test_formdata_file_upload(fileData, **kwargs):
"""In Swagger, form paramaeters and files are passed separately"""
file_ = fileData[0]
try:
files = {}
for file_ in fileData:
filename = file_.filename
except AttributeError:
filename = file_.name
contents = file_.read()
if asyncio.iscoroutine(contents):
contents = await contents
contents = contents.decode("utf-8", "replace")
return {filename: contents}
content = file_.read()
if asyncio.iscoroutine(content):
# AsyncApp
content = await content

files[filename] = content.decode()

return files


async def test_mixed_formdata(fileData, formData):
files = {}
for file_ in fileData:
filename = file_.filename
content = file_.read()
if asyncio.iscoroutine(content):
# AsyncApp
content = await content

files[filename] = content.decode()

return {"data": {"formData": formData}, "files": files}


async def test_mixed_formdata3(fileData, formData):
files = {}
for file_ in fileData:
filename = file_.filename
content = file_.read()
if asyncio.iscoroutine(content):
# AsyncApp
content = await content

files[filename] = content.decode()

return {"data": formData, "files": files}


def test_formdata_file_upload_missing_param():
Expand Down
22 changes: 22 additions & 0 deletions tests/fixtures/simple/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,28 @@ paths:
format: binary
required:
- fileData
/test-mixed-formData:
post:
summary: 'Test formData with file type, for file upload'
operationId: fakeapi.hello.test_mixed_formdata3
responses:
'200':
description: OK
requestBody:
x-body-name: formData
content:
multipart/form-data:
schema:
type: object
properties:
formData:
type: string
fileData:
type: string
format: binary
required:
- formData
- fileData
/test-formData-file-upload-missing-param:
post:
summary: 'Test formData with file type, missing parameter in handler'
Expand Down
19 changes: 19 additions & 0 deletions tests/fixtures/simple/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -482,6 +482,25 @@ paths:
200:
description: OK

/test-mixed-formData:
post:
summary: 'Test formData with file type, for file upload'
operationId: fakeapi.hello.test_mixed_formdata
consumes:
- multipart/form-data
parameters:
- name: fileData
type: file
in: formData
required: true
- name: formData
type: string
in: formData
required: true
responses:
200:
description: OK

/test-formData-file-upload-missing-param:
post:
summary: Test formData with file type, missing parameter in handler
Expand Down

0 comments on commit 05c32d5

Please sign in to comment.