using NeonSprawl.Server.Game.Encounters; namespace NeonSprawl.Server.Tests.Game.Encounters; public sealed class InMemoryEncounterCompletionStoreTests { private const string PlayerId = "dev-local-1"; private const string EncounterId = "prototype_combat_pocket"; private static readonly DateTimeOffset CompletedAt = new(2026, 5, 31, 18, 0, 0, TimeSpan.Zero); [Fact] public void TryMarkCompleted_ShouldBeIdempotent_AtStoreLayer() { // Arrange var store = new InMemoryEncounterCompletionStore(); // Act var first = store.TryMarkCompleted(PlayerId, EncounterId, CompletedAt); var second = store.TryMarkCompleted(PlayerId, EncounterId, CompletedAt.AddHours(1)); var hasCompletedAt = store.TryGetCompletedAt(PlayerId, EncounterId, out var storedAt); // Assert Assert.True(first); Assert.False(second); Assert.True(store.IsCompleted(PlayerId, EncounterId)); Assert.True(hasCompletedAt); Assert.Equal(CompletedAt, storedAt); } }