using NSubstitute; using PnvPanel.Application.Billing.GetMyBillingStatus; using PnvPanel.Application.Common.Interfaces; using PnvPanel.Application.Tests.TestSupport; using PnvPanel.Domain.Billing; using Xunit; namespace PnvPanel.Application.Tests.Billing.GetMyBillingStatus; public class GetMyBillingStatusQueryHandlerTests { private readonly IIdentityService _identityService = Substitute.For(); private static CurrentUserProfile Profile( Guid userId, bool billingEnabled, DateTimeOffset? paidUntil = null, bool suspended = false ) => new( userId, "alice", Guid.NewGuid(), "premium", IsActivated: true, IsBlocked: false, ConfigQuota: 5, PlanId: null, MaxIpLimit: 3, SubscriptionToken: "sub-token", BillingEnabled: billingEnabled, BillingPaidUntil: paidUntil, BillingSuspended: suspended ); [Fact] public async Task Handle_WhenBillingNotEnabled_ReturnsDisabledStatusWithoutQueryingRequests() { using var dbContext = InMemoryDbContextFactory.Create(); var userId = Guid.NewGuid(); _identityService .GetProfileAsync(userId, Arg.Any()) .Returns(Profile(userId, billingEnabled: false)); var handler = new GetMyBillingStatusQueryHandler( dbContext, _identityService, FakeCurrentUser.Authenticated(userId) ); var result = await handler.Handle(new GetMyBillingStatusQuery(), CancellationToken.None); Assert.True(result.IsSuccess); Assert.False(result.Value.BillingEnabled); Assert.Null(result.Value.ActiveRequest); } [Fact] public async Task Handle_WhenActiveRequestExists_IncludesItInStatus() { using var dbContext = InMemoryDbContextFactory.Create(); var userId = Guid.NewGuid(); var paidUntil = DateTimeOffset.UtcNow.AddDays(10); var request = PaymentRequest.Create(userId, PaymentPeriod.Quarter, 1500); dbContext.PaymentRequests.Add(request); await dbContext.SaveChangesAsync(CancellationToken.None); _identityService .GetProfileAsync(userId, Arg.Any()) .Returns(Profile(userId, billingEnabled: true, paidUntil: paidUntil)); var handler = new GetMyBillingStatusQueryHandler( dbContext, _identityService, FakeCurrentUser.Authenticated(userId) ); var result = await handler.Handle(new GetMyBillingStatusQuery(), CancellationToken.None); Assert.True(result.IsSuccess); Assert.True(result.Value.BillingEnabled); Assert.Equal(paidUntil, result.Value.PaidUntil); Assert.NotNull(result.Value.ActiveRequest); Assert.Equal(request.Id, result.Value.ActiveRequest!.Id); } }