Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit ece2eab

Browse files
author
Chris Rees
committed
Add tests around adding games to a user's collection
1 parent 1bb3354 commit ece2eab

File tree

3 files changed

+56
-6
lines changed

3 files changed

+56
-6
lines changed

lib/agoneum/account/account.ex

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ defmodule Agoneum.Account do
55

66
import Ecto.Query, warn: false
77
alias Agoneum.Repo
8-
9-
alias Agoneum.Account.User
8+
alias Agoneum.{Account.User, Games.Game}
109

1110
@doc """
1211
Returns the list of users.
@@ -120,4 +119,15 @@ defmodule Agoneum.Account do
120119
def change_user(%User{} = user) do
121120
User.changeset(user, %{})
122121
end
122+
123+
@doc """
124+
Adds a new game (or games) to the user's collection.
125+
"""
126+
def add_games(%User{} = user, %Game{} = game), do: add_games(user, [game])
127+
def add_games(%User{} = user, games) do
128+
user
129+
|> change_user()
130+
|> Ecto.Changeset.put_assoc(:games, games)
131+
|> Repo.update()
132+
end
123133
end

lib/agoneum/games/game.ex

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ defmodule Agoneum.Games.Game do
88
@optional_fields ~w(year image)a
99
@all_fields @required_fields ++ @optional_fields
1010

11-
# TODO: Add a unique constraint for name/year combo
1211
schema "games" do
1312
field :description, :string
1413
field :image, :string

test/agoneum/account/account_test.exs

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
defmodule Agoneum.AccountTest do
22
use Agoneum.DataCase
33

4-
alias Agoneum.Account
4+
alias Agoneum.{Account, Account.User, Games}
55

66
describe "users" do
7-
alias Agoneum.Account.User
8-
97
@valid_attrs %{email: "[email protected]", name: "some name", password: "some password"}
108
@update_attrs %{email: "[email protected]", name: "some updated name", password: "some updated password"}
119
@invalid_attrs %{email: nil, name: nil, password_hash: nil}
10+
@game_attrs %{description: "Kill your friends", max_players: 7, min_players: 4, name: "BANG!", year: 2002}
1211

1312
def user_fixture(attrs \\ %{}) do
1413
{:ok, user} =
@@ -17,6 +16,17 @@ defmodule Agoneum.AccountTest do
1716
|> Account.create_user()
1817

1918
user
19+
|> Agoneum.Repo.preload(:games)
20+
end
21+
22+
def game_fixture(attrs \\ %{}) do
23+
{:ok, game} =
24+
attrs
25+
|> Enum.into(@game_attrs)
26+
|> Games.create_game()
27+
28+
game
29+
|> Agoneum.Repo.preload(:users)
2030
end
2131

2232
test "list_users/0 returns all users" do
@@ -102,5 +112,36 @@ defmodule Agoneum.AccountTest do
102112
user = user_fixture()
103113
assert %Ecto.Changeset{} = Account.change_user(user)
104114
end
115+
116+
test "add_game/1 associates a game with the user" do
117+
user = user_fixture()
118+
game = game_fixture()
119+
assert length(user.games) == 0
120+
121+
assert {:ok, user} = Account.add_games(user, game)
122+
assert length(user.games) == 1
123+
end
124+
125+
test "add_game/1 updates a user's list of games without creating duplicates" do
126+
user = user_fixture()
127+
game = game_fixture()
128+
game2 = game_fixture(%{name: "BANG! High Noon"})
129+
assert length(user.games) == 0
130+
131+
Account.add_games(user, game)
132+
{:ok, user} = Account.add_games(user, [game, game2])
133+
assert length(user.games) == 2
134+
end
135+
136+
test "add_game/1 associates a game with multiple users" do
137+
user1 = user_fixture(%{email: "[email protected]", name: "User 1"})
138+
user2 = user_fixture(%{email: "[email protected]", name: "User 2"})
139+
game = game_fixture()
140+
141+
assert {:ok, user1} = Account.add_games(user1, game)
142+
assert {:ok, user2} = Account.add_games(user2, game)
143+
144+
assert List.first(user1.games).id == List.first(user2.games).id
145+
end
105146
end
106147
end

0 commit comments

Comments
 (0)