338 lines
12 KiB
C#
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);
|
|
}
|
|
}
|