using Omika.Core.Observability; using Omika.Diagnostics.Models; using Omika.Diagnostics.Queries; using Omika.Diagnostics.Tests.Fakes; using Omika.Diagnostics.Web.Pages; namespace Omika.Diagnostics.Tests; /// /// T18 — PageModel /Telemetry : section « Utilisation de l'application » (écrans + /// fonctionnalités) et filtres d'usage. Testé sans HttpContext. /// public class DiagnosticTelemetryUsageModelTests { private static readonly string ScreenView = TelemetryEventCodes.MobileScreenView.Value!; private static readonly string FeatureUse = TelemetryEventCodes.MobileFeatureUse.Value!; [Fact] public async Task TelemetryModel_LoadsScreenAndFeatureUsage() { var repo = new FakeDiagnosticEventRepository(); DateTimeOffset now = DateTimeOffset.UtcNow; await repo.InsertBatchAsync( [ Screen("AGENDA", "D-A", Guid.NewGuid(), now.AddMinutes(-10)), Screen("AGENDA", "D-B", Guid.NewGuid(), now.AddMinutes(-9)), Screen("SITE_DETAIL", "D-A", Guid.NewGuid(), now.AddMinutes(-8)), Feature("EMAIL_SEND", "D-A", now.AddMinutes(-7)), Feature("EMAIL_SEND", "D-B", now.AddMinutes(-6)), Feature("REPORT_GENERATE", "D-A", now.AddMinutes(-5)) ]); var model = new TelemetryModel(repo) { Period = "30d" }; await model.OnGetAsync(); Assert.True(model.PostgreSqlAvailable); Assert.True(model.HasUsageData); ScreenUsageRecord agenda = model.ScreenUsage.Single(s => s.ScreenCode == "AGENDA"); Assert.Equal(2, agenda.Views); Assert.Equal(2, agenda.DistinctDevices); FeatureUsageRecord email = model.FeatureUsage.Single(f => f.FeatureCode == "EMAIL_SEND"); Assert.Equal(2, email.Uses); Assert.Equal(2, email.DistinctDevices); } [Fact] public async Task TelemetryModel_UsageFiltersByScreenAndPlatform() { var repo = new FakeDiagnosticEventRepository(); DateTimeOffset now = DateTimeOffset.UtcNow; await repo.InsertBatchAsync( [ Screen("AGENDA", "D-A", Guid.NewGuid(), now.AddMinutes(-10), platform: "Android"), Screen("SITE_DETAIL", "D-A", Guid.NewGuid(), now.AddMinutes(-9), platform: "Android"), Screen("SITE_DETAIL", "D-B", Guid.NewGuid(), now.AddMinutes(-8), platform: "iOS") ]); var model = new TelemetryModel(repo) { Period = "30d", ScreenCode = "SITE_DETAIL" }; await model.OnGetAsync(); ScreenUsageRecord item = Assert.Single(model.ScreenUsage); Assert.Equal("SITE_DETAIL", item.ScreenCode); Assert.Equal(2, item.Views); } private static DiagnosticEventRecord Screen( string screenCode, string deviceKey, Guid sessionId, DateTimeOffset ts, string? platform = null) => new() { EventId = Guid.NewGuid(), EventCode = ScreenView, TimestampUtc = ts, ScreenCode = screenCode, DeviceKey = deviceKey, SessionId = sessionId, Platform = platform, Source = "mobile", IngestedAtUtc = DateTimeOffset.UtcNow }; private static DiagnosticEventRecord Feature(string featureCode, string deviceKey, DateTimeOffset ts) => new() { EventId = Guid.NewGuid(), EventCode = FeatureUse, TimestampUtc = ts, FeatureCode = featureCode, DeviceKey = deviceKey, Source = "mobile", IngestedAtUtc = DateTimeOffset.UtcNow }; }