public void CreateBookPostShouldNotSaveWhenBookPostIsInvalid()
        {
            var repository = new Mock<Repository>();
            var book = new Book { Id = 1 };
            var bookPost = new BookPost { Title = "The Book Post", Content = "some content", Type = BookPost.BookPostType.Reviews };
            var submittedBookPostInformation = new BookPostInformation(book.Id, bookPost);
            repository.Setup(repo => repo.Get<Book>(book.Id)).Returns(book);
            var bookPostsController = new BookPostsController(repository.Object);
            bookPostsController.ModelState.AddModelError("test error", "test exception");

            var result = (ViewResult)bookPostsController.Create(submittedBookPostInformation);

            repository.Verify(repo => repo.Edit(book), Times.Never(), "failing model validation should prevent creating book post");
            Assert.AreEqual("There were problems saving this book post", bookPostsController.TempData["flashError"]);
        }
        public void EditBookShouldNotSaveWhenBookIsInvalid()
        {
            var bookPost = new BookPost();
            var book = new Book { Id = 1 };
            book.Posts.Add(bookPost);
            var mockedRepo = new Mock<Repository>();
            var bookPostsController = new BookPostsController(mockedRepo.Object);
            mockedRepo.Setup(repo => repo.Get<Book>(book.Id)).Returns(book);
            bookPostsController.ModelState.AddModelError("test error", "test exception");

            var result = (ViewResult)bookPostsController.Edit(new BookPostInformation(book.Id, bookPost));

            mockedRepo.Verify(repo => repo.Edit(book), Times.Never(), "failing model validation should prevent updating book post");
            Assert.AreEqual("There were problems saving this book post", bookPostsController.TempData["flashError"]);
        }
        public void ShouldDeleteBookPostAndShowListOfBooksPosts()
        {
            var mockedRepo = new Mock<Repository>();
            var book = new Book {Id = 1};
            var bookPost = new BookPost {Id = 2, Title = "something"};
            book.Posts.Add(bookPost);
            mockedRepo.Setup(repo => repo.Get<Book>(book.Id)).Returns(book);
            var bookPostsController = new BookPostsController(mockedRepo.Object);

            var viewResult = bookPostsController.Delete(bookPost.Id, book.Id);
            mockedRepo.Verify(repo => repo.Edit(book));
            Assert.AreEqual("Book Post successfully deleted", bookPostsController.TempData["flashSuccess"]);
            Assert.AreEqual("Details", viewResult.RouteValues["action"]);
            Assert.AreEqual(book.Id, viewResult.RouteValues["id"]);
        }
 public void ShouldSetCreatedAtFromExisitingBookPost()
 {
     var repository = new Mock<Repository>();
     var book = new Book { Id = 1 };
     var existingBookPost = new BookPost { Id = 1, Title = "Derping for dummies", Type = BookPost.BookPostType.Reviews, CreatedAt = DateTime.Now.AddMinutes(-1)};
     book.Posts.Add(existingBookPost);
     repository.Setup(repo => repo.Get<Book>(book.Id)).Returns(book);
     var bookPostsController = new BookPostsController(repository.Object);
     var editedBookPost = new BookPost { Id = 1, Title = "Derping for dummies II", Type = BookPost.BookPostType.Reviews, CreatedAt = DateTime.Now };
     bookPostsController.Edit(new BookPostInformation(book.Id, editedBookPost));
     Assert.AreEqual(existingBookPost.CreatedAt, editedBookPost.CreatedAt);
 }
 public void ShouldStoreBookPostWhenCreated()
 {
     var repository = new Mock<Repository>();
     var book = new Book { Id = 1 };
     var bookPost = new BookPost {Title = "test title", Content = "some content"};
     var submittedBookPostInformation = new BookPostInformation(book.Id, bookPost);
     repository.Setup(repo => repo.Get<Book>(book.Id)).Returns(book);
     var controller = new BookPostsController(repository.Object);
     var result = (RedirectToRouteResult)controller.Create(submittedBookPostInformation);
     repository.Verify(it => it.Edit(book), Times.Once());
     Assert.AreEqual(string.Format("Added {0} successfully", bookPost.Title), controller.TempData["flashSuccess"]);
     Assert.AreEqual(book.Id, result.RouteValues["id"]);
 }
        public void ShouldRedirectToDetailsPageWhenBookPostIsCreated()
        {
            var repository = new Mock<Repository>();
            var book = new Book { Id = 1 };
            var bookPost = new BookPost { Title = "The Book Post", Content = "some content", Type = BookPost.BookPostType.Reviews };
            var submittedBookPostInformation = new BookPostInformation(book.Id, bookPost);
            repository.Setup(repo => repo.Get<Book>(book.Id)).Returns(book);
            var bookPostsController = new BookPostsController(repository.Object);
            var viewResult = (RedirectToRouteResult)bookPostsController.Create(submittedBookPostInformation);

            repository.Verify(repo => repo.Edit(book));

            Assert.IsNotNull(viewResult);
            Assert.AreEqual("Added The Book Post successfully", bookPostsController.TempData["flashSuccess"]);
            Assert.AreEqual(1, viewResult.RouteValues["id"]);
            Assert.IsTrue(book.Posts.Contains(bookPost));
        }
 public void ShouldSetCreatedAtAndUpdatedAtOnBookPostCreation()
 {
     var now = DateTime.Now;
     var repository = new Mock<Repository>();
     var book = new Book { Id = 1 };
     var bookPost = new BookPost { Title = "test title", Content = "some content" };
     var submittedBookPostInformation = new BookPostInformation(book.Id, bookPost);
     repository.Setup(repo => repo.Get<Book>(book.Id)).Returns(book);
     var controller = new BookPostsController(repository.Object);
     controller.Create(submittedBookPostInformation);
     Assert.IsTrue(bookPost.CreatedAt >= now);
     Assert.IsTrue(bookPost.UpdatedAt >= now);
 }
        public void ShouldNotStoreBookPostWhenTypeIsInvalid()
        {
            var repository = new Mock<Repository>();
            var submittedBookPost = new BookPost { Title = "test title", Content = "derp" };
            repository.Setup(repo => repo.Create(submittedBookPost)).Returns(submittedBookPost);

            var controller = new BookPostsController(repository.Object);
            ValidateViewModel(submittedBookPost, controller);
            Assert.IsFalse(controller.ModelState.IsValid);
        }
 public void ShouldKnowToRenderTheBookPostContentAsMarkdown()
 {
     var id = 12;
     var repository = new Mock<Repository>();
     var book = new Book { Id = 1 };
     var markdown = new Markdown();
     var savedBookPost = new BookPost { Id = id, Title = "test title", Content = "Hello\n=====\nWorld", Type = BookPost.BookPostType.Reviews };
     book.Posts.Add(savedBookPost);
     repository.Setup(repo => repo.Get<Book>(book.Id)).Returns(book);
     var controller = new BookPostsController(repository.Object);
     var result = controller.Details(id, book.Id);
     repository.Verify(it => it.Get<Book>(book.Id), Times.Once());
     var transformedContent = markdown.Transform(savedBookPost.Content);
     Assert.AreEqual(transformedContent, result.ViewBag.transformedContent);
     Assert.AreEqual(id, ((BookPostInformation)result.Model).Model.Id);
 }
 public void ShouldKnowHowToUpdateABookPost()
 {
     var repository = new Mock<Repository>();
     var book = new Book {Id = 1};
     var existingBookPost = new BookPost { Id = 1, Title = "Derping for dummies", Type = BookPost.BookPostType.Reviews };
     book.Posts.Add(existingBookPost);
     repository.Setup(repo => repo.Get<Book>(book.Id)).Returns(book);
     var bookPostsController = new BookPostsController(repository.Object);
     var result = (RedirectToRouteResult)bookPostsController.Edit(new BookPostInformation(book.Id, existingBookPost));
     Assert.AreEqual(existingBookPost.Id, result.RouteValues["id"]);
     Assert.AreEqual("Updated Derping for dummies successfully", bookPostsController.TempData["flashSuccess"]);
     repository.Verify(repo => repo.Edit(book), Times.Once());
 }
        public void ShouldKnowHowToRenderAnEditPage()
        {
            var repositoryMock = new Mock<Repository>();
            var bookPost = new BookPost { Id = 1, Title = "The Page", Type = BookPost.BookPostType.Reviews };
            var book = new Book {Id = 1};
            book.Posts.Add(bookPost);
            repositoryMock.Setup(repo => repo.Get<Book>(book.Id)).Returns(book);
            var bookPostsController = new BookPostsController(repositoryMock.Object);

            var result = bookPostsController.Edit(bookPost.Id, book.Id);
            var actualModel = (BookPostInformation)result.Model;

            Assert.AreEqual(bookPost.Title, actualModel.Model.Title);
            Assert.AreEqual("PUT", bookPostsController.ViewBag.Method);
            repositoryMock.Verify(repo => repo.Get<Book>(book.Id), Times.Once());
        }
 public void ShouldKnowHowToDisplayABookPost()
 {
     var id = 12;
     var repository = new Mock<Repository>();
     var book = new Book { Id = 1 };
     var savedBookPost = new BookPost { Id = id, Title = "test title", Content = "some content", Type = BookPost.BookPostType.Reviews};
     book.Posts.Add(savedBookPost);
     repository.Setup(repo => repo.Get<Book>(book.Id)).Returns(book);
     var controller = new BookPostsController(repository.Object);
     var result = controller.Details(id, book.Id);
     repository.Verify(it => it.Get<Book>(book.Id), Times.Once());
     Assert.AreEqual(book.Id, ((BookPostInformation)result.Model).BookId);
     Assert.AreEqual(id, ((BookPostInformation)result.Model).Model.Id);
     Assert.AreEqual(book, ((BookPostInformation)result.Model).Book);
 }