using NeonSprawl.Server.Game.Contracts; namespace NeonSprawl.Server.Tests.Game.Contracts; public class ContractTemplateRegistryTests { private static ContractTemplateRegistry CreateRegistryFromRows(IReadOnlyDictionary byId) { var catalog = new ContractTemplateCatalog("/tmp/catalog", byId, catalogJsonFileCount: 1); return new ContractTemplateRegistry(catalog); } [Fact] public void TryGetDefinition_ShouldReturnTrue_WhenIdExists() { // Arrange var expected = PrototypeE7M4ContractCatalogRules.ExpectedTemplateFreeze["prototype_contract_clear_combat_pocket"]; var rows = new Dictionary(StringComparer.Ordinal) { [expected.Id] = expected, }; var registry = CreateRegistryFromRows(rows); // Act var found = registry.TryGetDefinition("prototype_contract_clear_combat_pocket", out var def); // Assert Assert.True(found); Assert.NotNull(def); Assert.Equal("Clear Combat Pocket (Repeat)", def!.DisplayName); Assert.Equal("prototype_combat_pocket", def.EncounterTemplateId); } [Fact] public void TryGetDefinition_ShouldReturnFalse_WhenTemplateIdIsNull() { // Arrange var expected = PrototypeE7M4ContractCatalogRules.ExpectedTemplateFreeze["prototype_contract_clear_combat_pocket"]; var rows = new Dictionary(StringComparer.Ordinal) { [expected.Id] = expected, }; var registry = CreateRegistryFromRows(rows); // Act var found = registry.TryGetDefinition(null, out var def); // Assert Assert.False(found); Assert.Null(def); } [Fact] public void TryGetDefinition_ShouldReturnFalse_WhenIdUnknown() { // Arrange var expected = PrototypeE7M4ContractCatalogRules.ExpectedTemplateFreeze["prototype_contract_clear_combat_pocket"]; var rows = new Dictionary(StringComparer.Ordinal) { [expected.Id] = expected, }; var registry = CreateRegistryFromRows(rows); // Act var found = registry.TryGetDefinition("not_a_real_template", out var def); // Assert Assert.False(found); Assert.Null(def); } [Fact] public void GetDefinitionsInIdOrder_ShouldListAllRowsOrderedById_WhenMultipleTemplates() { // Arrange var prototype = PrototypeE7M4ContractCatalogRules.ExpectedTemplateFreeze["prototype_contract_clear_combat_pocket"]; var other = prototype with { Id = "zzz_other_template" }; var rows = new Dictionary(StringComparer.Ordinal) { [other.Id] = other, [prototype.Id] = prototype, }; var registry = CreateRegistryFromRows(rows); // Act var list = registry.GetDefinitionsInIdOrder(); // Assert Assert.Equal(2, list.Count); Assert.Equal("prototype_contract_clear_combat_pocket", list[0].Id); Assert.Equal("zzz_other_template", list[1].Id); } [Fact] public async Task Host_ShouldResolveContractCatalogFromDi_WhenStartupSucceeds() { // Arrange await using var factory = new InMemoryWebApplicationFactory(); using var client = factory.CreateClient(); _ = await client.GetAsync("/health"); // Act var registry = factory.Services.GetRequiredService(); var found = registry.TryGetDefinition("prototype_contract_clear_combat_pocket", out var template); // Assert Assert.True(found); Assert.NotNull(template); Assert.Equal("Clear Combat Pocket (Repeat)", template!.DisplayName); Assert.Equal("encounter_clear", template.ObjectiveKind); Assert.Equal("prototype_combat_pocket", template.EncounterTemplateId); } }