using System.Net; using System.Net.Http.Json; using Microsoft.AspNetCore.Mvc.Testing; using NeonSprawl.Server.Game.PositionState; using Xunit; namespace NeonSprawl.Server.Tests.Game.PositionState; /// Integration tests for GET routes. public class PositionStateApiTests(WebApplicationFactory factory) : IClassFixture> { private readonly HttpClient _client = factory.CreateClient(); [Fact] public async Task GetPosition_ShouldReturnVersionedPayloadAtOrigin_WhenDevPlayerRequested() { // Arrange const string url = "/game/players/dev-local-1/position"; // Act var response = await _client.GetAsync(url); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); var body = await response.Content.ReadFromJsonAsync(); Assert.NotNull(body); Assert.Equal(PositionStateResponse.CurrentSchemaVersion, body.SchemaVersion); Assert.Equal("dev-local-1", body.PlayerId); Assert.NotNull(body.Position); Assert.Equal(0, body.Position.X); Assert.Equal(0, body.Position.Y); Assert.Equal(0, body.Position.Z); } [Fact] public async Task GetPosition_ShouldReturnOk_WhenPathIdDiffersOnlyByCase() { // Arrange const string url = "/game/players/DEV-LOCAL-1/position"; // Act var response = await _client.GetAsync(url); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); var body = await response.Content.ReadFromJsonAsync(); Assert.NotNull(body); Assert.Equal(PositionStateResponse.CurrentSchemaVersion, body!.SchemaVersion); Assert.Equal("DEV-LOCAL-1", body.PlayerId); Assert.Equal(0, body.Position!.X); } [Fact] public async Task GetPosition_ShouldReturnNotFound_WhenPlayerIsUnknown() { // Arrange const string url = "/game/players/unknown-player/position"; // Act var response = await _client.GetAsync(url); // Assert Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); } }