Skip to content

Commit 231f337

Browse files
committed
Add tests for project user invite
1 parent 751c37f commit 231f337

File tree

2 files changed

+87
-29
lines changed

2 files changed

+87
-29
lines changed

lib/code_corps/accounts/user_invites.ex

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
defmodule CodeCorps.Accounts.UserInvites do
2+
@moduledoc ~S"""
3+
Subcontext for managing of `UserInvite` records
4+
"""
5+
26
alias CodeCorps.{Project, ProjectUser, Repo, User, UserInvite}
37
alias Ecto.{Changeset, Multi}
48

@@ -13,6 +17,7 @@ defmodule CodeCorps.Accounts.UserInvites do
1317
|> Changeset.assoc_constraint(:inviter)
1418
|> Changeset.assoc_constraint(:project)
1519
|> ensure_email_not_owned_by_member()
20+
|> ensure_role_and_project()
1621
|> Repo.insert()
1722
end
1823

@@ -45,6 +50,29 @@ defmodule CodeCorps.Accounts.UserInvites do
4550
end
4651
end
4752

53+
@spec ensure_role_and_project(Changeset.t()) :: Changeset.t()
54+
defp ensure_role_and_project(%Changeset{} = changeset) do
55+
changes = [
56+
changeset |> Changeset.get_field(:role),
57+
changeset |> Changeset.get_field(:project_id)
58+
]
59+
60+
case changes do
61+
[nil, nil] ->
62+
changeset
63+
64+
[nil, _project_id] ->
65+
changeset |> Changeset.add_error(:role, "Needs to be specified for a project invite")
66+
67+
[_role, nil] ->
68+
changeset
69+
|> Changeset.add_error(:project_id, "Needs to be specified for a project invite")
70+
71+
[_role, _project_id] ->
72+
changeset
73+
end
74+
end
75+
4876
@spec claim_invite(map) :: {:ok, User.t()}
4977
def claim_invite(%{} = params) do
5078
Multi.new()

test/lib/code_corps/accounts/accounts_test.exs

Lines changed: 59 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,23 @@ defmodule CodeCorps.AccountsTest do
44
use CodeCorps.DbAccessCase
55

66
alias CodeCorps.{
7-
Accounts, Comment, ProjectUser, Task, GitHub.TestHelpers, User, UserInvite
7+
Accounts,
8+
Comment,
9+
ProjectUser,
10+
Task,
11+
GitHub.TestHelpers,
12+
User,
13+
UserInvite
814
}
15+
916
alias Ecto.Changeset
1017

1118
describe "create_from_github/1" do
1219
test "creates proper user from provided payload" do
1320
{:ok, %User{} = user} =
1421
"user"
15-
|> TestHelpers.load_endpoint_fixture
16-
|> Accounts.create_from_github
22+
|> TestHelpers.load_endpoint_fixture()
23+
|> Accounts.create_from_github()
1724

1825
assert user.id
1926
assert user.default_color
@@ -29,7 +36,7 @@ defmodule CodeCorps.AccountsTest do
2936

3037
{:error, %Changeset{} = changeset} =
3138
payload
32-
|> Accounts.create_from_github
39+
|> Accounts.create_from_github()
3340

3441
assert changeset.errors[:email] == {"has already been taken", []}
3542
end
@@ -42,16 +49,16 @@ defmodule CodeCorps.AccountsTest do
4249

4350
{:error, %Changeset{} = changeset} =
4451
payload
45-
|> Accounts.create_from_github
52+
|> Accounts.create_from_github()
4653

4754
assert changeset.errors[:github_id] == {"account is already connected to someone else", []}
4855
end
4956

5057
test "uploads photo from GitHub avatar" do
5158
{:ok, %User{} = user} =
5259
"user"
53-
|> TestHelpers.load_endpoint_fixture
54-
|> Accounts.create_from_github
60+
|> TestHelpers.load_endpoint_fixture()
61+
|> Accounts.create_from_github()
5562

5663
user = Repo.get(User, user.id)
5764
assert user.cloudinary_public_id
@@ -132,7 +139,7 @@ defmodule CodeCorps.AccountsTest do
132139
{:ok, %UserInvite{} = user_invite} =
133140
@base_attrs
134141
|> Map.put(:inviter_id, inviter_id)
135-
|> Accounts.create_invite
142+
|> Accounts.create_invite()
136143

137144
assert Repo.one(UserInvite).id == user_invite.id
138145
end
@@ -141,7 +148,7 @@ defmodule CodeCorps.AccountsTest do
141148
{:error, changeset} =
142149
@base_attrs
143150
|> Map.delete(:email)
144-
|> Accounts.create_invite
151+
|> Accounts.create_invite()
145152

146153
refute changeset.valid?
147154
assert changeset.errors[:email]
@@ -150,15 +157,15 @@ defmodule CodeCorps.AccountsTest do
150157
test "requires valid inviter id" do
151158
{:error, changeset} =
152159
@base_attrs
153-
|> Accounts.create_invite
160+
|> Accounts.create_invite()
154161

155162
refute changeset.valid?
156163
assert changeset.errors[:inviter_id]
157164

158165
{:error, changeset} =
159166
@base_attrs
160167
|> Map.put(:inviter_id, -1)
161-
|> Accounts.create_invite
168+
|> Accounts.create_invite()
162169

