using NSubstitute; using PnvPanel.Application.Admin.Billing; using PnvPanel.Application.Common.Interfaces; using PnvPanel.Application.Tests.TestSupport; using PnvPanel.Domain.Billing; using Xunit; namespace PnvPanel.Application.Tests.Admin.Billing; public class ListPaymentRequestsQueryHandlerTests { private readonly IIdentityService _identityService = Substitute.For(); [Fact] public async Task Handle_FiltersByKind() { using var dbContext = InMemoryDbContextFactory.Create(); var userId = Guid.NewGuid(); var subscription = PaymentRequest.Create(userId, PaymentPeriod.Quarter, 1500); var topUp = PaymentRequest.CreatePlanChangeTopUp(userId, 500); dbContext.PaymentRequests.AddRange(subscription, topUp); await dbContext.SaveChangesAsync(CancellationToken.None); _identityService .GetUserNamesAsync(Arg.Any>(), Arg.Any()) .Returns(new Dictionary { [userId] = "alice" }); var handler = new ListPaymentRequestsQueryHandler(dbContext, _identityService); var result = await handler.Handle( new ListPaymentRequestsQuery( StatusFilter: null, KindFilter: PaymentRequestKind.PlanChangeTopUp, Search: null, Page: 1, PageSize: 20 ), CancellationToken.None ); Assert.True(result.IsSuccess); var item = Assert.Single(result.Value.Items); Assert.Equal(topUp.Id, item.Id); } [Fact] public async Task Handle_FiltersBySearch_ResolvesUserIdsBeforePagination() { using var dbContext = InMemoryDbContextFactory.Create(); var aliceId = Guid.NewGuid(); var bobId = Guid.NewGuid(); var aliceRequest = PaymentRequest.Create(aliceId, PaymentPeriod.Quarter, 1500); var bobRequest = PaymentRequest.Create(bobId, PaymentPeriod.Quarter, 1500); dbContext.PaymentRequests.AddRange(aliceRequest, bobRequest); await dbContext.SaveChangesAsync(CancellationToken.None); _identityService .FindUserIdsByUserNameAsync("alice", Arg.Any()) .Returns([aliceId]); _identityService .GetUserNamesAsync(Arg.Any>(), Arg.Any()) .Returns(new Dictionary { [aliceId] = "alice" }); var handler = new ListPaymentRequestsQueryHandler(dbContext, _identityService); var result = await handler.Handle( new ListPaymentRequestsQuery( StatusFilter: null, KindFilter: null, Search: "alice", Page: 1, PageSize: 20 ), CancellationToken.None ); Assert.True(result.IsSuccess); var item = Assert.Single(result.Value.Items); Assert.Equal(aliceRequest.Id, item.Id); } }