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(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(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(result); } // ── GET SUMMARY ────────────────────────────────────────────────────── [Fact] public void GetSummary_MissingInstanceId_Returns400() { using var db = DbContextFactory.Create(); var result = BuildController(db).GetSummary("", null, null, null); Assert.IsType(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(result); var summary = Assert.IsType(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(result); var summary = Assert.IsType(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(result); var summary = Assert.IsType(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(result); var summary = Assert.IsType(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(result); var summary = Assert.IsType(ok.Value); Assert.Equal(2, summary.TopSections.Count); Assert.Equal("sect-a", summary.TopSections.First().SectionId); Assert.Equal(2, summary.TopSections.First().Views); } } }