diff --git a/lib/chess/repo/queries.ex b/lib/chess/repo/queries.ex index 832db05..a37c223 100644 --- a/lib/chess/repo/queries.ex +++ b/lib/chess/repo/queries.ex @@ -36,10 +36,11 @@ defmodule Chess.Repo.Queries do |> Repo.get!(game_id) end - def moves_with_captures(game_id) do + def captures_for_colour(game, colour) do Move - |> Move.for_game_id(game_id) + |> Move.for_game_id(game.id) |> Move.with_captures + |> Move.captures_for_colour(colour) |> Repo.all end diff --git a/lib/chess/store/move.ex b/lib/chess/store/move.ex index 4ab2a61..28a19e7 100644 --- a/lib/chess/store/move.ex +++ b/lib/chess/store/move.ex @@ -37,6 +37,11 @@ defmodule Chess.Store.Move do where: not is_nil(move.piece_captured) end + def captures_for_colour(query, colour) do + from move in query, + where: fragment("(piece_captured -> 'colour')::jsonb = ?", ^colour) + end + def transform(move) do %{ id: move.id, diff --git a/lib/chess_web/views/game_channel_view.ex b/lib/chess_web/views/game_channel_view.ex index 2933def..feb9b79 100644 --- a/lib/chess_web/views/game_channel_view.ex +++ b/lib/chess_web/views/game_channel_view.ex @@ -6,8 +6,8 @@ defmodule ChessWeb.GameChannelView do import ChessWeb.GameView, only: [player: 2, opponent: 2] alias Chess.Board - alias Chess.MoveList + alias Chess.Repo.Queries def after_join_payload(socket, game) do %{ @@ -19,6 +19,10 @@ defmodule ChessWeb.GameChannelView do turn: game.turn, state: game.state, moves: MoveList.transform(game.moves), + graveyard: %{ + white: Queries.captures_for_colour(game, "white"), + black: Queries.captures_for_colour(game, "black"), + }, } end @@ -28,6 +32,10 @@ defmodule ChessWeb.GameChannelView do turn: game.turn, state: game.state, moves: MoveList.transform(game.moves), + graveyard: %{ + white: Queries.captures_for_colour(game, "white"), + black: Queries.captures_for_colour(game, "black"), + }, } end end diff --git a/test/features/moves_test.exs b/test/features/moves_test.exs index 4ca38e0..46de35a 100644 --- a/test/features/moves_test.exs +++ b/test/features/moves_test.exs @@ -145,6 +145,37 @@ defmodule Chess.Features.MovesTest do |> assert_has(square_containing("f4-r3", %{type: "pawn", colour: "white"})) end + test "captured pieces are displayed on the page", %{session: session} do + user = insert(:user, %{password: "mypassword"}) + opponent = insert(:opponent) + + insert(:game, %{ + board: %{ + "4,0" => %{"type" => "queen", "colour" => "white"}, + "0,2" => %{"type" => "king", "colour" => "white"}, + "4,7" => %{"type" => "pawn", "colour" => "black"}, + "0,7" => %{"type" => "king", "colour" => "black"}, + }, + user_id: user.id, + opponent_id: opponent.id, + turn: "white", + }) + + session + |> login(user.email, "mypassword") + |> visit("/games") + |> click(link("Game with #{opponent.name}")) + + refute_has(session, css("li", text: "Black Pawn")) + + session + |> click(css("#f4-r0")) + |> click(css("#f4-r7")) + |> assert_has(square_containing("f4-r7", %{type: "queen", colour: "white"})) + |> refute_has(square_containing("f4-r0", %{type: "queen", colour: "white"})) + |> assert_has(css("li", text: "Black Pawn")) + end + test "cannot move the king into a position that would result in check", %{session: session} do user = insert(:user, %{