public Specification when_updating_status_with_invalid_model()
        {
            string statusText = new string('*', 141);
            var statusViewModel = new StatusViewModel
            {
                Status = statusText
            };
            ISessionAdapter session = sessionFactory();
            var testDbContext = new TestDbContext();
            Container container = containerFactory(testDbContext);

            int maxId = testDbContext.Statuses.Max(_ => _.Key);

            return new QuerySpecification<TwitterController, ViewResult>
            {
                On = () =>
                         {
                             session.SetTwitterAccessToken(new OAuthToken("", ""));
                             return GetTwitterController(container, session);
                         },
                When = ctrl => ctrl.UpdateStatus(statusViewModel) as ViewResult,
                Expect =
                               {
                                   routeResult =>routeResult.ViewName == "Send",
                               },
            };
        }
        public Specification when_updating_status_with_access_token()
        {
            const string statusText = "some test status";
            var statusViewModel = new StatusViewModel
                                      {
                                          Status = statusText
                                      };
            ISessionAdapter session = sessionFactory();
            var testDbContext = new TestDbContext();
            Container container = containerFactory(testDbContext);

            var mockTwitterProvider = MockTwitterProvider(statusText);

            container.TwitterServiceFactory = () => mockTwitterProvider.Object;

            int statusCount = testDbContext.Statuses.Count;

            return new ActionSpecification<TwitterController>
                       {
                           On = () =>
                                    {
                                        session.SetTwitterAccessToken(new OAuthToken("", ""));
                                        return GetTwitterController(container, session);
                                    },
                           When = ctrl => ctrl.UpdateStatus(statusViewModel),
                           Expect =
                               {
                                   ctrl => testDbContext.Statuses.Count == statusCount + 1,
                                   ctrl => testDbContext.Statuses.Last().Value.Text == statusText,
                               },
                       };
        }
        public Specification when_updating_status_with_no_access_token()
        {
            const string statusText = "some test status";
            var statusViewModel = new StatusViewModel
            {
                Status = statusText
            };
            ISessionAdapter session = sessionFactory();

            return new QuerySpecification<TwitterController, ActionResult>
            {
                On = () => GetTwitterController(session: session),
                When = ctrl => ctrl.UpdateStatus(statusViewModel),
                Expect =
                               {
                                   actionResult => session.GetTwitterNewStatus() == statusText,
                                   actionResult => actionResult is RedirectToRouteResult,
                                   actionResult =>
                                           ((RedirectToRouteResult)actionResult).RouteValues["action"] == "SignIn",
                               },
            };
        }
 public ActionResult UpdateStatus(StatusViewModel model)
 {
     OAuthToken token = Session.GetTwitterAccessToken();
     if (token == null)
     {
         Session.SetTwitterStatus(model.Status);
         return RedirectToAction("SignIn");
     }
     return SendUpdate(model, token);
 }
        private ActionResult SendUpdate(StatusViewModel model, OAuthToken token)
        {
            if (!TryValidateModel(model))
            {
                return View("Send", model);
            }

            var twitterStatus = new TwitterStatus {Text = model.Status};
            //unit of work for db
            using (IRepository repository = Container.RepositoryFactory())
            {
                twitterStatus = repository.AddStatus(twitterStatus);
            }

            //twitter service operation
            ITwitter twitterClient = TwitterProvider.GetApi(token.Value, token.Secret);
            twitterClient.TimelineOperations.UpdateStatusAsync(twitterStatus.Text);

            return RedirectToAction("View", new {id = twitterStatus.Id});
        }