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); }
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(); }
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(); }