diff --git a/src/Api/AdminConsole/Controllers/OrganizationsController.cs b/src/Api/AdminConsole/Controllers/OrganizationsController.cs index f802624b725f..96bce7cea609 100644 --- a/src/Api/AdminConsole/Controllers/OrganizationsController.cs +++ b/src/Api/AdminConsole/Controllers/OrganizationsController.cs @@ -65,6 +65,7 @@ public class OrganizationsController : Controller private readonly IPricingClient _pricingClient; private readonly IOrganizationUpdateKeysCommand _organizationUpdateKeysCommand; private readonly IOrganizationUpdateCommand _organizationUpdateCommand; + private readonly IOrganizationUpdateCollectionManagementCommand _organizationUpdateCollectionManagementCommand; public OrganizationsController( IOrganizationRepository organizationRepository, @@ -88,7 +89,8 @@ public OrganizationsController( IOrganizationDeleteCommand organizationDeleteCommand, IPricingClient pricingClient, IOrganizationUpdateKeysCommand organizationUpdateKeysCommand, - IOrganizationUpdateCommand organizationUpdateCommand) + IOrganizationUpdateCommand organizationUpdateCommand, + IOrganizationUpdateCollectionManagementCommand organizationUpdateCollectionManagementCommand) { _organizationRepository = organizationRepository; _organizationUserRepository = organizationUserRepository; @@ -112,6 +114,7 @@ public OrganizationsController( _pricingClient = pricingClient; _organizationUpdateKeysCommand = organizationUpdateKeysCommand; _organizationUpdateCommand = organizationUpdateCommand; + _organizationUpdateCollectionManagementCommand = organizationUpdateCollectionManagementCommand; } [HttpGet("{id}")] @@ -547,7 +550,7 @@ public async Task PutCollectionManagement(Guid id, [F throw new NotFoundException(); } - var organization = await _organizationService.UpdateCollectionManagementSettingsAsync(id, model.ToSettings()); + var organization = await _organizationUpdateCollectionManagementCommand.UpdateAsync(id, model.ToSettings()); var plan = await _pricingClient.GetPlan(organization.PlanType); return new OrganizationResponseModel(organization, plan); } diff --git a/src/Core/AdminConsole/OrganizationFeatures/Organizations/Interfaces/IOrganizationUpdateCollectionManagementCommand.cs b/src/Core/AdminConsole/OrganizationFeatures/Organizations/Interfaces/IOrganizationUpdateCollectionManagementCommand.cs new file mode 100644 index 000000000000..7dd3dba83e19 --- /dev/null +++ b/src/Core/AdminConsole/OrganizationFeatures/Organizations/Interfaces/IOrganizationUpdateCollectionManagementCommand.cs @@ -0,0 +1,15 @@ +using Bit.Core.AdminConsole.Entities; +using Bit.Core.AdminConsole.Models.Business; + +namespace Bit.Core.AdminConsole.OrganizationFeatures.Organizations.Interfaces; + +public interface IOrganizationUpdateCollectionManagementCommand +{ + /// + /// Updates an organization's collection management settings. + /// + /// The unique identifier of the organization to update. + /// The collection management settings to apply. + /// The updated organization. + Task UpdateAsync(Guid organizationId, OrganizationCollectionManagementSettings settings); +} diff --git a/src/Core/AdminConsole/OrganizationFeatures/Organizations/OrganizationUpdateCollectionManagementCommand.cs b/src/Core/AdminConsole/OrganizationFeatures/Organizations/OrganizationUpdateCollectionManagementCommand.cs new file mode 100644 index 000000000000..58724ea1b399 --- /dev/null +++ b/src/Core/AdminConsole/OrganizationFeatures/Organizations/OrganizationUpdateCollectionManagementCommand.cs @@ -0,0 +1,99 @@ +using Bit.Core.AdminConsole.Entities; +using Bit.Core.AdminConsole.Models.Business; +using Bit.Core.AdminConsole.OrganizationFeatures.Organizations.Interfaces; +using Bit.Core.Enums; +using Bit.Core.Exceptions; +using Bit.Core.Platform.Push; +using Bit.Core.Repositories; +using Bit.Core.Services; + +namespace Bit.Core.AdminConsole.OrganizationFeatures.Organizations; + +public class OrganizationUpdateCollectionManagementCommand : IOrganizationUpdateCollectionManagementCommand +{ + private readonly IOrganizationRepository _organizationRepository; + private readonly IApplicationCacheService _applicationCacheService; + private readonly IEventService _eventService; + private readonly IPushNotificationService _pushNotificationService; + + public OrganizationUpdateCollectionManagementCommand( + IOrganizationRepository organizationRepository, + IApplicationCacheService applicationCacheService, + IEventService eventService, + IPushNotificationService pushNotificationService) + { + _organizationRepository = organizationRepository; + _applicationCacheService = applicationCacheService; + _eventService = eventService; + _pushNotificationService = pushNotificationService; + } + + public async Task UpdateAsync(Guid organizationId, OrganizationCollectionManagementSettings settings) + { + var existingOrganization = await _organizationRepository.GetByIdAsync(organizationId); + if (existingOrganization == null) + { + throw new NotFoundException(); + } + + var loggingActions = CreateCollectionManagementLoggingActions(existingOrganization, settings); + + existingOrganization.LimitCollectionCreation = settings.LimitCollectionCreation; + existingOrganization.LimitCollectionDeletion = settings.LimitCollectionDeletion; + existingOrganization.LimitItemDeletion = settings.LimitItemDeletion; + existingOrganization.AllowAdminAccessToAllCollectionItems = settings.AllowAdminAccessToAllCollectionItems; + existingOrganization.RevisionDate = DateTime.UtcNow; + + await _organizationRepository.ReplaceAsync(existingOrganization); + await _applicationCacheService.UpsertOrganizationAbilityAsync(existingOrganization); + + if (loggingActions.Any()) + { + await Task.WhenAll(loggingActions.Select(action => action())); + } + + await _pushNotificationService.PushSyncOrganizationCollectionManagementSettingsAsync(existingOrganization); + + return existingOrganization; + } + + private List> CreateCollectionManagementLoggingActions( + Organization existingOrganization, OrganizationCollectionManagementSettings settings) + { + var loggingActions = new List>(); + + if (existingOrganization.LimitCollectionCreation != settings.LimitCollectionCreation) + { + var eventType = settings.LimitCollectionCreation + ? EventType.Organization_CollectionManagement_LimitCollectionCreationEnabled + : EventType.Organization_CollectionManagement_LimitCollectionCreationDisabled; + loggingActions.Add(() => _eventService.LogOrganizationEventAsync(existingOrganization, eventType)); + } + + if (existingOrganization.LimitCollectionDeletion != settings.LimitCollectionDeletion) + { + var eventType = settings.LimitCollectionDeletion + ? EventType.Organization_CollectionManagement_LimitCollectionDeletionEnabled + : EventType.Organization_CollectionManagement_LimitCollectionDeletionDisabled; + loggingActions.Add(() => _eventService.LogOrganizationEventAsync(existingOrganization, eventType)); + } + + if (existingOrganization.LimitItemDeletion != settings.LimitItemDeletion) + { + var eventType = settings.LimitItemDeletion + ? EventType.Organization_CollectionManagement_LimitItemDeletionEnabled + : EventType.Organization_CollectionManagement_LimitItemDeletionDisabled; + loggingActions.Add(() => _eventService.LogOrganizationEventAsync(existingOrganization, eventType)); + } + + if (existingOrganization.AllowAdminAccessToAllCollectionItems != settings.AllowAdminAccessToAllCollectionItems) + { + var eventType = settings.AllowAdminAccessToAllCollectionItems + ? EventType.Organization_CollectionManagement_AllowAdminAccessToAllCollectionItemsEnabled + : EventType.Organization_CollectionManagement_AllowAdminAccessToAllCollectionItemsDisabled; + loggingActions.Add(() => _eventService.LogOrganizationEventAsync(existingOrganization, eventType)); + } + + return loggingActions; + } +} diff --git a/src/Core/AdminConsole/Services/IOrganizationService.cs b/src/Core/AdminConsole/Services/IOrganizationService.cs index f55899b97141..e96224ff02e4 100644 --- a/src/Core/AdminConsole/Services/IOrganizationService.cs +++ b/src/Core/AdminConsole/Services/IOrganizationService.cs @@ -2,7 +2,6 @@ #nullable disable using Bit.Core.AdminConsole.Entities; -using Bit.Core.AdminConsole.Models.Business; using Bit.Core.Auth.Enums; using Bit.Core.Entities; using Bit.Core.Enums; @@ -20,7 +19,6 @@ public interface IOrganizationService Task AdjustSeatsAsync(Guid organizationId, int seatAdjustment); Task UpdateExpirationDateAsync(Guid organizationId, DateTime? expirationDate); Task UpdateAsync(Organization organization, bool updateBilling = false); - Task UpdateCollectionManagementSettingsAsync(Guid organizationId, OrganizationCollectionManagementSettings settings); Task UpdateTwoFactorProviderAsync(Organization organization, TwoFactorProviderType type); Task DisableTwoFactorProviderAsync(Organization organization, TwoFactorProviderType type); Task InviteUserAsync(Guid organizationId, Guid? invitingUserId, EventSystemUser? systemUser, diff --git a/src/Core/AdminConsole/Services/Implementations/OrganizationService.cs b/src/Core/AdminConsole/Services/Implementations/OrganizationService.cs index 4381b9fe8d70..b47d32cb5d3f 100644 --- a/src/Core/AdminConsole/Services/Implementations/OrganizationService.cs +++ b/src/Core/AdminConsole/Services/Implementations/OrganizationService.cs @@ -3,7 +3,6 @@ using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Enums.Provider; -using Bit.Core.AdminConsole.Models.Business; using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Interfaces; using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers; using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models; @@ -389,35 +388,6 @@ await _stripeAdapter.UpdateCustomerAsync(organization.GatewayCustomerId, } } - public async Task UpdateCollectionManagementSettingsAsync(Guid organizationId, OrganizationCollectionManagementSettings settings) - { - var existingOrganization = await _organizationRepository.GetByIdAsync(organizationId); - if (existingOrganization == null) - { - throw new NotFoundException(); - } - - // Create logging actions based on what will change - var loggingActions = CreateCollectionManagementLoggingActions(existingOrganization, settings); - - existingOrganization.LimitCollectionCreation = settings.LimitCollectionCreation; - existingOrganization.LimitCollectionDeletion = settings.LimitCollectionDeletion; - existingOrganization.LimitItemDeletion = settings.LimitItemDeletion; - existingOrganization.AllowAdminAccessToAllCollectionItems = settings.AllowAdminAccessToAllCollectionItems; - existingOrganization.RevisionDate = DateTime.UtcNow; - - await ReplaceAndUpdateCacheAsync(existingOrganization); - - if (loggingActions.Any()) - { - await Task.WhenAll(loggingActions.Select(action => action())); - } - - await _pushNotificationService.PushSyncOrganizationCollectionManagementSettingsAsync(existingOrganization); - - return existingOrganization; - } - public async Task UpdateTwoFactorProviderAsync(Organization organization, TwoFactorProviderType type) { if (!type.ToString().Contains("Organization")) @@ -1122,43 +1092,4 @@ public static OrganizationUserStatusType GetPriorActiveOrganizationUserStatusTyp return status; } - private List> CreateCollectionManagementLoggingActions( - Organization existingOrganization, OrganizationCollectionManagementSettings settings) - { - var loggingActions = new List>(); - - if (existingOrganization.LimitCollectionCreation != settings.LimitCollectionCreation) - { - var eventType = settings.LimitCollectionCreation - ? EventType.Organization_CollectionManagement_LimitCollectionCreationEnabled - : EventType.Organization_CollectionManagement_LimitCollectionCreationDisabled; - loggingActions.Add(() => _eventService.LogOrganizationEventAsync(existingOrganization, eventType)); - } - - if (existingOrganization.LimitCollectionDeletion != settings.LimitCollectionDeletion) - { - var eventType = settings.LimitCollectionDeletion - ? EventType.Organization_CollectionManagement_LimitCollectionDeletionEnabled - : EventType.Organization_CollectionManagement_LimitCollectionDeletionDisabled; - loggingActions.Add(() => _eventService.LogOrganizationEventAsync(existingOrganization, eventType)); - } - - if (existingOrganization.LimitItemDeletion != settings.LimitItemDeletion) - { - var eventType = settings.LimitItemDeletion - ? EventType.Organization_CollectionManagement_LimitItemDeletionEnabled - : EventType.Organization_CollectionManagement_LimitItemDeletionDisabled; - loggingActions.Add(() => _eventService.LogOrganizationEventAsync(existingOrganization, eventType)); - } - - if (existingOrganization.AllowAdminAccessToAllCollectionItems != settings.AllowAdminAccessToAllCollectionItems) - { - var eventType = settings.AllowAdminAccessToAllCollectionItems - ? EventType.Organization_CollectionManagement_AllowAdminAccessToAllCollectionItemsEnabled - : EventType.Organization_CollectionManagement_AllowAdminAccessToAllCollectionItemsDisabled; - loggingActions.Add(() => _eventService.LogOrganizationEventAsync(existingOrganization, eventType)); - } - - return loggingActions; - } } diff --git a/src/Core/OrganizationFeatures/OrganizationServiceCollectionExtensions.cs b/src/Core/OrganizationFeatures/OrganizationServiceCollectionExtensions.cs index c24b378c93d6..e4ad510d6e11 100644 --- a/src/Core/OrganizationFeatures/OrganizationServiceCollectionExtensions.cs +++ b/src/Core/OrganizationFeatures/OrganizationServiceCollectionExtensions.cs @@ -105,6 +105,7 @@ private static void AddOrganizationUpdateCommands(this IServiceCollection servic { services.AddScoped(); services.AddScoped(); + services.AddScoped(); } private static void AddOrganizationEnableCommands(this IServiceCollection services) => diff --git a/test/Api.Test/AdminConsole/Controllers/OrganizationsControllerTests.cs b/test/Api.Test/AdminConsole/Controllers/OrganizationsControllerTests.cs index a8acf8fe02ed..63583ac20ba5 100644 --- a/test/Api.Test/AdminConsole/Controllers/OrganizationsControllerTests.cs +++ b/test/Api.Test/AdminConsole/Controllers/OrganizationsControllerTests.cs @@ -205,8 +205,8 @@ public async Task PutCollectionManagement_ValidRequest_Success( var plan = MockPlans.Get(PlanType.EnterpriseAnnually); sutProvider.GetDependency().GetPlan(Arg.Any()).Returns(plan); - sutProvider.GetDependency() - .UpdateCollectionManagementSettingsAsync( + sutProvider.GetDependency() + .UpdateAsync( organization.Id, Arg.Is(s => s.LimitCollectionCreation == model.LimitCollectionCreation && @@ -219,9 +219,9 @@ public async Task PutCollectionManagement_ValidRequest_Success( await sutProvider.Sut.PutCollectionManagement(organization.Id, model); // Assert - await sutProvider.GetDependency() + await sutProvider.GetDependency() .Received(1) - .UpdateCollectionManagementSettingsAsync( + .UpdateAsync( organization.Id, Arg.Is(s => s.LimitCollectionCreation == model.LimitCollectionCreation && diff --git a/test/Core.Test/AdminConsole/OrganizationFeatures/Organizations/OrganizationUpdateCollectionManagementCommandTests.cs b/test/Core.Test/AdminConsole/OrganizationFeatures/Organizations/OrganizationUpdateCollectionManagementCommandTests.cs new file mode 100644 index 000000000000..d246ef37a06b --- /dev/null +++ b/test/Core.Test/AdminConsole/OrganizationFeatures/Organizations/OrganizationUpdateCollectionManagementCommandTests.cs @@ -0,0 +1,120 @@ +using Bit.Core.AdminConsole.Entities; +using Bit.Core.AdminConsole.Models.Business; +using Bit.Core.AdminConsole.OrganizationFeatures.Organizations; +using Bit.Core.Enums; +using Bit.Core.Exceptions; +using Bit.Core.Repositories; +using Bit.Core.Services; +using Bit.Test.Common.AutoFixture; +using Bit.Test.Common.AutoFixture.Attributes; +using NSubstitute; +using Xunit; + +namespace Bit.Core.Test.AdminConsole.OrganizationFeatures.Organizations; + +[SutProviderCustomize] +public class OrganizationUpdateCollectionManagementCommandTests +{ + [Theory] + [BitAutoData(false, true, false, true)] + [BitAutoData(true, false, true, false)] + public async Task UpdateAsync_WhenSettingsChanged_LogsSpecificEvents( + bool newLimitCollectionCreation, + bool newLimitCollectionDeletion, + bool newLimitItemDeletion, + bool newAllowAdminAccessToAllCollectionItems, + Organization existingOrganization, SutProvider sutProvider) + { + // Arrange + existingOrganization.LimitCollectionCreation = false; + existingOrganization.LimitCollectionDeletion = false; + existingOrganization.LimitItemDeletion = false; + existingOrganization.AllowAdminAccessToAllCollectionItems = false; + + sutProvider.GetDependency() + .GetByIdAsync(existingOrganization.Id) + .Returns(existingOrganization); + + var settings = new OrganizationCollectionManagementSettings + { + LimitCollectionCreation = newLimitCollectionCreation, + LimitCollectionDeletion = newLimitCollectionDeletion, + LimitItemDeletion = newLimitItemDeletion, + AllowAdminAccessToAllCollectionItems = newAllowAdminAccessToAllCollectionItems + }; + + // Act + await sutProvider.Sut.UpdateAsync(existingOrganization.Id, settings); + + // Assert + var eventService = sutProvider.GetDependency(); + if (newLimitCollectionCreation) + { + await eventService.Received(1).LogOrganizationEventAsync( + Arg.Is(org => org.Id == existingOrganization.Id), + Arg.Is(e => e == EventType.Organization_CollectionManagement_LimitCollectionCreationEnabled)); + } + else + { + await eventService.DidNotReceive().LogOrganizationEventAsync( + Arg.Is(org => org.Id == existingOrganization.Id), + Arg.Is(e => e == EventType.Organization_CollectionManagement_LimitCollectionCreationEnabled)); + } + + if (newLimitCollectionDeletion) + { + await eventService.Received(1).LogOrganizationEventAsync( + Arg.Is(org => org.Id == existingOrganization.Id), + Arg.Is(e => e == EventType.Organization_CollectionManagement_LimitCollectionDeletionEnabled)); + } + else + { + await eventService.DidNotReceive().LogOrganizationEventAsync( + Arg.Is(org => org.Id == existingOrganization.Id), + Arg.Is(e => e == EventType.Organization_CollectionManagement_LimitCollectionDeletionEnabled)); + } + + if (newLimitItemDeletion) + { + await eventService.Received(1).LogOrganizationEventAsync( + Arg.Is(org => org.Id == existingOrganization.Id), + Arg.Is(e => e == EventType.Organization_CollectionManagement_LimitItemDeletionEnabled)); + } + else + { + await eventService.DidNotReceive().LogOrganizationEventAsync( + Arg.Is(org => org.Id == existingOrganization.Id), + Arg.Is(e => e == EventType.Organization_CollectionManagement_LimitItemDeletionEnabled)); + } + + if (newAllowAdminAccessToAllCollectionItems) + { + await eventService.Received(1).LogOrganizationEventAsync( + Arg.Is(org => org.Id == existingOrganization.Id), + Arg.Is(e => e == EventType.Organization_CollectionManagement_AllowAdminAccessToAllCollectionItemsEnabled)); + } + else + { + await eventService.DidNotReceive().LogOrganizationEventAsync( + Arg.Is(org => org.Id == existingOrganization.Id), + Arg.Is(e => e == EventType.Organization_CollectionManagement_AllowAdminAccessToAllCollectionItemsEnabled)); + } + } + + [Theory, BitAutoData] + public async Task UpdateAsync_WhenOrganizationNotFound_ThrowsNotFoundException( + Guid organizationId, OrganizationCollectionManagementSettings settings, SutProvider sutProvider) + { + // Arrange + sutProvider.GetDependency() + .GetByIdAsync(organizationId) + .Returns((Organization)null); + + // Act/Assert + await Assert.ThrowsAsync(() => sutProvider.Sut.UpdateAsync(organizationId, settings)); + + await sutProvider.GetDependency() + .Received(1) + .GetByIdAsync(organizationId); + } +} diff --git a/test/Core.Test/AdminConsole/Services/OrganizationServiceTests.cs b/test/Core.Test/AdminConsole/Services/OrganizationServiceTests.cs index 269ce3008d8b..4ba8ca9ef2c2 100644 --- a/test/Core.Test/AdminConsole/Services/OrganizationServiceTests.cs +++ b/test/Core.Test/AdminConsole/Services/OrganizationServiceTests.cs @@ -1,7 +1,6 @@ using System.Text.Json; using Bit.Core.AdminConsole.Entities.Provider; using Bit.Core.AdminConsole.Enums.Provider; -using Bit.Core.AdminConsole.Models.Business; using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Interfaces; using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers; using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models; @@ -1231,109 +1230,6 @@ await organizationRepository .GetByIdentifierAsync(Arg.Is(id => id == organization.Identifier)); } - [Theory] - [BitAutoData(false, true, false, true)] - [BitAutoData(true, false, true, false)] - public async Task UpdateCollectionManagementSettingsAsync_WhenSettingsChanged_LogsSpecificEvents( - bool newLimitCollectionCreation, - bool newLimitCollectionDeletion, - bool newLimitItemDeletion, - bool newAllowAdminAccessToAllCollectionItems, - Organization existingOrganization, SutProvider sutProvider) - { - // Arrange - existingOrganization.LimitCollectionCreation = false; - existingOrganization.LimitCollectionDeletion = false; - existingOrganization.LimitItemDeletion = false; - existingOrganization.AllowAdminAccessToAllCollectionItems = false; - - sutProvider.GetDependency() - .GetByIdAsync(existingOrganization.Id) - .Returns(existingOrganization); - - var settings = new OrganizationCollectionManagementSettings - { - LimitCollectionCreation = newLimitCollectionCreation, - LimitCollectionDeletion = newLimitCollectionDeletion, - LimitItemDeletion = newLimitItemDeletion, - AllowAdminAccessToAllCollectionItems = newAllowAdminAccessToAllCollectionItems - }; - - // Act - await sutProvider.Sut.UpdateCollectionManagementSettingsAsync(existingOrganization.Id, settings); - - // Assert - var eventService = sutProvider.GetDependency(); - if (newLimitCollectionCreation) - { - await eventService.Received(1).LogOrganizationEventAsync( - Arg.Is(org => org.Id == existingOrganization.Id), - Arg.Is(e => e == EventType.Organization_CollectionManagement_LimitCollectionCreationEnabled)); - } - else - { - await eventService.DidNotReceive().LogOrganizationEventAsync( - Arg.Is(org => org.Id == existingOrganization.Id), - Arg.Is(e => e == EventType.Organization_CollectionManagement_LimitCollectionCreationEnabled)); - } - - if (newLimitCollectionDeletion) - { - await eventService.Received(1).LogOrganizationEventAsync( - Arg.Is(org => org.Id == existingOrganization.Id), - Arg.Is(e => e == EventType.Organization_CollectionManagement_LimitCollectionDeletionEnabled)); - } - else - { - await eventService.DidNotReceive().LogOrganizationEventAsync( - Arg.Is(org => org.Id == existingOrganization.Id), - Arg.Is(e => e == EventType.Organization_CollectionManagement_LimitCollectionDeletionEnabled)); - } - - if (newLimitItemDeletion) - { - await eventService.Received(1).LogOrganizationEventAsync( - Arg.Is(org => org.Id == existingOrganization.Id), - Arg.Is(e => e == EventType.Organization_CollectionManagement_LimitItemDeletionEnabled)); - } - else - { - await eventService.DidNotReceive().LogOrganizationEventAsync( - Arg.Is(org => org.Id == existingOrganization.Id), - Arg.Is(e => e == EventType.Organization_CollectionManagement_LimitItemDeletionEnabled)); - } - - if (newAllowAdminAccessToAllCollectionItems) - { - await eventService.Received(1).LogOrganizationEventAsync( - Arg.Is(org => org.Id == existingOrganization.Id), - Arg.Is(e => e == EventType.Organization_CollectionManagement_AllowAdminAccessToAllCollectionItemsEnabled)); - } - else - { - await eventService.DidNotReceive().LogOrganizationEventAsync( - Arg.Is(org => org.Id == existingOrganization.Id), - Arg.Is(e => e == EventType.Organization_CollectionManagement_AllowAdminAccessToAllCollectionItemsEnabled)); - } - } - - [Theory, BitAutoData] - public async Task UpdateCollectionManagementSettingsAsync_WhenOrganizationNotFound_ThrowsNotFoundException( - Guid organizationId, OrganizationCollectionManagementSettings settings, SutProvider sutProvider) - { - // Arrange - sutProvider.GetDependency() - .GetByIdAsync(organizationId) - .Returns((Organization)null); - - // Act/Assert - await Assert.ThrowsAsync(() => sutProvider.Sut.UpdateCollectionManagementSettingsAsync(organizationId, settings)); - - await sutProvider.GetDependency() - .Received(1) - .GetByIdAsync(organizationId); - } - [Theory, PaidOrganizationCustomize(CheckedPlanType = PlanType.EnterpriseAnnually), BitAutoData] public async Task AdjustSeatsAsync_WithFeatureFlag_UsesUpdateOrganizationSubscriptionCommand( Organization organization, SutProvider sutProvider)