public void TrickleThreeMessagesOverTenMinutesOneMessageFailsCoordinatorStillCompletes()
        {
            var coordinatorId          = Guid.NewGuid();
            var ravenScheduleDocuments = MockRepository.GenerateStrictMock <IRavenScheduleDocuments>();

            ravenScheduleDocuments.Expect(r => r.SaveCoordinator(Arg <CoordinatorCreated> .Is.Anything));
            ravenScheduleDocuments.Expect(r => r.SaveSchedules(Arg <List <ScheduleSmsForSendingLater> > .Is.Anything, Arg <Guid> .Is.Anything));
            ravenScheduleDocuments.Expect(r => r.AreCoordinatedSchedulesComplete(coordinatorId)).Return(true);
            ravenScheduleDocuments.Expect(r => r.MarkCoordinatorAsComplete(Arg <Guid> .Is.Equal(coordinatorId), Arg <DateTime> .Is.Anything));
            ravenScheduleDocuments.Expect(r => r.GetScheduleSummary(coordinatorId)).Return(new List <ScheduledMessagesStatusCountInCoordinatorIndex.ReduceResult>());
            var startTime = DateTime.Now.AddHours(3);
            var duration  = new TimeSpan(0, 10, 0);
            var trickleMultipleMessages = new TrickleSmsOverCalculatedIntervalsBetweenSetDates
            {
                StartTimeUtc = startTime,
                Messages     = new List <SmsData>
                {
                    new SmsData("mobile#1", "message"),
                    new SmsData("mobile#2", "message2"),
                    new SmsData("mobile#3", "message3")
                },
                Duration      = duration,
                CoordinatorId = coordinatorId,
                MetaData      = new SmsMetaData()
            };

            var timingManager = MockRepository.GenerateMock <ICalculateSmsTiming>();
            var messageTiming = new List <DateTime> {
                startTime, startTime.AddMinutes(5), startTime.AddMinutes(10)
            };

            timingManager.Expect(t => t.CalculateTiming(startTime, duration, 3))
            .Return(messageTiming);

            var sagaData = new CoordinateSmsSchedulingData {
                Id = Guid.NewGuid(), Originator = "o", OriginalMessageId = "i"
            };

            Test.Initialize();
            Test.Saga <CoordinateSmsScheduler>()
            .WithExternalDependencies(s =>
            {
                s.TimingManager          = timingManager;
                s.Data                   = sagaData;
                s.RavenScheduleDocuments = ravenScheduleDocuments;
            })
            .ExpectSend <ScheduleSmsForSendingLater>(l => l.SmsData.Mobile == trickleMultipleMessages.Messages[0].Mobile)
            .ExpectSend <ScheduleSmsForSendingLater>(l => l.SmsData.Mobile == trickleMultipleMessages.Messages[1].Mobile)
            .ExpectSend <ScheduleSmsForSendingLater>(l => l.SmsData.Mobile == trickleMultipleMessages.Messages[2].Mobile)
            .ExpectPublish <CoordinatorCreated>()
            .ExpectTimeoutToBeSetAt <CoordinatorTimeout>((state, timeout) => true)
            .When(s => s.Handle(trickleMultipleMessages))
            .AssertSagaCompletionIs(false)
            .ExpectPublish <CoordinatorCompleted>()
            .When(s => s.Timeout(new CoordinatorTimeout()))
            .AssertSagaCompletionIs(true);

            timingManager.VerifyAllExpectations();
        }
        public void TrickleThreeMessagesFirstSentPausedThenResumedOutOfOrder()
        {
            var startTime              = DateTime.Now.AddHours(3);
            var duration               = new TimeSpan(0, 10, 0);
            var coordinatorId          = Guid.NewGuid();
            var ravenScheduleDocuments = MockRepository.GenerateStrictMock <IRavenScheduleDocuments>();

            ravenScheduleDocuments.Expect(r => r.SaveSchedules(Arg <List <ScheduleSmsForSendingLater> > .Is.Anything, Arg <Guid> .Is.Anything));
            ravenScheduleDocuments.Expect(r => r.SaveCoordinator(Arg <CoordinatorCreated> .Is.Anything));
            ravenScheduleDocuments.Expect(r => r.GetActiveScheduleTrackingData(coordinatorId)).Return(new List <ScheduleTrackingData> {
                new ScheduleTrackingData(), new ScheduleTrackingData()
            });
            ravenScheduleDocuments.Expect(r => r.AreCoordinatedSchedulesComplete(coordinatorId)).Return(true);
            ravenScheduleDocuments.Expect(r => r.MarkCoordinatorAsComplete(Arg <Guid> .Is.Equal(coordinatorId), Arg <DateTime> .Is.Anything));
            ravenScheduleDocuments.Expect(r => r.GetScheduleSummary(coordinatorId)).Return(new List <ScheduledMessagesStatusCountInCoordinatorIndex.ReduceResult>());
            var trickleMultipleMessages = new TrickleSmsOverCalculatedIntervalsBetweenSetDates
            {
                StartTimeUtc = startTime,
                Messages     = new List <SmsData>
                {
                    new SmsData("mobile#1", "message"),
                    new SmsData("mobile#2", "message2"),
                    new SmsData("mobile#3", "message3")
                },
                Duration      = duration,
                CoordinatorId = coordinatorId,
                MetaData      = new SmsMetaData()
            };

            var sagaData = new CoordinateSmsSchedulingData {
                Id = Guid.NewGuid(), Originator = "o", OriginalMessageId = "i"
            };

            Test.Initialize();
            Test.Saga <CoordinateSmsScheduler>()
            .WithExternalDependencies(d => { d.Data = sagaData; d.RavenScheduleDocuments = ravenScheduleDocuments; d.TimingManager = new CalculateSmsTiming(); })
            .ExpectSend <ScheduleSmsForSendingLater>(l => l.SmsData.Mobile == trickleMultipleMessages.Messages[0].Mobile)
            .ExpectSend <ScheduleSmsForSendingLater>(l => l.SmsData.Mobile == trickleMultipleMessages.Messages[1].Mobile)
            .ExpectSend <ScheduleSmsForSendingLater>(l => l.SmsData.Mobile == trickleMultipleMessages.Messages[2].Mobile)
            .ExpectTimeoutToBeSetAt <CoordinatorTimeout>((state, timeout) => true)
            .When(s => s.Handle(trickleMultipleMessages))
            .ExpectSend <ResumeScheduledMessageWithOffset>()
            .ExpectSend <ResumeScheduledMessageWithOffset>()
            .When(s => s.Handle(new ResumeTrickledMessages {
                MessageRequestTimeUtc = DateTime.Now.AddMinutes(-10)
            }))
            .ExpectNotSend <PauseScheduledMessageIndefinitely>(a => true)
            .ExpectNotSend <PauseScheduledMessageIndefinitely>(a => true)
            .When(s => s.Handle(new PauseTrickledMessagesIndefinitely {
                MessageRequestTimeUtc = DateTime.Now.AddMinutes(-11)
            }))
            .AssertSagaCompletionIs(false)
            .ExpectPublish <CoordinatorCompleted>()
            .When(s => s.Timeout(new CoordinatorTimeout()))
            .AssertSagaCompletionIs(true);
        }
