using Shogi.AcceptanceTests.TestSetup; using Shogi.Types; using System.Net; using System.Net.Http.Json; namespace Shogi.AcceptanceTests; public class ApiTests(AatTestFixture fixture) : IClassFixture { private readonly HttpClient httpClient = fixture.HttpClient; private readonly HttpClient player2HttpClient = fixture.OtherHttpClient; private string sessionId = string.Empty; [Fact] public async Task CreateSession() { try { // Arrange await this.SetupTestSession(); // Act var response = await this.ReadTestSession(); // Assert Assert.NotNull(response); Assert.NotEmpty(response!.BoardState.Board); ValidateBoard(response.BoardState.Board); Assert.Empty(response.BoardState.Player1Hand); Assert.Empty(response.BoardState.Player2Hand); Assert.Null(response.BoardState.PlayerInCheck); Assert.Equal(WhichPlayer.Player1, response.BoardState.WhoseTurn); Assert.NotNull(response.Player1); Assert.True(string.IsNullOrEmpty(response.Player2)); Assert.NotEqual(Guid.Empty, response.SessionId); } finally { // Annul await this.DeleteTestSession(); } static void ValidateBoard(Dictionary board) { Assert.Equal(WhichPiece.Lance, board["A1"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["A1"]!.Owner); Assert.False(board["A1"]!.IsPromoted); Assert.Equal(WhichPiece.Knight, board["B1"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["B1"]!.Owner); Assert.False(board["B1"]!.IsPromoted); Assert.Equal(WhichPiece.SilverGeneral, board["C1"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["C1"]!.Owner); Assert.False(board["C1"]!.IsPromoted); Assert.Equal(WhichPiece.GoldGeneral, board["D1"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["D1"]!.Owner); Assert.False(board["D1"]!.IsPromoted); Assert.Equal(WhichPiece.King, board["E1"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["E1"]!.Owner); Assert.False(board["E1"]!.IsPromoted); Assert.Equal(WhichPiece.GoldGeneral, board["F1"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["F1"]!.Owner); Assert.False(board["F1"]!.IsPromoted); Assert.Equal(WhichPiece.SilverGeneral, board["G1"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["G1"]!.Owner); Assert.False(board["G1"]!.IsPromoted); Assert.Equal(WhichPiece.Knight, board["H1"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["H1"]!.Owner); Assert.False(board["H1"]!.IsPromoted); Assert.Equal(WhichPiece.Lance, board["I1"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["I1"]!.Owner); Assert.False(board["I1"]!.IsPromoted); Assert.Null(board["A2"]); Assert.Equal(WhichPiece.Bishop, board["B2"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["B2"]!.Owner); Assert.False(board["B2"]!.IsPromoted); Assert.Null(board["C2"]); Assert.Null(board["D2"]); Assert.Null(board["E2"]); Assert.Null(board["F2"]); Assert.Null(board["G2"]); Assert.Equal(WhichPiece.Rook, board["H2"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["H2"]!.Owner); Assert.False(board["H2"]!.IsPromoted); Assert.Null(board["I2"]); Assert.Equal(WhichPiece.Pawn, board["A3"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["A3"]!.Owner); Assert.False(board["A3"]!.IsPromoted); Assert.Equal(WhichPiece.Pawn, board["B3"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["B3"]!.Owner); Assert.False(board["B3"]!.IsPromoted); Assert.Equal(WhichPiece.Pawn, board["C3"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["C3"]!.Owner); Assert.False(board["C3"]!.IsPromoted); Assert.Equal(WhichPiece.Pawn, board["D3"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["D3"]!.Owner); Assert.False(board["D3"]!.IsPromoted); Assert.Equal(WhichPiece.Pawn, board["E3"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["E3"]!.Owner); Assert.False(board["E3"]!.IsPromoted); Assert.Equal(WhichPiece.Pawn, board["F3"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["F3"]!.Owner); Assert.False(board["F3"]!.IsPromoted); Assert.Equal(WhichPiece.Pawn, board["G3"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["G3"]!.Owner); Assert.False(board["G3"]!.IsPromoted); Assert.Equal(WhichPiece.Pawn, board["H3"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["H3"]!.Owner); Assert.False(board["H3"]!.IsPromoted); Assert.Equal(WhichPiece.Pawn, board["I3"]!.WhichPiece); Assert.Equal(WhichPlayer.Player1, board["I3"]!.Owner); Assert.False(board["I3"]!.IsPromoted); Assert.Null(board["A4"]); Assert.Null(board["B4"]); Assert.Null(board["C4"]); Assert.Null(board["D4"]); Assert.Null(board["E4"]); Assert.Null(board["F4"]); Assert.Null(board["G4"]); Assert.Null(board["H4"]); Assert.Null(board["I4"]); Assert.Null(board["A5"]); Assert.Null(board["B5"]); Assert.Null(board["C5"]); Assert.Null(board["D5"]); Assert.Null(board["E5"]); Assert.Null(board["F5"]); Assert.Null(board["G5"]); Assert.Null(board["H5"]); Assert.Null(board["I5"]); Assert.Null(board["A6"]); Assert.Null(board["B6"]); Assert.Null(board["C6"]); Assert.Null(board["D6"]); Assert.Null(board["E6"]); Assert.Null(board["F6"]); Assert.Null(board["G6"]); Assert.Null(board["H6"]); Assert.Null(board["I6"]); Assert.Equal(WhichPiece.Pawn, board["A7"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["A7"]!.Owner); Assert.False(board["A7"]!.IsPromoted); Assert.Equal(WhichPiece.Pawn, board["B7"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["B7"]!.Owner); Assert.False(board["B7"]!.IsPromoted); Assert.Equal(WhichPiece.Pawn, board["C7"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["C7"]!.Owner); Assert.False(board["C7"]!.IsPromoted); Assert.Equal(WhichPiece.Pawn, board["D7"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["D7"]!.Owner); Assert.False(board["D7"]!.IsPromoted); Assert.Equal(WhichPiece.Pawn, board["E7"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["E7"]!.Owner); Assert.False(board["E7"]!.IsPromoted); Assert.Equal(WhichPiece.Pawn, board["F7"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["F7"]!.Owner); Assert.False(board["F7"]!.IsPromoted); Assert.Equal(WhichPiece.Pawn, board["G7"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["G7"]!.Owner); Assert.False(board["G7"]!.IsPromoted); Assert.Equal(WhichPiece.Pawn, board["H7"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["H7"]!.Owner); Assert.False(board["H7"]!.IsPromoted); Assert.Equal(WhichPiece.Pawn, board["I7"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["I7"]!.Owner); Assert.False(board["I7"]!.IsPromoted); Assert.Null(board["A8"]); Assert.Equal(WhichPiece.Rook, board["B8"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["B8"]!.Owner); Assert.False(board["B8"]!.IsPromoted); Assert.Null(board["C8"]); Assert.Null(board["D8"]); Assert.Null(board["E8"]); Assert.Null(board["F8"]); Assert.Null(board["G8"]); Assert.Equal(WhichPiece.Bishop, board["H8"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["H8"]!.Owner); Assert.False(board["H8"]!.IsPromoted); Assert.Null(board["I8"]); Assert.Equal(WhichPiece.Lance, board["A9"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["A9"]!.Owner); Assert.False(board["A9"]!.IsPromoted); Assert.Equal(WhichPiece.Knight, board["B9"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["B9"]!.Owner); Assert.False(board["B9"]!.IsPromoted); Assert.Equal(WhichPiece.SilverGeneral, board["C9"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["C9"]!.Owner); Assert.False(board["C9"]!.IsPromoted); Assert.Equal(WhichPiece.GoldGeneral, board["D9"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["D9"]!.Owner); Assert.False(board["D9"]!.IsPromoted); Assert.Equal(WhichPiece.King, board["E9"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["E9"]!.Owner); Assert.False(board["E9"]!.IsPromoted); Assert.Equal(WhichPiece.GoldGeneral, board["F9"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["F9"]!.Owner); Assert.False(board["F9"]!.IsPromoted); Assert.Equal(WhichPiece.SilverGeneral, board["G9"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["G9"]!.Owner); Assert.False(board["G9"]!.IsPromoted); Assert.Equal(WhichPiece.Knight, board["H9"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["H9"]!.Owner); Assert.False(board["H9"]!.IsPromoted); Assert.Equal(WhichPiece.Lance, board["I9"]!.WhichPiece); Assert.Equal(WhichPlayer.Player2, board["I9"]!.Owner); Assert.False(board["I9"]!.IsPromoted); } } [Fact] public async Task ReadAllSessionsMetadata() { try { // Arrange await this.SetupTestSession(); var testSession = await this.ReadTestSession(); // Act var readAllResponse = await this.httpClient.GetFromJsonAsync( new Uri("Sessions", UriKind.Relative)); // Assert Assert.NotNull(readAllResponse); Assert.Equal(testSession.SessionId, readAllResponse!.First().SessionId); } finally { // Annul await this.DeleteTestSession(); } } [Fact] public async Task JoinSession_Player2IsNotSet_SetsPlayer2() { try { // Arrange await this.SetupTestSession(); // Act var joinResponse = await this.player2HttpClient.PatchAsync(new Uri($"Sessions/{this.sessionId}/Join", UriKind.Relative), null); // Assert Assert.Equal(HttpStatusCode.OK, joinResponse.StatusCode); var readSessionResponse = await this.ReadTestSession(); Assert.False(string.IsNullOrEmpty(readSessionResponse.Player2)); } finally { await this.DeleteTestSession(); } } [Fact] public async Task JoinSession_SessionIsFull_Conflict() { try { // Arrange await this.SetupTestSession(); var joinResponse = await this.player2HttpClient.PatchAsync(new Uri($"Sessions/{this.sessionId}/Join", UriKind.Relative), null); Assert.Equal(HttpStatusCode.OK, joinResponse.StatusCode); var readSessionResponse = await this.ReadTestSession(); Assert.NotNull(readSessionResponse.Player2); // Act joinResponse = await this.player2HttpClient.PatchAsync(new Uri($"Sessions/{this.sessionId}/Join", UriKind.Relative), null); // Assert Assert.Equal(HttpStatusCode.Conflict, joinResponse.StatusCode); } finally { await this.DeleteTestSession(); } } [Fact] public async Task MovePieceCommand_MovingPieceFromBoard_MovesThePiece() { try { // Arrange await this.SetupTestSession(); var movePawnCommand = new MovePieceCommand { From = "A3", To = "A4", }; // Act var response = await this.httpClient.PatchAsync(new Uri($"Sessions/{this.sessionId}/Move", UriKind.Relative), JsonContent.Create(movePawnCommand)); Assert.Equal(HttpStatusCode.NoContent, response.StatusCode); // Assert var session = await this.ReadTestSession(); Assert.Contains("A3", session.BoardState.Board.Keys); Assert.Null(session.BoardState.Board["A3"]); Assert.NotNull(session.BoardState.Board["A4"]); Assert.False(session.BoardState.Board["A4"]!.IsPromoted); Assert.Equal(WhichPlayer.Player1, session.BoardState.Board["A4"]!.Owner); Assert.Equal(WhichPiece.Pawn, session.BoardState.Board["A4"]!.WhichPiece); } finally { // Annul await this.DeleteTestSession(); } } private async Task SetupTestSession() { var createResponse = await this.httpClient.PostAsync(new Uri("Sessions", UriKind.Relative), null); Assert.Equal(HttpStatusCode.Created, createResponse.StatusCode); this.sessionId = await createResponse.Content.ReadAsStringAsync(); } private Task ReadTestSession() { return this.httpClient.GetFromJsonAsync(new Uri($"Sessions/{Uri.EscapeDataString(this.sessionId)}", UriKind.Relative))!; } private async Task DeleteTestSession() { var response = await this.httpClient.DeleteAsync(new Uri($"Sessions/{Uri.EscapeDataString(this.sessionId)}", UriKind.Relative)); Assert.Equal(HttpStatusCode.NoContent, response.StatusCode); } }