using StellaOps.AirGap.Time.Models; using StellaOps.AirGap.Time.Services; using StellaOps.AirGap.Time.Stores; namespace StellaOps.AirGap.Time.Tests; public class TimeStatusServiceTests { [Fact] public async Task ReturnsUnknownWhenNoAnchor() { var svc = Build(); var status = await svc.GetStatusAsync("t1", DateTimeOffset.UnixEpoch); Assert.Equal(TimeAnchor.Unknown, status.Anchor); Assert.False(status.Staleness.IsWarning); } [Fact] public async Task PersistsAnchorAndBudget() { var svc = Build(); var anchor = new TimeAnchor(DateTimeOffset.UnixEpoch, "source", "fmt", "fp", "digest"); var budget = new StalenessBudget(10, 20); await svc.SetAnchorAsync("t1", anchor, budget); var status = await svc.GetStatusAsync("t1", DateTimeOffset.UnixEpoch.AddSeconds(15)); Assert.Equal(anchor, status.Anchor); Assert.True(status.Staleness.IsWarning); Assert.False(status.Staleness.IsBreach); } private static TimeStatusService Build() => new(new InMemoryTimeAnchorStore(), new StalenessCalculator()); }