public void CoordinatorOverTimespanLongMessageIsShortenedReturnsDetails() { var model = new CoordinatedSharedMessageModel { Numbers = "04040404040", 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) }; var bus = MockRepository.GenerateMock<IBus>(); var mapper = MockRepository.GenerateMock<ICoordinatorModelToMessageMapping>(); var coordinatorMessage = new CoordinatedSharedMessageModel(); mapper.Expect(m => m.MapToTrickleOverPeriod(Arg<CoordinatedSharedMessageModel>.Is.Anything)) .Return(new TrickleSmsOverCalculatedIntervalsBetweenSetDates()) .WhenCalled(t => coordinatorMessage = (CoordinatedSharedMessageModel)(t.Arguments[0])); var trickleMessage = new TrickleSmsOverCalculatedIntervalsBetweenSetDates(); bus.Expect(b => b.Send(Arg<TrickleSmsOverCalculatedIntervalsBetweenSetDates>.Is.NotNull)) .WhenCalled(i => trickleMessage = (TrickleSmsOverCalculatedIntervalsBetweenSetDates)((object[])(i.Arguments[0]))[0]); var controller = new CoordinatorController { ControllerContext = new ControllerContext(), Bus = bus, Mapper = mapper }; 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))); bus.VerifyAllExpectations(); mapper.VerifyAllExpectations(); }
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 }; 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; }) .ExpectSend<ScheduleSmsForSendingLater>(l => l.SendMessageAtUtc == datetimeSpacing[0].ToUniversalTime() && 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].ToUniversalTime() && l.SmsData.Message == trickleMessagesOverTime.Messages[1].Message && l.SmsData.Mobile == trickleMessagesOverTime.Messages[1].Mobile && l.SmsMetaData == trickleMessagesOverTime.MetaData) .ExpectPublish<CoordinatorCreated>(c => c.CoordinatorId == sagaData.Id && c.ScheduledMessages.Count == 2 && c.ScheduledMessages[0].Number == trickleMessagesOverTime.Messages[0].Mobile && c.ScheduledMessages[0].ScheduleMessageId == sagaData.ScheduledMessageStatus[0].ScheduledSms.ScheduleMessageId && c.ScheduledMessages[0].ScheduleMessageId != Guid.Empty && c.ScheduledMessages[0].ScheduledTimeUtc == datetimeSpacing[0].ToUniversalTime() && c.ScheduledMessages[1].Number == trickleMessagesOverTime.Messages[1].Mobile && c.ScheduledMessages[1].ScheduleMessageId == sagaData.ScheduledMessageStatus[1].ScheduledSms.ScheduleMessageId && c.ScheduledMessages[1].ScheduleMessageId != Guid.Empty && c.ScheduledMessages[1].ScheduledTimeUtc == datetimeSpacing[1].ToUniversalTime()) .When(s => s.Handle(trickleMessagesOverTime)); Assert.That(sagaData.MessagesScheduled, Is.EqualTo(2)); Assert.That(sagaData.ScheduledMessageStatus[0].MessageStatus, Is.EqualTo(MessageStatus.WaitingForScheduling)); Assert.That(sagaData.ScheduledMessageStatus[1].MessageStatus, Is.EqualTo(MessageStatus.WaitingForScheduling)); timingManager.VerifyAllExpectations(); }
public void CoordinatorOverTimespanReturnsDetails() { var model = new CoordinatedSharedMessageModel { Numbers = "04040404040", Message = "Message", StartTime = DateTime.Now.AddHours(2), SendAllBy = DateTime.Now.AddHours(3) }; var bus = MockRepository.GenerateMock<IBus>(); var mapper = MockRepository.GenerateMock<ICoordinatorModelToMessageMapping>(); mapper.Expect(m => m.MapToTrickleOverPeriod(Arg<CoordinatedSharedMessageModel>.Is.Anything)).Return(new TrickleSmsOverCalculatedIntervalsBetweenSetDates()); var trickleMessage = new TrickleSmsOverCalculatedIntervalsBetweenSetDates(); bus.Expect(b => b.Send(Arg<TrickleSmsOverCalculatedIntervalsBetweenSetDates>.Is.NotNull)) .WhenCalled(i => trickleMessage = (TrickleSmsOverCalculatedIntervalsBetweenSetDates)((object[])(i.Arguments[0]))[0]); var controller = new CoordinatorController { ControllerContext = new ControllerContext(), Bus = bus, Mapper = mapper }; 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 TrickleThreeMessagesOverTenMinutesOneMessageFailsCoordinatorStillCompletes() { 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 }; 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; }) .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>() .When(s => s.Handle(trickleMultipleMessages)) .AssertSagaCompletionIs(false) .When(s => s.Handle(new ScheduledSmsSent { ConfirmationData = new SmsConfirmationData("r", DateTime.Now, 1m), ScheduledSmsId = sagaData.ScheduledMessageStatus[0].ScheduledSms.ScheduleMessageId })) .AssertSagaCompletionIs(false) .When(s => s.Handle(new ScheduledSmsSent { ConfirmationData = new SmsConfirmationData("r", DateTime.Now, 1m), ScheduledSmsId = sagaData.ScheduledMessageStatus[1].ScheduledSms.ScheduleMessageId })) .AssertSagaCompletionIs(false) .ExpectPublish<CoordinatorCompleted>() .When(s => s.Handle(new ScheduledSmsFailed { ScheduledSmsId = sagaData.ScheduledMessageStatus[2].ScheduledSms.ScheduleMessageId })) .AssertSagaCompletionIs(true); timingManager.VerifyAllExpectations(); Assert.That(sagaData.MessagesScheduled, Is.EqualTo(3)); Assert.That(sagaData.MessagesConfirmedSentOrFailed, Is.EqualTo(3)); }
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>(); 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>()))) .Return(new TrickleSmsOverCalculatedIntervalsBetweenSetDates()); var trickleMessage = new TrickleSmsOverCalculatedIntervalsBetweenSetDates(); bus.Expect(b => b.Send(Arg<TrickleSmsOverCalculatedIntervalsBetweenSetDates>.Is.NotNull)) .WhenCalled(i => trickleMessage = (TrickleSmsOverCalculatedIntervalsBetweenSetDates)((object[])(i.Arguments[0]))[0]); var controller = new CoordinatorController { ControllerContext = new ControllerContext(), Bus = bus, Mapper = mapper, RavenDocStore = ravenDocStore }; 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 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>(); 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)) .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)((object[])(i.Arguments[0]))[0]); var controller = new CoordinatorController { ControllerContext = new ControllerContext(), Bus = bus, Mapper = mapper, RavenDocStore = ravenDocStore }; 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 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 TrickleThreeMessagesFirstSentPausedThenResumed_SecondPauseMessageOutOfOrderIgnored() { var coordinatorId = Guid.NewGuid(); var startTime = DateTime.Now.AddHours(3); var duration = new TimeSpan(0, 10, 0); var ravenScheduleDocuments = MockRepository.GenerateStrictMock<IRavenScheduleDocuments>(); ravenScheduleDocuments.Expect(r => r.SaveSchedules(Arg<List<ScheduleSmsForSendingLater>>.Is.Anything, Arg<Guid>.Is.Anything)); ravenScheduleDocuments.Expect(r => r.GetActiveScheduleTrackingData(coordinatorId)).Return(new List<ScheduleTrackingData> { new ScheduleTrackingData(), new ScheduleTrackingData() }); ravenScheduleDocuments.Expect(r => r.GetActiveScheduleTrackingData(coordinatorId)).Return(new List<ScheduleTrackingData> { new ScheduleTrackingData(), new ScheduleTrackingData() }); ravenScheduleDocuments.Expect(r => r.GetActiveScheduleTrackingData(coordinatorId)).Return(new List<ScheduleTrackingData>()); ravenScheduleDocuments.Expect(r => r.AreCoordinatedSchedulesComplete(coordinatorId)).Return(true); ravenScheduleDocuments.Expect(r => r.SaveCoordinator(Arg<CoordinatorCreated>.Is.Anything)); 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<PauseScheduledMessageIndefinitely>() .ExpectSend<PauseScheduledMessageIndefinitely>() .When(s => s.Handle(new PauseTrickledMessagesIndefinitely { MessageRequestTimeUtc = DateTime.Now.AddMinutes(-11) })) .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) })) .ExpectPublish<CoordinatorCompleted>() .When(s => s.Timeout(new CoordinatorTimeout())) .AssertSagaCompletionIs(true); }
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(); }