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:
parent
46c3109b7c
commit
fffff9624e
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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?
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user