Skip to content

Commit b43e632

Browse files
committed
Refactor account creation by extracting into Accounts context
1 parent e898b0f commit b43e632

File tree

3 files changed

+85
-63
lines changed

3 files changed

+85
-63
lines changed

lib/code_corps/accounts/accounts.ex

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,21 @@ defmodule CodeCorps.Accounts do
2222

2323
import Ecto.Query
2424

25+
@doc ~S"""
26+
Creates a `CodeCorps.User` account when such a request is made from the client
27+
application.
28+
29+
If an `invite_id` attribute is provided in the request, treats the process as
30+
claiming the specified invite.
31+
"""
32+
@spec create(map) :: {:ok, User.t} | {:error, Changeset.t} | {:error, :invite_not_found}
33+
def create(%{"invite_id" => _} = params) do
34+
params |> Accounts.UserInvites.claim_invite()
35+
end
36+
def create(%{} = params) do
37+
%User{} |> User.registration_changeset(params) |> Repo.insert()
38+
end
39+
2540
@doc ~S"""
2641
Creates a user record using attributes from a GitHub payload.
2742
"""
@@ -189,7 +204,4 @@ defmodule CodeCorps.Accounts do
189204

190205
@spec create_invite(map) :: {:ok, UserInvite.t} | {:error, Changeset.t}
191206
defdelegate create_invite(params), to: Accounts.UserInvites
192-
193-
@spec claim_invite(map) :: {:ok, User.t}
194-
defdelegate claim_invite(map), to: Accounts.UserInvites
195207
end

lib/code_corps_web/controllers/user_controller.ex

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,11 @@ defmodule CodeCorpsWeb.UserController do
3636
end
3737

3838
@spec create(Conn.t, map) :: Conn.t
39-
def create(%Conn{} = conn, %{"invite_id" => _} = params) do
40-
with {:ok, %User{} = user} <- Accounts.claim_invite(params),
41-
user <- preload(user)
42-
do
43-
conn |> put_status(:created) |> render("show.json-api", data: user)
44-
end
45-
end
4639
def create(%Conn{} = conn, %{} = params) do
47-
with {:ok, %User{} = user} <- %User{} |> User.registration_changeset(params) |> Repo.insert(),
48-
user <- preload(user)
49-
do
50-
conn |> put_status(:created) |> render("show.json-api", data: user)
40+
with {:ok, %User{} = user} <- params |> Accounts.create() do
41+
conn
42+
|> put_status(:created)
43+
|> render("show.json-api", data: user |> preload())
5144
end
5245
end
5346

test/lib/code_corps/accounts/accounts_test.exs

Lines changed: 66 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,72 @@ defmodule CodeCorps.AccountsTest do
1515

1616
alias Ecto.Changeset
1717

18+
describe "create/1" do
19+
@valid_user_params %{
20+
"email" => "[email protected]",
21+
"password" => "somepassword",
22+
"username" => "testuser"
23+
}
24+
25+
test "creates user" do
26+
{:ok, %User{} = user} =
27+
@valid_user_params
28+
|> Accounts.create()
29+
30+
assert Repo.get(User, user.id)
31+
end
32+
33+
test "returns changeset if validation errors" do
34+
{:error, %Changeset{} = changeset} =
35+
@valid_user_params
36+
|> Map.delete("email")
37+
|> Accounts.create()
38+
39+
refute changeset.valid?
40+
end
41+
42+
test "claims invite if id providedf" do
43+
invite = insert(:user_invite, invitee: nil, project: nil)
44+
45+
{:ok, %User{} = user} =
46+
@valid_user_params
47+
|> Map.put("invite_id", invite.id)
48+
|> Accounts.create()
49+
50+
assert Repo.get(User, user.id)
51+
end
52+
53+
test "associates invite with user" do
54+
invite = insert(:user_invite, invitee: nil, project: nil)
55+
56+
{:ok, %User{} = user} =
57+
@valid_user_params
58+
|> Map.put("invite_id", invite.id)
59+
|> Accounts.create()
60+
61+
assert Repo.one(UserInvite).invitee_id == user.id
62+
end
63+
64+
test "creates project membership if project provided with invite" do
65+
project = insert(:project)
66+
invite = insert(:user_invite, invitee: nil, project: project, role: "admin")
67+
68+
{:ok, %User{} = user} =
69+
@valid_user_params
70+
|> Map.put("invite_id", invite.id)
71+
|> Accounts.create()
72+
73+
assert Repo.get_by(ProjectUser, user_id: user.id, project_id: project.id, role: "admin")
74+
end
75+
76+
test "returns :invite_not_found if bad invite id provided" do
77+
assert {:error, :invite_not_found} =
78+
@valid_user_params
79+
|> Map.put("invite_id", -1)
80+
|> Accounts.create()
81+
end
82+
end
83+
1884
describe "create_from_github/1" do
1985
test "creates proper user from provided payload" do
2086
{:ok, %User{} = user} =
@@ -268,53 +334,4 @@ defmodule CodeCorps.AccountsTest do
268334
assert changeset.errors[:email]
269335
end
270336
end
271-
272-
describe "claim_invite/1" do
273-
@valid_user_params %{
274-
"email" => "[email protected]",
275-
"password" => "somepassword",
276-
"username" => "testuser"
277-
}
278-
279-
test "creates user" do
280-
invite = insert(:user_invite, invitee: nil, project: nil)
281-
282-
{:ok, %User{} = user} =
283-
@valid_user_params
284-
|> Map.put("invite_id", invite.id)
285-
|> Accounts.claim_invite()
286-
287-
assert Repo.get(User, user.id)
288-
end
289-
290-
test "associates invite with user" do
291-
invite = insert(:user_invite, invitee: nil, project: nil)
292-
293-
{:ok, %User{} = user} =
294-
@valid_user_params
295-
|> Map.put("invite_id", invite.id)
296-
|> Accounts.claim_invite()
297-
298-
assert Repo.one(UserInvite).invitee_id == user.id
299-
end
300-
301-
test "creates project membership if project provided" do
302-
project = insert(:project)
303-
invite = insert(:user_invite, invitee: nil, project: project, role: "admin")
304-
305-
{:ok, %User{} = user} =
306-
@valid_user_params
307-
|> Map.put("invite_id", invite.id)
308-
|> Accounts.claim_invite()
309-
310-
assert Repo.get_by(ProjectUser, user_id: user.id, project_id: project.id, role: "admin")
311-
end
312-
313-
test "returns :invite_not_found if bad id provided" do
314-
assert {:error, :invite_not_found} =
315-
@valid_user_params
316-
|> Map.put("invite_id", -1)
317-
|> Accounts.claim_invite()
318-
end
319-
end
320337
end

0 commit comments

Comments
 (0)