Skip to content

Commit 6347afc

Browse files
committed
Test Sync.GithubUser properly
1 parent 915cbc0 commit 6347afc

File tree

5 files changed

+129
-20
lines changed

5 files changed

+129
-20
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
defmodule CodeCorps.GitHub.Sync.GithubUser.Changeset do
2+
@moduledoc ~S"""
3+
In charge of changesets for actions on `CodeCorps.GithubUser` records.
4+
"""
5+
6+
alias CodeCorps.GithubUser
7+
alias Ecto.Changeset
8+
9+
@doc ~S"""
10+
Builds a changeset for creating or updating a `CodeCorps.GithubUser` record.
11+
"""
12+
@spec changeset(GithubUser.t(), map) :: Changeset.t()
13+
def changeset(%GithubUser{} = struct, %{} = attrs) do
14+
struct
15+
|> Changeset.cast(attrs, [:avatar_url, :email, :github_id, :username, :type])
16+
|> Changeset.validate_required([:avatar_url, :github_id, :username, :type])
17+
end
18+
end

lib/code_corps/github/sync/github_user/github_user.ex

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,26 @@ defmodule CodeCorps.GitHub.Sync.GithubUser do
44
containing the user.
55
"""
66

7-
alias CodeCorps.{
8-
GitHub.Adapters,
9-
GithubUser,
10-
Repo
11-
}
7+
alias CodeCorps.{GitHub.Adapters, GitHub.Sync, GithubUser, Repo}
128

139
@doc ~S"""
1410
Finds or creates a `GithubUser` record using information in the GitHub API
1511
payload.
1612
"""
1713
@spec create_or_update_github_user(map) :: {:ok, GithubUser.t}
18-
def create_or_update_github_user(%{"user" => %{"id" => github_id} = attrs}) do
14+
def create_or_update_github_user(%{"user" => %{"id" => github_id} = params}) do
15+
attrs = params |> Adapters.User.to_github_user()
16+
1917
case GithubUser |> Repo.get_by(github_id: github_id) do
2018
nil ->
2119
%GithubUser{}
22-
|> GithubUser.changeset(attrs |> Adapters.User.to_github_user)
23-
|> Repo.insert
24-
%GithubUser{} = issue ->
25-
issue
26-
|> GithubUser.changeset(attrs |> Adapters.User.to_github_user)
27-
|> Repo.update
20+
|> Sync.GithubUser.Changeset.changeset(attrs)
21+
|> Repo.insert()
22+
23+
%GithubUser{} = record ->
24+
record
25+
|> Sync.GithubUser.Changeset.changeset(attrs)
26+
|> Repo.update()
2827
end
2928
end
3029
end
Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
defmodule CodeCorps.GithubUser do
22
use Ecto.Schema
3-
import Ecto.Changeset
43

54
@type t :: %__MODULE__{}
65

@@ -15,11 +14,4 @@ defmodule CodeCorps.GithubUser do
1514

1615
timestamps()
1716
end
18-
19-
@doc false
20-
def changeset(struct, attrs) do
21-
struct
22-
|> cast(attrs, [:avatar_url, :email, :github_id, :username, :type])
23-
|> validate_required([:avatar_url, :github_id, :username, :type])
24-
end
2517
end
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
defmodule CodeCorps.GitHub.Event.GithubUser.ChangesetTest do
2+
@moduledoc false
3+
4+
use CodeCorps.DbAccessCase
5+
6+
import CodeCorps.GitHub.TestHelpers
7+
alias CodeCorps.{
8+
GitHub.Adapters,
9+
GitHub.Sync,
10+
GithubUser
11+
}
12+
alias Ecto.Changeset
13+
14+
15+
describe "changeset/2" do
16+
test "assigns correct changes" do
17+
attrs =
18+
"issues_opened"
19+
|> load_event_fixture()
20+
|> Kernel.get_in(["issue", "user"])
21+
|> Adapters.User.to_github_user()
22+
23+
changeset = %GithubUser{} |> Sync.GithubUser.Changeset.changeset(attrs)
24+
25+
assert changeset |> Changeset.get_change(:avatar_url) == attrs.avatar_url
26+
assert changeset |> Changeset.get_change(:email) == attrs.email
27+
assert changeset |> Changeset.get_change(:github_id) == attrs.github_id
28+
assert changeset |> Changeset.get_change(:username) == attrs.username
29+
assert changeset |> Changeset.get_change(:type) == attrs.type
30+
31+
assert changeset.valid?
32+
end
33+
34+
test "validates correct required attributes" do
35+
changeset = %GithubUser{} |> Sync.GithubUser.Changeset.changeset(%{})
36+
37+
refute changeset.valid?
38+
39+
assert changeset.errors[:avatar_url]
40+
assert changeset.errors[:github_id]
41+
assert changeset.errors[:username]
42+
assert changeset.errors[:type]
43+
end
44+
end
45+
end
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
defmodule CodeCorps.GitHub.Sync.GithubUserTest do
2+
@moduledoc false
3+
4+
use CodeCorps.DbAccessCase
5+
6+
import CodeCorps.GitHub.TestHelpers
7+
8+
alias CodeCorps.{
9+
GitHub.Adapters,
10+
GitHub.Sync,
11+
GithubUser,
12+
Repo
13+
}
14+
15+
alias Ecto.Changeset
16+
17+
18+
19+
@event_payload "issues_opened" |> load_event_fixture() |> Map.get("issue")
20+
21+
describe "create_or_update_github_user/1" do
22+
test "creates github user if one is not matched from the payload" do
23+
assert {:ok, %GithubUser{id: created_id}} =
24+
@event_payload |> Sync.GithubUser.create_or_update_github_user()
25+
26+
assert created_user = Repo.one(GithubUser)
27+
assert created_user.id == created_id
28+
attrs = Adapters.User.to_github_user(@event_payload["user"])
29+
assert created_user |> Map.take(attrs |> Map.keys()) == attrs
30+
end
31+
32+
test "updates github user if one is matched from the payload" do
33+
record = insert(:github_user, github_id: @event_payload["user"]["id"])
34+
35+
assert {:ok, %GithubUser{id: updated_id}} =
36+
@event_payload |> Sync.GithubUser.create_or_update_github_user()
37+
38+
assert updated_user = Repo.one(GithubUser)
39+
assert updated_user.id == updated_id
40+
assert updated_user.id == record.id
41+
attrs = Adapters.User.to_github_user(@event_payload["user"])
42+
assert updated_user |> Map.take(attrs |> Map.keys()) == attrs
43+
end
44+
45+
test "returns changeset if there was a problem" do
46+
assert {:error, %Changeset{} = changeset} =
47+
@event_payload
48+
|> Kernel.put_in(["user", "login"], nil)
49+
|> Sync.GithubUser.create_or_update_github_user()
50+
51+
refute changeset.valid?
52+
refute Repo.one(GithubUser)
53+
end
54+
end
55+
end

0 commit comments

Comments
 (0)