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

Commit 3a5a312

Browse files
author
Chris Rees
committed
Add tests around removing games from a user's collection
1 parent 516439a commit 3a5a312

File tree

4 files changed

+56
-3
lines changed

4 files changed

+56
-3
lines changed

lib/agoneum/account/account.ex

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,27 @@ defmodule Agoneum.Account do
125125
"""
126126
def add_games(%User{} = user, %Game{} = game), do: add_games(user, [game])
127127
def add_games(%User{} = user, games) do
128-
game_changesets = Enum.map(games ++ user.games, &Ecto.Changeset.change/1)
128+
game_changesets = games ++ user.games
129+
|> Enum.map(&Ecto.Changeset.change/1)
129130
|> Enum.uniq()
130131

131132
user
132133
|> change_user()
133134
|> Ecto.Changeset.put_assoc(:games, game_changesets)
134135
|> Repo.update()
135136
end
137+
138+
@doc """
139+
Removes a game (or games) from the user's collection.
140+
"""
141+
def remove_games(%User{} = user, %Game{} = game), do: remove_games(user, [game])
142+
def remove_games(%User{} = user, games) do
143+
remaining_games = Enum.reject(user.games, fn(game) -> Enum.member?(games, game) end)
144+
game_changesets = Enum.map(remaining_games, &Ecto.Changeset.change/1)
145+
146+
user
147+
|> change_user()
148+
|> Ecto.Changeset.put_assoc(:games, game_changesets)
149+
|> Repo.update()
150+
end
136151
end

lib/agoneum/account/user.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ defmodule Agoneum.Account.User do
1717

1818
field :admin, :boolean, default: false, null: false
1919

20-
many_to_many :games, Agoneum.Games.Game, join_through: "user_games"
20+
many_to_many :games, Agoneum.Games.Game, join_through: "user_games", on_replace: :delete
2121

2222
timestamps()
2323
end

lib/agoneum/games/game.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ defmodule Agoneum.Games.Game do
1616
field :name, :string
1717
field :year, :integer
1818

19-
many_to_many :users, Agoneum.Account.User, join_through: "user_games"
19+
many_to_many :users, Agoneum.Account.User, join_through: "user_games", on_replace: :delete
2020

2121
timestamps()
2222
end

test/agoneum/account/account_test.exs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,5 +154,43 @@ defmodule Agoneum.AccountTest do
154154

155155
assert List.first(user1.games).id == List.first(user2.games).id
156156
end
157+
158+
test "remove_games/2 removes a game from the user's list" do
159+
user = user_fixture()
160+
game = game_fixture()
161+
game2 = game_fixture(%{name: "BANG! High Noon"})
162+
163+
{:ok, user} = Account.add_games(user, [game, game2])
164+
assert length(user.games) == 2
165+
166+
{:ok, user} = Account.remove_games(user, game)
167+
assert length(user.games) == 1
168+
assert List.first(user.games).name == "BANG! High Noon"
169+
end
170+
171+
test "remove_games/2 removes multiple games from the user's list" do
172+
user = user_fixture()
173+
game = game_fixture()
174+
game2 = game_fixture(%{name: "BANG! High Noon"})
175+
game3 = game_fixture(%{name: "BANG! Fistful of Cards"})
176+
177+
{:ok, user} = Account.add_games(user, [game, game2, game3])
178+
assert length(user.games) == 3
179+
180+
{:ok, user} = Account.remove_games(user, [game, game3])
181+
assert length(user.games) == 1
182+
assert List.first(user.games).name == "BANG! High Noon"
183+
end
184+
185+
test "remove_games/2 returns the original game list if the game being removed is not present" do
186+
user = user_fixture()
187+
game = game_fixture()
188+
game2 = game_fixture(%{name: "BANG! High Noon"})
189+
190+
{:ok, user} = Account.add_games(user, game)
191+
{:ok, user} = Account.remove_games(user, game2)
192+
assert length(user.games) == 1
193+
assert List.first(user.games).name == "BANG!"
194+
end
157195
end
158196
end

0 commit comments

Comments
 (0)