Skip to content

Commit aff42e5

Browse files
committed
Add UsertTaskController, routes, abilities and tests
1 parent cf48b67 commit aff42e5

File tree

4 files changed

+140
-0
lines changed

4 files changed

+140
-0
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
defmodule CodeCorps.UserTaskControllerTest do
2+
@moduledoc false
3+
4+
use CodeCorps.ApiCase, resource_name: :user_task
5+
6+
describe "index" do
7+
test "lists all entries on index", %{conn: conn} do
8+
[user_task_1, user_task_2] = insert_pair(:user_task)
9+
10+
conn
11+
|> request_index
12+
|> json_response(200)
13+
|> assert_ids_from_response([user_task_1.id, user_task_2.id])
14+
end
15+
16+
test "filters resources on index", %{conn: conn} do
17+
[user_task_1, user_task_2 | _] = insert_list(3, :user_task)
18+
19+
path = "user-tasks/?filter[id]=#{user_task_1.id},#{user_task_2.id}"
20+
21+
conn
22+
|> get(path)
23+
|> json_response(200)
24+
|> assert_ids_from_response([user_task_1.id, user_task_2.id])
25+
end
26+
end
27+
28+
describe "show" do
29+
test "shows chosen resource", %{conn: conn} do
30+
user = insert(:user)
31+
task = insert(:task)
32+
user_task = insert(:user_task, task: task, user: user)
33+
34+
conn
35+
|> request_show(user_task)
36+
|> json_response(200)
37+
|> Map.get("data")
38+
|> assert_result_id(user_task.id)
39+
end
40+
41+
test "renders 404 error when id is nonexistent", %{conn: conn} do
42+
assert conn |> request_show(:not_found) |> json_response(404)
43+
end
44+
end
45+
46+
describe "create" do
47+
@tag :authenticated
48+
test "creates and renders resource when data is valid", %{conn: conn, current_user: current_user} do
49+
task = insert(:task, user: current_user)
50+
user = insert(:user)
51+
52+
attrs = %{task: task, user: user}
53+
assert conn |> request_create(attrs) |> json_response(201)
54+
end
55+
56+
@tag :authenticated
57+
test "renders 422 error when data is invalid", %{conn: conn, current_user: current_user} do
58+
task = insert(:task, user: current_user)
59+
60+
invalid_attrs = %{task: task, user: nil}
61+
assert conn |> request_create(invalid_attrs) |> json_response(422)
62+
end
63+
64+
test "renders 401 when unauthenticated", %{conn: conn} do
65+
assert conn |> request_create |> json_response(401)
66+
end
67+
68+
@tag :authenticated
69+
test "renders 403 when not authorized", %{conn: conn} do
70+
task = insert(:task)
71+
user = insert(:user)
72+
attrs = %{task: task, user: user}
73+
74+
assert conn |> request_create(attrs) |> json_response(403)
75+
end
76+
end
77+
78+
describe "delete" do
79+
@tag :authenticated
80+
test "deletes chosen resource", %{conn: conn, current_user: current_user} do
81+
task = insert(:task, user: current_user)
82+
user_task = insert(:user_task, task: task)
83+
84+
assert conn |> request_delete(user_task) |> response(204)
85+
end
86+
87+
test "renders 401 when unauthenticated", %{conn: conn} do
88+
assert conn |> request_delete |> json_response(401)
89+
end
90+
91+
@tag :authenticated
92+
test "renders 403 when not authorized", %{conn: conn} do
93+
assert conn |> request_delete |> json_response(403)
94+
end
95+
96+
@tag :authenticated
97+
test "renders 404 when id is nonexistent on delete", %{conn: conn} do
98+
assert conn |> request_delete(:not_found) |> json_response(404)
99+
end
100+
end
101+
end

test/views/user_task_view_test.exs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
defmodule CodeCorps.UserTaskViewTest do
2+
@moduledoc false
3+
4+
use CodeCorps.ViewCase
5+
6+
test "renders all attributes and relationships properly" do
7+
user_task = insert(:user_task)
8+
9+
rendered_json = render(CodeCorps.UserTaskView, "show.json-api", data: user_task)
10+
11+
expected_json = %{
12+
"data" => %{
13+
"id" => user_task.id |> Integer.to_string,
14+
"type" => "user-task",
15+
"attributes" => %{},
16+
"relationships" => %{
17+
"task" => %{
18+
"data" => %{"id" => user_task.task_id |> Integer.to_string, "type" => "task"}
19+
},
20+
"user" => %{
21+
"data" => %{"id" => user_task.user_id |> Integer.to_string, "type" => "user"}
22+
}
23+
}
24+
},
25+
"jsonapi" => %{
26+
"version" => "1.0"
27+
}
28+
}
29+
30+
assert rendered_json == expected_json
31+
end
32+
end

web/models/abilities.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ defmodule Canary.Abilities do
2121
alias CodeCorps.UserCategory
2222
alias CodeCorps.UserRole
2323
alias CodeCorps.UserSkill
24+
alias CodeCorps.UserTask
2425

2526
alias CodeCorps.CategoryPolicy
2627
alias CodeCorps.CommentPolicy
@@ -44,6 +45,7 @@ defmodule Canary.Abilities do
4445
alias CodeCorps.UserCategoryPolicy
4546
alias CodeCorps.UserRolePolicy
4647
alias CodeCorps.UserSkillPolicy
48+
alias CodeCorps.UserTaskPolicy
4749

4850
alias Ecto.Changeset
4951

@@ -122,5 +124,8 @@ defmodule Canary.Abilities do
122124

123125
def can?(%User{} = user, :create, %Changeset{data: %UserSkill{}} = changeset), do: UserSkillPolicy.create?(user, changeset)
124126
def can?(%User{} = user, :delete, %UserSkill{} = user_skill), do: UserSkillPolicy.delete?(user, user_skill)
127+
128+
def can?(%User{} = user, :create, %Changeset{data: %UserTask{}} = changeset), do: UserTaskPolicy.create?(user, changeset)
129+
def can?(%User{} = user, :delete, %UserTask{} = user_task), do: UserTaskPolicy.delete?(user, user_task)
125130
end
126131
end

web/router.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ defmodule CodeCorps.Router do
7878
resources "/user-categories", UserCategoryController, only: [:create, :delete]
7979
resources "/user-roles", UserRoleController, only: [:create, :delete]
8080
resources "/user-skills", UserSkillController, only: [:create, :delete]
81+
resources "/user-tasks", UserTaskController, only: [:create, :delete]
8182
end
8283

8384
scope "/", CodeCorps, host: "api." do
@@ -110,6 +111,7 @@ defmodule CodeCorps.Router do
110111
resources "/user-categories", UserCategoryController, only: [:index, :show]
111112
resources "/user-roles", UserRoleController, only: [:index, :show]
112113
resources "/user-skills", UserSkillController, only: [:index, :show]
114+
resources "/user-tasks", UserTaskController, only: [:index, :show]
113115
get "/:slug", SluggedRouteController, :show
114116
get "/:slug/projects", ProjectController, :index
115117
get "/:slug/:project_slug", ProjectController, :show

0 commit comments

Comments
 (0)