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 DeleteOrganizationIntegrationCommandTests { [Theory, BitAutoData] public async Task DeleteAsync_Success_DeletesIntegrationAndInvalidatesCache( SutProvider sutProvider, Guid organizationId, Guid integrationId, OrganizationIntegration integration) { integration.Id = integrationId; integration.OrganizationId = organizationId; integration.Type = IntegrationType.Webhook; sutProvider.GetDependency() .GetByIdAsync(integrationId) .Returns(integration); await sutProvider.Sut.DeleteAsync(organizationId, integrationId); await sutProvider.GetDependency().Received(1) .GetByIdAsync(integrationId); await sutProvider.GetDependency().Received(1) .DeleteAsync(integration); await sutProvider.GetDependency().Received(1) .RemoveByTagAsync(EventIntegrationsCacheConstants.BuildCacheTagForOrganizationIntegration( organizationId, integration.Type)); } [Theory, BitAutoData] public async Task DeleteAsync_IntegrationDoesNotExist_ThrowsNotFound( SutProvider sutProvider, Guid organizationId, Guid integrationId) { sutProvider.GetDependency() .GetByIdAsync(integrationId) .Returns((OrganizationIntegration)null); await Assert.ThrowsAsync( () => sutProvider.Sut.DeleteAsync(organizationId, integrationId)); await sutProvider.GetDependency().DidNotReceive() .DeleteAsync(Arg.Any()); await sutProvider.GetDependency().DidNotReceive() .RemoveByTagAsync(Arg.Any()); } [Theory, BitAutoData] public async Task DeleteAsync_IntegrationDoesNotBelongToOrganization_ThrowsNotFound( SutProvider sutProvider, Guid organizationId, Guid integrationId, OrganizationIntegration integration) { integration.Id = integrationId; integration.OrganizationId = Guid.NewGuid(); // Different organization sutProvider.GetDependency() .GetByIdAsync(integrationId) .Returns(integration); await Assert.ThrowsAsync( () => sutProvider.Sut.DeleteAsync(organizationId, integrationId)); await sutProvider.GetDependency().DidNotReceive() .DeleteAsync(Arg.Any()); await sutProvider.GetDependency().DidNotReceive() .RemoveByTagAsync(Arg.Any()); } }