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

View File

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

View File

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

View File

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

View File

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