line-gestao-api/line-gestao-api.Tests/LinesControllerTests.cs

189 lines
6.7 KiB
C#

using line_gestao_api.Controllers;
using line_gestao_api.Data;
using line_gestao_api.Dtos;
using line_gestao_api.Models;
using line_gestao_api.Services;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.FileProviders;
using Xunit;
namespace line_gestao_api.Tests
{
public class LinesControllerTests
{
[Fact]
public async Task GetAll_WithAssignedReservaInAll_IncludesAssignedReserveAndExcludesStock()
{
var tenantId = Guid.NewGuid();
var provider = new TestTenantProvider(tenantId);
await using var db = BuildContext(provider);
db.MobileLines.AddRange(
new MobileLine
{
TenantId = tenantId,
Item = 1,
Cliente = "CLIENTE A",
Usuario = "USUARIO A",
Skil = "PESSOA JURIDICA",
Linha = "11111111111",
Status = "ATIVO"
},
new MobileLine
{
TenantId = tenantId,
Item = 2,
Cliente = "AVANCO DISTRIBUIDORA",
Usuario = "RESERVA",
Skil = "RESERVA",
Linha = "22222222222",
Status = "ATIVO"
},
new MobileLine
{
TenantId = tenantId,
Item = 3,
Cliente = "RESERVA",
Usuario = "RESERVA",
Skil = "RESERVA",
Linha = "33333333333",
Status = "ATIVO"
});
await db.SaveChangesAsync();
var controller = CreateController(db, provider);
var result = await controller.GetAll(includeAssignedReservaInAll: true, pageSize: 50);
var ok = Assert.IsType<OkObjectResult>(result.Result);
var payload = Assert.IsType<PagedResult<MobileLineListDto>>(ok.Value);
Assert.Equal(2, payload.Total);
Assert.Contains(payload.Items, x => x.Linha == "11111111111");
Assert.Contains(payload.Items, x => x.Linha == "22222222222");
Assert.DoesNotContain(payload.Items, x => x.Linha == "33333333333");
}
[Fact]
public async Task GetAll_WithoutAssignedReservaInAll_KeepsAssignedReserveOutOfAll()
{
var tenantId = Guid.NewGuid();
var provider = new TestTenantProvider(tenantId);
await using var db = BuildContext(provider);
db.MobileLines.AddRange(
new MobileLine
{
TenantId = tenantId,
Item = 1,
Cliente = "CLIENTE A",
Usuario = "USUARIO A",
Skil = "PESSOA JURIDICA",
Linha = "11111111111",
Status = "ATIVO"
},
new MobileLine
{
TenantId = tenantId,
Item = 2,
Cliente = "AVANCO DISTRIBUIDORA",
Usuario = "RESERVA",
Skil = "RESERVA",
Linha = "22222222222",
Status = "ATIVO"
},
new MobileLine
{
TenantId = tenantId,
Item = 3,
Cliente = "RESERVA",
Usuario = "RESERVA",
Skil = "RESERVA",
Linha = "33333333333",
Status = "ATIVO"
});
await db.SaveChangesAsync();
var controller = CreateController(db, provider);
var result = await controller.GetAll(pageSize: 50);
var ok = Assert.IsType<OkObjectResult>(result.Result);
var payload = Assert.IsType<PagedResult<MobileLineListDto>>(ok.Value);
Assert.Single(payload.Items);
Assert.Equal(1, payload.Total);
Assert.Contains(payload.Items, x => x.Linha == "11111111111");
Assert.DoesNotContain(payload.Items, x => x.Linha == "22222222222");
Assert.DoesNotContain(payload.Items, x => x.Linha == "33333333333");
}
private static AppDbContext BuildContext(TestTenantProvider provider)
{
var options = new DbContextOptionsBuilder<AppDbContext>()
.UseInMemoryDatabase(Guid.NewGuid().ToString())
.Options;
return new AppDbContext(options, provider, new NullAuditLogBuilder());
}
private static LinesController CreateController(AppDbContext db, TestTenantProvider provider)
{
return new LinesController(
db,
provider,
new NullVigenciaNotificationSyncService(),
null!,
null!,
null!,
new TestWebHostEnvironment());
}
private sealed class TestTenantProvider : ITenantProvider
{
public TestTenantProvider(Guid tenantId)
{
TenantId = tenantId;
}
public Guid? ActorTenantId => TenantId;
public Guid? TenantId { get; private set; }
public bool HasGlobalViewAccess => false;
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>();
}
}
private sealed class NullVigenciaNotificationSyncService : IVigenciaNotificationSyncService
{
public Task SyncCurrentTenantAsync(CancellationToken cancellationToken = default) => Task.CompletedTask;
public Task SyncTenantAsync(Guid tenantId, CancellationToken cancellationToken = default) => Task.CompletedTask;
}
private sealed class TestWebHostEnvironment : IWebHostEnvironment
{
public string EnvironmentName { get; set; } = "Tests";
public string ApplicationName { get; set; } = "line-gestao-api.Tests";
public string WebRootPath { get; set; } = Path.GetTempPath();
public IFileProvider WebRootFileProvider { get; set; } = new NullFileProvider();
public string ContentRootPath { get; set; } = Path.GetTempPath();
public IFileProvider ContentRootFileProvider { get; set; } = new NullFileProvider();
}
}
}