using Bit.Api.AdminConsole.Controllers; using Bit.Api.AdminConsole.Models.Request.Organizations; using Bit.Api.AdminConsole.Models.Response.Organizations; using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.EventIntegrations.OrganizationIntegrationConfigurations.Interfaces; using Bit.Core.Context; using Bit.Core.Exceptions; using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture.Attributes; using Microsoft.AspNetCore.Mvc; using NSubstitute; using Xunit; namespace Bit.Api.Test.AdminConsole.Controllers; [ControllerCustomize(typeof(OrganizationIntegrationConfigurationController))] [SutProviderCustomize] public class OrganizationIntegrationsConfigurationControllerTests { [Theory, BitAutoData] public async Task DeleteAsync_AllParamsProvided_Succeeds( SutProvider sutProvider, Guid organizationId, Guid integrationId, Guid configurationId) { sutProvider.Sut.Url = Substitute.For(); sutProvider.GetDependency() .OrganizationOwner(organizationId) .Returns(true); await sutProvider.Sut.DeleteAsync(organizationId, integrationId, configurationId); await sutProvider.GetDependency().Received(1) .DeleteAsync(organizationId, integrationId, configurationId); } [Theory, BitAutoData] [Obsolete("Obsolete")] public async Task PostDeleteAsync_AllParamsProvided_Succeeds( SutProvider sutProvider, Guid organizationId, Guid integrationId, Guid configurationId) { sutProvider.Sut.Url = Substitute.For(); sutProvider.GetDependency() .OrganizationOwner(organizationId) .Returns(true); await sutProvider.Sut.PostDeleteAsync(organizationId, integrationId, configurationId); await sutProvider.GetDependency().Received(1) .DeleteAsync(organizationId, integrationId, configurationId); } [Theory, BitAutoData] public async Task DeleteAsync_UserIsNotOrganizationAdmin_ThrowsNotFound( SutProvider sutProvider, Guid organizationId, Guid integrationId, Guid configurationId) { sutProvider.Sut.Url = Substitute.For(); sutProvider.GetDependency() .OrganizationOwner(organizationId) .Returns(false); await Assert.ThrowsAsync(async () => await sutProvider.Sut.DeleteAsync(organizationId, integrationId, configurationId)); } [Theory, BitAutoData] public async Task GetAsync_ConfigurationsExist_Succeeds( SutProvider sutProvider, Guid organizationId, Guid integrationId, List configurations) { sutProvider.Sut.Url = Substitute.For(); sutProvider.GetDependency() .OrganizationOwner(organizationId) .Returns(true); sutProvider.GetDependency() .GetManyByIntegrationAsync(organizationId, integrationId) .Returns(configurations); var result = await sutProvider.Sut.GetAsync(organizationId, integrationId); Assert.NotNull(result); Assert.Equal(configurations.Count, result.Count); Assert.All(result, r => Assert.IsType(r)); await sutProvider.GetDependency().Received(1) .GetManyByIntegrationAsync(organizationId, integrationId); } [Theory, BitAutoData] public async Task GetAsync_NoConfigurationsExist_ReturnsEmptyList( SutProvider sutProvider, Guid organizationId, Guid integrationId) { sutProvider.Sut.Url = Substitute.For(); sutProvider.GetDependency() .OrganizationOwner(organizationId) .Returns(true); sutProvider.GetDependency() .GetManyByIntegrationAsync(organizationId, integrationId) .Returns([]); var result = await sutProvider.Sut.GetAsync(organizationId, integrationId); Assert.NotNull(result); Assert.Empty(result); await sutProvider.GetDependency().Received(1) .GetManyByIntegrationAsync(organizationId, integrationId); } [Theory, BitAutoData] public async Task GetAsync_UserIsNotOrganizationAdmin_ThrowsNotFound( SutProvider sutProvider, Guid organizationId, Guid integrationId) { sutProvider.Sut.Url = Substitute.For(); sutProvider.GetDependency() .OrganizationOwner(organizationId) .Returns(false); await Assert.ThrowsAsync(async () => await sutProvider.Sut.GetAsync(organizationId, integrationId)); } [Theory, BitAutoData] public async Task PostAsync_AllParamsProvided_Succeeds( SutProvider sutProvider, Guid organizationId, Guid integrationId, OrganizationIntegrationConfiguration configuration, OrganizationIntegrationConfigurationRequestModel model) { sutProvider.Sut.Url = Substitute.For(); sutProvider.GetDependency() .OrganizationOwner(organizationId) .Returns(true); sutProvider.GetDependency() .CreateAsync(organizationId, integrationId, Arg.Any()) .Returns(configuration); var createResponse = await sutProvider.Sut.CreateAsync(organizationId, integrationId, model); await sutProvider.GetDependency().Received(1) .CreateAsync(organizationId, integrationId, Arg.Any()); Assert.IsType(createResponse); } [Theory, BitAutoData] public async Task PostAsync_UserIsNotOrganizationAdmin_ThrowsNotFound( SutProvider sutProvider, Guid organizationId, Guid integrationId) { sutProvider.Sut.Url = Substitute.For(); sutProvider.GetDependency() .OrganizationOwner(organizationId) .Returns(false); await Assert.ThrowsAsync(async () => await sutProvider.Sut.CreateAsync(organizationId, integrationId, new OrganizationIntegrationConfigurationRequestModel())); } [Theory, BitAutoData] public async Task UpdateAsync_AllParamsProvided_Succeeds( SutProvider sutProvider, Guid organizationId, Guid integrationId, Guid configurationId, OrganizationIntegrationConfiguration configuration, OrganizationIntegrationConfigurationRequestModel model) { sutProvider.Sut.Url = Substitute.For(); sutProvider.GetDependency() .OrganizationOwner(organizationId) .Returns(true); sutProvider.GetDependency() .UpdateAsync(organizationId, integrationId, configurationId, Arg.Any()) .Returns(configuration); var updateResponse = await sutProvider.Sut.UpdateAsync(organizationId, integrationId, configurationId, model); await sutProvider.GetDependency().Received(1) .UpdateAsync(organizationId, integrationId, configurationId, Arg.Any()); Assert.IsType(updateResponse); } [Theory, BitAutoData] public async Task UpdateAsync_UserIsNotOrganizationAdmin_ThrowsNotFound( SutProvider sutProvider, Guid organizationId, Guid integrationId, Guid configurationId) { sutProvider.Sut.Url = Substitute.For(); sutProvider.GetDependency() .OrganizationOwner(organizationId) .Returns(false); await Assert.ThrowsAsync(async () => await sutProvider.Sut.UpdateAsync(organizationId, integrationId, configurationId, new OrganizationIntegrationConfigurationRequestModel())); } }