public void RateRestaurantWithInvalidIdShouldReturnNotFound()
        {
            // Setup repositories
            var mockedRepository = new Mock <IRepository <Restaurant> >();

            mockedRepository.Setup(r => r.GetById(It.IsAny <int>())).Returns((Restaurant)null);
            var mockedUsers = new Mock <IRepository <ApplicationUser> >();

            // Setup data layer
            var mockedContext = new Mock <IRestaurantData>();

            mockedContext.Setup(c => c.Restaurants).Returns(mockedRepository.Object);
            mockedContext.Setup(c => c.ApplicationUsers).Returns(mockedUsers.Object);
            var mockedProvider = new Mock <IUserIdProvider>();

            mockedProvider.Setup(p => p.GetUserId()).Returns("10");

            // Setup controller
            var controller = new RestaurantsController(mockedContext.Object, mockedProvider.Object);

            controller.Request       = new HttpRequestMessage();
            controller.Configuration = new HttpConfiguration();

            var response = controller.PostRateExistingRestaurant(1, new RatingBindingModel()
            {
                Stars = 1
            })
                           .ExecuteAsync(CancellationToken.None).Result;

            Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode);
        }
        public void RateRestaurant_WhenValidData_ShouldReturnOk()
        {
            // Setup fake restaurants
            var user = new ApplicationUser()
            {
                Id = "1", UserName = "******", PasswordHash = "1234"
            };
            var sofia = new Town()
            {
                Id = 1, Name = "Sofia"
            };
            var restourant = new Restaurant()
            {
                Id      = 1,
                Meals   = new List <Meal>(),
                Name    = "Fake",
                Owner   = user,
                OwnerId = "1",
                Ratings = new List <Rating>(),
                Town    = sofia
            };

            // Setup repositories
            var mockedRepository = new Mock <IRepository <Restaurant> >();

            mockedRepository.Setup(r => r.GetById(It.IsAny <int>())).Returns(restourant);
            var mockedUsers = new Mock <IRepository <ApplicationUser> >();

            mockedUsers.Setup(r => r.GetById(It.IsAny <string>())).Returns(user);

            // Setup data layer
            var mockedContext = new Mock <IRestaurantData>();

            mockedContext.Setup(c => c.Restaurants).Returns(mockedRepository.Object);
            mockedContext.Setup(c => c.ApplicationUsers).Returns(mockedUsers.Object);
            var mockedProvider = new Mock <IUserIdProvider>();

            mockedProvider.Setup(p => p.GetUserId()).Returns("10");

            // Setup controller
            var controller = new RestaurantsController(mockedContext.Object, mockedProvider.Object)
            {
                Request       = new HttpRequestMessage(),
                Configuration = new HttpConfiguration()
            };

            var response = controller.PostRateExistingRestaurant(1, new RatingBindingModel()
            {
                Stars = 1
            })
                           .ExecuteAsync(CancellationToken.None).Result;

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);

            Assert.AreEqual(1, restourant.Ratings.Count);
            Assert.AreEqual(1, restourant.Ratings.Select(r => r.Stars).Average());
        }