Skip to content

Commit f007df2

Browse files
committed
Add routes, abilities, controllers and tests for TaskSkills
1 parent 4a122fc commit f007df2

File tree

4 files changed

+136
-5
lines changed

4 files changed

+136
-5
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
defmodule CodeCorps.TaskSkillControllerTest do
2+
@moduledoc false
3+
4+
use CodeCorps.ApiCase, resource_name: :task_skill
5+
6+
describe "index" do
7+
test "lists all entries on index", %{conn: conn} do
8+
[task_skill_1, task_skill_2] = insert_pair(:task_skill)
9+
10+
conn
11+
|> request_index
12+
|> json_response(200)
13+
|> assert_ids_from_response([task_skill_1.id, task_skill_2.id])
14+
end
15+
16+
test "filters resources on index", %{conn: conn} do
17+
[task_skill_1, task_skill_2 | _] = insert_list(3, :task_skill)
18+
19+
path = "task-skills/?filter[id]=#{task_skill_1.id},#{task_skill_2.id}"
20+
21+
conn
22+
|> get(path)
23+
|> json_response(200)
24+
|> assert_ids_from_response([task_skill_1.id, task_skill_2.id])
25+
end
26+
end
27+
28+
describe "show" do
29+
test "shows chosen resource", %{conn: conn} do
30+
skill = insert(:skill)
31+
task = insert(:task)
32+
task_skill = insert(:task_skill, task: task, skill: skill)
33+
34+
conn
35+
|> request_show(task_skill)
36+
|> json_response(200)
37+
|> Map.get("data")
38+
|> assert_result_id(task_skill.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+
skill = insert(:skill)
51+
52+
attrs = %{task: task, skill: skill}
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, skill: 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+
skill = insert(:skill)
72+
attrs = %{task: task, skill: skill}
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+
task_skill = insert(:task_skill, task: task)
83+
84+
assert conn |> request_delete(task_skill) |> 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
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
defmodule CodeCorps.TaskSkillController do
2+
use CodeCorps.Web, :controller
3+
use JaResource
4+
5+
import CodeCorps.Helpers.Query, only: [id_filter: 2]
6+
7+
alias CodeCorps.TaskSkill
8+
9+
plug :load_resource, model: TaskSkill, only: [:show], preload: [:task, :skill]
10+
plug :load_and_authorize_changeset, model: TaskSkill, only: [:create]
11+
plug :load_and_authorize_resource, model: TaskSkill, only: [:delete]
12+
plug JaResource
13+
14+
@spec filter(Plug.Conn.t, Ecto.Query.t, String.t, list) :: Plug.Conn.t
15+
def filter(_conn, query, "id", id_list) do
16+
query |> id_filter(id_list)
17+
end
18+
19+
@spec handle_create(Plug.Conn.t, map) :: Ecto.Changeset.t
20+
def handle_create(_conn, attributes) do
21+
%TaskSkill{} |> TaskSkill.create_changeset(attributes)
22+
end
23+
end

web/models/abilities.ex

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ defmodule Canary.Abilities do
44
alias CodeCorps.DonationGoal
55
alias CodeCorps.Organization
66
alias CodeCorps.OrganizationMembership
7-
alias CodeCorps.Task
87
alias CodeCorps.Preview
98
alias CodeCorps.Project
109
alias CodeCorps.ProjectCategory
@@ -17,6 +16,8 @@ defmodule Canary.Abilities do
1716
alias CodeCorps.StripeConnectSubscription
1817
alias CodeCorps.StripePlatformCard
1918
alias CodeCorps.StripePlatformCustomer
19+
alias CodeCorps.Task
20+
alias CodeCorps.TaskSkill
2021
alias CodeCorps.User
2122
alias CodeCorps.UserCategory
2223
alias CodeCorps.UserRole
@@ -28,7 +29,6 @@ defmodule Canary.Abilities do
2829
alias CodeCorps.DonationGoalPolicy
2930
alias CodeCorps.OrganizationPolicy
3031
alias CodeCorps.OrganizationMembershipPolicy
31-
alias CodeCorps.TaskPolicy
3232
alias CodeCorps.PreviewPolicy
3333
alias CodeCorps.ProjectPolicy
3434
alias CodeCorps.ProjectCategoryPolicy
@@ -41,6 +41,8 @@ defmodule Canary.Abilities do
4141
alias CodeCorps.StripeConnectSubscriptionPolicy
4242
alias CodeCorps.StripePlatformCardPolicy
4343
alias CodeCorps.StripePlatformCustomerPolicy
44+
alias CodeCorps.TaskPolicy
45+
alias CodeCorps.TaskSkillPolicy
4446
alias CodeCorps.UserPolicy
4547
alias CodeCorps.UserCategoryPolicy
4648
alias CodeCorps.UserRolePolicy
@@ -78,9 +80,6 @@ defmodule Canary.Abilities do
7880
def can?(%User{} = user, :update, %Changeset{data: %OrganizationMembership{}} = changeset), do: OrganizationMembershipPolicy.update?(user, changeset)
7981
def can?(%User{} = user, :delete, %OrganizationMembership{} = membership), do: OrganizationMembershipPolicy.delete?(user, membership)
8082

81-
def can?(%User{} = user, :create, %Changeset{data: %Task{}} = changeset), do: TaskPolicy.create?(user, changeset)
82-
def can?(%User{} = user, :update, %Task{} = task), do: TaskPolicy.update?(user, task)
83-
8483
def can?(%User{} = user, :create, %Changeset{data: %Preview{}} = changeset), do: PreviewPolicy.create?(user, changeset)
8584

8685
def can?(%User{} = user, :create, %Changeset{data: %Project{}} = changeset), do: ProjectPolicy.create?(user, changeset)
@@ -116,6 +115,12 @@ defmodule Canary.Abilities do
116115
def can?(%User{} = user, :create, %Changeset{data: %StripePlatformCustomer{}} = changeset), do: StripePlatformCustomerPolicy.create?(user, changeset)
117116
def can?(%User{} = user, :show, %StripePlatformCustomer{} = stripe_platform_customer), do: StripePlatformCustomerPolicy.show?(user, stripe_platform_customer)
118117

118+
def can?(%User{} = user, :create, %Changeset{data: %Task{}} = changeset), do: TaskPolicy.create?(user, changeset)
119+
def can?(%User{} = user, :update, %Task{} = task), do: TaskPolicy.update?(user, task)
120+
121+
def can?(%User{} = user, :create, %Changeset{data: %TaskSkill{}} = changeset), do: TaskSkillPolicy.create?(user, changeset)
122+
def can?(%User{} = user, :delete, %TaskSkill{} = task_skill), do: TaskSkillPolicy.delete?(user, task_skill)
123+
119124
def can?(%User{} = user, :create, %Changeset{data: %UserCategory{}} = changeset), do: UserCategoryPolicy.create?(user, changeset)
120125
def can?(%User{} = user, :delete, %UserCategory{} = user_category), do: UserCategoryPolicy.delete?(user, user_category)
121126

web/router.ex

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ defmodule CodeCorps.Router do
7474
resources "/stripe-platform-cards", StripePlatformCardController, only: [:show, :create]
7575
resources "/stripe-platform-customers", StripePlatformCustomerController, only: [:show, :create]
7676
resources "/tasks", TaskController, only: [:create, :update]
77+
resources "/task-skills", TaskSkillController, only: [:create, :delete]
7778
resources "/users", UserController, only: [:update]
7879
resources "/user-categories", UserCategoryController, only: [:create, :delete]
7980
resources "/user-roles", UserRoleController, only: [:create, :delete]
@@ -105,6 +106,7 @@ defmodule CodeCorps.Router do
105106
resources "/tasks", TaskController, only: [:index, :show]
106107
end
107108
resources "/tasks", TaskController, only: [:index, :show]
109+
resources "/task-skills", TaskSkillController, only: [:index, :show]
108110
get "/users/email_available", UserController, :email_available
109111
get "/users/username_available", UserController, :username_available
110112
resources "/users", UserController, only: [:index, :show, :create]

0 commit comments

Comments
 (0)