line-gestao-api/line-gestao-api.Tests/GeralDashboardInsightsServi...

168 lines
5.5 KiB
C#

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);
}
[Fact]
public async Task GetInsightsAsync_TravelZeroIsCountedAsSemTravel()
{
var tenantId = Guid.NewGuid();
var provider = new TestTenantProvider(tenantId);
var db = BuildContext(provider);
db.MobileLines.AddRange(
new MobileLine
{
TenantId = tenantId,
Cliente = "Cliente Travel",
Status = "Ativo",
ValorPlanoVivo = 120m,
VivoTravelMundo = 0m
},
new MobileLine
{
TenantId = tenantId,
Cliente = "Cliente Travel",
Status = "Ativo",
ValorPlanoVivo = 120m,
VivoTravelMundo = 15m
},
new MobileLine
{
TenantId = tenantId,
Cliente = "Cliente Travel",
Status = "Ativo",
ValorPlanoVivo = null,
VivoTravelMundo = null
});
await db.SaveChangesAsync();
var service = new GeralDashboardInsightsService(db);
var result = await service.GetInsightsAsync();
Assert.Equal(1, result.Kpis.TravelMundo.ComTravel);
Assert.Equal(2, result.Kpis.TravelMundo.SemTravel);
Assert.Equal(new[] { 1, 2 }, result.Charts.TravelMundo.Values);
}
private static AppDbContext BuildContext(TestTenantProvider provider)
{
var options = new DbContextOptionsBuilder<AppDbContext>()
.UseInMemoryDatabase(Guid.NewGuid().ToString())
.Options;
return new AppDbContext(options, provider, new NullAuditLogBuilder());
}
private sealed class TestTenantProvider : ITenantProvider
{
public TestTenantProvider(Guid tenantId)
{
TenantId = tenantId;
}
public Guid? TenantId { get; private set; }
public void SetTenantId(Guid? tenantId)
{
TenantId = tenantId;
}
}
private sealed class NullAuditLogBuilder : IAuditLogBuilder
{
public List<AuditLog> BuildAuditLogs(Microsoft.EntityFrameworkCore.ChangeTracking.ChangeTracker changeTracker)
{
return new List<AuditLog>();
}
}
}
}