Beispiel #3
0
        public void CreateOverTimespanLongMessageIsShortenedReturnsDetails()
        {
            var model = new CoordinatedSharedMessageModel
            {
                Numbers      = "04040404040, 0920939",
                Message      = "asfdkjadfskl asflkj;faskjf;aslkjf;lasdkjfaslkfjas;lkfjslkfjas;lkfjsalkfjas;fklasj;flksdjf;lkasjflskdjflkasjflksjlk lskaf jlsk fdaskl dflksjfalk sflkj sfkl jlkjs flkj skjkj sadflkjsaflj",
                StartTime    = DateTime.Now.AddHours(2),
                SendAllBy    = DateTime.Now.AddHours(3),
                Topic        = "frank",
                UserTimeZone = "Australia/Sydney"
            };

            var bus           = MockRepository.GenerateMock <IBus>();
            var mapper        = MockRepository.GenerateMock <ICoordinatorModelToMessageMapping>();
            var ravenDocStore = MockRepository.GenerateMock <IRavenDocStore>();
            var docStore      = MockRepository.GenerateMock <IDocumentStore>();
            var docSession    = MockRepository.GenerateMock <IDocumentSession>();
            var currentUser   = MockRepository.GenerateStub <ICurrentUser>();

            ravenDocStore.Expect(r => r.GetStore()).Return(docStore);
            docStore.Expect(d => d.OpenSession("Configuration")).Return(docSession);
            docSession.Expect(d => d.Load <CountryCodeReplacement>("CountryCodeConfig")).Return(new CountryCodeReplacement());

            var coordinatorMessage = new CoordinatedSharedMessageModel();
            var excludeList        = new List <string>();

            mapper
            .Expect(m => m.MapToTrickleOverPeriod(Arg <CoordinatedSharedMessageModel> .Is.Anything, Arg <CountryCodeReplacement> .Is.Anything, Arg <List <string> > .Is.Anything, Arg <string> .Is.Anything))
            .Return(new TrickleSmsOverCalculatedIntervalsBetweenSetDates())
            .WhenCalled(t => coordinatorMessage = (CoordinatedSharedMessageModel)(t.Arguments[0]))
            .WhenCalled(t => excludeList        = (List <string>)(t.Arguments[2]));
            var trickleMessage = new TrickleSmsOverCalculatedIntervalsBetweenSetDates();

            bus.Expect(b => b.Send(Arg <TrickleSmsOverCalculatedIntervalsBetweenSetDates> .Is.NotNull))
            .WhenCalled(i => trickleMessage = (TrickleSmsOverCalculatedIntervalsBetweenSetDates)(i.Arguments[0]));

            var controller = new CoordinatorController {
                ControllerContext = new ControllerContext(), Bus = bus, Mapper = mapper, RavenDocStore = ravenDocStore, CurrentUser = currentUser
            };
            var actionResult = (RedirectToRouteResult)controller.Create(model);

            Assert.That(actionResult.RouteValues["action"], Is.EqualTo("Details"));
            Assert.That(coordinatorMessage.Message, Is.EqualTo(model.Message.Substring(0, 160)));
            Assert.That(excludeList.Count, Is.EqualTo(0));

            bus.VerifyAllExpectations();
            mapper.VerifyAllExpectations();
        }
