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

182 lines
4.8 KiB
Elixir

defmodule Chess.GamesTest do
use ChessWeb.FeatureCase
import Wallaby.Query
import Chess.Factory
test "visit homepage", %{session: session} do
session
|> visit("/")
|> assert_has(css("header h1", text: "Chess"))
end
test "can create a new game", %{session: session} do
insert(:user, %{username: "zelda", password: "ganonsucks"})
session
|> create_user_and_login()
|> visit("/games")
|> click(link("New game"))
|> select("game[opponent_id]", option: "zelda")
|> click(button("Create game"))
session
|> assert_has(css("h2", text: "Game with zelda"))
|> assert_has(css(".board"))
end
test "can only see own games", %{session: session} do
opponent = insert(:user, %{username: "urbosa", password: "gerudoqueen"})
user = insert(:user, %{username: "zelda", password: "ganonsucks"})
insert(:game, %{user_id: user.id, opponent_id: opponent.id})
session
|> create_user_and_login()
|> visit("/games")
|> click(link("New game"))
|> select("game[opponent_id]", option: "urbosa")
|> click(button("Create game"))
|> click(link("Back to games"))
session
|> assert_has(css(".table tr", count: 1))
|> assert_has(link("Game with urbosa"))
end
test "can see games as an opponent", %{session: session} do
opponent = insert(:user, %{username: "urbosa", password: "gerudoqueen"})
user = insert(:user, %{username: "zelda", password: "ganonsucks"})
insert(:game, %{user_id: user.id, opponent_id: opponent.id})
session
|> login("urbosa", "gerudoqueen")
session
|> assert_has(css(".table tr", count: 1))
|> assert_has(link("Game with zelda"))
session
|> click(link("Game with zelda"))
session
|> assert_has(css("h2", text: "Game with zelda"))
end
test "can move a piece", %{session: session} do
insert(:user, %{username: "zelda", password: "ganonsucks"})
session
|> create_user_and_login()
|> visit("/games")
|> click(link("New game"))
|> select("game[opponent_id]", option: "zelda")
|> click(button("Create game"))
session
|> click(css("#f4-r1"))
|> assert_has(square_selected("f4-r1"))
|> assert_has(square_containing("f4-r1", "white.pawn"))
session
|> click(css("#f4-r3"))
|> refute_has(square_containing("f4-r1", "white.pawn"))
|> assert_has(square_containing("f4-r3", "white.pawn"))
end
test "cannot move the opponents pieces", %{session: session} do
insert(:user, %{username: "zelda", password: "ganonsucks"})
session
|> create_user_and_login()
|> visit("/games")
|> click(link("New game"))
|> select("game[opponent_id]", option: "zelda")
|> click(button("Create game"))
session
|> click(css("#f4-r6"))
|> refute_has(square_selected("f4-r5"))
end
test "cannot move pieces when it's the opponents turn", %{session: session} do
insert(:user, %{username: "link", password: "ilovezelda"})
insert(:user, %{username: "zelda", password: "ganonsucks"})
session
|> login("link", "ilovezelda")
|> visit("/games")
|> click(link("New game"))
|> select("game[opponent_id]", option: "zelda")
|> click(button("Create game"))
{:ok, session2} = Wallaby.start_session
session2
|> login("zelda", "ganonsucks")
|> click(link("Game with link"))
session2
|> click(css("#f4-r6"))
|> refute_has(square_selected("f4-r5"))
end
test "move is reflected on opponents screen", %{session: session} do
insert(:user, %{username: "link", password: "ilovezelda"})
insert(:user, %{username: "zelda", password: "ganonsucks"})
session
|> login("link", "ilovezelda")
|> visit("/games")
|> click(link("New game"))
|> select("game[opponent_id]", option: "zelda")
|> click(button("Create game"))
{:ok, session2} = Wallaby.start_session
session2
|> login("zelda", "ganonsucks")
|> click(link("Game with link"))
session
|> click(css("#f4-r1"))
|> click(css("#f4-r3"))
session2
|> assert_has(css(".board.black-to-move"))
|> refute_has(square_containing("f4-r1", "white.pawn"))
|> assert_has(square_containing("f4-r3", "white.pawn"))
end
defp create_user_and_login(session) do
insert(:user, %{username: "link", password: "ilovezelda"})
session
|> login("link", "ilovezelda")
end
defp login(session, username, password) do
session
|> visit("/session/new")
|> fill_in(text_field("Username"), with: username)
|> fill_in(text_field("Password"), with: password)
|> click(button("Log in"))
end
def select(session, name, [option: option]) do
session
|> find(css("[name='#{name}']"))
|> click(option(option))
session
end
defp square_selected(square) do
css("##{square}.selected")
end
defp square_containing(square, piece) do
css("##{square}.#{piece}")
end
end