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
|
def create_changeset(struct, params \\ %{}) do
|
||||||
struct
|
struct
|
||||||
|> cast(params, [:board, :user_id])
|
|> cast(params, [:board, :user_id, :opponent_id])
|
||||||
|> put_change(:board, Board.default)
|
|> put_change(:board, Board.default)
|
||||||
|> validate_required([:board, :user_id])
|
|> validate_required([:board, :user_id, :opponent_id])
|
||||||
end
|
end
|
||||||
|
|
||||||
def changeset(struct, params \\ %{}) do
|
def changeset(struct, params \\ %{}) do
|
||||||
struct
|
struct
|
||||||
|> cast(params, [:board, :user_id])
|
|> cast(params, [:board, :user_id, :opponent_id])
|
||||||
|> validate_required([:board, :user_id])
|
|> validate_required([:board, :user_id, :opponent_id])
|
||||||
end
|
end
|
||||||
|
|
||||||
def for_user(query, user) do
|
def for_user(query, user) do
|
||||||
|
|||||||
@ -2,7 +2,6 @@ defmodule ChessWeb.GameController do
|
|||||||
use ChessWeb, :controller
|
use ChessWeb, :controller
|
||||||
|
|
||||||
alias Chess.Store.Game
|
alias Chess.Store.Game
|
||||||
alias Chess.Auth.User
|
|
||||||
|
|
||||||
def index(conn, _params) do
|
def index(conn, _params) do
|
||||||
changeset = Game.changeset(%Game{})
|
changeset = Game.changeset(%Game{})
|
||||||
@ -17,12 +16,7 @@ defmodule ChessWeb.GameController do
|
|||||||
|
|
||||||
def new(conn, _params) do
|
def new(conn, _params) do
|
||||||
changeset = Game.changeset(%Game{})
|
changeset = Game.changeset(%Game{})
|
||||||
|
opponents = get_opponents(current_user(conn))
|
||||||
query = from user in "users",
|
|
||||||
where: user.id != ^current_user(conn).id,
|
|
||||||
select: {user.username, user.id}
|
|
||||||
|
|
||||||
opponents = query |> Repo.all
|
|
||||||
|
|
||||||
render(conn, "new.html", changeset: changeset, opponents: opponents)
|
render(conn, "new.html", changeset: changeset, opponents: opponents)
|
||||||
end
|
end
|
||||||
@ -39,7 +33,8 @@ defmodule ChessWeb.GameController do
|
|||||||
|> put_flash(:info, "Game created successfully.")
|
|> put_flash(:info, "Game created successfully.")
|
||||||
|> redirect(to: game_path(conn, :show, game))
|
|> redirect(to: game_path(conn, :show, game))
|
||||||
{:error, changeset} ->
|
{:error, changeset} ->
|
||||||
render(conn, "new.html", changeset: changeset)
|
opponents = get_opponents(current_user(conn))
|
||||||
|
render(conn, "new.html", changeset: changeset, opponents: opponents)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -61,6 +56,15 @@ defmodule ChessWeb.GameController do
|
|||||||
|> redirect(to: game_path(conn, :index))
|
|> redirect(to: game_path(conn, :index))
|
||||||
end
|
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
|
defp current_user(conn) do
|
||||||
Guardian.Plug.current_resource(conn)
|
Guardian.Plug.current_resource(conn)
|
||||||
end
|
end
|
||||||
|
|||||||
@ -5,27 +5,34 @@ defmodule Chess.GameTest do
|
|||||||
alias Chess.Store.Game
|
alias Chess.Store.Game
|
||||||
|
|
||||||
test "game is valid with a board and user" do
|
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)
|
changeset = Game.changeset(%Game{}, attrs)
|
||||||
|
|
||||||
assert changeset.valid?
|
assert changeset.valid?
|
||||||
end
|
end
|
||||||
|
|
||||||
test "game is invalid without a board" do
|
test "game is invalid without a board" do
|
||||||
attrs = %{user_id: 1}
|
attrs = %{user_id: 1, opponent_id: 2}
|
||||||
changeset = Game.changeset(%Game{}, attrs)
|
changeset = Game.changeset(%Game{}, attrs)
|
||||||
|
|
||||||
refute changeset.valid?
|
refute changeset.valid?
|
||||||
end
|
end
|
||||||
|
|
||||||
test "game is invalid without a user" do
|
test "game is invalid without a user" do
|
||||||
attrs = %{board: %{}}
|
attrs = %{board: %{}, opponent_id: 2}
|
||||||
changeset = Game.changeset(%Game{}, attrs)
|
changeset = Game.changeset(%Game{}, attrs)
|
||||||
|
|
||||||
refute changeset.valid?
|
refute changeset.valid?
|
||||||
end
|
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{}, %{})
|
changeset = Game.changeset(%Game{}, %{})
|
||||||
|
|
||||||
refute changeset.valid?
|
refute changeset.valid?
|
||||||
|
|||||||
@ -3,7 +3,7 @@ defmodule Chess.GamesTest do
|
|||||||
|
|
||||||
import Wallaby.Query
|
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
|
test "visit homepage", %{session: session} do
|
||||||
session
|
session
|
||||||
@ -20,14 +20,16 @@ defmodule Chess.GamesTest do
|
|||||||
|> click(link("New game"))
|
|> click(link("New game"))
|
||||||
|> select("game[opponent_id]", option: "zelda")
|
|> select("game[opponent_id]", option: "zelda")
|
||||||
|> click(button("Create game"))
|
|> click(button("Create game"))
|
||||||
|
|
||||||
|
session
|
||||||
|> assert_has(css(".board"))
|
|> assert_has(css(".board"))
|
||||||
end
|
end
|
||||||
|
|
||||||
test "can only see own games", %{session: session} do
|
test "can only see own games", %{session: session} do
|
||||||
create_user("urbosa", "gerudoqueen")
|
opponent = create_user("urbosa", "gerudoqueen")
|
||||||
|
|
||||||
user = create_user("zelda", "ganonsucks")
|
user = create_user("zelda", "ganonsucks")
|
||||||
create_game_for(user)
|
create_game_for(user, opponent)
|
||||||
|
|
||||||
session
|
session
|
||||||
|> login()
|
|> login()
|
||||||
@ -36,6 +38,8 @@ defmodule Chess.GamesTest do
|
|||||||
|> select("game[opponent_id]", option: "urbosa")
|
|> select("game[opponent_id]", option: "urbosa")
|
||||||
|> click(button("Create game"))
|
|> click(button("Create game"))
|
||||||
|> click(link("Back to games"))
|
|> click(link("Back to games"))
|
||||||
|
|
||||||
|
session
|
||||||
|> assert_has(css(".table tr", count: 1))
|
|> assert_has(css(".table tr", count: 1))
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -61,11 +65,11 @@ defmodule Chess.GamesTest do
|
|||||||
end
|
end
|
||||||
|
|
||||||
defp login(session) do
|
defp login(session) do
|
||||||
create_user("link@hyrule.kingdom", "ilovezelda")
|
create_user("link", "ilovezelda")
|
||||||
|
|
||||||
session
|
session
|
||||||
|> visit("/session/new")
|
|> 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")
|
|> fill_in(text_field("Password"), with: "ilovezelda")
|
||||||
|> click(button("Log in"))
|
|> click(button("Log in"))
|
||||||
end
|
end
|
||||||
|
|||||||
@ -11,10 +11,10 @@ defmodule Chess.Factory do
|
|||||||
|> Repo.insert!
|
|> Repo.insert!
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_game_for(user) do
|
def create_game_for(user, opponent) do
|
||||||
Game.create_changeset(
|
Game.create_changeset(
|
||||||
%Game{},
|
%Game{},
|
||||||
%{user_id: user.id}
|
%{user_id: user.id, opponent_id: opponent.id}
|
||||||
)
|
)
|
||||||
|> Repo.insert!
|
|> Repo.insert!
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user