180 lines
7.2 KiB
C#
180 lines
7.2 KiB
C#
using ManagerService.Controllers;
|
|
using ManagerService.Data;
|
|
using ManagerService.DTOs;
|
|
using ManagerService.Tests.Infrastructure;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Xunit;
|
|
|
|
namespace ManagerService.Tests.Controllers
|
|
{
|
|
public class StatsControllerTests
|
|
{
|
|
private StatsController BuildController(MyInfoMateDbContext db) => new StatsController(db);
|
|
|
|
// ── TRACK EVENT ──────────────────────────────────────────────────────
|
|
|
|
[Fact]
|
|
public void TrackEvent_ValidDto_PersistsAndReturns204()
|
|
{
|
|
using var db = DbContextFactory.Create();
|
|
|
|
var result = BuildController(db).TrackEvent(new VisitEventDTO
|
|
{
|
|
instanceId = "i1",
|
|
sessionId = "s1",
|
|
eventType = "SectionView",
|
|
appType = "Mobile"
|
|
});
|
|
|
|
Assert.IsType<NoContentResult>(result);
|
|
Assert.Equal(1, db.VisitEvents.Count());
|
|
}
|
|
|
|
[Fact]
|
|
public void TrackEvent_MissingInstanceId_Returns400()
|
|
{
|
|
using var db = DbContextFactory.Create();
|
|
|
|
var result = BuildController(db).TrackEvent(new VisitEventDTO
|
|
{
|
|
instanceId = "",
|
|
eventType = "SectionView",
|
|
appType = "Mobile"
|
|
});
|
|
|
|
Assert.IsType<BadRequestObjectResult>(result);
|
|
}
|
|
|
|
[Fact]
|
|
public void TrackEvent_UnknownEventType_Returns400()
|
|
{
|
|
using var db = DbContextFactory.Create();
|
|
|
|
var result = BuildController(db).TrackEvent(new VisitEventDTO
|
|
{
|
|
instanceId = "i1",
|
|
eventType = "InvalidType",
|
|
appType = "Mobile"
|
|
});
|
|
|
|
Assert.IsType<BadRequestObjectResult>(result);
|
|
}
|
|
|
|
// ── GET SUMMARY ──────────────────────────────────────────────────────
|
|
|
|
[Fact]
|
|
public void GetSummary_MissingInstanceId_Returns400()
|
|
{
|
|
using var db = DbContextFactory.Create();
|
|
|
|
var result = BuildController(db).GetSummary("", null, null, null);
|
|
|
|
Assert.IsType<BadRequestObjectResult>(result);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetSummary_FiltersToInstance()
|
|
{
|
|
using var db = DbContextFactory.Create();
|
|
db.VisitEvents.AddRange(
|
|
new VisitEvent { Id = "e1", InstanceId = "i1", SessionId = "s1", EventType = VisitEventType.SectionView, Timestamp = DateTime.UtcNow },
|
|
new VisitEvent { Id = "e2", InstanceId = "other", SessionId = "s2", EventType = VisitEventType.SectionView, Timestamp = DateTime.UtcNow }
|
|
);
|
|
db.SaveChanges();
|
|
|
|
var result = BuildController(db).GetSummary("i1", null, null, null);
|
|
|
|
var ok = Assert.IsType<OkObjectResult>(result);
|
|
var summary = Assert.IsType<StatsSummaryDTO>(ok.Value);
|
|
Assert.Equal(1, summary.TotalSessions);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetSummary_CountsDistinctSessions()
|
|
{
|
|
using var db = DbContextFactory.Create();
|
|
db.VisitEvents.AddRange(
|
|
new VisitEvent { Id = "e1", InstanceId = "i1", SessionId = "session-A", EventType = VisitEventType.SectionView, Timestamp = DateTime.UtcNow },
|
|
new VisitEvent { Id = "e2", InstanceId = "i1", SessionId = "session-A", EventType = VisitEventType.SectionView, Timestamp = DateTime.UtcNow },
|
|
new VisitEvent { Id = "e3", InstanceId = "i1", SessionId = "session-B", EventType = VisitEventType.SectionView, Timestamp = DateTime.UtcNow }
|
|
);
|
|
db.SaveChanges();
|
|
|
|
var result = BuildController(db).GetSummary("i1", null, null, null);
|
|
|
|
var ok = Assert.IsType<OkObjectResult>(result);
|
|
var summary = Assert.IsType<StatsSummaryDTO>(ok.Value);
|
|
Assert.Equal(2, summary.TotalSessions);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetSummary_AppliesDateRange()
|
|
{
|
|
using var db = DbContextFactory.Create();
|
|
var inRange = DateTime.UtcNow.AddDays(-5);
|
|
var outOfRange = DateTime.UtcNow.AddDays(-40);
|
|
|
|
db.VisitEvents.AddRange(
|
|
new VisitEvent { Id = "e1", InstanceId = "i1", SessionId = "s1", EventType = VisitEventType.SectionView, Timestamp = inRange },
|
|
new VisitEvent { Id = "e2", InstanceId = "i1", SessionId = "s2", EventType = VisitEventType.SectionView, Timestamp = outOfRange }
|
|
);
|
|
db.SaveChanges();
|
|
|
|
var from = DateTime.UtcNow.AddDays(-10);
|
|
var to = DateTime.UtcNow;
|
|
|
|
var result = BuildController(db).GetSummary("i1", from, to, null);
|
|
|
|
var ok = Assert.IsType<OkObjectResult>(result);
|
|
var summary = Assert.IsType<StatsSummaryDTO>(ok.Value);
|
|
Assert.Equal(1, summary.TotalSessions);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetSummary_DefaultsTo30Days()
|
|
{
|
|
using var db = DbContextFactory.Create();
|
|
// Event dans les 30 jours
|
|
db.VisitEvents.Add(new VisitEvent
|
|
{
|
|
Id = "e1", InstanceId = "i1", SessionId = "s1",
|
|
EventType = VisitEventType.SectionView, Timestamp = DateTime.UtcNow.AddDays(-5)
|
|
});
|
|
// Event au-delà des 30 jours
|
|
db.VisitEvents.Add(new VisitEvent
|
|
{
|
|
Id = "e2", InstanceId = "i1", SessionId = "s2",
|
|
EventType = VisitEventType.SectionView, Timestamp = DateTime.UtcNow.AddDays(-35)
|
|
});
|
|
db.SaveChanges();
|
|
|
|
// Sans dates → filtre 30 derniers jours
|
|
var result = BuildController(db).GetSummary("i1", null, null, null);
|
|
|
|
var ok = Assert.IsType<OkObjectResult>(result);
|
|
var summary = Assert.IsType<StatsSummaryDTO>(ok.Value);
|
|
Assert.Equal(1, summary.TotalSessions);
|
|
}
|
|
|
|
[Fact]
|
|
public void GetSummary_TopSections_AggregatesByViewCount()
|
|
{
|
|
using var db = DbContextFactory.Create();
|
|
db.VisitEvents.AddRange(
|
|
new VisitEvent { Id = "e1", InstanceId = "i1", SessionId = "s1", EventType = VisitEventType.SectionView, SectionId = "sect-a", Timestamp = DateTime.UtcNow },
|
|
new VisitEvent { Id = "e2", InstanceId = "i1", SessionId = "s2", EventType = VisitEventType.SectionView, SectionId = "sect-a", Timestamp = DateTime.UtcNow },
|
|
new VisitEvent { Id = "e3", InstanceId = "i1", SessionId = "s3", EventType = VisitEventType.SectionView, SectionId = "sect-b", Timestamp = DateTime.UtcNow }
|
|
);
|
|
db.SaveChanges();
|
|
|
|
var result = BuildController(db).GetSummary("i1", null, null, null);
|
|
|
|
var ok = Assert.IsType<OkObjectResult>(result);
|
|
var summary = Assert.IsType<StatsSummaryDTO>(ok.Value);
|
|
Assert.Equal(2, summary.TopSections.Count);
|
|
Assert.Equal("sect-a", summary.TopSections.First().SectionId);
|
|
Assert.Equal(2, summary.TopSections.First().Views);
|
|
}
|
|
}
|
|
}
|