コード例 #1
0
        public void Test_AddToQueue()
        {
            // Arrange
            var instant = 18.June(2019).At(23, 0, 0).Utc();

            this.SetClock(instant);

            var email = new RequestReminder("*****@*****.**", 1.July(2019), 5.July(2019));

            using (var scope = this.CreateScope())
            {
                // Act
                scope.ServiceProvider
                .GetRequiredService <IEmailRepository>()
                .AddToQueue(email);
            }

            using (var scope = this.CreateScope())
            {
                var context = scope.ServiceProvider.GetRequiredService <ApplicationDbContext>();

                var emails = context.EmailQueueItems.ToArray();

                Assert.Single(emails);

                var actual = emails[0];

                Assert.Equal(email.To, actual.To);
                Assert.Equal(email.Subject, actual.Subject);
                Assert.Equal(email.PlainTextBody, actual.PlainTextBody);
                Assert.Equal(email.HtmlBody, actual.HtmlBody);
                Assert.Equal(instant, actual.AddedTime);
            }
        }
コード例 #2
0
        public static void To_returns_email_address_of_corresponding_user(string emailAddress)
        {
            var template = new RequestReminder(
                CreateUser.With(userId: "user1", emailAddress: emailAddress),
                new DateInterval(21.December(2020), 24.December(2020)).ToArray());

            Assert.Equal(emailAddress, template.To);
        }
コード例 #3
0
        public static void TestBody()
        {
            var email = new RequestReminder(default(string), 17.December(2018), 21.December(2018));

            const string ExpectedText = "No requests have yet been entered for 17 Dec - 21 Dec";

            Assert.True(email.HtmlBody.Contains(ExpectedText, StringComparison.InvariantCulture));
            Assert.True(email.PlainTextBody.Contains(ExpectedText, StringComparison.InvariantCulture));
        }
コード例 #4
0
        public static void ScheduledTaskType_returns_RequestReminder()
        {
            var requestReminder = new RequestReminder(
                Mock.Of <IDateCalculator>(),
                Mock.Of <IEmailRepository>(),
                Mock.Of <IRequestRepository>(),
                Mock.Of <IUserRepository>());

            Assert.Equal(ScheduledTaskType.RequestReminder, requestReminder.ScheduledTaskType);
        }
コード例 #5
0
        public static void GetNextRunTime_uses_London_time_zone()
        {
            var dateCalculator = CreateDateCalculator(26.March(2020).AtMidnight().Utc());

            var actual = new RequestReminder(
                dateCalculator,
                Mock.Of <IEmailRepository>(),
                Mock.Of <IRequestRepository>(),
                Mock.Of <IUserRepository>()).GetNextRunTime();

            var expected = 31.March(2020).At(23, 0, 0).Utc();

            Assert.Equal(expected, actual);
        }
コード例 #6
0
        public static void GetNextRunTime_returns_midnight_on_next_Wednesday(int currentDay, int expectedNextDay)
        {
            var dateCalculator = CreateDateCalculator(currentDay.December(2020).AtMidnight().Utc());

            var actual = new RequestReminder(
                dateCalculator,
                Mock.Of <IEmailRepository>(),
                Mock.Of <IRequestRepository>(),
                Mock.Of <IUserRepository>()).GetNextRunTime();

            var expected = expectedNextDay.December(2020).AtMidnight().Utc();

            Assert.Equal(expected, actual);
        }
コード例 #7
0
        public static async Task Sends_emails_to_users_with_no_upcoming_requests()
        {
            var nextWeeklyNotificationDates = new[] { 21.December(2020), 22.December(2020) };

            var mockDateCalculator = new Mock <IDateCalculator>(MockBehavior.Strict);

            mockDateCalculator
            .Setup(d => d.GetNextWeeklyNotificationDates())
            .Returns(nextWeeklyNotificationDates);

            var mockEmailRepository = new Mock <IEmailRepository>();

            var requests = new[]
            {
                new Request("user1", 18.December(2020), RequestStatus.Allocated),
                new Request("user1", 21.December(2020), RequestStatus.Cancelled)
            };

            var mockRequestRepository = new Mock <IRequestRepository>(MockBehavior.Strict);

            mockRequestRepository
            .Setup(r => r.GetRequests(22.October(2020), 22.December(2020)))
            .ReturnsAsync(requests);

            var user = CreateUser.With(userId: "user1", emailAddress: "*****@*****.**");

            var mockUserRepository = new Mock <IUserRepository>(MockBehavior.Strict);

            mockUserRepository
            .Setup(r => r.GetUsers())
            .ReturnsAsync(new[] { user });

            var requestReminder = new RequestReminder(
                mockDateCalculator.Object,
                mockEmailRepository.Object,
                mockRequestRepository.Object,
                mockUserRepository.Object);

            await requestReminder.Run();

            mockEmailRepository.Verify(
                r => r.Send(It.Is <IEmailTemplate>(e =>
                                                   e.To == "*****@*****.**" && e.Subject == "No parking requests entered for Mon 21 Dec - Tue 22 Dec")),
                Times.Once);
            mockEmailRepository.VerifyNoOtherCalls();
        }
