Skip to content

Commit 90ffda3

Browse files
joshsmithbegedin
authored andcommitted
Add status filtering to GitHub events (#1352)
* Add status filtering to github events
1 parent 810cc30 commit 90ffda3

File tree

4 files changed

+150
-0
lines changed

4 files changed

+150
-0
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
defmodule CodeCorps.Admin.GithubEventQuery do
2+
@moduledoc ~S"""
3+
Holds helpers to query `CodeCorps.GithubEvent` records using a map of params.
4+
"""
5+
6+
import Ecto.Query
7+
8+
alias Ecto.Queryable
9+
10+
@doc ~S"""
11+
Filters a `CodeCorps.GithubEvent` query by `action`, if specified in params
12+
"""
13+
@spec action_filter(Queryable.t, map) :: Queryable.t
14+
def action_filter(queryable, %{"action" => action}) do
15+
queryable
16+
|> where([c], c.action == ^action)
17+
end
18+
def action_filter(queryable, %{}), do: queryable
19+
20+
@doc ~S"""
21+
Filters a `CodeCorps.GithubEvent` query by `status`, if specified in params
22+
"""
23+
@spec status_filter(Queryable.t, map) :: Queryable.t
24+
def status_filter(queryable, %{"status" => status}) do
25+
queryable
26+
|> where([c], c.status == ^status)
27+
end
28+
def status_filter(queryable, %{}), do: queryable
29+
30+
@doc ~S"""
31+
Filters a `CodeCorps.GithubEvent` query by `type`, if specified in params
32+
"""
33+
@spec type_filter(Queryable.t, map) :: Queryable.t
34+
def type_filter(queryable, %{"type" => type}) do
35+
queryable
36+
|> where([c], c.type == ^type)
37+
end
38+
def type_filter(queryable, %{}), do: queryable
39+
end

lib/code_corps_web/controllers/github_event_controller.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ defmodule CodeCorpsWeb.GithubEventController do
44
import Ecto.Query, only: [from: 2]
55

66
alias CodeCorps.{
7+
Admin,
78
GithubEvent,
89
GithubRepo,
910
GitHub.Webhook.Handler,
@@ -26,6 +27,9 @@ defmodule CodeCorpsWeb.GithubEventController do
2627
github_events =
2728
GithubEvent
2829
|> Query.id_filter(params)
30+
|> Admin.GithubEventQuery.action_filter(params)
31+
|> Admin.GithubEventQuery.status_filter(params)
32+
|> Admin.GithubEventQuery.type_filter(params)
2933
|> Ecto.Query.order_by([desc: :inserted_at])
3034
|> paginate(params)
3135

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
defmodule CodeCorps.Admin.GithubEventQueryTest do
2+
@moduledoc false
3+
4+
use CodeCorps.DbAccessCase
5+
6+
alias CodeCorps.{
7+
Admin.GithubEventQuery,
8+
GithubEvent,
9+
Repo
10+
}
11+
12+
describe "action_filter/2" do
13+
test "when action is present it filters" do
14+
created_event = insert(:github_event, action: "created")
15+
insert(:github_event, action: "opened")
16+
17+
[result] =
18+
GithubEvent
19+
|> GithubEventQuery.action_filter(%{"action" => "created"})
20+
|> Repo.all()
21+
22+
assert created_event == result
23+
end
24+
25+
test "when action is not present returns the queryable" do
26+
created_event = insert(:github_event, action: "created")
27+
opened_event = insert(:github_event, action: "opened")
28+
29+
[result1, result2] =
30+
GithubEvent
31+
|> GithubEventQuery.action_filter(%{})
32+
|> Repo.all()
33+
34+
assert created_event == result1
35+
assert opened_event == result2
36+
end
37+
end
38+
39+
describe "status_filter/2" do
40+
test "when status is present it filters" do
41+
processed_event = insert(:github_event, status: "processed")
42+
insert(:github_event, status: "unprocessed")
43+
44+
[result] =
45+
GithubEvent
46+
|> GithubEventQuery.status_filter(%{"status" => "processed"})
47+
|> Repo.all()
48+
49+
assert processed_event == result
50+
end
51+
52+
test "when status is not present returns the queryable" do
53+
processed_event = insert(:github_event, status: "processed")
54+
unprocessed_event = insert(:github_event, status: "unprocessed")
55+
56+
[result1, result2] =
57+
GithubEvent
58+
|> GithubEventQuery.status_filter(%{})
59+
|> Repo.all()
60+
61+
assert processed_event == result1
62+
assert unprocessed_event == result2
63+
end
64+
end
65+
66+
describe "type_filter/2" do
67+
test "when type is present it filters" do
68+
created_event = insert(:github_event, type: "issues")
69+
insert(:github_event, type: "installation")
70+
71+
[result] =
72+
GithubEvent
73+
|> GithubEventQuery.type_filter(%{"type" => "issues"})
74+
|> Repo.all()
75+
76+
assert created_event == result
77+
end
78+
79+
test "when type is not present returns the queryable" do
80+
issues_event = insert(:github_event, type: "issues")
81+
installation_event = insert(:github_event, type: "installation")
82+
83+
[result1, result2] =
84+
GithubEvent
85+
|> GithubEventQuery.type_filter(%{})
86+
|> Repo.all()
87+
88+
assert issues_event == result1
89+
assert installation_event == result2
90+
end
91+
end
92+
end

test/lib/code_corps_web/controllers/github_event_controller_test.exs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,21 @@ defmodule CodeCorpsWeb.GithubEventControllerTest do
5454
|> assert_ids_from_response([github_event_1.id, github_event_2.id])
5555
end
5656

57+
@tag authenticated: :admin
58+
test "filters resources on index with query params", %{conn: conn} do
59+
expected_event = insert(:github_event, action: "opened", status: "processed", type: "issues")
60+
insert(:github_event, action: "created")
61+
insert(:github_event, status: "unprocessed")
62+
insert(:github_event, type: "installation")
63+
64+
path = "github-events/?action=opened&status=processed&type=issues"
65+
66+
conn
67+
|> get(path)
68+
|> json_response(200)
69+
|> assert_ids_from_response([expected_event.id])
70+
end
71+
5772
test "renders 401 when unauthenticated", %{conn: conn} do
5873
assert conn |> request_index() |> json_response(401)
5974
end

0 commit comments

Comments
 (0)