using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.EventIntegrations.OrganizationIntegrations; using Bit.Core.Enums; using Bit.Core.Exceptions; using Bit.Core.Repositories; using Bit.Core.Utilities; using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture.Attributes; using NSubstitute; using Xunit; using ZiggyCreatures.Caching.Fusion; namespace Bit.Core.Test.AdminConsole.EventIntegrations.OrganizationIntegrations; [SutProviderCustomize] public class UpdateOrganizationIntegrationCommandTests { [Theory, BitAutoData] public async Task UpdateAsync_Success_UpdatesIntegrationAndInvalidatesCache( SutProvider sutProvider, Guid organizationId, Guid integrationId, OrganizationIntegration existingIntegration, OrganizationIntegration updatedIntegration) { existingIntegration.Id = integrationId; existingIntegration.OrganizationId = organizationId; existingIntegration.Type = IntegrationType.Webhook; updatedIntegration.Id = integrationId; updatedIntegration.OrganizationId = organizationId; updatedIntegration.Type = IntegrationType.Webhook; sutProvider.GetDependency() .GetByIdAsync(integrationId) .Returns(existingIntegration); var result = await sutProvider.Sut.UpdateAsync(organizationId, integrationId, updatedIntegration); await sutProvider.GetDependency().Received(1) .GetByIdAsync(integrationId); await sutProvider.GetDependency().Received(1) .ReplaceAsync(updatedIntegration); await sutProvider.GetDependency().Received(1) .RemoveByTagAsync(EventIntegrationsCacheConstants.BuildCacheTagForOrganizationIntegration( organizationId, existingIntegration.Type)); Assert.Equal(updatedIntegration, result); } [Theory, BitAutoData] public async Task UpdateAsync_IntegrationDoesNotExist_ThrowsNotFound( SutProvider sutProvider, Guid organizationId, Guid integrationId, OrganizationIntegration updatedIntegration) { sutProvider.GetDependency() .GetByIdAsync(integrationId) .Returns((OrganizationIntegration)null); await Assert.ThrowsAsync( () => sutProvider.Sut.UpdateAsync(organizationId, integrationId, updatedIntegration)); await sutProvider.GetDependency().DidNotReceive() .ReplaceAsync(Arg.Any()); await sutProvider.GetDependency().DidNotReceive() .RemoveByTagAsync(Arg.Any()); } [Theory, BitAutoData] public async Task UpdateAsync_IntegrationDoesNotBelongToOrganization_ThrowsNotFound( SutProvider sutProvider, Guid organizationId, Guid integrationId, OrganizationIntegration existingIntegration, OrganizationIntegration updatedIntegration) { existingIntegration.Id = integrationId; existingIntegration.OrganizationId = Guid.NewGuid(); // Different organization sutProvider.GetDependency() .GetByIdAsync(integrationId) .Returns(existingIntegration); await Assert.ThrowsAsync( () => sutProvider.Sut.UpdateAsync(organizationId, integrationId, updatedIntegration)); await sutProvider.GetDependency().DidNotReceive() .ReplaceAsync(Arg.Any()); await sutProvider.GetDependency().DidNotReceive() .RemoveByTagAsync(Arg.Any()); } [Theory, BitAutoData] public async Task UpdateAsync_IntegrationIsDifferentType_ThrowsNotFound( SutProvider sutProvider, Guid organizationId, Guid integrationId, OrganizationIntegration existingIntegration, OrganizationIntegration updatedIntegration) { existingIntegration.Id = integrationId; existingIntegration.OrganizationId = organizationId; existingIntegration.Type = IntegrationType.Webhook; updatedIntegration.Id = integrationId; updatedIntegration.OrganizationId = organizationId; updatedIntegration.Type = IntegrationType.Hec; // Different Type sutProvider.GetDependency() .GetByIdAsync(integrationId) .Returns(existingIntegration); await Assert.ThrowsAsync( () => sutProvider.Sut.UpdateAsync(organizationId, integrationId, updatedIntegration)); await sutProvider.GetDependency().DidNotReceive() .ReplaceAsync(Arg.Any()); await sutProvider.GetDependency().DidNotReceive() .RemoveByTagAsync(Arg.Any()); } }