using System.Linq; using System.Net; using System.Net.Http.Json; using NeonSprawl.Server.Game.Encounters; using Xunit; namespace NeonSprawl.Server.Tests.Game.Encounters; public class EncounterDefinitionsWorldApiTests { /// Frozen prototype encounter id. Keep in sync with Bruno. public const string PrototypeCombatPocket = "prototype_combat_pocket"; [Fact] public async Task GetEncounterDefinitions_ShouldReturnSchemaV1_WithFrozenEncounterAndNestedRewardTable() { // Arrange await using var factory = new InMemoryWebApplicationFactory(); var client = factory.CreateClient(); // Act var response = await client.GetAsync("/game/world/encounter-definitions"); // Assert Assert.Equal(HttpStatusCode.OK, response.StatusCode); var body = await response.Content.ReadFromJsonAsync(); Assert.NotNull(body); Assert.Equal(EncounterDefinitionsListResponse.CurrentSchemaVersion, body!.SchemaVersion); Assert.NotNull(body.Encounters); Assert.Single(body.Encounters); var encounter = body.Encounters[0]; Assert.Equal(PrototypeCombatPocket, encounter.Id); Assert.Equal("Prototype Combat Pocket", encounter.DisplayName); Assert.NotNull(encounter.CompletionCriteria); Assert.Equal("defeat_all_targets", encounter.CompletionCriteria.Kind); Assert.Equal( ["prototype_npc_melee", "prototype_npc_ranged", "prototype_npc_elite"], encounter.RequiredNpcInstanceIds); Assert.NotNull(encounter.RewardTable); Assert.Equal("prototype_combat_pocket_clear", encounter.RewardTable.Id); Assert.Equal("Prototype Combat Pocket Clear", encounter.RewardTable.DisplayName); Assert.Equal(2, encounter.RewardTable.FixedGrants.Count); var scrapGrant = encounter.RewardTable.FixedGrants.Single(g => g.ItemId == "scrap_metal_bulk"); Assert.Equal(10, scrapGrant.Quantity); var tokenGrant = encounter.RewardTable.FixedGrants.Single(g => g.ItemId == "contract_handoff_token"); Assert.Equal(1, tokenGrant.Quantity); } }