using System; using System.Collections.Generic; using System.Threading.Tasks; using Bit.Core.Models.Data; using Bit.Core.Models.Table; using Bit.Core.Repositories; using Bit.Core.Services; using Microsoft.AspNetCore.DataProtection; using NSubstitute; using Xunit; namespace Bit.Core.Test.Services { public class OrganizationServiceTests { [Fact] public async Task OrgImportCreateNewUsers() { var orgRepo = Substitute.For(); var orgUserRepo = Substitute.For(); var collectionRepo = Substitute.For(); var userRepo = Substitute.For(); var groupRepo = Substitute.For(); var dataProtector = Substitute.For(); var mailService = Substitute.For(); var pushNotService = Substitute.For(); var pushRegService = Substitute.For(); var deviceRepo = Substitute.For(); var licenseService = Substitute.For(); var eventService = Substitute.For(); var installationRepo = Substitute.For(); var appCacheService = Substitute.For(); var paymentService = Substitute.For(); var globalSettings = Substitute.For(); var orgService = new OrganizationService(orgRepo, orgUserRepo, collectionRepo, userRepo, groupRepo, dataProtector, mailService, pushNotService, pushRegService, deviceRepo, licenseService, eventService, installationRepo, appCacheService, paymentService, globalSettings); var id = Guid.NewGuid(); var userId = Guid.NewGuid(); var org = new Organization { Id = id, Name = "Test Org", UseDirectory = true, UseGroups = true, Seats = 3 }; orgRepo.GetByIdAsync(id).Returns(org); var existingUsers = new List(); existingUsers.Add(new OrganizationUserUserDetails { Id = Guid.NewGuid(), ExternalId = "a", Email = "a@test.com" }); orgUserRepo.GetManyDetailsByOrganizationAsync(id).Returns(existingUsers); orgUserRepo.GetCountByOrganizationIdAsync(id).Returns(1); var newUsers = new List(); newUsers.Add(new Models.Business.ImportedOrganizationUser { Email = "a@test.com", ExternalId = "a" }); newUsers.Add(new Models.Business.ImportedOrganizationUser { Email = "b@test.com", ExternalId = "b" }); newUsers.Add(new Models.Business.ImportedOrganizationUser { Email = "c@test.com", ExternalId = "c" }); await orgService.ImportAsync(id, userId, null, newUsers, null); await orgUserRepo.DidNotReceive().UpsertAsync(Arg.Any()); await orgUserRepo.Received(2).CreateAsync(Arg.Any()); } [Fact] public async Task OrgImportCreateNewUsersAndMarryExistingUser() { var orgRepo = Substitute.For(); var orgUserRepo = Substitute.For(); var collectionRepo = Substitute.For(); var userRepo = Substitute.For(); var groupRepo = Substitute.For(); var dataProtector = Substitute.For(); var mailService = Substitute.For(); var pushNotService = Substitute.For(); var pushRegService = Substitute.For(); var deviceRepo = Substitute.For(); var licenseService = Substitute.For(); var eventService = Substitute.For(); var installationRepo = Substitute.For(); var appCacheService = Substitute.For(); var paymentService = Substitute.For(); var globalSettings = Substitute.For(); var orgService = new OrganizationService(orgRepo, orgUserRepo, collectionRepo, userRepo, groupRepo, dataProtector, mailService, pushNotService, pushRegService, deviceRepo, licenseService, eventService, installationRepo, appCacheService, paymentService, globalSettings); var id = Guid.NewGuid(); var userId = Guid.NewGuid(); var org = new Organization { Id = id, Name = "Test Org", UseDirectory = true, UseGroups = true, Seats = 3 }; orgRepo.GetByIdAsync(id).Returns(org); var existingUserAId = Guid.NewGuid(); var existingUsers = new List(); existingUsers.Add(new OrganizationUserUserDetails { Id = existingUserAId, // No external id here Email = "a@test.com" }); orgUserRepo.GetManyDetailsByOrganizationAsync(id).Returns(existingUsers); orgUserRepo.GetCountByOrganizationIdAsync(id).Returns(1); orgUserRepo.GetByIdAsync(existingUserAId).Returns(new OrganizationUser { Id = existingUserAId }); var newUsers = new List(); newUsers.Add(new Models.Business.ImportedOrganizationUser { Email = "a@test.com", ExternalId = "a" }); newUsers.Add(new Models.Business.ImportedOrganizationUser { Email = "b@test.com", ExternalId = "b" }); newUsers.Add(new Models.Business.ImportedOrganizationUser { Email = "c@test.com", ExternalId = "c" }); await orgService.ImportAsync(id, userId, null, newUsers, null); await orgUserRepo.Received(1).UpsertAsync(Arg.Any()); await orgUserRepo.Received(2).CreateAsync(Arg.Any()); } } }