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 sutProvider) => await Assert.ThrowsAsync(() => sutProvider.Sut.CreateCustomer(null, organization)); [Theory, BitAutoData] public async Task CreateCustomer_ForClientOrg_OrganizationNull_ThrowsArgumentNullException( Provider provider, SutProvider sutProvider) => await Assert.ThrowsAsync(() => sutProvider.Sut.CreateCustomer(provider, null)); [Theory, BitAutoData] public async Task CreateCustomer_ForClientOrg_HasGatewayCustomerId_NoOp( Provider provider, Organization organization, SutProvider sutProvider) { organization.GatewayCustomerId = _customerId; await sutProvider.Sut.CreateCustomer(provider, organization); await sutProvider.GetDependency().DidNotReceiveWithAnyArgs() .GetCustomerOrThrow(Arg.Any(), Arg.Any()); } [Theory, BitAutoData] public async Task CreateCustomer_ForClientOrg_Succeeds( Provider provider, Organization organization, SutProvider 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 { Data = [ new TaxId { Type = "TYPE", Value = "VALUE" } ] } }; sutProvider.GetDependency().GetCustomerOrThrow(provider, Arg.Is( options => options.Expand.FirstOrDefault() == "tax_ids")) .Returns(providerCustomer); sutProvider.GetDependency().BaseServiceUri .Returns(new GlobalSettings.BaseServiceUriSettings(new GlobalSettings()) { CloudRegion = "US" }); sutProvider.GetDependency().CustomerCreateAsync(Arg.Is( 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().Received(1).CustomerCreateAsync(Arg.Is( 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().Received(1).ReplaceAsync(Arg.Is( org => org.GatewayCustomerId == "customer_id")); } }