using line_gestao_api.Data; using line_gestao_api.Models; using line_gestao_api.Services; using Microsoft.EntityFrameworkCore; using Xunit; namespace line_gestao_api.Tests { public class GeralDashboardInsightsServiceTests { [Fact] public async Task GetInsightsAsync_ReturnsZerosWhenNoLines() { var tenantId = Guid.NewGuid(); var provider = new TestTenantProvider(tenantId); var db = BuildContext(provider); var service = new GeralDashboardInsightsService(db); var result = await service.GetInsightsAsync(); Assert.NotNull(result); Assert.Equal(0, result.Kpis.TotalLinhas); Assert.Equal(0, result.Kpis.Vivo.QtdLinhas); Assert.NotNull(result.Charts.LinhasPorFranquia); Assert.NotNull(result.ClientGroups); } [Fact] public async Task GetInsightsAsync_RespectsTenantIsolation() { var tenantA = Guid.NewGuid(); var tenantB = Guid.NewGuid(); var provider = new TestTenantProvider(tenantA); var db = BuildContext(provider); db.MobileLines.AddRange( new MobileLine { TenantId = tenantA, Cliente = "Cliente A", Status = "Ativo", ValorPlanoVivo = 100m, GestaoVozDados = 10m }, new MobileLine { TenantId = tenantB, Cliente = "Cliente B", Status = "Ativo", ValorPlanoVivo = 200m, GestaoVozDados = 20m }); await db.SaveChangesAsync(); var service = new GeralDashboardInsightsService(db); var result = await service.GetInsightsAsync(); Assert.Equal(1, result.Kpis.TotalLinhas); Assert.Equal(1, result.Kpis.Vivo.QtdLinhas); Assert.Equal("Cliente A", result.ClientGroups.Single().Cliente); } [Fact] public async Task GetInsightsAsync_ReturnsNonNullCollections() { var tenantId = Guid.NewGuid(); var provider = new TestTenantProvider(tenantId); var db = BuildContext(provider); db.MobileLines.Add(new MobileLine { TenantId = tenantId, Cliente = "Cliente X", Status = "Ativo", ValorPlanoVivo = 120m, Skeelo = 5m, VivoTravelMundo = 0m }); await db.SaveChangesAsync(); var service = new GeralDashboardInsightsService(db); var result = await service.GetInsightsAsync(); Assert.NotNull(result.Kpis.Adicionais.ServicesPaid); Assert.NotNull(result.Kpis.Adicionais.ServicesNotPaid); Assert.NotEmpty(result.ClientGroups); Assert.NotEmpty(result.Charts.AdicionaisPagosPorServico.Labels); } private static AppDbContext BuildContext(TestTenantProvider provider) { var options = new DbContextOptionsBuilder() .UseInMemoryDatabase(Guid.NewGuid().ToString()) .Options; return new AppDbContext(options, provider); } private sealed class TestTenantProvider : ITenantProvider { public TestTenantProvider(Guid tenantId) { TenantId = tenantId; } public Guid? TenantId { get; private set; } public void SetTenantId(Guid? tenantId) { TenantId = tenantId; } } } }