public void PostNewReviewForeRestaurant_ValidInput_OkWithUrl()
        {
            //arrange
            var restaurantID = 10;

            var    postedDate           = new DateTime(2016, 10, 1);
            var    createdUser          = 1;
            int    postedRating         = 3;
            int    expectedReviewNumber = 1;
            string postedComment        = "Review comment 1";
            User   postingUser          = new User {
                Id = createdUser, UserName = "******"
            };

            var expectedResponse = new API.ViewModels.Review
            {
                Comment        = postedComment,
                PostedDateTime = postedDate,
                Rating         = postedRating,
                ReviewNumber   = expectedReviewNumber,
                UserName       = postingUser.UserName,
            };

            var requestReview = new API.ViewModels.Review
            {
                Comment        = postedComment,
                PostedDateTime = postedDate,
                Rating         = postedRating,
                UserName       = postingUser.UserName,
                //no review Number
            };

            var transactionRequest = new AddReviewRequestModel
            {
                Comment        = postedComment,
                DateTimePosted = postedDate,
                Rating         = postedRating,
                RestaurantId   = restaurantID,
                UserId         = createdUser
            };

            MockRepository.Setup(m => m.AddReviewGetNewId(transactionRequest)).Returns(expectedReviewNumber);
            MockRepository.Setup(m => m.DoseRestaurentIdExist(restaurantID)).Returns(true);
            MockRepository.Setup(m => m.DoseUserIdAlreadyExist(postingUser.Id)).Returns(true);
            MockIdentity.Setup(m => m.GetRequestingUserId()).Returns(createdUser);

            var ctrl = new ReviewsController(MockRepository.Object, MockLogger.Object, MockIdentity.Object);

            //act
            var actionResult  = ctrl.Post(restaurantID, requestReview);
            var createdResult = actionResult as CreatedAtRouteNegotiatedContentResult <API.ViewModels.Review>;

            //assert
            Assert.IsNotNull(createdResult, "created-201 status was not returned");
            Assert.AreEqual("NewReviewForRestaurant", createdResult.RouteName);
            Assert.AreEqual(restaurantID, createdResult.RouteValues["id"]);

            //validate response
            ValidateReviewResponse(createdResult.Content, expectedResponse);
        }
        public void PostNewReviewForeRestaurant_ServerException_InternalError()
        {
            //arrange
            var restaurantID = 10;

            var    postedDate    = new DateTime(2016, 10, 1);
            var    createdUser   = 10;
            int    postedRating  = 10;
            string postedComment = "Review comment 1";
            User   postingUser   = new User {
                Id = createdUser, UserName = "******"
            };

            var requestReview = new API.ViewModels.Review
            {
                Comment        = postedComment,
                PostedDateTime = postedDate,
                Rating         = postedRating,
                UserName       = postingUser.UserName,
                //no review Number
            };

            MockRepository.Setup(m => m.AddReviewGetNewId(It.IsAny <AddReviewRequestModel>()))
            .Throws(new Exception());
            MockRepository.Setup(m => m.DoseRestaurentIdExist(restaurantID)).Returns(true);
            MockRepository.Setup(m => m.DoseUserIdAlreadyExist(postingUser.Id)).Returns(true);
            MockIdentity.Setup(m => m.GetRequestingUserId()).Throws(new Exception());

            var ctrl = new ReviewsController(MockRepository.Object, MockLogger.Object, MockIdentity.Object);

            //act
            var actionResult = ctrl.Post(restaurantID, requestReview);

            //assert
            Assert.IsInstanceOfType(actionResult, typeof(InternalServerErrorResult));
        }