mirror of
https://github.com/bitwarden/server
synced 2025-12-10 21:33:41 +00:00
* Upgrade Stripe.net to v48.4.0 * Update PreviewTaxAmountCommand * Remove unused UpcomingInvoiceOptionExtensions * Added SubscriptionExtensions with GetCurrentPeriodEnd * Update PremiumUserBillingService * Update OrganizationBillingService * Update GetOrganizationWarningsQuery * Update BillingHistoryInfo * Update SubscriptionInfo * Remove unused Sql Billing folder * Update StripeAdapter * Update StripePaymentService * Update InvoiceCreatedHandler * Update PaymentFailedHandler * Update PaymentSucceededHandler * Update ProviderEventService * Update StripeEventUtilityService * Update SubscriptionDeletedHandler * Update SubscriptionUpdatedHandler * Update UpcomingInvoiceHandler * Update ProviderSubscriptionResponse * Remove unused Stripe Subscriptions Admin Tool * Update RemoveOrganizationFromProviderCommand * Update ProviderBillingService * Update RemoveOrganizatinoFromProviderCommandTests * Update PreviewTaxAmountCommandTests * Update GetCloudOrganizationLicenseQueryTests * Update GetOrganizationWarningsQueryTests * Update StripePaymentServiceTests * Update ProviderBillingControllerTests * Update ProviderEventServiceTests * Update SubscriptionDeletedHandlerTests * Update SubscriptionUpdatedHandlerTests * Resolve Billing test failures I completely removed tests for the StripeEventService as they were using a system I setup a while back that read JSON files of the Stripe event structure. I did not anticipate how frequently these structures would change with each API version and the cost of trying to update these specific JSON files to test a very static data retrieval service far outweigh the benefit. * Resolve Core test failures * Run dotnet format * Remove unused provider migration * Fixed failing tests * Run dotnet format * Replace the old webhook secret key with new one (#6223) * Fix compilation failures in additions * Run dotnet format * Bump Stripe API version * Fix recent addition: CreatePremiumCloudHostedSubscriptionCommand * Fix new code in main according to Stripe update * Fix InvoiceExtensions * Bump SDK version to match API Version * Fix provider invoice generation validation * More QA fixes * Fix tests * QA defect resolutions * QA defect resolutions * Run dotnet format * Fix tests --------- Co-authored-by: cyprain-okeke <108260115+cyprain-okeke@users.noreply.github.com>
196 lines
6.9 KiB
C#
196 lines
6.9 KiB
C#
using Bit.Billing.Constants;
|
|
using Bit.Billing.Services;
|
|
using Bit.Billing.Services.Implementations;
|
|
using Bit.Core.AdminConsole.OrganizationFeatures.Organizations.Interfaces;
|
|
using Bit.Core.Billing.Extensions;
|
|
using Bit.Core.Services;
|
|
using NSubstitute;
|
|
using Stripe;
|
|
using Xunit;
|
|
|
|
namespace Bit.Billing.Test.Services;
|
|
|
|
public class SubscriptionDeletedHandlerTests
|
|
{
|
|
private readonly IStripeEventService _stripeEventService;
|
|
private readonly IUserService _userService;
|
|
private readonly IStripeEventUtilityService _stripeEventUtilityService;
|
|
private readonly IOrganizationDisableCommand _organizationDisableCommand;
|
|
private readonly SubscriptionDeletedHandler _sut;
|
|
|
|
public SubscriptionDeletedHandlerTests()
|
|
{
|
|
_stripeEventService = Substitute.For<IStripeEventService>();
|
|
_userService = Substitute.For<IUserService>();
|
|
_stripeEventUtilityService = Substitute.For<IStripeEventUtilityService>();
|
|
_organizationDisableCommand = Substitute.For<IOrganizationDisableCommand>();
|
|
_sut = new SubscriptionDeletedHandler(
|
|
_stripeEventService,
|
|
_userService,
|
|
_stripeEventUtilityService,
|
|
_organizationDisableCommand);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task HandleAsync_SubscriptionNotCanceled_DoesNothing()
|
|
{
|
|
// Arrange
|
|
var stripeEvent = new Event();
|
|
var subscription = new Subscription
|
|
{
|
|
Status = "active",
|
|
Items = new StripeList<SubscriptionItem>
|
|
{
|
|
Data =
|
|
[
|
|
new SubscriptionItem { CurrentPeriodEnd = DateTime.UtcNow.AddDays(30) }
|
|
]
|
|
},
|
|
Metadata = new Dictionary<string, string>()
|
|
};
|
|
|
|
_stripeEventService.GetSubscription(stripeEvent, true).Returns(subscription);
|
|
_stripeEventUtilityService.GetIdsFromMetadata(subscription.Metadata)
|
|
.Returns(Tuple.Create<Guid?, Guid?, Guid?>(null, null, null));
|
|
|
|
// Act
|
|
await _sut.HandleAsync(stripeEvent);
|
|
|
|
// Assert
|
|
await _organizationDisableCommand.DidNotReceiveWithAnyArgs().DisableAsync(default, default);
|
|
await _userService.DidNotReceiveWithAnyArgs().DisablePremiumAsync(default, default);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task HandleAsync_OrganizationSubscriptionCanceled_DisablesOrganization()
|
|
{
|
|
// Arrange
|
|
var stripeEvent = new Event();
|
|
var organizationId = Guid.NewGuid();
|
|
var subscription = new Subscription
|
|
{
|
|
Status = StripeSubscriptionStatus.Canceled,
|
|
Items = new StripeList<SubscriptionItem>
|
|
{
|
|
Data =
|
|
[
|
|
new SubscriptionItem { CurrentPeriodEnd = DateTime.UtcNow.AddDays(30) }
|
|
]
|
|
},
|
|
Metadata = new Dictionary<string, string> { { "organizationId", organizationId.ToString() } }
|
|
};
|
|
|
|
_stripeEventService.GetSubscription(stripeEvent, true).Returns(subscription);
|
|
_stripeEventUtilityService.GetIdsFromMetadata(subscription.Metadata)
|
|
.Returns(Tuple.Create<Guid?, Guid?, Guid?>(organizationId, null, null));
|
|
|
|
// Act
|
|
await _sut.HandleAsync(stripeEvent);
|
|
|
|
// Assert
|
|
await _organizationDisableCommand.Received(1)
|
|
.DisableAsync(organizationId, subscription.GetCurrentPeriodEnd());
|
|
}
|
|
|
|
[Fact]
|
|
public async Task HandleAsync_UserSubscriptionCanceled_DisablesUserPremium()
|
|
{
|
|
// Arrange
|
|
var stripeEvent = new Event();
|
|
var userId = Guid.NewGuid();
|
|
var subscription = new Subscription
|
|
{
|
|
Status = StripeSubscriptionStatus.Canceled,
|
|
Items = new StripeList<SubscriptionItem>
|
|
{
|
|
Data =
|
|
[
|
|
new SubscriptionItem { CurrentPeriodEnd = DateTime.UtcNow.AddDays(30) }
|
|
]
|
|
},
|
|
Metadata = new Dictionary<string, string> { { "userId", userId.ToString() } }
|
|
};
|
|
|
|
_stripeEventService.GetSubscription(stripeEvent, true).Returns(subscription);
|
|
_stripeEventUtilityService.GetIdsFromMetadata(subscription.Metadata)
|
|
.Returns(Tuple.Create<Guid?, Guid?, Guid?>(null, userId, null));
|
|
|
|
// Act
|
|
await _sut.HandleAsync(stripeEvent);
|
|
|
|
// Assert
|
|
await _userService.Received(1)
|
|
.DisablePremiumAsync(userId, subscription.GetCurrentPeriodEnd());
|
|
}
|
|
|
|
[Fact]
|
|
public async Task HandleAsync_ProviderMigrationCancellation_DoesNotDisableOrganization()
|
|
{
|
|
// Arrange
|
|
var stripeEvent = new Event();
|
|
var organizationId = Guid.NewGuid();
|
|
var subscription = new Subscription
|
|
{
|
|
Status = StripeSubscriptionStatus.Canceled,
|
|
Items = new StripeList<SubscriptionItem>
|
|
{
|
|
Data =
|
|
[
|
|
new SubscriptionItem { CurrentPeriodEnd = DateTime.UtcNow.AddDays(30) }
|
|
]
|
|
},
|
|
Metadata = new Dictionary<string, string> { { "organizationId", organizationId.ToString() } },
|
|
CancellationDetails = new SubscriptionCancellationDetails
|
|
{
|
|
Comment = "Cancelled as part of provider migration to Consolidated Billing"
|
|
}
|
|
};
|
|
|
|
_stripeEventService.GetSubscription(stripeEvent, true).Returns(subscription);
|
|
_stripeEventUtilityService.GetIdsFromMetadata(subscription.Metadata)
|
|
.Returns(Tuple.Create<Guid?, Guid?, Guid?>(organizationId, null, null));
|
|
|
|
// Act
|
|
await _sut.HandleAsync(stripeEvent);
|
|
|
|
// Assert
|
|
await _organizationDisableCommand.DidNotReceiveWithAnyArgs()
|
|
.DisableAsync(default, default);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task HandleAsync_AddedToProviderCancellation_DoesNotDisableOrganization()
|
|
{
|
|
// Arrange
|
|
var stripeEvent = new Event();
|
|
var organizationId = Guid.NewGuid();
|
|
var subscription = new Subscription
|
|
{
|
|
Status = StripeSubscriptionStatus.Canceled,
|
|
Items = new StripeList<SubscriptionItem>
|
|
{
|
|
Data =
|
|
[
|
|
new SubscriptionItem { CurrentPeriodEnd = DateTime.UtcNow.AddDays(30) }
|
|
]
|
|
},
|
|
Metadata = new Dictionary<string, string> { { "organizationId", organizationId.ToString() } },
|
|
CancellationDetails = new SubscriptionCancellationDetails
|
|
{
|
|
Comment = "Organization was added to Provider"
|
|
}
|
|
};
|
|
|
|
_stripeEventService.GetSubscription(stripeEvent, true).Returns(subscription);
|
|
_stripeEventUtilityService.GetIdsFromMetadata(subscription.Metadata)
|
|
.Returns(Tuple.Create<Guid?, Guid?, Guid?>(organizationId, null, null));
|
|
|
|
// Act
|
|
await _sut.HandleAsync(stripeEvent);
|
|
|
|
// Assert
|
|
await _organizationDisableCommand.DidNotReceiveWithAnyArgs()
|
|
.DisableAsync(default, default);
|
|
}
|
|
}
|