1
0
mirror of https://github.com/bitwarden/server.git synced 2025-06-30 07:36:14 -05:00

[AC-2568] Added invoices and transaction history endpoints. Added cursor paging for each (#4692)

* Added invoices and transaction history endpoints. Added cursor paging for each

* Removed try/catch since it's handled by middleware. Updated condition to use pattern matching

* Added unit tests for PaymentHistoryService

* Removed organizationId from account billing controller endpoints
This commit is contained in:
Conner Turnbull
2024-09-09 09:38:58 -04:00
committed by GitHub
parent ebf8bc0b85
commit 46ac2a9b3b
16 changed files with 385 additions and 34 deletions

View File

@ -0,0 +1,89 @@
using Bit.Core.AdminConsole.Entities;
using Bit.Core.Billing.Services.Implementations;
using Bit.Core.Entities;
using Bit.Core.Models.BitStripe;
using Bit.Core.Repositories;
using Bit.Core.Services;
using Microsoft.Extensions.Logging;
using NSubstitute;
using Stripe;
using Xunit;
namespace Bit.Core.Test.Billing.Services;
public class PaymentHistoryServiceTests
{
[Fact]
public async Task GetInvoiceHistoryAsync_Succeeds()
{
// Arrange
var subscriber = new Organization { GatewayCustomerId = "cus_id", GatewaySubscriptionId = "sub_id" };
var invoices = new List<Invoice> { new() { Id = "in_id" } };
var stripeAdapter = Substitute.For<IStripeAdapter>();
stripeAdapter.InvoiceListAsync(Arg.Any<StripeInvoiceListOptions>()).Returns(invoices);
var transactionRepository = Substitute.For<ITransactionRepository>();
var logger = Substitute.For<ILogger<PaymentHistoryService>>();
var paymentHistoryService = new PaymentHistoryService(stripeAdapter, transactionRepository, logger);
// Act
var result = await paymentHistoryService.GetInvoiceHistoryAsync(subscriber);
// Assert
Assert.NotNull(result);
Assert.Single(result);
await stripeAdapter.Received(1).InvoiceListAsync(Arg.Any<StripeInvoiceListOptions>());
}
[Fact]
public async Task GetInvoiceHistoryAsync_SubscriberNull_ReturnsNull()
{
// Arrange
var paymentHistoryService = new PaymentHistoryService(
Substitute.For<IStripeAdapter>(),
Substitute.For<ITransactionRepository>(),
Substitute.For<ILogger<PaymentHistoryService>>());
// Act
var result = await paymentHistoryService.GetInvoiceHistoryAsync(null);
// Assert
Assert.Null(result);
}
[Fact]
public async Task GetTransactionHistoryAsync_Succeeds()
{
// Arrange
var subscriber = new Organization { Id = Guid.NewGuid() };
var transactions = new List<Transaction> { new() { Id = Guid.NewGuid() } };
var transactionRepository = Substitute.For<ITransactionRepository>();
transactionRepository.GetManyByOrganizationIdAsync(subscriber.Id, Arg.Any<int>(), Arg.Any<DateTime?>()).Returns(transactions);
var stripeAdapter = Substitute.For<IStripeAdapter>();
var logger = Substitute.For<ILogger<PaymentHistoryService>>();
var paymentHistoryService = new PaymentHistoryService(stripeAdapter, transactionRepository, logger);
// Act
var result = await paymentHistoryService.GetTransactionHistoryAsync(subscriber);
// Assert
Assert.NotNull(result);
Assert.Single(result);
await transactionRepository.Received(1).GetManyByOrganizationIdAsync(subscriber.Id, Arg.Any<int>(), Arg.Any<DateTime?>());
}
[Fact]
public async Task GetTransactionHistoryAsync_SubscriberNull_ReturnsNull()
{
// Arrange
var paymentHistoryService = new PaymentHistoryService(
Substitute.For<IStripeAdapter>(),
Substitute.For<ITransactionRepository>(),
Substitute.For<ILogger<PaymentHistoryService>>());
// Act
var result = await paymentHistoryService.GetTransactionHistoryAsync(null);
// Assert
Assert.Null(result);
}
}