using NSubstitute;
using ScadaLink.CentralUI.Services;
using ScadaLink.Commons.Entities.Audit;
using ScadaLink.Commons.Interfaces.Repositories;
using ScadaLink.Commons.Types.Audit;
using ScadaLink.Commons.Types.Enums;
namespace ScadaLink.CentralUI.Tests.Services;
///
/// Service-level tests for (#23 M7-T3). The
/// service is a thin pass-through over ;
/// these tests pin the filter forwarding contract and the 100-row default-page-size
/// rule the grid relies on.
///
public class AuditLogQueryServiceTests
{
[Fact]
public async Task QueryAsync_ForwardsFilterAndPaging_ToRepository()
{
var repo = Substitute.For();
var filter = new AuditLogQueryFilter(Channel: AuditChannel.ApiOutbound);
var paging = new AuditLogPaging(PageSize: 25);
var expected = new List
{
new() { EventId = Guid.NewGuid(), OccurredAtUtc = DateTime.UtcNow, Channel = AuditChannel.ApiOutbound, Kind = AuditKind.ApiCall, Status = AuditStatus.Delivered }
};
repo.QueryAsync(filter, paging, Arg.Any())
.Returns(Task.FromResult>(expected));
var sut = new AuditLogQueryService(repo);
var result = await sut.QueryAsync(filter, paging);
Assert.Same(expected, result);
await repo.Received(1).QueryAsync(filter, paging, Arg.Any());
}
[Fact]
public async Task QueryAsync_AppliesDefaultPageSize_WhenNotSpecified()
{
var repo = Substitute.For();
AuditLogPaging? observed = null;
repo.QueryAsync(Arg.Any(), Arg.Do(p => observed = p), Arg.Any())
.Returns(Task.FromResult>(Array.Empty()));
var sut = new AuditLogQueryService(repo);
await sut.QueryAsync(new AuditLogQueryFilter(), paging: null);
Assert.NotNull(observed);
Assert.Equal(sut.DefaultPageSize, observed!.PageSize);
Assert.Equal(100, sut.DefaultPageSize);
Assert.Null(observed.AfterOccurredAtUtc);
Assert.Null(observed.AfterEventId);
}
}