1
0
mirror of https://github.com/danbee/chess synced 2025-03-04 08:39:06 +00:00

WIP: Opponent is now required

Only the tests fail with "can't be blank" for some reason...
This commit is contained in:
Daniel Barber 2018-02-18 15:52:04 -05:00
parent 46c3109b7c
commit fffff9624e
Signed by: danbarber
GPG Key ID: 931D8112E0103DD8
5 changed files with 38 additions and 23 deletions

View File

@ -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

View File

@ -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

View File

@ -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?

View File

@ -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

View File

@ -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