84 lines
3.1 KiB
C#
84 lines
3.1 KiB
C#
using FluentAssertions;
|
|
using Microsoft.Extensions.Time.Testing;
|
|
using NSubstitute;
|
|
using SIGCM2.Application.Abstractions.Persistence;
|
|
using SIGCM2.Application.Rubros.GetById;
|
|
using SIGCM2.Application.Rubros.GetTree;
|
|
using SIGCM2.Domain.Entities;
|
|
using SIGCM2.Domain.Exceptions;
|
|
|
|
namespace SIGCM2.Application.Tests.Rubros.GetTree;
|
|
|
|
public class GetRubroTreeQueryHandlerTests
|
|
{
|
|
private static readonly FakeTimeProvider FakeTime = new(new DateTimeOffset(2026, 4, 18, 12, 0, 0, TimeSpan.Zero));
|
|
private readonly IRubroRepository _repo = Substitute.For<IRubroRepository>();
|
|
|
|
private static Rubro MakeRubro(int id, int? parentId = null, bool activo = true)
|
|
=> new(id, parentId, $"Rubro{id}", 0, activo, null, FakeTime.GetUtcNow().UtcDateTime, null);
|
|
|
|
// ── GetRubroTreeQueryHandler ─────────────────────────────────────────────
|
|
|
|
[Fact]
|
|
public async Task GetTree_OnlyActivos_ByDefault_ReturnsActiveTree()
|
|
{
|
|
_repo.GetAllAsync(false, Arg.Any<CancellationToken>())
|
|
.Returns(new[] { MakeRubro(1), MakeRubro(2) });
|
|
|
|
var handler = new GetRubroTreeQueryHandler(_repo);
|
|
var result = await handler.Handle(new GetRubroTreeQuery(IncluirInactivos: false));
|
|
|
|
result.Should().HaveCount(2);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task GetTree_IncluirInactivos_CallsRepoWithTrue()
|
|
{
|
|
_repo.GetAllAsync(true, Arg.Any<CancellationToken>())
|
|
.Returns(new[] { MakeRubro(1), MakeRubro(2, activo: false) });
|
|
|
|
var handler = new GetRubroTreeQueryHandler(_repo);
|
|
var result = await handler.Handle(new GetRubroTreeQuery(IncluirInactivos: true));
|
|
|
|
await _repo.Received(1).GetAllAsync(true, Arg.Any<CancellationToken>());
|
|
result.Should().HaveCount(2); // both roots
|
|
}
|
|
|
|
[Fact]
|
|
public async Task GetTree_Empty_ReturnsEmptyList()
|
|
{
|
|
_repo.GetAllAsync(Arg.Any<bool>(), Arg.Any<CancellationToken>())
|
|
.Returns(Array.Empty<Rubro>());
|
|
|
|
var handler = new GetRubroTreeQueryHandler(_repo);
|
|
var result = await handler.Handle(new GetRubroTreeQuery(IncluirInactivos: false));
|
|
|
|
result.Should().BeEmpty();
|
|
}
|
|
|
|
// ── GetRubroByIdQueryHandler ─────────────────────────────────────────────
|
|
|
|
[Fact]
|
|
public async Task GetById_Found_Active_ReturnsDto()
|
|
{
|
|
_repo.GetByIdAsync(5, Arg.Any<CancellationToken>()).Returns(MakeRubro(5));
|
|
|
|
var handler = new GetRubroByIdQueryHandler(_repo);
|
|
var result = await handler.Handle(new GetRubroByIdQuery(Id: 5));
|
|
|
|
result.Should().NotBeNull();
|
|
result!.Id.Should().Be(5);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task GetById_NotFound_ThrowsRubroNotFoundException()
|
|
{
|
|
_repo.GetByIdAsync(99, Arg.Any<CancellationToken>()).Returns((Rubro?)null);
|
|
|
|
var handler = new GetRubroByIdQueryHandler(_repo);
|
|
var act = () => handler.Handle(new GetRubroByIdQuery(Id: 99));
|
|
|
|
await act.Should().ThrowAsync<RubroNotFoundException>();
|
|
}
|
|
}
|