Skip to content

Commit 63abb83

Browse files
authored
Merge pull request code-corps#277 from code-corps/add-project-categories-show
Add show and index actions to ProjectCategory
2 parents 7256e91 + ee1a5db commit 63abb83

3 files changed

Lines changed: 89 additions & 0 deletions

File tree

test/controllers/project_category_controller_test.exs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,67 @@ defmodule CodeCorps.ProjectCategoryControllerTest do
2121
}
2222
end
2323

24+
describe "index" do
25+
test "lists all entries on index", %{conn: conn} do
26+
conn = get conn, project_category_path(conn, :index)
27+
assert json_response(conn, 200)["data"] == []
28+
end
29+
30+
test "filters resources on index", %{conn: conn} do
31+
arts = insert(:category, name: "Arts")
32+
society = insert(:category, name: "Society")
33+
technology = insert(:category, name: "Technology")
34+
35+
project = insert(:project)
36+
project_category_1 = insert(:project_category, project: project, category: arts)
37+
project_category_2 = insert(:project_category, project: project, category: society)
38+
insert(:project_category, project: project, category: technology)
39+
40+
json =
41+
conn
42+
|> get("project-categories/?filter[id]=#{project_category_1.id},#{project_category_2.id}")
43+
|> json_response(200)
44+
data = json["data"]
45+
assert length(data) == 2
46+
[first_result, second_result | _] = data
47+
48+
assert first_result["id"] == "#{project_category_1.id}"
49+
assert first_result["relationships"]["project"]["data"]["id"] == "#{project.id}"
50+
assert first_result["relationships"]["project"]["data"]["type"] == "project"
51+
assert first_result["relationships"]["category"]["data"]["id"] == "#{arts.id}"
52+
assert first_result["relationships"]["category"]["data"]["type"] == "category"
53+
54+
assert second_result["id"] == "#{project_category_2.id}"
55+
assert second_result["relationships"]["project"]["data"]["id"] == "#{project.id}"
56+
assert second_result["relationships"]["project"]["data"]["type"] == "project"
57+
assert second_result["relationships"]["category"]["data"]["id"] == "#{society.id}"
58+
assert second_result["relationships"]["category"]["data"]["type"] == "category"
59+
end
60+
end
61+
62+
describe "show" do
63+
test "shows chosen resource", %{conn: conn} do
64+
category = insert(:category)
65+
project = insert(:project)
66+
project_category = insert(:project_category, project: project, category: category)
67+
conn = get conn, project_category_path(conn, :show, project_category)
68+
data = json_response(conn, 200)["data"]
69+
assert data["id"] == "#{project_category.id}"
70+
assert data["type"] == "project-category"
71+
assert data["attributes"] == %{}
72+
assert data["relationships"]["project"]["data"]["id"] == "#{project.id}"
73+
assert data["relationships"]["project"]["data"]["type"] == "project"
74+
assert data["relationships"]["category"]["data"]["id"] == "#{category.id}"
75+
assert data["relationships"]["category"]["data"]["type"] == "category"
76+
end
77+
78+
test "does not show resource and instead throw error when id is nonexistent", %{conn: conn} do
79+
assert_error_sent 404, fn ->
80+
get conn, project_category_path(conn, :show, -1)
81+
end
82+
end
83+
end
84+
2485
describe "create" do
2586
@tag authenticated: :admin
2687
test "creates and renders resource when data is valid", %{conn: conn} do

web/controllers/project_category_controller.ex

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,31 @@
11
defmodule CodeCorps.ProjectCategoryController do
22
use CodeCorps.Web, :controller
33

4+
import CodeCorps.ControllerHelpers
5+
46
alias JaSerializer.Params
57
alias CodeCorps.ProjectCategory
68

79
plug :load_and_authorize_resource, model: ProjectCategory, only: [:create, :delete]
810
plug :scrub_params, "data" when action in [:create]
911

12+
def index(conn, params) do
13+
project_categories =
14+
case params do
15+
%{"filter" => %{"id" => id_list}} ->
16+
ids = id_list |> coalesce_id_string
17+
ProjectCategory
18+
|> preload([:project, :category])
19+
|> where([p], p.id in ^ids)
20+
|> Repo.all
21+
%{} ->
22+
ProjectCategory
23+
|> preload([:user, :category])
24+
|> Repo.all
25+
end
26+
render(conn, "index.json-api", data: project_categories)
27+
end
28+
1029
def create(conn, %{"data" => data = %{"type" => "project-category"}}) do
1130
changeset = %ProjectCategory{} |> ProjectCategory.create_changeset(Params.to_attributes(data))
1231

@@ -24,6 +43,14 @@ defmodule CodeCorps.ProjectCategoryController do
2443
end
2544
end
2645

46+
def show(conn, %{"id" => id}) do
47+
project_category =
48+
ProjectCategory
49+
|> preload([:project, :category])
50+
|> Repo.get!(id)
51+
render(conn, "show.json-api", data: project_category)
52+
end
53+
2754
def delete(conn, %{"id" => id}) do
2855
ProjectCategory |> Repo.get!(id) |> Repo.delete!
2956

web/router.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ defmodule CodeCorps.Router do
6161
resources "/posts", PostController, only: [:index, :show]
6262
end
6363

64+
resources "/project-categories", ProjectCategoryController, only: [:index, :show]
6465
resources "/project-skills", ProjectSkillController, only: [:index, :show]
6566
resources "/roles", RoleController, only: [:index, :show]
6667
resources "/skills", SkillController, only: [:index, :show]

0 commit comments

Comments
 (0)