using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using StellaOps.AirGap.Controller.Domain; using StellaOps.AirGap.Controller.Options; using StellaOps.AirGap.Controller.Services; using StellaOps.AirGap.Time.Models; using Xunit; using OptionsFactory = Microsoft.Extensions.Options.Options; using StellaOps.TestKit; namespace StellaOps.AirGap.Controller.Tests; public sealed class AirGapTelemetryTests { private static readonly DateTimeOffset FixedNow = new(2025, 12, 12, 10, 0, 0, TimeSpan.Zero); [Trait("Category", TestCategories.Unit)] [Fact] public void Evicts_oldest_tenants_when_over_limit() { var options = OptionsFactory.Create(new AirGapTelemetryOptions { MaxTenantEntries = 2 }); var telemetry = new AirGapTelemetry(options, NullLogger.Instance); telemetry.RecordStatus("tenant-1", BuildStatus("tenant-1")); telemetry.RecordStatus("tenant-2", BuildStatus("tenant-2")); telemetry.RecordStatus("tenant-3", BuildStatus("tenant-3")); Assert.Equal(2, telemetry.TenantCacheCount); } private static AirGapStatus BuildStatus(string tenantId) { var state = new AirGapState { TenantId = tenantId, Sealed = true, PolicyHash = "policy", TimeAnchor = TimeAnchor.Unknown, StalenessBudget = StalenessBudget.Default, LastTransitionAt = FixedNow }; var empty = new Dictionary(StringComparer.OrdinalIgnoreCase); return new AirGapStatus(state, StalenessEvaluation.Unknown, empty, FixedNow); } }