diff --git a/src/Core/OrganizationFeatures/OrganizationSubscriptions/UpgradeOrganizationPlanCommand.cs b/src/Core/OrganizationFeatures/OrganizationSubscriptions/UpgradeOrganizationPlanCommand.cs index 24a459ea32..54ca15ba13 100644 --- a/src/Core/OrganizationFeatures/OrganizationSubscriptions/UpgradeOrganizationPlanCommand.cs +++ b/src/Core/OrganizationFeatures/OrganizationSubscriptions/UpgradeOrganizationPlanCommand.cs @@ -268,7 +268,7 @@ public class UpgradeOrganizationPlanCommand : IUpgradeOrganizationPlanCommand organization.PrivateKey = upgrade.PrivateKey; organization.UsePasswordManager = true; organization.SmSeats = (short)(newSecretsManagerPlan.BaseSeats + upgrade.AdditionalSmSeats.GetValueOrDefault()); - organization.SmServiceAccounts = upgrade.AdditionalServiceAccounts.GetValueOrDefault(); + organization.SmServiceAccounts = newSecretsManagerPlan.BaseServiceAccount + upgrade.AdditionalServiceAccounts.GetValueOrDefault(); organization.UseSecretsManager = upgrade.UseSecretsManager; await _organizationService.ReplaceAndUpdateCacheAsync(organization); diff --git a/src/Core/Services/Implementations/OrganizationService.cs b/src/Core/Services/Implementations/OrganizationService.cs index 98506d43de..a34a1c915c 100644 --- a/src/Core/Services/Implementations/OrganizationService.cs +++ b/src/Core/Services/Implementations/OrganizationService.cs @@ -447,7 +447,7 @@ public class OrganizationService : IOrganizationService Status = OrganizationStatusType.Created, UsePasswordManager = true, SmSeats = (short)(secretsManagerPlan.BaseSeats + signup.AdditionalSmSeats.GetValueOrDefault()), - SmServiceAccounts = signup.AdditionalServiceAccounts.GetValueOrDefault(), + SmServiceAccounts = secretsManagerPlan.BaseServiceAccount + signup.AdditionalServiceAccounts.GetValueOrDefault(), UseSecretsManager = signup.UseSecretsManager }; diff --git a/test/Core.Test/OrganizationFeatures/OrganizationSubscriptionUpdate/UpdateSecretsManagerSubscriptionCommandTests.cs b/test/Core.Test/OrganizationFeatures/OrganizationSubscriptionUpdate/UpdateSecretsManagerSubscriptionCommandTests.cs index 5bd08a136c..11990c1733 100644 --- a/test/Core.Test/OrganizationFeatures/OrganizationSubscriptionUpdate/UpdateSecretsManagerSubscriptionCommandTests.cs +++ b/test/Core.Test/OrganizationFeatures/OrganizationSubscriptionUpdate/UpdateSecretsManagerSubscriptionCommandTests.cs @@ -372,13 +372,19 @@ public class UpdateSecretsManagerSubscriptionCommandTests Guid organizationId, SutProvider sutProvider) { + const int organizationServiceAccounts = 200; + const int seatAdjustment = 5; + const int maxAutoscaleSeats = 15; + const int serviceAccountAdjustment = 100; + const int maxAutoScaleServiceAccounts = 300; + var organization = new Organization { Id = organizationId, UseSecretsManager = true, SmSeats = 10, - SmServiceAccounts = 200, MaxAutoscaleSmSeats = 20, + SmServiceAccounts = organizationServiceAccounts, MaxAutoscaleSmServiceAccounts = 350, PlanType = planType, GatewayCustomerId = "1", @@ -389,28 +395,23 @@ public class UpdateSecretsManagerSubscriptionCommandTests var organizationUpdate = new SecretsManagerSubscriptionUpdate { OrganizationId = organizationId, - MaxAutoscaleSmSeats = 15, - SmSeatsAdjustment = 5, - MaxAutoscaleSmServiceAccounts = 300, - SmServiceAccountsAdjustment = 100, - SmSeats = organization.SmSeats.GetValueOrDefault() + 5, - SmSeatsExcludingBase = (organization.SmSeats.GetValueOrDefault() + 5) - plan.BaseSeats, - SmServiceAccounts = organization.SmServiceAccounts.GetValueOrDefault() + 100, - SmServiceAccountsExcludingBase = (organization.SmServiceAccounts.GetValueOrDefault() + 100) - (int)plan.BaseServiceAccount, - MaxAutoscaleSmSeatsChanged = 15 != organization.MaxAutoscaleSeats.GetValueOrDefault(), + SmSeatsAdjustment = seatAdjustment, + SmSeats = organization.SmSeats.GetValueOrDefault() + seatAdjustment, + SmSeatsExcludingBase = (organization.SmSeats.GetValueOrDefault() + seatAdjustment) - plan.BaseSeats, + MaxAutoscaleSmSeats = maxAutoscaleSeats, + + SmServiceAccountsAdjustment = serviceAccountAdjustment, + SmServiceAccounts = organization.SmServiceAccounts.GetValueOrDefault() + serviceAccountAdjustment, + SmServiceAccountsExcludingBase = (organization.SmServiceAccounts.GetValueOrDefault() + serviceAccountAdjustment) - (int)plan.BaseServiceAccount, + MaxAutoscaleSmServiceAccounts = maxAutoScaleServiceAccounts, + + MaxAutoscaleSmSeatsChanged = maxAutoscaleSeats != organization.MaxAutoscaleSeats.GetValueOrDefault(), MaxAutoscaleSmServiceAccountsChanged = 200 != organization.MaxAutoscaleSmServiceAccounts.GetValueOrDefault() }; sutProvider.GetDependency().GetByIdAsync(organizationId).Returns(organization); await sutProvider.Sut.UpdateSecretsManagerSubscription(organizationUpdate); - if (organizationUpdate.SmServiceAccountsAdjustment != 0) - { - await sutProvider.GetDependency().Received(1) - .AdjustSeatsAsync(organization, plan, organizationUpdate.SmSeatsExcludingBase); - - // TODO: call ReferenceEventService - see AC-1481 - } if (organizationUpdate.SmSeatsAdjustment != 0) { @@ -418,19 +419,21 @@ public class UpdateSecretsManagerSubscriptionCommandTests .AdjustServiceAccountsAsync(organization, plan, organizationUpdate.SmServiceAccountsExcludingBase); // TODO: call ReferenceEventService - see AC-1481 - } - if (organizationUpdate.SmSeatsAdjustment != 0) - { await sutProvider.GetDependency().Received(1).ReplaceAndUpdateCacheAsync( Arg.Is(org => org.SmSeats == organizationUpdate.SmSeats)); } if (organizationUpdate.SmServiceAccountsAdjustment != 0) { + await sutProvider.GetDependency().Received(1) + .AdjustSeatsAsync(organization, plan, organizationUpdate.SmSeatsExcludingBase); + + // TODO: call ReferenceEventService - see AC-1481 + await sutProvider.GetDependency().Received(1).ReplaceAndUpdateCacheAsync( Arg.Is(org => - org.SmServiceAccounts == organizationUpdate.SmServiceAccounts)); + org.SmServiceAccounts == (organizationServiceAccounts + organizationUpdate.SmServiceAccountsAdjustment))); } if (organizationUpdate.MaxAutoscaleSmSeats != organization.MaxAutoscaleSmSeats) diff --git a/test/Core.Test/OrganizationFeatures/OrganizationSubscriptionUpdate/UpgradeOrganizationPlanCommandTests.cs b/test/Core.Test/OrganizationFeatures/OrganizationSubscriptionUpdate/UpgradeOrganizationPlanCommandTests.cs index e71e3052ff..f9524b2d6b 100644 --- a/test/Core.Test/OrganizationFeatures/OrganizationSubscriptionUpdate/UpgradeOrganizationPlanCommandTests.cs +++ b/test/Core.Test/OrganizationFeatures/OrganizationSubscriptionUpdate/UpgradeOrganizationPlanCommandTests.cs @@ -5,6 +5,7 @@ using Bit.Core.OrganizationFeatures.OrganizationSubscriptions; using Bit.Core.Repositories; using Bit.Core.Services; using Bit.Core.Test.AutoFixture.OrganizationFixtures; +using Bit.Core.Utilities; using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture.Attributes; using NSubstitute; @@ -96,16 +97,33 @@ public class UpgradeOrganizationPlanCommandTests await sutProvider.GetDependency().Received(1).ReplaceAndUpdateCacheAsync(organization); } - [Theory] - [FreeOrganizationUpgradeCustomize, BitAutoData] - public async Task UpgradePlan_SM_Passes(Organization organization, OrganizationUpgrade upgrade, + [Theory, FreeOrganizationUpgradeCustomize] + [BitAutoData(PlanType.EnterpriseMonthly)] + [BitAutoData(PlanType.EnterpriseAnnually)] + [BitAutoData(PlanType.TeamsMonthly)] + [BitAutoData(PlanType.TeamsAnnually)] + public async Task UpgradePlan_SM_Passes(PlanType planType, Organization organization, OrganizationUpgrade upgrade, SutProvider sutProvider) { + upgrade.Plan = planType; + + var passwordManagerPlan = StaticStore.GetPasswordManagerPlan(upgrade.Plan); + var secretsManagerPlan = StaticStore.GetSecretsManagerPlan(upgrade.Plan); + sutProvider.GetDependency().GetByIdAsync(organization.Id).Returns(organization); + + upgrade.AdditionalSeats = 15; upgrade.AdditionalSmSeats = 10; - upgrade.AdditionalSeats = 10; + upgrade.AdditionalServiceAccounts = 20; + var result = await sutProvider.Sut.UpgradePlanAsync(organization.Id, upgrade); - await sutProvider.GetDependency().Received(1).ReplaceAndUpdateCacheAsync(organization); + + await sutProvider.GetDependency().Received(1).ReplaceAndUpdateCacheAsync( + Arg.Is(o => + o.Seats == passwordManagerPlan.BaseSeats + upgrade.AdditionalSeats + && o.SmSeats == secretsManagerPlan.BaseSeats + upgrade.AdditionalSmSeats + && o.SmServiceAccounts == secretsManagerPlan.BaseServiceAccount + upgrade.AdditionalServiceAccounts)); + Assert.True(result.Item1); Assert.NotNull(result.Item2); } diff --git a/test/Core.Test/Services/OrganizationServiceTests.cs b/test/Core.Test/Services/OrganizationServiceTests.cs index 7729d748cd..699f0509d6 100644 --- a/test/Core.Test/Services/OrganizationServiceTests.cs +++ b/test/Core.Test/Services/OrganizationServiceTests.cs @@ -147,13 +147,21 @@ public class OrganizationServiceTests [Theory] - [BitAutoData] - public async Task SignUp_SM_Passes(OrganizationSignup signup, SutProvider sutProvider) + [BitAutoData(PlanType.EnterpriseAnnually)] + [BitAutoData(PlanType.EnterpriseMonthly)] + [BitAutoData(PlanType.TeamsAnnually)] + [BitAutoData(PlanType.TeamsMonthly)] + public async Task SignUp_SM_Passes(PlanType planType, OrganizationSignup signup, SutProvider sutProvider) { - signup.AdditionalSmSeats = 10; - signup.AdditionalSeats = 10; - signup.Plan = PlanType.EnterpriseAnnually; + signup.Plan = planType; + + var passwordManagerPlan = StaticStore.GetPasswordManagerPlan(signup.Plan); + var secretsManagerPlan = StaticStore.GetSecretsManagerPlan(signup.Plan); + signup.UseSecretsManager = true; + signup.AdditionalSeats = 15; + signup.AdditionalSmSeats = 10; + signup.AdditionalServiceAccounts = 20; signup.PaymentMethodType = PaymentMethodType.Card; signup.PremiumAccessAddon = false; @@ -161,6 +169,12 @@ public class OrganizationServiceTests var result = await sutProvider.Sut.SignUpAsync(signup); + await sutProvider.GetDependency().Received(1).CreateAsync( + Arg.Is(o => + o.Seats == passwordManagerPlan.BaseSeats + signup.AdditionalSeats + && o.SmSeats == secretsManagerPlan.BaseSeats + signup.AdditionalSmSeats + && o.SmServiceAccounts == secretsManagerPlan.BaseServiceAccount + signup.AdditionalServiceAccounts)); + await sutProvider.GetDependency().Received(1) .RaiseEventAsync(Arg.Is(referenceEvent => referenceEvent.Type == ReferenceEventType.Signup &&