Files
Omika/tests/Omika.Diagnostics.Tests/DiagnosticTelemetryUsageModelTests.cs
T
2026-10-23 18:46:50 +02:00

101 lines
3.6 KiB
C#

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;
/// <summary>
/// T18 — PageModel /Telemetry : section « Utilisation de l'application » (écrans +
/// fonctionnalités) et filtres d'usage. Testé sans HttpContext.
/// </summary>
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
};
}