コード例 #8
0
        public static void Subject_contains_requests_date_range(
            int firstMonth,
            int firstDay,
            int lastMonth,
            int lastDay,
            string expectedSubject)
        {
            var user = CreateUser.With(userId: "user1", emailAddress: "*****@*****.**");

            var template = new RequestReminder(
                user,
                new DateInterval(
                    new LocalDate(2020, firstMonth, firstDay),
                    new LocalDate(2020, lastMonth, lastDay)).ToArray());

            Assert.Equal(expectedSubject, template.Subject);
        }
コード例 #9
0
        public static async Task Does_not_send_emails_to_users_with_no_recent_requests()
        {
            var nextWeeklyNotificationDates = new[] { 21.December(2020), 22.December(2020) };

            var mockDateCalculator = new Mock <IDateCalculator>(MockBehavior.Strict);

            mockDateCalculator
            .Setup(d => d.GetNextWeeklyNotificationDates())
            .Returns(nextWeeklyNotificationDates);

            var mockEmailRepository = new Mock <IEmailRepository>();

            var requests = new[]
            {
                new Request("user1", 18.December(2020), RequestStatus.Cancelled),
            };

            var mockRequestRepository = new Mock <IRequestRepository>(MockBehavior.Strict);

            mockRequestRepository
            .Setup(r => r.GetRequests(22.October(2020), 22.December(2020)))
            .ReturnsAsync(requests);

            var users = new[]
            {
                CreateUser.With(userId: "user1", emailAddress: "*****@*****.**"),
                CreateUser.With(userId: "user2", emailAddress: "*****@*****.**")
            };

            var mockUserRepository = new Mock <IUserRepository>(MockBehavior.Strict);

            mockUserRepository
            .Setup(r => r.GetUsers())
            .ReturnsAsync(users);

            var requestReminder = new RequestReminder(
                mockDateCalculator.Object,
                mockEmailRepository.Object,
                mockRequestRepository.Object,
                mockUserRepository.Object);

            await requestReminder.Run();

            mockEmailRepository.VerifyNoOtherCalls();
        }
コード例 #10
0
        public static void Body_contains_requests_date_range()
        {
            var template = new RequestReminder(
                CreateUser.With(userId: "user1", emailAddress: "*****@*****.**"),
                new DateInterval(21.December(2020), 24.December(2020)).ToArray());

            const string ExpectedPlainTextBody =
                "No requests have yet been entered for Mon 21 Dec - Thu 24 Dec.\r\n\r\n" +
                "If you do not need parking during this period you can ignore this message.\r\n\r\n" +
                "Otherwise, you should enter requests by the end of today to have them taken into account.\r\n\r\n" +
                "If you do not want to receive these emails, you can turn them off from your profile page in the app.";
            const string ExpectedHtmlTextBody =
                "<p>No requests have yet been entered for Mon 21 Dec - Thu 24 Dec.</p>\r\n" +
                "<p>If you do not need parking during this period you can ignore this message.</p>\r\n" +
                "<p>Otherwise, you should enter requests by the end of today to have them taken into account.</p>\r\n" +
                "<p>If you do not want to receive these emails, you can turn them off from your profile page in the app.</p>";

            Assert.Equal(ExpectedPlainTextBody, template.PlainTextBody);
            Assert.Equal(ExpectedHtmlTextBody, template.HtmlBody);
        }
コード例 #11
0
        public static void TestSubject()
        {
            var email = new RequestReminder(default(string), 17.December(2018), 21.December(2018));

            Assert.Equal("No requests entered for 17 Dec - 21 Dec", email.Subject);
        }
コード例 #12
0
        public static void TestTo(string to)
        {
            var email = new RequestReminder(to, default(LocalDate), default(LocalDate));

            Assert.Equal(to, email.To);
        }