Beispiel #4
0
        public void CreateOverTimespanReturnsDetails()
        {
            var model = new CoordinatedSharedMessageModel
            {
                Numbers      = "04040404040, lskadfjlasdk",
                Message      = "Message",
                StartTime    = DateTime.Now.AddHours(2),
                SendAllBy    = DateTime.Now.AddHours(3),
                Topic        = "frank",
                UserTimeZone = "Australia/Sydney"
            };

            var bus           = MockRepository.GenerateMock <IBus>();
            var mapper        = MockRepository.GenerateMock <ICoordinatorModelToMessageMapping>();
            var ravenDocStore = MockRepository.GenerateMock <IRavenDocStore>();
            var docStore      = MockRepository.GenerateMock <IDocumentStore>();
            var docSession    = MockRepository.GenerateMock <IDocumentSession>();
            var currentUser   = MockRepository.GenerateStub <ICurrentUser>();

            ravenDocStore.Expect(r => r.GetStore()).Return(docStore);
            docStore.Expect(d => d.OpenSession("Configuration")).Return(docSession);
            docSession.Expect(d => d.Load <CountryCodeReplacement>("CountryCodeConfig")).Return(new CountryCodeReplacement());

            mapper
            .Expect(m => m.MapToTrickleOverPeriod(Arg <CoordinatedSharedMessageModel> .Is.Anything, Arg <CountryCodeReplacement> .Is.Anything, Arg <List <string> > .Is.Equal(new List <string>()), Arg <string> .Is.Anything))
            .Return(new TrickleSmsOverCalculatedIntervalsBetweenSetDates());
            var trickleMessage = new TrickleSmsOverCalculatedIntervalsBetweenSetDates();

            bus.Expect(b => b.Send(Arg <TrickleSmsOverCalculatedIntervalsBetweenSetDates> .Is.NotNull))
            .WhenCalled(i => trickleMessage = (TrickleSmsOverCalculatedIntervalsBetweenSetDates)(i.Arguments[0]));

            var controller = new CoordinatorController {
                ControllerContext = new ControllerContext(), Bus = bus, Mapper = mapper, RavenDocStore = ravenDocStore, CurrentUser = currentUser
            };
            var actionResult = (RedirectToRouteResult)controller.Create(model);

            Assert.That(actionResult.RouteValues["action"], Is.EqualTo("Details"));
            Assert.That(trickleMessage.CoordinatorId, Is.Not.EqualTo(Guid.Empty));

            bus.VerifyAllExpectations();
            mapper.VerifyAllExpectations();
        }
        public void Handle(TrickleSmsOverCalculatedIntervalsBetweenSetDates message)
        {
            Data.CoordinatorId             = message.CoordinatorId == Guid.Empty ? Data.Id : message.CoordinatorId;
            Data.OriginalScheduleStartTime = message.StartTimeUtc;
            Data.EmailAddresses            = message.ConfirmationEmails;
            Data.UserOlsenTimeZone         = message.UserOlsenTimeZone;
            Data.Topic = message.MetaData.Topic;
            var messageTiming            = TimingManager.CalculateTiming(message.StartTimeUtc, message.Duration, message.Messages.Count);
            var lastScheduledMessageTime = message.StartTimeUtc.Add(message.Duration);
            var messageList = new List <ScheduleSmsForSendingLater>();

            for (int i = 0; i < message.Messages.Count; i++)
            {
                var smsData            = new SmsData(message.Messages[i].Mobile, message.Messages[i].Message);
                var smsForSendingLater = new ScheduleSmsForSendingLater(messageTiming[i], smsData, message.MetaData, Data.CoordinatorId, message.Username);
                messageList.Add(smsForSendingLater);
            }
            messageList.ForEach(m => Bus.Send(m));
            //Bus.Send(messageList.ToArray());
            var coordinatorCreated = new CoordinatorCreated
            {
                CoordinatorId     = Data.CoordinatorId,
                ScheduledMessages = messageList.Select(m => new MessageSchedule {
                    Number = m.SmsData.Mobile, ScheduledTimeUtc = m.SendMessageAtUtc, ScheduleMessageId = m.ScheduleMessageId
                }).ToList(),
                CreationDateUtc            = DateTime.UtcNow,
                MetaData                   = message.MetaData,
                ConfirmationEmailAddresses = message.ConfirmationEmails,
                UserOlsenTimeZone          = message.UserOlsenTimeZone,
                MessageBody                = message.Messages.First().Message,
                MessageCount               = message.Messages.Count
            };

            RavenScheduleDocuments.SaveCoordinator(coordinatorCreated);
            RavenScheduleDocuments.SaveSchedules(messageList, Data.CoordinatorId);

            RequestUtcTimeout <CoordinatorTimeout>(lastScheduledMessageTime.AddMinutes(2));
            Bus.Publish(coordinatorCreated);
            Bus.SendLocal(new CoordinatorCreatedEmail(coordinatorCreated));
        }
        public void TrickleMessagesOverPeriod_Data()
        {
            var messageList = new List <SmsData> {
                new SmsData("9384938", "3943lasdkf;j"), new SmsData("99999", "dj;alsdfkj")
            };
            var trickleMessagesOverTime = new TrickleSmsOverCalculatedIntervalsBetweenSetDates {
                Duration = new TimeSpan(1000), Messages = messageList, StartTimeUtc = DateTime.Now, UserOlsenTimeZone = "timeZone", CoordinatorId = Guid.NewGuid(), MetaData = new SmsMetaData()
            };

            var ravenScheduleDocuments = MockRepository.GenerateStrictMock <IRavenScheduleDocuments>();
            var sendingMessages        = new List <ScheduleSmsForSendingLater>();

            ravenScheduleDocuments.Expect(r => r.SaveSchedules(Arg <List <ScheduleSmsForSendingLater> > .Is.NotNull, Arg <Guid> .Is.Equal(trickleMessagesOverTime.CoordinatorId)))
            .WhenCalled(r => sendingMessages = (List <ScheduleSmsForSendingLater>)r.Arguments[0]);
            ravenScheduleDocuments.Expect(r => r.SaveCoordinator(Arg <CoordinatorCreated> .Is.Anything));

            var timingManager = MockRepository.GenerateMock <ICalculateSmsTiming>();

            var datetimeSpacing = new List <DateTime> {
                DateTime.Now.AddMinutes(10), DateTime.Now.AddMinutes(20)
            };

            timingManager
            .Expect(t => t.CalculateTiming(trickleMessagesOverTime.StartTimeUtc, trickleMessagesOverTime.Duration, trickleMessagesOverTime.Messages.Count))
            .Return(datetimeSpacing);


            var sagaData = new CoordinateSmsSchedulingData {
                Originator = "originator", Id = Guid.NewGuid()
            };

            Test.Initialize();
            Test.Saga <CoordinateSmsScheduler>()
            .WithExternalDependencies(s =>
            {
                s.TimingManager          = timingManager;
                s.Data                   = sagaData;
                s.RavenScheduleDocuments = ravenScheduleDocuments;
            })
            .ExpectSend <ScheduleSmsForSendingLater>(l =>
                                                     l.SendMessageAtUtc == datetimeSpacing[0] &&
                                                     l.SmsData.Message == trickleMessagesOverTime.Messages[0].Message &&
                                                     l.SmsData.Mobile == trickleMessagesOverTime.Messages[0].Mobile &&
                                                     l.SmsMetaData == trickleMessagesOverTime.MetaData)
            .ExpectSend <ScheduleSmsForSendingLater>(l =>
                                                     l.SendMessageAtUtc == datetimeSpacing[1] &&
                                                     l.SmsData.Message == trickleMessagesOverTime.Messages[1].Message &&
                                                     l.SmsData.Mobile == trickleMessagesOverTime.Messages[1].Mobile &&
                                                     l.SmsMetaData == trickleMessagesOverTime.MetaData)
            .ExpectPublish <CoordinatorCreated>(c =>
                                                c.CoordinatorId == trickleMessagesOverTime.CoordinatorId &&
                                                c.ScheduledMessages.Count == 2 &&
                                                c.ScheduledMessages[0].Number == trickleMessagesOverTime.Messages[0].Mobile &&
                                                c.ScheduledMessages[0].ScheduleMessageId == sendingMessages[0].ScheduleMessageId &&
                                                c.ScheduledMessages[0].ScheduleMessageId != Guid.Empty &&
                                                c.ScheduledMessages[0].ScheduledTimeUtc == datetimeSpacing[0] &&

                                                c.ScheduledMessages[1].Number == trickleMessagesOverTime.Messages[1].Mobile &&
                                                c.ScheduledMessages[1].ScheduleMessageId == sendingMessages[1].ScheduleMessageId &&
                                                c.ScheduledMessages[1].ScheduleMessageId != Guid.Empty &&
                                                c.ScheduledMessages[1].ScheduledTimeUtc == datetimeSpacing[1] &&
                                                c.UserOlsenTimeZone == trickleMessagesOverTime.UserOlsenTimeZone)
            .ExpectTimeoutToBeSetAt <CoordinatorTimeout>((state, timeout) => timeout == trickleMessagesOverTime.StartTimeUtc.Add(trickleMessagesOverTime.Duration).AddMinutes(2))
            .When(s => s.Handle(trickleMessagesOverTime));

            Assert.That(sendingMessages.Count, Is.EqualTo(2));
            timingManager.VerifyAllExpectations();
        }