public void CreateSendAllAtOnceReturnsDetails()
        {
            var model = new CoordinatedSharedMessageModel
            {
                Numbers= "04040404040",
                Message = "Message",
                StartTime = DateTime.Now.AddHours(2),
                SendAllAtOnce = true,
                Tags = "tag1, tag2",
                Topic = "New Feature!",
                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.MapToSendAllAtOnce(Arg<CoordinatedSharedMessageModel>.Is.Anything, Arg<CountryCodeReplacement>.Is.Anything, Arg<List<string>>.Is.Anything))
                .Return(new SendAllMessagesAtOnce());
            var trickleMessage = new SendAllMessagesAtOnce();
            bus.Expect(b => b.Send(Arg<SendAllMessagesAtOnce>.Is.NotNull))
                .WhenCalled(i => trickleMessage = (SendAllMessagesAtOnce) ((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 SendAllAtOnce_Data()
        {
            var messageList = new List<SmsData> { new SmsData("9384938", "3943lasdkf;j"), new SmsData("99999", "dj;alsdfkj")};
            var sendTimeUtc = DateTime.Now;
            var sendAllMessagesAtOnce = new SendAllMessagesAtOnce { Messages = messageList, SendTimeUtc = sendTimeUtc, 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(sendAllMessagesAtOnce.CoordinatorId)))
                .WhenCalled(r => sendingMessages = (List<ScheduleSmsForSendingLater>)r.Arguments[0]);
            ravenScheduleDocuments.Expect(r => r.SaveCoordinator(Arg<CoordinatorCreated>.Is.Anything));

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

            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 == sendTimeUtc &&
                        l.SmsData.Message == sendAllMessagesAtOnce.Messages[0].Message &&
                        l.SmsData.Mobile == sendAllMessagesAtOnce.Messages[0].Mobile &&
                        l.SmsMetaData == sendAllMessagesAtOnce.MetaData)
                    .ExpectSend<ScheduleSmsForSendingLater>(l =>
                        l.SendMessageAtUtc == sendTimeUtc &&
                        l.SmsData.Message == sendAllMessagesAtOnce.Messages[1].Message &&
                        l.SmsData.Mobile == sendAllMessagesAtOnce.Messages[1].Mobile &&
                        l.SmsMetaData == sendAllMessagesAtOnce.MetaData)
                    .ExpectPublish<CoordinatorCreated>(c =>
                        c.CoordinatorId == sendAllMessagesAtOnce.CoordinatorId &&
                        c.ScheduledMessages.Count == 2 &&
                        c.ScheduledMessages[0].Number == sendAllMessagesAtOnce.Messages[0].Mobile &&
                        c.ScheduledMessages[0].ScheduleMessageId == sendingMessages[0].ScheduleMessageId &&
                        c.ScheduledMessages[0].ScheduleMessageId != Guid.Empty &&
                        c.ScheduledMessages[0].ScheduledTimeUtc == sendTimeUtc &&

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

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