public void Vote_ShouldCallPostServiceToggleVote()
        {
            // Arrange
            var post = new Post {
                Id = Guid.NewGuid()
            };

            var categoryServiceMock = new Mock <ICategoryService>();
            var postServiceMock     = new Mock <IPostService>();

            postServiceMock
            .Setup(x => x.GetById(It.Is <Guid>(g => g == post.Id), It.IsAny <bool>()))
            .Returns(new Post[] { post }.AsQueryable());

            var voteServiceMock = new Mock <IVoteService>();
            var userManagerMock = new Mock <IApplicationUserManager>();

            var identityMock  = new Mock <IIdentity>();
            var principalMock = new Mock <IPrincipal>();

            principalMock.SetupGet(x => x.Identity).Returns(identityMock.Object);
            var contextMock = new Mock <ControllerContext>();

            contextMock.SetupGet(p => p.HttpContext.User).Returns(principalMock.Object);

            var controller = new PostsAjaxController(
                categoryServiceMock.Object,
                postServiceMock.Object,
                voteServiceMock.Object,
                userManagerMock.Object)
            {
                ControllerContext = contextMock.Object
            };

            // Act
            controller.Vote(post.Id, VoteType.Upvote);

            // Assert
            voteServiceMock.Verify(x => x.ToggleVote(
                                       It.Is <Guid>(g => g == post.Id),
                                       It.IsAny <string>(),
                                       It.Is <VoteType>(v => v == VoteType.Upvote)));
        }
        public void Edit_ShouldReturnForbiddenIfUserIsNotTheAuthor()
        {
            // Arrange
            var post = new Post {
                Id = Guid.NewGuid(), AuthorId = "userid"
            };

            var categoryServiceMock = new Mock <ICategoryService>();
            var postServiceMock     = new Mock <IPostService>();

            postServiceMock
            .Setup(x => x.GetById(It.Is <Guid>(g => g == post.Id), It.IsAny <bool>()))
            .Returns(new Post[] { post }.AsQueryable());

            var voteServiceMock = new Mock <IVoteService>();
            var userManagerMock = new Mock <IApplicationUserManager>();

            var identityMock  = new Mock <IIdentity>();
            var principalMock = new Mock <IPrincipal>();

            principalMock.SetupGet(x => x.Identity).Returns(identityMock.Object);
            var contextMock = new Mock <ControllerContext>();

            contextMock.SetupGet(p => p.HttpContext.User).Returns(principalMock.Object);

            var controller = new PostsAjaxController(
                categoryServiceMock.Object,
                postServiceMock.Object,
                voteServiceMock.Object,
                userManagerMock.Object)
            {
                ControllerContext = contextMock.Object
            };

            // Act
            var result = controller.Edit(post.Id, "newcontent");

            // Assert
            // Assert
            Assert.IsInstanceOf <HttpStatusCodeResult>(result);
            Assert.AreEqual((int)HttpStatusCode.Forbidden, (result as HttpStatusCodeResult).StatusCode);
        }