163170
refute changeset.valid?
164171
refute changeset.errors[:inviter_id]
@@ -172,63 +179,83 @@ defmodule CodeCorps.AccountsTest do
172179
@base_attrs
173180
|> Map.put(:inviter_id, inviter_id)
174181
|> Map.put(:name, "John")
175-
|> Accounts.create_invite
182+
|> Accounts.create_invite()
176183

177184
assert user_invite.name == "John"
178185
end
179186

180-
test "allows specifying role" do
187+
test "creates a user invite for a project" do
181188
%{id: inviter_id} = insert(:user)
189+
%{id: project_id} = insert(:project)
182190

183191
{:ok, %UserInvite{} = user_invite} =
184192
@base_attrs
185193
|> Map.put(:inviter_id, inviter_id)
186194
|> Map.put(:role, "admin")
187-
|> Accounts.create_invite
195+
|> Map.put(:project_id, project_id)
196+
|> Accounts.create_invite()
188197

189198
assert user_invite.role == "admin"
199+
assert user_invite.project_id == project_id
190200
end
191201

192202
test "does not allow invalid roles" do
193203
%{id: inviter_id} = insert(:user)
204+
%{id: project_id} = insert(:project)
194205

195206
{:error, changeset} =
196207
@base_attrs
197208
|> Map.put(:inviter_id, inviter_id)
198209
|> Map.put(:role, "foo")
199-
|> Accounts.create_invite
210+
|> Map.put(:project_id, project_id)
211+
|> Accounts.create_invite()
200212

201213
refute changeset.valid?
202214
assert changeset.errors[:role]
203215
end
204216

205-
test "associates with project if id provided" do
217+
test "requires valid project id" do
218+
%{id: inviter_id} = insert(:user)
219+
220+
{:error, changeset} =
221+
@base_attrs
222+
|> Map.put(:inviter_id, inviter_id)
223+
|> Map.put(:project_id, -1)
224+
|> Map.put(:role, "contributor")
225+
|> Accounts.create_invite()
226+
227+
refute changeset.valid?
228+
assert changeset.errors[:project]
229+
end
230+
231+
test "requires role if project is specified" do
206232
%{id: inviter_id} = insert(:user)
207233
%{id: project_id} = insert(:project)
208234

209-
{:ok, %UserInvite{} = user_invite} =
235+
{:error, changeset} =
210236
@base_attrs
211237
|> Map.put(:inviter_id, inviter_id)
212238
|> Map.put(:project_id, project_id)
213-
|> Accounts.create_invite
239+
|> Accounts.create_invite()
214240

215-
assert user_invite.project_id == project_id
241+
refute changeset.valid?
242+
assert changeset.errors[:role]
216243
end
217244

218-
test "requires valid project id" do
245+
test "requires project_id if role is specified" do
219246
%{id: inviter_id} = insert(:user)
220247

221248
{:error, changeset} =
222249
@base_attrs
223250
|> Map.put(:inviter_id, inviter_id)
224-
|> Map.put(:project_id, -1)
225-
|> Accounts.create_invite
251+
|> Map.put(:role, "contributor")
252+
|> Accounts.create_invite()
226253

227254
refute changeset.valid?
228-
assert changeset.errors[:project]
255+
assert changeset.errors[:project_id]
229256
end
230257

231-
test "throws error if user is already member of project" do
258+
test "requires user not to be member of project" do
232259
%{id: inviter_id} = insert(:user)
233260
%{id: project_id} = project = insert(:project)
234261
%{email: email} = user = insert(:user)
@@ -239,7 +266,7 @@ defmodule CodeCorps.AccountsTest do
239266
%{email: email}
240267
|> Map.put(:inviter_id, inviter_id)
241268
|> Map.put(:project_id, project_id)
242-
|> Accounts.create_invite
269+
|> Accounts.create_invite()
243270

244271
refute changeset.valid?
245272
assert changeset.errors[:email]
@@ -258,7 +285,8 @@ defmodule CodeCorps.AccountsTest do
258285
{:ok, %User{} = user} =
259286
@valid_user_params
260287
|> Map.put("invite_id", invite.id)
261-
|> Accounts.claim_invite
288+
|> Accounts.claim_invite()
289+
262290
assert Repo.get(User, user.id)
263291
end
264292

@@ -268,7 +296,8 @@ defmodule CodeCorps.AccountsTest do
268296
{:ok, %User{} = user} =
269297
@valid_user_params
270298
|> Map.put("invite_id", invite.id)
271-
|> Accounts.claim_invite
299+
|> Accounts.claim_invite()
300+
272301
assert Repo.one(UserInvite).invitee_id == user.id
273302
end
274303

@@ -279,15 +308,16 @@ defmodule CodeCorps.AccountsTest do
279308
{:ok, %User{} = user} =
280309
@valid_user_params
281310
|> Map.put("invite_id", invite.id)
282-
|> Accounts.claim_invite
311+
|> Accounts.claim_invite()
312+
283313
assert Repo.get_by(ProjectUser, user_id: user.id, project_id: project.id, role: "admin")
284314
end
285315

286316
test "returns :invite_not_found if bad id provided" do
287317
assert {:error, :invite_not_found} =
288318
@valid_user_params
289319
|> Map.put("invite_id", -1)
290-
|> Accounts.claim_invite
320+
|> Accounts.claim_invite()
291321
end
292322
end
293323
end

0 commit comments

Comments
 (0)