Files
Shogi/Tests/AcceptanceTests/ApiTests.cs

338 lines
12 KiB
C#

using Shogi.AcceptanceTests.TestSetup;
using Shogi.Types;
using System.Net;
using System.Net.Http.Json;
namespace Shogi.AcceptanceTests;
public class ApiTests(AatTestFixture fixture) : IClassFixture<AatTestFixture>
{
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<string, Piece?> 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<SessionMetadata[]>(
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<Session> ReadTestSession()
{
return this.httpClient.GetFromJsonAsync<Session>(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);
}
}