public void Test_Notify()
        {
            // Arrange
            var currentInstant = 27.December(2018).At(15, 48, 14).Utc();

            this.SetClock(currentInstant);

            var user = new ApplicationUser {
                Email = "[email protected]"
            };
            var otherUser = new ApplicationUser {
                Email = "[email protected]"
            };

            var allUsers = new[] { user, otherUser };

            var allocations = Create.Allocations(allUsers, 27.December(2018))
                              .Concat(Create.Allocations(allUsers, 28.December(2018)))
                              .ToArray();

            const bool DailySummaryDue  = false;
            const bool WeeklySummaryDue = false;

            this.SetupScheduledTasks(currentInstant, DailySummaryDue, WeeklySummaryDue);

            // Act
            using (var scope = this.CreateScope())
            {
                scope.ServiceProvider.GetRequiredService <AllocationNotifier>().Notify(allocations);
            }

            // Assert
            this.CheckNotifiedAllocations(allocations);
        }
        public void Test_Notify_ExcludesVisitorAccounts()
        {
            // Arrange
            var currentInstant = 27.December(2018).At(15, 48, 14).Utc();

            this.SetClock(currentInstant);

            var user = new ApplicationUser {
                Email = "[email protected]", IsVisitor = false
            };
            var visitorUser = new ApplicationUser {
                Email = "[email protected]", IsVisitor = true
            };

            var allUsers = new[] { user, visitorUser };

            var allocations = Create.Allocations(allUsers, 27.December(2018));

            const bool DailySummaryDue  = false;
            const bool WeeklySummaryDue = false;

            this.SetupScheduledTasks(currentInstant, DailySummaryDue, WeeklySummaryDue);

            // Act
            using (var scope = this.CreateScope())
            {
                scope.ServiceProvider.GetRequiredService <AllocationNotifier>().Notify(allocations);
            }

            // Assert
            var expectedNotifiedAllocations = allocations.Where(a => a.ApplicationUser == user);

            this.CheckNotifiedAllocations(expectedNotifiedAllocations.ToArray());
        }
        public static void TestBody_RecipientInterrupted()
        {
            var recipient = Create.User("Pierre-Emerick Aubameyang");

            var allocatedUsers   = Create.Users("Petr Čech", "Héctor Bellerín");
            var interruptedUsers = Create.Users("Sokratis Papastathopoulos", "Mohamed Elneny").Concat(new[] { recipient });

            var allUsers = allocatedUsers.Concat(interruptedUsers);

            var allocations = Create.Allocations(allocatedUsers, default(LocalDate));
            var requests    = Create.Requests(allUsers, default(LocalDate));

            var email = new DailySummary(recipient, allocations, requests);

            Assert.All(allocatedUsers, a => email.HtmlBody.Contains(a.FullName, StringComparison.InvariantCulture));
            Assert.All(allocatedUsers, a => email.PlainTextBody.Contains(a.FullName, StringComparison.InvariantCulture));

            const string ExpectedHtmlInterruptedText =
                "(Interrupted: <strong>Pierre-Emerick Aubameyang</strong>, Mohamed Elneny, Sokratis Papastathopoulos)";
            const string ExpectedPlainInterruptedText =
                "(Interrupted: *Pierre-Emerick Aubameyang*, Mohamed Elneny, Sokratis Papastathopoulos)";

            Assert.True(email.HtmlBody.Contains(ExpectedHtmlInterruptedText, StringComparison.InvariantCulture));
            Assert.True(email.PlainTextBody.Contains(ExpectedPlainInterruptedText, StringComparison.InvariantCulture));
        }
        public static void TestSubject_RecipientInterrupted()
        {
            var date = 18.December(2018);

            var recipient = Create.User("Pierre-Emerick Aubameyang");

            var allocatedUsers   = Create.Users("Petr Čech", "Héctor Bellerín");
            var interruptedUsers = Create.Users("Sokratis Papastathopoulos", "Mohamed Elneny").Concat(new[] { recipient });

            var allUsers = allocatedUsers.Concat(interruptedUsers);

            var allocations = Create.Allocations(allocatedUsers, date);
            var requests    = Create.Requests(allUsers, date);

            var email = new DailySummary(recipient, allocations, requests);

            Assert.Equal("[INTERRUPTED] 18 Dec Daily allocations summary", email.Subject);
        }
        public static void TestBody()
        {
            var recipient = Create.User("Pierre-Emerick Aubameyang");

            var firstDateAllocatedUsers   = Create.Users("Petr Čech", "Héctor Bellerín").Concat(new[] { recipient });
            var firstDateInterruptedUsers = Create.Users("Sokratis Papastathopoulos", "Mohamed Elneny");

            var secondDateAllocatedUsers   = Create.Users("Henrikh Mkhitaryan", "Laurent Koscielny");
            var secondDateInterruptedUsers = Create.Users("Aaron Ramsey", "Alexandre Lacazette").Concat(new[] { recipient });

            var allFirstDateUsers  = firstDateAllocatedUsers.Concat(firstDateInterruptedUsers);
            var allSecondDateUsers = secondDateAllocatedUsers.Concat(secondDateInterruptedUsers);

            var allocations = Create.Allocations(secondDateAllocatedUsers, 21.December(2018))
                              .Concat(Create.Allocations(firstDateAllocatedUsers, 17.December(2018)));

            var requests = Create.Requests(allSecondDateUsers, 21.December(2018))
                           .Concat(Create.Requests(allFirstDateUsers, 17.December(2018)));

            var email = new WeeklySummary(recipient, allocations.ToArray(), requests.ToArray());

            var expectedHtmlValues = new[]
            {
                "17 Dec:", "<strong>Pierre-Emerick Aubameyang</strong>", "Héctor Bellerín", "Petr Čech", "(Interrupted: Mohamed Elneny, Sokratis Papastathopoulos)",
                "21 Dec:", "Laurent Koscielny", "Henrikh Mkhitaryan", "(Interrupted: <strong>Pierre-Emerick Aubameyang</strong>, Alexandre Lacazette, Aaron Ramsey)"
            };

            var expectedPlainTextValues = new[]
            {
                "17 Dec:", "*Pierre-Emerick Aubameyang*", "Héctor Bellerín", "Petr Čech", "(Interrupted: Mohamed Elneny, Sokratis Papastathopoulos)",
                "21 Dec:", "Laurent Koscielny", "Henrikh Mkhitaryan", "(Interrupted: *Pierre-Emerick Aubameyang*, Alexandre Lacazette, Aaron Ramsey)"
            };

            Check_TextAppearsInOrder(expectedHtmlValues, email.HtmlBody);
            Check_TextAppearsInOrder(expectedPlainTextValues, email.PlainTextBody);
        }