168 lines
5.5 KiB
C#
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>();
|
|
}
|
|
}
|
|
}
|
|
}
|