Skip to content

Commit 410f3aa

Browse files
authored
Test array query params in example phoenix app (#667)
1 parent 22f46f5 commit 410f3aa

File tree

4 files changed

+44
-17
lines changed

4 files changed

+44
-17
lines changed

examples/phoenix_app/lib/phoenix_app/accounts/accounts.ex

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,19 @@ defmodule PhoenixApp.Accounts do
22
alias PhoenixApp.Accounts.User
33
alias PhoenixApp.Repo
44

5-
def list_users() do
6-
Repo.all(User)
5+
import Ecto.Query
6+
7+
def list_users(filters) do
8+
query = from(u in User, order_by: [asc: u.id])
9+
10+
query =
11+
if filters[:ids] do
12+
from(u in query, where: u.id in ^filters[:ids])
13+
else
14+
query
15+
end
16+
17+
Repo.all(query)
718
end
819

920
def get_user!(id) do

examples/phoenix_app/lib/phoenix_app_web/controllers/user_controller.ex

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,22 @@ defmodule PhoenixAppWeb.UserController do
2121
operation :index,
2222
summary: "List users",
2323
description: "List all users",
24+
parameters: [
25+
OpenApiSpex.Operation.parameter(
26+
:ids,
27+
:query,
28+
%Schema{type: :array, items: %Schema{type: :integer}},
29+
"Filter by user ids"
30+
)
31+
],
2432
responses: [
2533
ok: {"User List Response", "application/json", Schemas.UsersResponse},
2634
unprocessable_entity: %Reference{"$ref": "#/components/responses/unprocessable_entity"}
2735
]
2836

29-
def index(conn, _params) do
30-
users = Accounts.list_users()
37+
def index(conn, params) do
38+
users = Accounts.list_users(params)
39+
3140
render(conn, "index.json", users: users)
3241
end
3342

@@ -37,8 +46,7 @@ defmodule PhoenixAppWeb.UserController do
3746
parameters: [
3847
group_id: [in: :path, type: :integer, description: "Group ID", example: 1]
3948
],
40-
request_body:
41-
{"The user attributes", "application/json", Schemas.UserRequest, required: true},
49+
request_body: {"The user attributes", "application/json", Schemas.UserRequest, required: true},
4250
responses: [
4351
created: {"User", "application/json", Schemas.UserResponse}
4452
]
@@ -88,8 +96,7 @@ defmodule PhoenixAppWeb.UserController do
8896
required: true
8997
]
9098
],
91-
request_body:
92-
{"The user attributes", "application/json", Schemas.UserRequest, required: true},
99+
request_body: {"The user attributes", "application/json", Schemas.UserRequest, required: true},
93100
responses: [
94101
ok: {"User", "application/json", Schemas.UserResponse}
95102
]

examples/phoenix_app/lib/phoenix_app_web/controllers/user_controller_with_struct_specs.ex

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ defmodule PhoenixAppWeb.UserControllerWithStructSpecs do
44
of using the ExDoc-based operation specs.
55
"""
66
use PhoenixAppWeb, :controller
7+
78
import OpenApiSpex.Operation, only: [parameter: 5, request_body: 4, response: 3]
8-
alias OpenApiSpex.{Operation, Reference}
9+
10+
alias OpenApiSpex.{Operation, Reference, Schema}
911
alias PhoenixApp.{Accounts, Accounts.User}
1012
alias PhoenixAppWeb.Schemas
1113

@@ -34,15 +36,24 @@ defmodule PhoenixAppWeb.UserControllerWithStructSpecs do
3436
summary: "List users",
3537
description: "List all useres",
3638
operationId: "UserController.index",
39+
parameters: [
40+
OpenApiSpex.Operation.parameter(
41+
:ids,
42+
:query,
43+
%Schema{type: :array, items: %Schema{type: :integer}},
44+
"Filter by user ids"
45+
)
46+
],
3747
responses: %{
3848
200 => response("User List Response", "application/json", Schemas.UsersResponse),
3949
422 => %Reference{"$ref": "#/components/responses/unprocessable_entity"}
4050
}
4151
}
4252
end
4353

44-
def index(conn, _params) do
45-
users = Accounts.list_users()
54+
def index(conn, params) do
55+
users = Accounts.list_users(params)
56+
4657
render(conn, "index.json", users: users)
4758
end
4859

@@ -56,9 +67,7 @@ defmodule PhoenixAppWeb.UserControllerWithStructSpecs do
5667
Operation.parameter(:group_id, :path, :integer, "Group ID", example: 1)
5768
],
5869
requestBody:
59-
request_body("The user attributes", "application/json", Schemas.UserRequest,
60-
required: true
61-
),
70+
request_body("The user attributes", "application/json", Schemas.UserRequest, required: true),
6271
responses: %{
6372
201 => response("User", "application/json", Schemas.UserResponse)
6473
}

examples/phoenix_app/test/phoenix_app_web/controllers/user_controller_test.exs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,17 @@ defmodule PhoenixAppWeb.UserControllerTest do
3434
%{id: id2} =
3535
PhoenixApp.Repo.insert!(%PhoenixApp.Accounts.User{name: "Benjamin", email: "[email protected]"})
3636

37-
%{id: id3} =
37+
%{id: _id3} =
3838
PhoenixApp.Repo.insert!(%PhoenixApp.Accounts.User{name: "Chuck", email: "[email protected]"})
3939

4040
response =
4141
conn
4242
|> Plug.Conn.put_req_header("accept", "application/json")
43-
|> get(user_path(conn, :index))
43+
|> get(user_path(conn, :index), ids: [id1, id2])
4444
|> json_response(200)
4545
|> assert_schema("UsersResponse", spec)
4646

47-
assert [%{id: ^id1}, %{id: ^id2}, %{id: ^id3}] = response.data
47+
assert [%{id: ^id1}, %{id: ^id2}] = response.data
4848
end
4949

5050
test "User schema example", %{spec: spec} do

0 commit comments

Comments
 (0)