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); } }