public async Task GetNextMembersPageTest()
        {
            var mockLogs        = new MockLoggingRepository();
            var telemetryClient = new TelemetryClient(TelemetryConfiguration.CreateDefault());
            var mockGraphGroup  = new Mock <IGraphGroupRepository>();
            var mockMail        = new MockMailRepository();
            var mailSenders     = new EmailSenderRecipient("*****@*****.**", "fake_pass", "*****@*****.**", "*****@*****.**", "*****@*****.**");
            var mockSynJobs     = new MockSyncJobRepository();
            var dryRun          = new DryRunValue(false);

            var samplePageResponse = GetPageSampleResponse(100, true);

            var userCount = 100;

            mockGraphGroup.Setup(x => x.GetNextUsersPageAsync(It.IsAny <string>(), It.IsAny <IGroupTransitiveMembersCollectionWithReferencesPage>()))
            .ReturnsAsync(samplePageResponse);

            var graphUpdaterService = new GraphUpdaterService(mockLogs, telemetryClient, mockGraphGroup.Object, mockMail, mailSenders, mockSynJobs, dryRun);

            var groupId     = Guid.NewGuid();
            var runId       = Guid.NewGuid();
            var nextPageUrl = samplePageResponse.nextPageUrl;

            var response = await graphUpdaterService.GetNextMembersPageAsync(nextPageUrl, samplePageResponse.usersFromGroup, runId);

            Assert.IsNotNull(response.NextPageUrl);
            Assert.AreEqual(userCount, response.Members.Count);
        }
        public async Task RemoveUsersToGroupInDryRunMode()
        {
            var mockLogs            = new MockLoggingRepository();
            var telemetryClient     = new TelemetryClient(TelemetryConfiguration.CreateDefault());
            var mockGraphGroup      = new MockGraphGroupRepository();
            var mockMail            = new MockMailRepository();
            var mailSenders         = new EmailSenderRecipient("*****@*****.**", "fake_pass", "*****@*****.**", "*****@*****.**", "*****@*****.**");
            var mockSynJobs         = new MockSyncJobRepository();
            var dryRun              = new DryRunValue(true);
            var graphUpdaterService = new GraphUpdaterService(mockLogs, telemetryClient, mockGraphGroup, mockMail, mailSenders, mockSynJobs, dryRun);

            var  runId         = Guid.NewGuid();
            var  groupId       = Guid.NewGuid();
            bool isInitialSync = false;

            var newUsers  = new List <AzureADUser>();
            var userCount = 10;

            for (int i = 0; i < userCount; i++)
            {
                newUsers.Add(new AzureADUser {
                    ObjectId = Guid.NewGuid()
                });
            }

            mockGraphGroup.GroupsToUsers.Add(groupId, newUsers);

            var status = await graphUpdaterService.RemoveUsersFromGroupAsync(newUsers.Take(5).ToList(), groupId, runId, isInitialSync);

            Assert.AreEqual(GraphUpdaterStatus.Ok, status.Status);
            Assert.AreEqual(newUsers.Count, mockGraphGroup.GroupsToUsers[groupId].Count);
        }
        public async Task UpdateSyncJobStatusDryRunModeTest()
        {
            var mockLogs        = new MockLoggingRepository();
            var telemetryClient = new TelemetryClient(TelemetryConfiguration.CreateDefault());
            var mockGraphGroup  = new MockGraphGroupRepository();
            var mockMail        = new MockMailRepository();
            var mailSenders     = new EmailSenderRecipient("*****@*****.**", "fake_pass", "*****@*****.**", "*****@*****.**", "*****@*****.**");
            var mockSynJobs     = new MockSyncJobRepository();
            var dryRun          = new DryRunValue(false);

            var graphUpdaterService = new GraphUpdaterService(mockLogs, telemetryClient, mockGraphGroup, mockMail, mailSenders, mockSynJobs, dryRun);

            var runId       = Guid.NewGuid();
            var lastRunTime = DateTime.UtcNow.AddDays(-1);
            var job         = new SyncJob {
                PartitionKey = "00-00-00", RowKey = Guid.NewGuid().ToString(), Status = SyncStatus.InProgress.ToString(), Enabled = true, DryRunTimeStamp = lastRunTime
            };

            mockSynJobs.ExistingSyncJobs.Add((job.PartitionKey, job.RowKey), job);

            await graphUpdaterService.UpdateSyncJobStatusAsync(job, SyncStatus.Idle, true, runId);

            Assert.AreEqual(SyncStatus.Idle.ToString(), job.Status);
            Assert.IsTrue(job.DryRunTimeStamp > lastRunTime);
            Assert.IsTrue(job.LastRunTime < lastRunTime);
            Assert.IsNotNull(job.RunId);
        }
        public async Task GroupExistsSocketExceptionTest()
        {
            var mockLogs        = new MockLoggingRepository();
            var telemetryClient = new TelemetryClient(TelemetryConfiguration.CreateDefault());
            var mockGraphGroup  = new Mock <IGraphGroupRepository>();
            var mockMail        = new MockMailRepository();
            var mailSenders     = new EmailSenderRecipient("*****@*****.**", "fake_pass", "*****@*****.**", "*****@*****.**", "*****@*****.**");
            var mockSynJobs     = new MockSyncJobRepository();
            var dryRun          = new DryRunValue(false);

            var attemptNumber = 1;

            mockGraphGroup.Setup(x => x.GroupExists(It.IsAny <Guid>())).Callback(() =>
            {
                if (attemptNumber == 1)
                {
                    attemptNumber++;
                    throw new SocketException();
                }
            }).ReturnsAsync(true);

            var graphUpdaterService = new GraphUpdaterService(mockLogs, telemetryClient, mockGraphGroup.Object, mockMail, mailSenders, mockSynJobs, dryRun);

            var groupId  = Guid.NewGuid();
            var runId    = Guid.NewGuid();
            var response = await graphUpdaterService.GroupExistsAsync(groupId, runId);

            Assert.IsTrue(response.Result);
            Assert.IsTrue(mockLogs.MessagesLogged.Any(x => x.Message.Contains("Got a transient SocketException")));
        }
        public async Task GetGroupNameTest()
        {
            var mockLogs            = new MockLoggingRepository();
            var telemetryClient     = new TelemetryClient(TelemetryConfiguration.CreateDefault());
            var mockGraphGroup      = new Mock <IGraphGroupRepository>();
            var mockMail            = new MockMailRepository();
            var mailSenders         = new EmailSenderRecipient("*****@*****.**", "fake_pass", "*****@*****.**", "*****@*****.**", "*****@*****.**");
            var mockSynJobs         = new MockSyncJobRepository();
            var dryRun              = new DryRunValue(false);
            var graphUpdaterService = new GraphUpdaterService(mockLogs, telemetryClient, mockGraphGroup.Object, mockMail, mailSenders, mockSynJobs, dryRun);

            var groupName = "MyTestGroup";

            mockGraphGroup.Setup(x => x.GetGroupNameAsync(It.IsAny <Guid>())).ReturnsAsync(groupName);

            var response = await graphUpdaterService.GetGroupNameAsync(Guid.NewGuid());

            Assert.AreEqual(groupName, response);
        }
        public async Task SendEmailTest()
        {
            var mockLogs        = new MockLoggingRepository();
            var telemetryClient = new TelemetryClient(TelemetryConfiguration.CreateDefault());
            var mockGraphGroup  = new MockGraphGroupRepository();
            var mockMail        = new MockMailRepository();
            var mailSenders     = new EmailSenderRecipient("*****@*****.**", "fake_pass", "*****@*****.**", "*****@*****.**", "*****@*****.**");
            var mockSynJobs     = new MockSyncJobRepository();
            var dryRun          = new DryRunValue(false);

            var graphUpdaterService = new GraphUpdaterService(mockLogs, telemetryClient, mockGraphGroup, mockMail, mailSenders, mockSynJobs, dryRun);

            var toEmail  = "user@domain";
            var template = "SampleTemplate";
            var runId    = Guid.NewGuid();
            await graphUpdaterService.SendEmailAsync(toEmail, template, new string[0] {
            }, runId);

            Assert.AreEqual(1, mockMail.SentEmails.Count);
        }
        public async Task GroupExistsTest()
        {
            var mockLogs        = new MockLoggingRepository();
            var telemetryClient = new TelemetryClient(TelemetryConfiguration.CreateDefault());
            var mockGraphGroup  = new MockGraphGroupRepository();
            var mockMail        = new MockMailRepository();
            var mailSenders     = new EmailSenderRecipient("*****@*****.**", "fake_pass", "*****@*****.**", "*****@*****.**", "*****@*****.**");
            var mockSynJobs     = new MockSyncJobRepository();
            var dryRun          = new DryRunValue(false);

            var graphUpdaterService = new GraphUpdaterService(mockLogs, telemetryClient, mockGraphGroup, mockMail, mailSenders, mockSynJobs, dryRun);

            var groupId = Guid.NewGuid();
            var runId   = Guid.NewGuid();

            mockGraphGroup.GroupsToUsers.Add(groupId, new List <AzureADUser>());

            var response = await graphUpdaterService.GroupExistsAsync(groupId, runId);

            Assert.IsTrue(response.Result);
        }