using NSubstitute; using PnvPanel.Application.Admin.Billing; using PnvPanel.Application.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 RejectPaymentRequestCommandHandlerTests { private readonly ITelegramNotifier _telegramNotifier = Substitute.For(); [Fact] public async Task Handle_WhenAwaitingConfirmation_RejectsAndNotifiesUser() { using var dbContext = InMemoryDbContextFactory.Create(); var adminId = Guid.NewGuid(); var userId = Guid.NewGuid(); var request = PaymentRequest.Create(userId, PaymentPeriod.Quarter, 1500); request.MarkPaymentSent(); dbContext.PaymentRequests.Add(request); await dbContext.SaveChangesAsync(CancellationToken.None); var handler = new RejectPaymentRequestCommandHandler( dbContext, _telegramNotifier, FakeCurrentUser.Authenticated(adminId, "admin") ); var result = await handler.Handle( new RejectPaymentRequestCommand(request.Id, "Платёж не найден"), CancellationToken.None ); Assert.True(result.IsSuccess); Assert.Equal(PaymentRequestStatus.Rejected, request.Status); Assert.Equal("Платёж не найден", request.RejectionReason); await _telegramNotifier .Received(1) .NotifyUserAsync( userId, Arg.Is(m => m.Contains("Платёж не найден")), Arg.Any(), Arg.Any() ); } [Fact] public async Task Handle_WhenRequestNotFound_ReturnsRequestNotFound() { using var dbContext = InMemoryDbContextFactory.Create(); var handler = new RejectPaymentRequestCommandHandler( dbContext, _telegramNotifier, FakeCurrentUser.Authenticated(Guid.NewGuid(), "admin") ); var result = await handler.Handle( new RejectPaymentRequestCommand(Guid.NewGuid(), null), CancellationToken.None ); Assert.False(result.IsSuccess); Assert.Equal(BillingErrors.RequestNotFound, result.Error); } }