Skip to content

Commit f84e274

Browse files
committed
Made searching by slug case insensitive
1 parent 755090a commit f84e274

5 files changed

Lines changed: 39 additions & 7 deletions

File tree

test/controllers/project_controller_test.exs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@ defmodule CodeCorps.ProjectControllerTest do
6161

6262
assert expected_ids == actual_ids
6363
end
64+
65+
test "listing by organization slug is case insensitive", %{conn: conn} do
66+
organization = insert(:organization)
67+
insert(:slugged_route, slug: "codecorps", organization: organization)
68+
69+
assert conn |> get("/codeCorps/projects") |> json_response(200)
70+
end
6471
end
6572

6673
describe "#show" do
@@ -104,6 +111,13 @@ defmodule CodeCorps.ProjectControllerTest do
104111
assert data["attributes"]["long-description-markdown"] == "A markdown **description**"
105112
assert data["relationships"]["organization"]["data"]["id"] == Integer.to_string(project.organization_id)
106113
end
114+
115+
test "retrieval by slug is case insensitive", %{conn: conn} do
116+
organization = insert(:organization, slug: "codecorps")
117+
insert(:project, slug: "codecorpsproject", organization: organization)
118+
119+
assert conn |> get("codeCorps/codeCorpsProject") |> json_response(200)
120+
end
107121
end
108122

109123
describe "create" do

test/controllers/slugged_route_controller_test.exs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
defmodule CodeCorps.SluggedRouteControllerTest do
22
use CodeCorps.ApiCase
33

4-
alias CodeCorps.SluggedRoute
5-
alias CodeCorps.Repo
6-
74
@valid_attrs %{organization_id: 42, slug: "some content", user_id: 42}
85
@invalid_attrs %{}
96

107
test "shows chosen resource", %{conn: conn} do
118
slug = "test-slug"
12-
slugged_route = Repo.insert! %SluggedRoute{slug: slug}
9+
slugged_route = insert(:slugged_route, slug: slug)
1310
conn = get conn, "/#{slug}"
1411
data = json_response(conn, 200)["data"]
1512
assert data["id"] == "#{slugged_route.id}"
@@ -19,6 +16,14 @@ defmodule CodeCorps.SluggedRouteControllerTest do
1916
assert data["attributes"]["user_id"] == slugged_route.user_id
2017
end
2118

19+
test "is case insensitive", %{conn: conn} do
20+
slug = "test"
21+
insert(:slugged_route, slug: slug)
22+
23+
assert conn |> get("/test") |> json_response(200)
24+
assert conn |> get("/tEst") |> json_response(200)
25+
end
26+
2227
test "does not show resource and instead throw error when id is nonexistent", %{conn: conn} do
2328
assert_error_sent 404, fn ->
2429
get conn, slugged_route_path(conn, :show, -1)

web/controllers/project_controller.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ defmodule CodeCorps.ProjectController do
1010
def index(conn, %{"slug" => slug}) do
1111
slugged_route =
1212
CodeCorps.SluggedRoute
13-
|> Repo.get_by!(slug: slug)
13+
|> CodeCorps.ModelHelpers.slug_finder(slug)
1414

1515
projects =
1616
Project
@@ -32,7 +32,7 @@ defmodule CodeCorps.ProjectController do
3232
def show(conn, %{"slug" => _slug, "project_slug" => project_slug}) do
3333
project =
3434
Project
35-
|> Repo.get_by!(slug: project_slug)
35+
|> CodeCorps.ModelHelpers.slug_finder(project_slug)
3636
|> Repo.preload([:categories, :organization, :posts, :skills])
3737

3838
render(conn, "show.json-api", data: project)

web/controllers/slugged_route_controller.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ defmodule CodeCorps.SluggedRouteController do
77
slugged_route =
88
SluggedRoute
99
|> preload([:organization, :user])
10-
|> Repo.get_by!(slug: slug)
10+
|> CodeCorps.ModelHelpers.slug_finder(slug)
11+
1112
render(conn, "show.json-api", data: slugged_route)
1213
end
1314
end

web/models/model_helpers.ex

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ defmodule CodeCorps.ModelHelpers do
1515
end
1616
end
1717

18+
# filters
19+
1820
def id_filter(query, %{"filter" => %{"id" => id_list}}) do
1921
ids = id_list |> coalesce_id_string
2022
query |> where([object], object.id in ^ids)
@@ -62,4 +64,14 @@ defmodule CodeCorps.ModelHelpers do
6264
query |> where([object], ilike(object.title, ^"%#{title}%"))
6365
end
6466
def title_filter(query, _), do: query
67+
68+
# end filters
69+
70+
# finders
71+
72+
def slug_finder(query, slug) do
73+
query |> CodeCorps.Repo.get_by!(slug: slug |> String.downcase)
74+
end
75+
76+
# end finders
6577
end

0 commit comments

Comments
 (0)