using Bit.Core.Billing.Constants; using Bit.Core.Billing.Tax.Services.Implementations; using Bit.Core.Services; using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture.Attributes; using NSubstitute; using Stripe; using Xunit; namespace Bit.Core.Test.Billing.Tax.Services; [SutProviderCustomize] public class BusinessUseAutomaticTaxStrategyTests { [Theory] [BitAutoData] public void GetUpdateOptions_ReturnsNull_WhenFeatureFlagAllowingToUpdateSubscriptionsIsDisabled( SutProvider sutProvider) { var subscription = new Subscription(); sutProvider.GetDependency() .IsEnabled(Arg.Is(p => p == FeatureFlagKeys.PM19422_AllowAutomaticTaxUpdates)) .Returns(false); var actual = sutProvider.Sut.GetUpdateOptions(subscription); Assert.Null(actual); } [Theory] [BitAutoData] public void GetUpdateOptions_ReturnsNull_WhenSubscriptionDoesNotNeedUpdating( SutProvider sutProvider) { var subscription = new Subscription { AutomaticTax = new SubscriptionAutomaticTax { Enabled = true }, Customer = new Customer { Address = new Address { Country = "US", }, Tax = new CustomerTax { AutomaticTax = StripeConstants.AutomaticTaxStatus.Supported } } }; sutProvider.GetDependency() .IsEnabled(Arg.Is(p => p == FeatureFlagKeys.PM19422_AllowAutomaticTaxUpdates)) .Returns(true); var actual = sutProvider.Sut.GetUpdateOptions(subscription); Assert.Null(actual); } [Theory] [BitAutoData] public void GetUpdateOptions_SetsAutomaticTaxToFalse_WhenTaxLocationIsUnrecognizedOrInvalid( SutProvider sutProvider) { var subscription = new Subscription { AutomaticTax = new SubscriptionAutomaticTax { Enabled = true }, Customer = new Customer { Tax = new CustomerTax { AutomaticTax = StripeConstants.AutomaticTaxStatus.UnrecognizedLocation } } }; sutProvider.GetDependency() .IsEnabled(Arg.Is(p => p == FeatureFlagKeys.PM19422_AllowAutomaticTaxUpdates)) .Returns(true); var actual = sutProvider.Sut.GetUpdateOptions(subscription); Assert.NotNull(actual); Assert.False(actual.AutomaticTax.Enabled); } [Theory] [BitAutoData] public void GetUpdateOptions_SetsAutomaticTaxToTrue_ForAmericanCustomers( SutProvider sutProvider) { var subscription = new Subscription { AutomaticTax = new SubscriptionAutomaticTax { Enabled = false }, Customer = new Customer { Address = new Address { Country = "US", }, Tax = new CustomerTax { AutomaticTax = StripeConstants.AutomaticTaxStatus.Supported } } }; sutProvider.GetDependency() .IsEnabled(Arg.Is(p => p == FeatureFlagKeys.PM19422_AllowAutomaticTaxUpdates)) .Returns(true); var actual = sutProvider.Sut.GetUpdateOptions(subscription); Assert.NotNull(actual); Assert.True(actual.AutomaticTax.Enabled); } [Theory] [BitAutoData] public void GetUpdateOptions_SetsAutomaticTaxToTrue_ForGlobalCustomersWithTaxIds( SutProvider sutProvider) { var subscription = new Subscription { AutomaticTax = new SubscriptionAutomaticTax { Enabled = false }, Customer = new Customer { Address = new Address { Country = "ES", }, Tax = new CustomerTax { AutomaticTax = StripeConstants.AutomaticTaxStatus.Supported }, TaxIds = new StripeList { Data = new List { new() { Country = "ES", Type = "eu_vat", Value = "ESZ8880999Z" } } } } }; sutProvider.GetDependency() .IsEnabled(Arg.Is(p => p == FeatureFlagKeys.PM19422_AllowAutomaticTaxUpdates)) .Returns(true); var actual = sutProvider.Sut.GetUpdateOptions(subscription); Assert.NotNull(actual); Assert.True(actual.AutomaticTax.Enabled); } [Theory] [BitAutoData] public void GetUpdateOptions_ThrowsArgumentNullException_WhenTaxIdsIsNull( SutProvider sutProvider) { var subscription = new Subscription { AutomaticTax = new SubscriptionAutomaticTax { Enabled = true }, Customer = new Customer { Address = new Address { Country = "ES", }, Tax = new CustomerTax { AutomaticTax = StripeConstants.AutomaticTaxStatus.Supported }, TaxIds = null } }; sutProvider.GetDependency() .IsEnabled(Arg.Is(p => p == FeatureFlagKeys.PM19422_AllowAutomaticTaxUpdates)) .Returns(true); Assert.Throws(() => sutProvider.Sut.GetUpdateOptions(subscription)); } [Theory] [BitAutoData] public void GetUpdateOptions_SetsAutomaticTaxToTrue_ForGlobalCustomersWithoutTaxIds( SutProvider sutProvider) { var subscription = new Subscription { AutomaticTax = new SubscriptionAutomaticTax { Enabled = true }, Customer = new Customer { Address = new Address { Country = "ES", }, Tax = new CustomerTax { AutomaticTax = StripeConstants.AutomaticTaxStatus.Supported }, TaxIds = new StripeList { Data = new List() } } }; sutProvider.GetDependency() .IsEnabled(Arg.Is(p => p == FeatureFlagKeys.PM19422_AllowAutomaticTaxUpdates)) .Returns(true); var actual = sutProvider.Sut.GetUpdateOptions(subscription); Assert.NotNull(actual); Assert.False(actual.AutomaticTax.Enabled); } [Theory] [BitAutoData] public void SetUpdateOptions_SetsNothing_WhenFeatureFlagAllowingToUpdateSubscriptionsIsDisabled( SutProvider sutProvider) { var options = new SubscriptionUpdateOptions(); var subscription = new Subscription { Customer = new Customer { Address = new() { Country = "US" } } }; sutProvider.GetDependency() .IsEnabled(Arg.Is(p => p == FeatureFlagKeys.PM19422_AllowAutomaticTaxUpdates)) .Returns(false); sutProvider.Sut.SetUpdateOptions(options, subscription); Assert.Null(options.AutomaticTax); } [Theory] [BitAutoData] public void SetUpdateOptions_SetsNothing_WhenSubscriptionDoesNotNeedUpdating( SutProvider sutProvider) { var options = new SubscriptionUpdateOptions(); var subscription = new Subscription { AutomaticTax = new SubscriptionAutomaticTax { Enabled = true }, Customer = new Customer { Address = new Address { Country = "US", }, Tax = new CustomerTax { AutomaticTax = StripeConstants.AutomaticTaxStatus.Supported } } }; sutProvider.GetDependency() .IsEnabled(Arg.Is(p => p == FeatureFlagKeys.PM19422_AllowAutomaticTaxUpdates)) .Returns(true); sutProvider.Sut.SetUpdateOptions(options, subscription); Assert.Null(options.AutomaticTax); } [Theory] [BitAutoData] public void SetUpdateOptions_SetsAutomaticTaxToFalse_WhenTaxLocationIsUnrecognizedOrInvalid( SutProvider sutProvider) { var options = new SubscriptionUpdateOptions(); var subscription = new Subscription { AutomaticTax = new SubscriptionAutomaticTax { Enabled = true }, Customer = new Customer { Tax = new CustomerTax { AutomaticTax = StripeConstants.AutomaticTaxStatus.UnrecognizedLocation } } }; sutProvider.GetDependency() .IsEnabled(Arg.Is(p => p == FeatureFlagKeys.PM19422_AllowAutomaticTaxUpdates)) .Returns(true); sutProvider.Sut.SetUpdateOptions(options, subscription); Assert.False(options.AutomaticTax.Enabled); } [Theory] [BitAutoData] public void SetUpdateOptions_SetsAutomaticTaxToTrue_ForAmericanCustomers( SutProvider sutProvider) { var options = new SubscriptionUpdateOptions(); var subscription = new Subscription { AutomaticTax = new SubscriptionAutomaticTax { Enabled = false }, Customer = new Customer { Address = new Address { Country = "US", }, Tax = new CustomerTax { AutomaticTax = StripeConstants.AutomaticTaxStatus.Supported } } }; sutProvider.GetDependency() .IsEnabled(Arg.Is(p => p == FeatureFlagKeys.PM19422_AllowAutomaticTaxUpdates)) .Returns(true); sutProvider.Sut.SetUpdateOptions(options, subscription); Assert.True(options.AutomaticTax!.Enabled); } [Theory] [BitAutoData] public void SetUpdateOptions_SetsAutomaticTaxToTrue_ForGlobalCustomersWithTaxIds( SutProvider sutProvider) { var options = new SubscriptionUpdateOptions(); var subscription = new Subscription { AutomaticTax = new SubscriptionAutomaticTax { Enabled = false }, Customer = new Customer { Address = new Address { Country = "ES", }, Tax = new CustomerTax { AutomaticTax = StripeConstants.AutomaticTaxStatus.Supported }, TaxIds = new StripeList { Data = new List { new() { Country = "ES", Type = "eu_vat", Value = "ESZ8880999Z" } } } } }; sutProvider.GetDependency() .IsEnabled(Arg.Is(p => p == FeatureFlagKeys.PM19422_AllowAutomaticTaxUpdates)) .Returns(true); sutProvider.Sut.SetUpdateOptions(options, subscription); Assert.True(options.AutomaticTax!.Enabled); } [Theory] [BitAutoData] public void SetUpdateOptions_ThrowsArgumentNullException_WhenTaxIdsIsNull( SutProvider sutProvider) { var options = new SubscriptionUpdateOptions(); var subscription = new Subscription { AutomaticTax = new SubscriptionAutomaticTax { Enabled = true }, Customer = new Customer { Address = new Address { Country = "ES", }, Tax = new CustomerTax { AutomaticTax = StripeConstants.AutomaticTaxStatus.Supported }, TaxIds = null } }; sutProvider.GetDependency() .IsEnabled(Arg.Is(p => p == FeatureFlagKeys.PM19422_AllowAutomaticTaxUpdates)) .Returns(true); Assert.Throws(() => sutProvider.Sut.SetUpdateOptions(options, subscription)); } [Theory] [BitAutoData] public void SetUpdateOptions_SetsAutomaticTaxToTrue_ForGlobalCustomersWithoutTaxIds( SutProvider sutProvider) { var options = new SubscriptionUpdateOptions(); var subscription = new Subscription { AutomaticTax = new SubscriptionAutomaticTax { Enabled = true }, Customer = new Customer { Address = new Address { Country = "ES", }, Tax = new CustomerTax { AutomaticTax = StripeConstants.AutomaticTaxStatus.Supported }, TaxIds = new StripeList { Data = new List() } } }; sutProvider.GetDependency() .IsEnabled(Arg.Is(p => p == FeatureFlagKeys.PM19422_AllowAutomaticTaxUpdates)) .Returns(true); sutProvider.Sut.SetUpdateOptions(options, subscription); Assert.False(options.AutomaticTax!.Enabled); } }