diff --git a/test/Core.Test/AdminConsole/OrganizationFeatures/OrganizationUsers/ImportOrganizationUserCommandTests.cs b/test/Core.Test/AdminConsole/OrganizationFeatures/OrganizationUsers/ImportOrganizationUserCommandTests.cs index 0879ad4780..384d409ff3 100644 --- a/test/Core.Test/AdminConsole/OrganizationFeatures/OrganizationUsers/ImportOrganizationUserCommandTests.cs +++ b/test/Core.Test/AdminConsole/OrganizationFeatures/OrganizationUsers/ImportOrganizationUserCommandTests.cs @@ -1,20 +1,18 @@ using Bit.Core.AdminConsole.Models.Business; using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers; -using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.Interfaces; using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers; using Bit.Core.AdminConsole.OrganizationFeatures.OrganizationUsers.InviteUsers.Models; +using Bit.Core.AdminConsole.Utilities.Commands; using Bit.Core.Auth.Models.Business.Tokenables; using Bit.Core.Context; using Bit.Core.Entities; using Bit.Core.Enums; using Bit.Core.Models.Business; -using Bit.Core.Models.Data; using Bit.Core.Models.Data.Organizations.OrganizationUsers; using Bit.Core.Repositories; using Bit.Core.Services; using Bit.Core.Test.AutoFixture.OrganizationFixtures; using Bit.Core.Tokens; -using Bit.Core.Tools.Enums; using Bit.Core.Tools.Models.Business; using Bit.Core.Tools.Services; using Bit.Test.Common.AutoFixture; @@ -36,41 +34,48 @@ public class ImportOrganizationUserCommandTests SutProvider sutProvider, Organization org, List existingUsers, - List newUsers - ) + List newUsers, + List newGroups) { - // Setup FakeDataProtectorTokenFactory for creating new tokens - this must come first in order to avoid resetting mocks - sutProvider.SetDependency(_orgUserInviteTokenDataFactory, "orgUserInviteTokenDataFactory"); - sutProvider.Create(); + SetupOrganizationConfigForImport(sutProvider, org, existingUsers, newUsers); + + var expectedNewUsersCount = newUsers.Count - 1; + var invitedOrganizationUsers = new List(); + var invites = new List(); + + foreach (var u in newUsers) + { + invitedOrganizationUsers.Add(new OrganizationUser { Email = u.Email + "@test.com", ExternalId = u.ExternalId }); + invites.Add(new OrganizationUserInviteCommandModel(u.Email + "@test.com", u.ExternalId)); + } + + var inviteCommandModel = new InviteOrganizationUsersRequest(invites.ToArray(), new InviteOrganization(org, null), Guid.Empty, DateTimeOffset.UtcNow); - org.UseDirectory = true; - org.Seats = 10; newUsers.Add(new ImportedOrganizationUser { Email = existingUsers.First().Email, ExternalId = existingUsers.First().ExternalId }); - var expectedNewUsersCount = newUsers.Count - 1; existingUsers.First().Type = OrganizationUserType.Owner; sutProvider.GetDependency().GetByIdAsync(org.Id).Returns(org); - - var organizationUserRepository = sutProvider.GetDependency(); - SetupOrgUserRepositoryCreateManyAsyncMock(organizationUserRepository); - - organizationUserRepository.GetManyDetailsByOrganizationAsync(org.Id) - .Returns(existingUsers); - organizationUserRepository.GetCountByOrganizationIdAsync(org.Id) - .Returns(existingUsers.Count); - sutProvider.GetDependency() - .HasConfirmedOwnersExceptAsync(org.Id, Arg.Any>()) - .Returns(true); + sutProvider.GetDependency().HasSecretsManagerStandalone(org).Returns(false); + sutProvider.GetDependency().GetManyDetailsByOrganizationAsync(org.Id).Returns(existingUsers); + sutProvider.GetDependency().GetCountByOrganizationIdAsync(org.Id).Returns(existingUsers.Count); sutProvider.GetDependency().ManageUsers(org.Id).Returns(true); + // Use the arranged command model + sutProvider.GetDependency().InviteImportedOrganizationUsersAsync(inviteCommandModel, org.Id) + // assert against this returned CommandResult response + .Returns(new Success(new InviteOrganizationUsersResponse(invitedOrganizationUsers, org.Id))); + await sutProvider.Sut.ImportAsync(org.Id, newGroups, newUsers, new List(), false, EventSystemUser.PublicApi); - await sutProvider.Sut.ImportAsync(org.Id, null, newUsers, null, false, EventSystemUser.PublicApi); - + await sutProvider.GetDependency().Received(1) + .InviteImportedOrganizationUsersAsync(Arg.Is( + // These are the invites that should get populated from the CommandResult response above + request => request.Invites.Count() == 0 + ), org.Id); await sutProvider.GetDependency().DidNotReceiveWithAnyArgs() .UpsertAsync(default); await sutProvider.GetDependency().Received(1) @@ -78,36 +83,23 @@ public class ImportOrganizationUserCommandTests await sutProvider.GetDependency().DidNotReceiveWithAnyArgs() .CreateAsync(default); - // Create new users - await sutProvider.GetDependency().Received(1) - .CreateManyAsync(Arg.Is>(users => users.Count() == expectedNewUsersCount)); - - await sutProvider.GetDependency().Received(1) - .SendInvitesAsync( - Arg.Is( - info => info.Users.Length == expectedNewUsersCount && - info.Organization == org)); - // Send events await sutProvider.GetDependency().Received(1) - .LogOrganizationUserEventsAsync(Arg.Is>(events => - events.Count() == expectedNewUsersCount)); + .LogOrganizationUserEventsAsync(Arg.Any>()); await sutProvider.GetDependency().Received(1) - .RaiseEventAsync(Arg.Is(referenceEvent => - referenceEvent.Type == ReferenceEventType.InvitedUsers && referenceEvent.Id == org.Id && - referenceEvent.Users == expectedNewUsersCount)); + .RaiseEventAsync(Arg.Any()); } [Theory, PaidOrganizationCustomize, BitAutoData] - public async Task OrgImportCreateNewUsersAndMarryExistingUser(SutProvider sutProvider, Organization org, List existingUsers, - List newUsers) + public async Task OrgImportCreateNewUsersAndMarryExistingUser( + SutProvider sutProvider, + Organization org, + List existingUsers, + List newUsers, + List newGroups) { - // Setup FakeDataProtectorTokenFactory for creating new tokens - this must come first in order to avoid resetting mocks - sutProvider.SetDependency(_orgUserInviteTokenDataFactory, "orgUserInviteTokenDataFactory"); - sutProvider.Create(); + SetupOrganizationConfigForImport(sutProvider, org, existingUsers, newUsers); - org.UseDirectory = true; - org.Seats = newUsers.Count + existingUsers.Count + 1; var reInvitedUser = existingUsers.First(); reInvitedUser.ExternalId = null; newUsers.Add(new ImportedOrganizationUser @@ -115,24 +107,16 @@ public class ImportOrganizationUserCommandTests Email = reInvitedUser.Email, ExternalId = reInvitedUser.Email, }); - var expectedNewUsersCount = newUsers.Count - 1; sutProvider.GetDependency().GetByIdAsync(org.Id).Returns(org); - sutProvider.GetDependency().GetManyDetailsByOrganizationAsync(org.Id) - .Returns(existingUsers); - sutProvider.GetDependency().GetCountByOrganizationIdAsync(org.Id) - .Returns(existingUsers.Count); - sutProvider.GetDependency().GetByIdAsync(reInvitedUser.Id) - .Returns(new OrganizationUser { Id = reInvitedUser.Id }); + sutProvider.GetDependency().GetManyDetailsByOrganizationAsync(org.Id).Returns(existingUsers); + sutProvider.GetDependency().GetCountByOrganizationIdAsync(org.Id).Returns(existingUsers.Count); + sutProvider.GetDependency().GetByIdAsync(reInvitedUser.Id).Returns(new OrganizationUser { Id = reInvitedUser.Id }); + sutProvider.GetDependency().InviteImportedOrganizationUsersAsync(Arg.Any(), org.Id) + .Returns(new Success(new InviteOrganizationUsersResponse(org.Id))); - var organizationUserRepository = sutProvider.GetDependency(); - SetupOrgUserRepositoryCreateManyAsyncMock(organizationUserRepository); - - var currentContext = sutProvider.GetDependency(); - currentContext.ManageUsers(org.Id).Returns(true); - - await sutProvider.Sut.ImportAsync(org.Id, null, newUsers, null, false, EventSystemUser.PublicApi); + await sutProvider.Sut.ImportAsync(org.Id, newGroups, newUsers, new List(), false, EventSystemUser.PublicApi); await sutProvider.GetDependency().DidNotReceiveWithAnyArgs() .UpsertAsync(default); @@ -145,47 +129,28 @@ public class ImportOrganizationUserCommandTests await sutProvider.GetDependency().Received(1) .UpsertManyAsync(Arg.Is>(users => users.Count() == 1)); - // Created and invited new users - await sutProvider.GetDependency().Received(1) - .CreateManyAsync(Arg.Is>(users => users.Count() == expectedNewUsersCount)); + await sutProvider.GetDependency().Received(1) + .InviteImportedOrganizationUsersAsync(Arg.Any(), org.Id); - await sutProvider.GetDependency().Received(1) - .SendInvitesAsync(Arg.Is(request => - request.Users.Length == expectedNewUsersCount && - request.Organization == org)); - - // Sent events + // Send events await sutProvider.GetDependency().Received(1) - .LogOrganizationUserEventsAsync(Arg.Is>(events => - events.Count(e => e.Item2 == EventType.OrganizationUser_Invited) == expectedNewUsersCount)); + .LogOrganizationUserEventsAsync(Arg.Any>()); await sutProvider.GetDependency().Received(1) - .RaiseEventAsync(Arg.Is(referenceEvent => - referenceEvent.Type == ReferenceEventType.InvitedUsers && referenceEvent.Id == org.Id && - referenceEvent.Users == expectedNewUsersCount)); + .RaiseEventAsync(Arg.Any()); + } - private void SetupOrgUserRepositoryCreateManyAsyncMock(IOrganizationUserRepository organizationUserRepository) + private void SetupOrganizationConfigForImport( + SutProvider sutProvider, + Organization org, + List existingUsers, + List newUsers) { - organizationUserRepository.CreateManyAsync(Arg.Any>()).Returns( - info => - { - var orgUsers = info.Arg>(); - foreach (var orgUser in orgUsers) - { - orgUser.Id = Guid.NewGuid(); - } + // Setup FakeDataProtectorTokenFactory for creating new tokens - this must come first in order to avoid resetting mocks + sutProvider.SetDependency(_orgUserInviteTokenDataFactory, "orgUserInviteTokenDataFactory"); + sutProvider.Create(); - return Task.FromResult>(orgUsers.Select(u => u.Id).ToList()); - } - ); - - organizationUserRepository.CreateAsync(Arg.Any(), Arg.Any>()).Returns( - info => - { - var orgUser = info.Arg(); - orgUser.Id = Guid.NewGuid(); - return Task.FromResult(orgUser.Id); - } - ); + org.UseDirectory = true; + org.Seats = newUsers.Count + existingUsers.Count + 1; } }