mirror of
https://github.com/bitwarden/server.git
synced 2025-02-18 02:11:22 +01:00
* Add new endpoint for creating client organizations in consolidated billing * Create empty org and then assign seats for code re-use * Fixes made from debugging client side * few more small fixes * Vincent's feedback
130 lines
5.9 KiB
C#
130 lines
5.9 KiB
C#
using Bit.Core.AdminConsole.Entities;
|
|
using Bit.Core.AdminConsole.Entities.Provider;
|
|
using Bit.Core.Billing.Commands.Implementations;
|
|
using Bit.Core.Billing.Queries;
|
|
using Bit.Core.Entities;
|
|
using Bit.Core.Repositories;
|
|
using Bit.Core.Services;
|
|
using Bit.Core.Settings;
|
|
using Bit.Test.Common.AutoFixture;
|
|
using Bit.Test.Common.AutoFixture.Attributes;
|
|
using NSubstitute;
|
|
using Stripe;
|
|
using Xunit;
|
|
using GlobalSettings = Bit.Core.Settings.GlobalSettings;
|
|
|
|
namespace Bit.Core.Test.Billing.Commands;
|
|
|
|
[SutProviderCustomize]
|
|
public class CreateCustomerCommandTests
|
|
{
|
|
private const string _customerId = "customer_id";
|
|
|
|
[Theory, BitAutoData]
|
|
public async Task CreateCustomer_ForClientOrg_ProviderNull_ThrowsArgumentNullException(
|
|
Organization organization,
|
|
SutProvider<CreateCustomerCommand> sutProvider) =>
|
|
await Assert.ThrowsAsync<ArgumentNullException>(() => sutProvider.Sut.CreateCustomer(null, organization));
|
|
|
|
[Theory, BitAutoData]
|
|
public async Task CreateCustomer_ForClientOrg_OrganizationNull_ThrowsArgumentNullException(
|
|
Provider provider,
|
|
SutProvider<CreateCustomerCommand> sutProvider) =>
|
|
await Assert.ThrowsAsync<ArgumentNullException>(() => sutProvider.Sut.CreateCustomer(provider, null));
|
|
|
|
[Theory, BitAutoData]
|
|
public async Task CreateCustomer_ForClientOrg_HasGatewayCustomerId_NoOp(
|
|
Provider provider,
|
|
Organization organization,
|
|
SutProvider<CreateCustomerCommand> sutProvider)
|
|
{
|
|
organization.GatewayCustomerId = _customerId;
|
|
|
|
await sutProvider.Sut.CreateCustomer(provider, organization);
|
|
|
|
await sutProvider.GetDependency<ISubscriberQueries>().DidNotReceiveWithAnyArgs()
|
|
.GetCustomerOrThrow(Arg.Any<ISubscriber>(), Arg.Any<CustomerGetOptions>());
|
|
}
|
|
|
|
[Theory, BitAutoData]
|
|
public async Task CreateCustomer_ForClientOrg_Succeeds(
|
|
Provider provider,
|
|
Organization organization,
|
|
SutProvider<CreateCustomerCommand> sutProvider)
|
|
{
|
|
organization.GatewayCustomerId = null;
|
|
organization.Name = "Name";
|
|
organization.BusinessName = "BusinessName";
|
|
|
|
var providerCustomer = new Customer
|
|
{
|
|
Address = new Address
|
|
{
|
|
Country = "USA",
|
|
PostalCode = "12345",
|
|
Line1 = "123 Main St.",
|
|
Line2 = "Unit 4",
|
|
City = "Fake Town",
|
|
State = "Fake State"
|
|
},
|
|
TaxIds = new StripeList<TaxId>
|
|
{
|
|
Data =
|
|
[
|
|
new TaxId { Type = "TYPE", Value = "VALUE" }
|
|
]
|
|
}
|
|
};
|
|
|
|
sutProvider.GetDependency<ISubscriberQueries>().GetCustomerOrThrow(provider, Arg.Is<CustomerGetOptions>(
|
|
options => options.Expand.FirstOrDefault() == "tax_ids"))
|
|
.Returns(providerCustomer);
|
|
|
|
sutProvider.GetDependency<IGlobalSettings>().BaseServiceUri
|
|
.Returns(new GlobalSettings.BaseServiceUriSettings(new GlobalSettings()) { CloudRegion = "US" });
|
|
|
|
sutProvider.GetDependency<IStripeAdapter>().CustomerCreateAsync(Arg.Is<CustomerCreateOptions>(
|
|
options =>
|
|
options.Address.Country == providerCustomer.Address.Country &&
|
|
options.Address.PostalCode == providerCustomer.Address.PostalCode &&
|
|
options.Address.Line1 == providerCustomer.Address.Line1 &&
|
|
options.Address.Line2 == providerCustomer.Address.Line2 &&
|
|
options.Address.City == providerCustomer.Address.City &&
|
|
options.Address.State == providerCustomer.Address.State &&
|
|
options.Name == organization.DisplayName() &&
|
|
options.Description == $"{provider.Name} Client Organization" &&
|
|
options.Email == provider.BillingEmail &&
|
|
options.InvoiceSettings.CustomFields.FirstOrDefault().Name == "Organization" &&
|
|
options.InvoiceSettings.CustomFields.FirstOrDefault().Value == "Name" &&
|
|
options.Metadata["region"] == "US" &&
|
|
options.TaxIdData.FirstOrDefault().Type == providerCustomer.TaxIds.FirstOrDefault().Type &&
|
|
options.TaxIdData.FirstOrDefault().Value == providerCustomer.TaxIds.FirstOrDefault().Value))
|
|
.Returns(new Customer
|
|
{
|
|
Id = "customer_id"
|
|
});
|
|
|
|
await sutProvider.Sut.CreateCustomer(provider, organization);
|
|
|
|
await sutProvider.GetDependency<IStripeAdapter>().Received(1).CustomerCreateAsync(Arg.Is<CustomerCreateOptions>(
|
|
options =>
|
|
options.Address.Country == providerCustomer.Address.Country &&
|
|
options.Address.PostalCode == providerCustomer.Address.PostalCode &&
|
|
options.Address.Line1 == providerCustomer.Address.Line1 &&
|
|
options.Address.Line2 == providerCustomer.Address.Line2 &&
|
|
options.Address.City == providerCustomer.Address.City &&
|
|
options.Address.State == providerCustomer.Address.State &&
|
|
options.Name == organization.DisplayName() &&
|
|
options.Description == $"{provider.Name} Client Organization" &&
|
|
options.Email == provider.BillingEmail &&
|
|
options.InvoiceSettings.CustomFields.FirstOrDefault().Name == "Organization" &&
|
|
options.InvoiceSettings.CustomFields.FirstOrDefault().Value == "Name" &&
|
|
options.Metadata["region"] == "US" &&
|
|
options.TaxIdData.FirstOrDefault().Type == providerCustomer.TaxIds.FirstOrDefault().Type &&
|
|
options.TaxIdData.FirstOrDefault().Value == providerCustomer.TaxIds.FirstOrDefault().Value));
|
|
|
|
await sutProvider.GetDependency<IOrganizationRepository>().Received(1).ReplaceAsync(Arg.Is<Organization>(
|
|
org => org.GatewayCustomerId == "customer_id"));
|
|
}
|
|
}
|