61 lines
2.7 KiB
C#
61 lines
2.7 KiB
C#
using NeonSprawl.Server.Game.Contracts;
|
|
using NeonSprawl.Server.Game.Encounters;
|
|
using NeonSprawl.Server.Game.Factions;
|
|
using NeonSprawl.Server.Game.Items;
|
|
|
|
namespace NeonSprawl.Server.Tests.Game.Contracts;
|
|
|
|
public sealed class ContractGeneratorOperationsIntegrationTests
|
|
{
|
|
private const string PlayerId = "dev-local-1";
|
|
private const string TemplateId = "prototype_contract_clear_combat_pocket";
|
|
private const string EncounterId = "prototype_combat_pocket";
|
|
private const string SeedBucket = "2026-06-22";
|
|
|
|
[Fact]
|
|
public async Task TryIssue_ShouldCreateActiveInstanceWithEncounterBinding_WhenResolvedFromDi()
|
|
{
|
|
// Arrange
|
|
await using var factory = new InMemoryWebApplicationFactory();
|
|
using var client = factory.CreateClient();
|
|
_ = await client.GetAsync("/health");
|
|
using var scope = factory.Services.CreateScope();
|
|
var templateRegistry = scope.ServiceProvider.GetRequiredService<IContractTemplateRegistry>();
|
|
var instanceStore = scope.ServiceProvider.GetRequiredService<IContractInstanceStore>();
|
|
var standingStore = scope.ServiceProvider.GetRequiredService<IFactionStandingStore>();
|
|
var timeProvider = scope.ServiceProvider.GetRequiredService<TimeProvider>();
|
|
var expectedInstanceId = ContractInstanceIds.MakeDeterministicInstanceId(
|
|
PlayerId,
|
|
TemplateId,
|
|
SeedBucket);
|
|
// Act
|
|
var encounterRegistry = scope.ServiceProvider.GetRequiredService<IEncounterDefinitionRegistry>();
|
|
var itemRegistry = scope.ServiceProvider.GetRequiredService<IItemDefinitionRegistry>();
|
|
var skillRegistry = scope.ServiceProvider.GetRequiredService<ISkillDefinitionRegistry>();
|
|
var factionRegistry = scope.ServiceProvider.GetRequiredService<IFactionDefinitionRegistry>();
|
|
var result = ContractGeneratorOperations.TryIssue(
|
|
PlayerId,
|
|
TemplateId,
|
|
SeedBucket,
|
|
zoneDifficultyBand: null,
|
|
templateRegistry,
|
|
encounterRegistry,
|
|
itemRegistry,
|
|
skillRegistry,
|
|
factionRegistry,
|
|
instanceStore,
|
|
standingStore,
|
|
timeProvider);
|
|
// Assert
|
|
Assert.True(result.Success);
|
|
Assert.Null(result.ReasonCode);
|
|
Assert.NotNull(result.Snapshot);
|
|
Assert.Equal(expectedInstanceId, result.Snapshot!.ContractInstanceId);
|
|
Assert.Equal(TemplateId, result.Snapshot.TemplateId);
|
|
Assert.Equal(EncounterId, result.EncounterTemplateId);
|
|
Assert.Equal(ContractInstanceStatus.Active, result.Snapshot.Status);
|
|
Assert.True(instanceStore.TryGetActiveForPlayer(PlayerId, out var active));
|
|
Assert.Equal(expectedInstanceId, active.ContractInstanceId);
|
|
}
|
|
}
|