Skip to content

Commit 5fa5904

Browse files
committed
Add failing test for multipart array parameters
1 parent 5dfd3f5 commit 5fa5904

File tree

4 files changed

+73
-1
lines changed

4 files changed

+73
-1
lines changed

test/plug/cast_test.exs

+28
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,34 @@ defmodule OpenApiSpex.Plug.CastTest do
5151
assert OpenApiSpex.params(conn) == %{validParam: true}
5252
end
5353

54+
test "handles multipart/form-data array parameters" do
55+
boundary = "----testboundary"
56+
57+
body = """
58+
--#{boundary}\r
59+
Content-Disposition: form-data; name="files[]"; filename="file1.txt"\r
60+
Content-Type: text/plain\r
61+
\r
62+
HI\r
63+
--#{boundary}\r
64+
Content-Disposition: form-data; name="files[]"; filename="file2.txt"\r
65+
Content-Type: text/plain\r
66+
\r
67+
HI2\r
68+
--#{boundary}--\r
69+
"""
70+
71+
conn =
72+
Plug.Test.conn(:post, "/api/upload_multipart", body)
73+
|> Plug.Conn.put_req_header("content-type", "multipart/form-data; boundary=#{boundary}")
74+
|> Plug.Conn.put_req_header("accept", "application/json")
75+
|> OpenApiSpexTest.Router.call([])
76+
77+
body = Jason.decode!(conn.resp_body)
78+
79+
assert %{"data" => ["file1.txt", "file2.txt"]} = body
80+
end
81+
5482
@tag :capture_log
5583
test "invalid value" do
5684
conn =

test/support/router.ex

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ defmodule OpenApiSpexTest.Router do
66
pipeline :api do
77
plug :accepts, ["json"]
88
plug PutApiSpec, module: OpenApiSpexTest.ApiSpec
9-
plug Parsers, parsers: [:json], pass: ["text/*"], json_decoder: Jason
9+
plug Parsers, parsers: [:json, :multipart], pass: ["text/*"], json_decoder: Jason
1010
end
1111

1212
scope "/api" do
@@ -25,6 +25,7 @@ defmodule OpenApiSpexTest.Router do
2525
get "/users/:id/payment_details", OpenApiSpexTest.UserController, :payment_details
2626
post "/users/:id/contact_info", OpenApiSpexTest.UserController, :contact_info
2727
post "/users/create_entity", OpenApiSpexTest.UserController, :create_entity
28+
post "/upload_multipart", OpenApiSpexTest.UploadMultipartController, :create
2829
get "/openapi", OpenApiSpex.Plug.RenderSpec, []
2930

3031
resources "/pets", OpenApiSpexTest.PetController, only: [:create, :index, :show, :update]

test/support/schemas.ex

+23
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,29 @@ defmodule OpenApiSpexTest.Schemas do
278278
})
279279
end
280280

281+
defmodule UploadRequest do
282+
OpenApiSpex.schema(%{
283+
title: "UploadRequest",
284+
description: "POST body for uploading files",
285+
type: :object,
286+
properties: %{
287+
"files[]": %Schema{type: :array, items: %Schema{type: :string, format: :binary}}
288+
},
289+
required: [:"files[]"]
290+
})
291+
end
292+
293+
defmodule UploadResponse do
294+
OpenApiSpex.schema(%{
295+
title: "UploadResponse",
296+
description: "",
297+
type: :object,
298+
properties: %{
299+
data: %Schema{description: "Filenames", type: :array, items: %Schema{type: :string}}
300+
}
301+
})
302+
end
303+
281304
defmodule UserRequest do
282305
OpenApiSpex.schema(%{
283306
title: "UserRequest",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
defmodule OpenApiSpexTest.UploadMultipartController do
2+
@moduledoc tags: ["uploads"]
3+
4+
use Phoenix.Controller
5+
use OpenApiSpex.Controller
6+
7+
alias OpenApiSpexTest.Schemas
8+
9+
plug OpenApiSpex.Plug.CastAndValidate, json_render_error_v2: true, replace_params: false
10+
11+
@doc request_body: {"Files", "multipart/form-data", Schemas.UploadRequest},
12+
responses: [
13+
created: {"Files", "application/json", Schemas.UploadResponse}
14+
]
15+
def create(conn, %{"files" => files}) do
16+
json(conn, %Schemas.UploadResponse{
17+
data: Enum.map(files, & &1.filename)
18+
})
19+
end
20+
end

0 commit comments

Comments
 (0)