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

            mockedRepository.Setup(r => r.GetById(It.IsAny <int>())).Returns((Town)null);

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

            mockedContext.Setup(c => c.Towns).Returns(mockedRepository.Object);

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

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

            var response = controller.GetRestaurantsByTown(1).ExecuteAsync(CancellationToken.None).Result;

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

            var restaurants = response.Content
                              .ReadAsAsync <IEnumerable <RestaurantViewModel> >()
                              .Result
                              .Select(r => r.Name)
                              .ToList();

            Assert.AreEqual(0, restaurants.Count);
        }
        public void GetAllRestaurantsWhenHasSuchTownAndMoreThanOneRestaurantShouldReturnOkAndOrderTheRestaurants()
        {
            // Setup fake restaurants
            var user = new ApplicationUser()
            {
                Id = "1", UserName = "******", PasswordHash = "1234"
            };
            var sofia = new Town()
            {
                Id = 1, Name = "Sofia"
            };
            var fakeTown = new Town()
            {
                Id          = 1,
                Name        = "Sofia",
                Restaurants = new List <Restaurant>()
                {
                    new Restaurant()
                    {
                        Id      = 1,
                        Name    = "Best",
                        Owner   = user,
                        Ratings = new List <Rating>()
                        {
                            new Rating()
                            {
                                Stars = 10,
                                User  = new ApplicationUser()
                                {
                                    Id           = "2",
                                    UserName     = "******",
                                    PasswordHash = "1234"
                                }
                            }
                        },
                        Meals = new List <Meal>(),
                        Town  = sofia
                    },
                    new Restaurant()
                    {
                        Id      = 2,
                        Name    = "BSecond",
                        Owner   = user,
                        Ratings = new List <Rating>()
                        {
                            new Rating()
                            {
                                Stars = 1,
                                User  = new ApplicationUser()
                                {
                                    Id           = "2",
                                    UserName     = "******",
                                    PasswordHash = "1234"
                                }
                            }
                        },
                        Meals = new List <Meal>(),
                        Town  = sofia
                    },
                    new Restaurant()
                    {
                        Id      = 3,
                        Name    = "AThird",
                        Owner   = user,
                        Ratings = new List <Rating>()
                        {
                            new Rating()
                            {
                                Stars = 1,
                                User  = new ApplicationUser()
                                {
                                    Id           = "2",
                                    UserName     = "******",
                                    PasswordHash = "1234"
                                }
                            }
                        },
                        Meals = new List <Meal>(),
                        Town  = sofia
                    }
                }
            };

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

            mockedRepository.Setup(r => r.GetById(It.IsAny <int>())).Returns(fakeTown);

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

            mockedContext.Setup(c => c.Towns).Returns(mockedRepository.Object);

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

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

            var response = controller.GetRestaurantsByTown(1).ExecuteAsync(CancellationToken.None).Result;

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

            var restaurants = response.Content
                              .ReadAsAsync <IEnumerable <RestaurantViewModel> >()
                              .Result
                              .Select(r => r.Name)
                              .ToList();
            var fakeRestourants = fakeTown.Restaurants
                                  .OrderByDescending(r => r.Ratings.Select(ra => ra.Stars).Average())
                                  .ThenBy(r => r.Name)
                                  .Select(r => r.Name)
                                  .ToList();

            CollectionAssert.AreEqual(fakeRestourants, restaurants);
        }