11defmodule 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@agoneum.com" , name: "some name" , password: "some password" }
108 @ update_attrs % { email: "updated@agoneum.com" , 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,47 @@ defmodule Agoneum.AccountTest do
102112 user = user_fixture ( )
103113 assert % Ecto.Changeset { } = Account . change_user ( user )
104114 end
115+
116+ test "add_games/2 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_games/2 adds new games to the user's list" do
126+ user = user_fixture ( )
127+ game = game_fixture ( )
128+ game2 = game_fixture ( % { name: "BANG! High Noon" } )
129+
130+ { :ok , user } = Account . add_games ( user , game )
131+ { :ok , user } = Account . add_games ( user , game2 )
132+
133+ assert length ( user . games ) == 2
134+ end
135+
136+ test "add_games/2 adds to a user's list of games without creating duplicates" do
137+ user = user_fixture ( )
138+ game = game_fixture ( )
139+ game2 = game_fixture ( % { name: "BANG! High Noon" } )
140+ assert length ( user . games ) == 0
141+
142+ { :ok , user } = Account . add_games ( user , game )
143+ { :ok , user } = Account . add_games ( user , [ game , game2 ] )
144+ assert length ( user . games ) == 2
145+ end
146+
147+ test "add_games/2 associates a game with multiple users" do
148+ user1 = user_fixture ( % { email: "user1@agoneum.com" , name: "User 1" } )
149+ user2 = user_fixture ( % { email: "user2@agoneum.com" , name: "User 2" } )
150+ game = game_fixture ( )
151+
152+ assert { :ok , user1 } = Account . add_games ( user1 , game )
153+ assert { :ok , user2 } = Account . add_games ( user2 , game )
154+
155+ assert List . first ( user1 . games ) . id == List . first ( user2 . games ) . id
156+ end
105157 end
106158end
0 commit comments