public void SendOutMailsThatAreDue_ClaimedDueDateHasPassedLongAgo_StatusDoSomething()
        {
            using (ShimsContext.Create())
            {
                var result = new AutomaticMailSendTestResult();

                SetupAutomaticMailSendingEngine("12:Krävd", DateTime.Now.AddDays(-24), new DateTime(1970, 1, 1), result).SendOutMailsThatAreDue();

                Assert.AreEqual(1, result.NumberOfLogMessages, "Number of messages logged was not as expected.");
                Assert.AreEqual(1, result.NumberOfReindexes, "Number of reindexes was not as expected.");
                Assert.AreEqual(1, result.NumberOfSignals, "Number of signals was not as expected.");
                Assert.AreEqual(null, result.MailTemplate, "The fetched template was not as expected.");
                Assert.AreEqual("02:Åtgärda", result.NewStatus, "The new status was not as expected.");
            }
        }
        public void SendOutMailsThatAreDue_ClaimedDueDateWasTenDaysAgo_LoanPeriodReallyReallyOverMailIsSentOut()
        {
            using (ShimsContext.Create())
            {
                var result = new AutomaticMailSendTestResult();

                SetupAutomaticMailSendingEngine("12:Krävd", DateTime.Now.AddDays(-10), new DateTime(1970, 1, 1), result).SendOutMailsThatAreDue();

                Assert.AreEqual(2, result.NumberOfLogMessages, "Number of messages logged was not as expected.");
                Assert.AreEqual(1, result.NumberOfReindexes, "Number of reindexes was not as expected.");
                Assert.AreEqual(1, result.NumberOfSignals, "Number of signals was not as expected.");
                Assert.AreEqual("LoanPeriodReallyReallyOverMailTemplate", result.MailTemplate, "The fetched template was not as expected.");
                Assert.AreEqual(null, result.NewStatus, "The new status was not as expected.");
            }
        }
        public void SendOutMailsThatAreDue_ClaimedDueDateIsFarIntoTheFuture_NothingHappens()
        {
            using (ShimsContext.Create())
            {
                var result = new AutomaticMailSendTestResult();

                SetupAutomaticMailSendingEngine("12:Krävd", DateTime.Now.AddDays(24), new DateTime(1970, 1, 1), result).SendOutMailsThatAreDue();

                Assert.AreEqual(0, result.NumberOfLogMessages, "Number of messages logged was not as expected.");
                Assert.AreEqual(0, result.NumberOfReindexes, "Number of reindexes was not as expected.");
                Assert.AreEqual(0, result.NumberOfSignals, "Number of signals was not as expected.");
                Assert.AreEqual(null, result.MailTemplate, "The fetched template was not as expected.");
                Assert.AreEqual(null, result.NewStatus, "The new status was not as expected.");
            }
        }
        public void SendOutMailsThatAreDue_OnLoanDueDateIsInFiveDays_CourtesyNoticeIsSentOut()
        {
            using (ShimsContext.Create())
            {
                var result = new AutomaticMailSendTestResult();

                SetupAutomaticMailSendingEngine("11:Utlånad", DateTime.Now.AddDays(5), new DateTime(1970, 1, 1), result).SendOutMailsThatAreDue();

                Assert.AreEqual(2, result.NumberOfLogMessages, "Number of messages logged was not as expected.");
                Assert.AreEqual(1, result.NumberOfReindexes, "Number of reindexes was not as expected.");
                Assert.AreEqual(1, result.NumberOfSignals, "Number of signals was not as expected.");
                Assert.AreEqual("CourtesyNoticeMailTemplate", result.MailTemplate, "The fetched template was not as expected.");
                Assert.AreEqual(null, result.NewStatus, "The new status was not as expected.");
            }
        }
        private IAutomaticMailSendingEngine SetupAutomaticMailSendingEngine(string status, DateTime dueDate, DateTime deliveryDate, AutomaticMailSendTestResult result)
        {
            var fakeSearchResults = new List <OrderItemModel>()
            {
                new OrderItemModel()
                {
                    Status       = status,
                    OrderId      = "cth-123",
                    PatronName   = "John Doe",
                    PatronEmail  = "*****@*****.**",
                    DueDate      = dueDate,
                    DeliveryDate = deliveryDate
                }
            };

            IOrderItemSearcher orderItemsSearcher = GetFakeSearcher(fakeSearchResults);

            ITemplateService templateService = new Templates.Fakes.StubITemplateService()
            {
                GetTemplateDataStringOrderItemModel = (nodeName, orderItem) =>
                {
                    result.MailTemplate = nodeName;
                    return("FEJKMAIL");
                }
            };

            IOrderItemManager orderItemManager = new Chalmers.ILL.OrderItems.Fakes.StubIOrderItemManager()
            {
                SetStatusInt32StringStringBooleanBoolean = (nodeId, statusPrevalue, eventId, doReindex, doSignal) =>
                {
                    result.NewStatus = statusPrevalue;

                    if (doReindex)
                    {
                        result.NumberOfReindexes++;
                    }

                    if (doSignal)
                    {
                        result.NumberOfSignals++;
                    }
                },
                AddLogItemInt32StringStringStringBooleanBoolean = (nodeId, type, msg, eventId, doReindex, doSignal) =>
                {
                    result.NumberOfLogMessages++;

                    if (doReindex)
                    {
                        result.NumberOfReindexes++;
                    }

                    if (doSignal)
                    {
                        result.NumberOfSignals++;
                    }
                }
            };

            IMailService mailService = new Chalmers.ILL.Mail.Fakes.StubIMailService()
            {
                SendMailOutgoingMailModel = (mailModel) =>
                {
                    Assert.AreEqual("cth-123", mailModel.OrderId, "The order id was not as expected.");
                    Assert.AreEqual("John Doe", mailModel.recipientName, "The recipient name was not as expected.");
                    Assert.AreEqual("*****@*****.**", mailModel.recipientEmail, "The recipient email address was not as expected.");
                    Assert.AreEqual("FEJKMAIL", mailModel.message, "The sent email message was not as expected.");
                }
            };

            return(new AutomaticMailSendingEngine(orderItemsSearcher, templateService, orderItemManager, mailService));
        }