Skip to content

Commit 3788c8b

Browse files
irefbegedin
authored andcommitted
Moves nil parameter removal from github adapter to user changeset (#1300)
Move rejection of nil attributes from a github payload when updating a user record from the adapter into the user changeset.
1 parent 65ec89b commit 3788c8b

File tree

5 files changed

+43
-15
lines changed

5 files changed

+43
-15
lines changed

lib/code_corps/accounts/changesets.ex

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,14 @@ defmodule CodeCorps.Accounts.Changesets do
1414
"""
1515
@spec create_from_github_changeset(struct, map) :: Changeset.t
1616
def create_from_github_changeset(struct, %{} = params) do
17+
params =
18+
params
19+
|> Adapters.User.to_user()
20+
|> Enum.reject(fn {_, v} -> is_nil(v) end)
21+
|> Map.new()
22+
1723
struct
18-
|> Changeset.change(params |> Adapters.User.to_user())
24+
|> Changeset.change(params)
1925
|> Changeset.put_change(:sign_up_context, "github")
2026
|> Changeset.validate_inclusion(:type, ["bot", "user"])
2127
|> RandomIconColor.generate_icon_color(:default_color)

lib/code_corps/github/adapters/user.ex

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,12 @@ defmodule CodeCorps.GitHub.Adapters.User do
2121
Converts a Github user payload into a map of attributes suitable for creating
2222
or updating a `CodeCorps.User`
2323
24-
Any `nil` values are removed. For example, we don't want to delete an
25-
existing email just because it's `nil` in the payload.
26-
2724
The `type` gets transformed to match our expected values for user type.
2825
"""
2926
@spec to_user(map) :: map
3027
def to_user(%{} = payload) do
3128
payload
3229
|> CodeCorps.Adapter.MapTransformer.transform(@user_mapping)
33-
|> Enum.reject(fn {_, v} -> is_nil(v) end)
34-
|> Map.new
3530
|> transform_type
3631
end
3732

test/lib/code_corps/accounts/changesets_test.exs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,16 @@ defmodule CodeCorps.Accounts.ChangesetsTest do
1818
changeset = Changesets.create_from_github_changeset(%User{}, %{})
1919
assert changeset.changes.default_color
2020
end
21+
22+
test "ensures nil values are omitted" do
23+
params = %{"email" => nil, "github_avatar_url" => nil, "type" => "bot"}
24+
25+
changeset = Changesets.create_from_github_changeset(%User{}, params)
26+
27+
refute changeset.changes[:email]
28+
refute changeset.changes[:github_avatar_url]
29+
end
30+
2131
end
2232

2333
describe "update_from_github_oauth_changeset/2" do

test/lib/code_corps/github/adapters/user_test.exs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,22 @@ defmodule CodeCorps.GitHub.Adapters.UserTest do
77

88
alias CodeCorps.GitHub.Adapters.User
99

10+
defp expected_payload(type) do
11+
%{
12+
email: nil,
13+
github_id: nil,
14+
github_username: nil,
15+
github_avatar_url: nil,
16+
type: type
17+
}
18+
end
19+
1020
describe "to_user/1" do
1121
test "maps API payload" do
1222
%{"issue" => %{"user" => payload}} = load_event_fixture("issues_opened")
1323

1424
assert User.to_user(payload) == %{
25+
email: nil,
1526
github_id: payload["id"],
1627
github_username: payload["login"],
1728
github_avatar_url: payload["avatar_url"],
@@ -20,15 +31,15 @@ defmodule CodeCorps.GitHub.Adapters.UserTest do
2031
end
2132

2233
test "maps Bot type" do
23-
assert User.to_user(%{"type" => "Bot"}) == %{type: "bot"}
34+
assert User.to_user(%{"type" => "Bot"}) == expected_payload("bot")
2435
end
2536

2637
test "maps User type" do
27-
assert User.to_user(%{"type" => "User"}) == %{type: "user"}
38+
assert User.to_user(%{"type" => "User"}) == expected_payload("user")
2839
end
2940

3041
test "does not map Organization type" do
31-
assert User.to_user(%{"type" => "Organization"}) == %{type: "Organization"}
42+
assert User.to_user(%{"type" => "Organization"}) == expected_payload("Organization")
3243
end
3344
end
3445
end

test/lib/code_corps/github/sync/user/record_linker_test.exs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ defmodule CodeCorps.Sync.User.RecordLinkerTest do
1212
}
1313
alias CodeCorps.GitHub.Adapters.User, as: UserAdapter
1414

15+
def remove_nils(payload) do
16+
payload
17+
|> Enum.reject(fn {_, v} -> is_nil(v) end)
18+
|> Map.new()
19+
end
20+
1521
describe "link_to/2 for comments" do
1622
@payload load_event_fixture("issue_comment_created")
1723
@bot_payload load_event_fixture("issue_comment_created_by_bot")
@@ -43,7 +49,7 @@ defmodule CodeCorps.Sync.User.RecordLinkerTest do
4349

4450
test "finds user by github id if none is found by comment association" do
4551
%{"comment" => %{"id" => github_id} = comment} = @payload
46-
attributes = UserAdapter.to_user(@user_payload)
52+
attributes = @user_payload |> UserAdapter.to_user() |> remove_nils()
4753
preinserted_user = insert(:user, attributes)
4854
github_comment = insert(:github_comment, github_id: github_id)
4955

@@ -58,7 +64,7 @@ defmodule CodeCorps.Sync.User.RecordLinkerTest do
5864
github_comment = insert(:github_comment, github_id: github_id)
5965
{:ok, %User{} = returned_user} = RecordLinker.link_to(github_comment, comment)
6066

61-
created_attributes = UserAdapter.to_user(@user_payload)
67+
created_attributes = @user_payload |> UserAdapter.to_user() |> remove_nils()
6268
created_user = Repo.get_by(User, created_attributes)
6369
assert created_user.id == returned_user.id
6470
end
@@ -86,7 +92,7 @@ defmodule CodeCorps.Sync.User.RecordLinkerTest do
8692
github_comment = insert(:github_comment, github_id: github_id)
8793
{:ok, %User{} = returned_user} = RecordLinker.link_to(github_comment, comment)
8894

89-
created_attributes = UserAdapter.to_user(@bot_user_payload)
95+
created_attributes = @bot_user_payload |> UserAdapter.to_user() |> remove_nils()
9096
created_user = Repo.get_by(User, created_attributes)
9197
assert created_user.id == returned_user.id
9298
end
@@ -142,7 +148,7 @@ defmodule CodeCorps.Sync.User.RecordLinkerTest do
142148

143149
test "returns user by github id if no user by task association found" do
144150
%{"issue" => %{"number" => number} = issue} = @payload
145-
attributes = UserAdapter.to_user(@user_payload)
151+
attributes = @user_payload |> UserAdapter.to_user() |> remove_nils()
146152
preinserted_user = insert(:user, attributes)
147153
github_issue = insert(:github_issue, number: number)
148154

@@ -157,7 +163,7 @@ defmodule CodeCorps.Sync.User.RecordLinkerTest do
157163
github_issue = insert(:github_issue, number: number)
158164
{:ok, %User{} = returned_user} = RecordLinker.link_to(github_issue, issue)
159165

160-
created_attributes = UserAdapter.to_user(@user_payload)
166+
created_attributes = @user_payload |> UserAdapter.to_user() |> remove_nils()
161167
created_user = Repo.get_by(User, created_attributes)
162168
assert created_user.id == returned_user.id
163169
end
@@ -191,7 +197,7 @@ defmodule CodeCorps.Sync.User.RecordLinkerTest do
191197
github_issue = insert(:github_issue, number: number)
192198
{:ok, %User{} = returned_user} = RecordLinker.link_to(github_issue, issue)
193199

194-
created_attributes = UserAdapter.to_user(@bot_user_payload)
200+
created_attributes = @bot_user_payload |> UserAdapter.to_user() |> remove_nils()
195201
created_user = Repo.get_by(User, created_attributes)
196202
assert created_user.id == returned_user.id
197203
end

0 commit comments

Comments
 (0)