101 lines
3.6 KiB
C#
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
|
|
};
|
|
}
|