using Bit.Core.AdminConsole.Entities; using Bit.Core.AdminConsole.Models.Business.Tokenables; using Bit.Core.AdminConsole.OrganizationFeatures.Organizations; using Bit.Core.Entities; using Bit.Core.Enums; using Bit.Core.Exceptions; using Bit.Core.Models.Data.Organizations.OrganizationUsers; using Bit.Core.Repositories; using Bit.Core.Services; using Bit.Core.Tokens; 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 OrganizationInitiateDeleteCommandTests { [Theory] [BitAutoData(OrganizationUserType.Admin)] [BitAutoData(OrganizationUserType.Owner)] public async Task InitiateDeleteAsync_ValidAdminUser_Success(OrganizationUserType organizationUserType, Organization organization, User orgAdmin, OrganizationUserOrganizationDetails orgAdminUser, string token, SutProvider sutProvider) { orgAdminUser.Type = organizationUserType; orgAdminUser.Status = OrganizationUserStatusType.Confirmed; sutProvider.GetDependency() .GetByEmailAsync(orgAdmin.Email) .Returns(orgAdmin); sutProvider.GetDependency() .GetDetailsByUserAsync(orgAdmin.Id, organization.Id) .Returns(orgAdminUser); sutProvider.GetDependency>() .Protect(Arg.Any()) .Returns(token); await sutProvider.Sut.InitiateDeleteAsync(organization, orgAdmin.Email); await sutProvider.GetDependency().Received(1) .SendInitiateDeleteOrganzationEmailAsync(orgAdmin.Email, organization, token); } [Theory, BitAutoData] public async Task InitiateDeleteAsync_UserNotFound_ThrowsBadRequest( Organization organization, string email, SutProvider sutProvider) { sutProvider.GetDependency() .GetByEmailAsync(email) .Returns((User)null); var exception = await Assert.ThrowsAsync( () => sutProvider.Sut.InitiateDeleteAsync(organization, email)); Assert.Equal(OrganizationInitiateDeleteCommand.OrganizationAdminNotFoundErrorMessage, exception.Message); } [Theory] [BitAutoData(OrganizationUserType.User)] [BitAutoData(OrganizationUserType.Custom)] public async Task InitiateDeleteAsync_UserNotOrgAdmin_ThrowsBadRequest(OrganizationUserType organizationUserType, Organization organization, User user, OrganizationUserOrganizationDetails orgUser, SutProvider sutProvider) { orgUser.Type = organizationUserType; orgUser.Status = OrganizationUserStatusType.Confirmed; sutProvider.GetDependency() .GetByEmailAsync(user.Email) .Returns(user); sutProvider.GetDependency() .GetDetailsByUserAsync(user.Id, organization.Id) .Returns(orgUser); var exception = await Assert.ThrowsAsync( () => sutProvider.Sut.InitiateDeleteAsync(organization, user.Email)); Assert.Equal(OrganizationInitiateDeleteCommand.OrganizationAdminNotFoundErrorMessage, exception.Message); } [Theory] [BitAutoData(OrganizationUserStatusType.Invited)] [BitAutoData(OrganizationUserStatusType.Revoked)] [BitAutoData(OrganizationUserStatusType.Accepted)] public async Task InitiateDeleteAsync_UserNotConfirmed_ThrowsBadRequest( OrganizationUserStatusType organizationUserStatusType, Organization organization, User user, OrganizationUserOrganizationDetails orgUser, SutProvider sutProvider) { orgUser.Type = OrganizationUserType.Admin; orgUser.Status = organizationUserStatusType; sutProvider.GetDependency() .GetByEmailAsync(user.Email) .Returns(user); sutProvider.GetDependency() .GetDetailsByUserAsync(user.Id, organization.Id) .Returns(orgUser); var exception = await Assert.ThrowsAsync( () => sutProvider.Sut.InitiateDeleteAsync(organization, user.Email)); Assert.Equal(OrganizationInitiateDeleteCommand.OrganizationAdminNotFoundErrorMessage, exception.Message); } }