From fffff9624e947ce31b3d3c152c372c54763f1031 Mon Sep 17 00:00:00 2001 From: Dan Barber Date: Sun, 18 Feb 2018 15:52:04 -0500 Subject: [PATCH] WIP: Opponent is now required Only the tests fail with "can't be blank" for some reason... --- lib/chess/store/game.ex | 8 ++++---- lib/chess_web/controllers/game_controller.ex | 20 ++++++++++++-------- test/chess/store/game_test.exs | 15 +++++++++++---- test/features/games_test.exs | 14 +++++++++----- test/support/factory.ex | 4 ++-- 5 files changed, 38 insertions(+), 23 deletions(-) diff --git a/lib/chess/store/game.ex b/lib/chess/store/game.ex index 339e762..636c72c 100644 --- a/lib/chess/store/game.ex +++ b/lib/chess/store/game.ex @@ -23,15 +23,15 @@ defmodule Chess.Store.Game do """ def create_changeset(struct, params \\ %{}) do struct - |> cast(params, [:board, :user_id]) + |> cast(params, [:board, :user_id, :opponent_id]) |> put_change(:board, Board.default) - |> validate_required([:board, :user_id]) + |> validate_required([:board, :user_id, :opponent_id]) end def changeset(struct, params \\ %{}) do struct - |> cast(params, [:board, :user_id]) - |> validate_required([:board, :user_id]) + |> cast(params, [:board, :user_id, :opponent_id]) + |> validate_required([:board, :user_id, :opponent_id]) end def for_user(query, user) do diff --git a/lib/chess_web/controllers/game_controller.ex b/lib/chess_web/controllers/game_controller.ex index f27640b..ae3a9ae 100644 --- a/lib/chess_web/controllers/game_controller.ex +++ b/lib/chess_web/controllers/game_controller.ex @@ -2,7 +2,6 @@ defmodule ChessWeb.GameController do use ChessWeb, :controller alias Chess.Store.Game - alias Chess.Auth.User def index(conn, _params) do changeset = Game.changeset(%Game{}) @@ -17,12 +16,7 @@ defmodule ChessWeb.GameController do def new(conn, _params) do changeset = Game.changeset(%Game{}) - - query = from user in "users", - where: user.id != ^current_user(conn).id, - select: {user.username, user.id} - - opponents = query |> Repo.all + opponents = get_opponents(current_user(conn)) render(conn, "new.html", changeset: changeset, opponents: opponents) end @@ -39,7 +33,8 @@ defmodule ChessWeb.GameController do |> put_flash(:info, "Game created successfully.") |> redirect(to: game_path(conn, :show, game)) {:error, changeset} -> - render(conn, "new.html", changeset: changeset) + opponents = get_opponents(current_user(conn)) + render(conn, "new.html", changeset: changeset, opponents: opponents) end end @@ -61,6 +56,15 @@ defmodule ChessWeb.GameController do |> redirect(to: game_path(conn, :index)) end + defp get_opponents(user) do + query = from user in "users", + where: user.id != ^user.id, + select: {user.username, user.id} + + query + |> Repo.all + end + defp current_user(conn) do Guardian.Plug.current_resource(conn) end diff --git a/test/chess/store/game_test.exs b/test/chess/store/game_test.exs index c9d133b..f4bd465 100644 --- a/test/chess/store/game_test.exs +++ b/test/chess/store/game_test.exs @@ -5,27 +5,34 @@ defmodule Chess.GameTest do alias Chess.Store.Game test "game is valid with a board and user" do - attrs = %{board: %{}, user_id: 1} + attrs = %{board: %{}, user_id: 1, opponent_id: 2} changeset = Game.changeset(%Game{}, attrs) assert changeset.valid? end test "game is invalid without a board" do - attrs = %{user_id: 1} + attrs = %{user_id: 1, opponent_id: 2} changeset = Game.changeset(%Game{}, attrs) refute changeset.valid? end test "game is invalid without a user" do - attrs = %{board: %{}} + attrs = %{board: %{}, opponent_id: 2} changeset = Game.changeset(%Game{}, attrs) refute changeset.valid? end - test "game is invalid without a board or user" do + test "game is invalid without an opponent" do + attrs = %{board: %{}, user_id: 1} + changeset = Game.changeset(%Game{}, attrs) + + refute changeset.valid? + end + + test "game is invalid without anything" do changeset = Game.changeset(%Game{}, %{}) refute changeset.valid? diff --git a/test/features/games_test.exs b/test/features/games_test.exs index bf2c594..c70c751 100644 --- a/test/features/games_test.exs +++ b/test/features/games_test.exs @@ -3,7 +3,7 @@ defmodule Chess.GamesTest do import Wallaby.Query - import Chess.Factory, only: [create_user: 2, create_game_for: 1] + import Chess.Factory, only: [create_user: 2, create_game_for: 2] test "visit homepage", %{session: session} do session @@ -20,14 +20,16 @@ defmodule Chess.GamesTest do |> click(link("New game")) |> select("game[opponent_id]", option: "zelda") |> click(button("Create game")) + + session |> assert_has(css(".board")) end test "can only see own games", %{session: session} do - create_user("urbosa", "gerudoqueen") + opponent = create_user("urbosa", "gerudoqueen") user = create_user("zelda", "ganonsucks") - create_game_for(user) + create_game_for(user, opponent) session |> login() @@ -36,6 +38,8 @@ defmodule Chess.GamesTest do |> select("game[opponent_id]", option: "urbosa") |> click(button("Create game")) |> click(link("Back to games")) + + session |> assert_has(css(".table tr", count: 1)) end @@ -61,11 +65,11 @@ defmodule Chess.GamesTest do end defp login(session) do - create_user("link@hyrule.kingdom", "ilovezelda") + create_user("link", "ilovezelda") session |> visit("/session/new") - |> fill_in(text_field("Username"), with: "link@hyrule.kingdom") + |> fill_in(text_field("Username"), with: "link") |> fill_in(text_field("Password"), with: "ilovezelda") |> click(button("Log in")) end diff --git a/test/support/factory.ex b/test/support/factory.ex index 3ecb923..19120de 100644 --- a/test/support/factory.ex +++ b/test/support/factory.ex @@ -11,10 +11,10 @@ defmodule Chess.Factory do |> Repo.insert! end - def create_game_for(user) do + def create_game_for(user, opponent) do Game.create_changeset( %Game{}, - %{user_id: user.id} + %{user_id: user.id, opponent_id: opponent.id} ) |> Repo.insert! end