private void CheckIfRestaurantExists(RestaurantServiceModel restaurantServiceModel)
 {
     if (!dbContext.Restaurants.Any(restaurant => restaurant.Id == restaurantServiceModel.Id))
     {
         throw new ArgumentNullException(nameof(restaurantServiceModel));
     }
 }
        public async Task <IActionResult> Create(string city, string restaurant, CreateReservationBindingModel viewModel)
        {
            var dateTime    = DateTime.Parse(viewModel.Date + " " + viewModel.Time);
            var isDateValid = await reservationsService.IsDateValid(dateTime);

            if (isDateValid)
            {
                RestaurantServiceModel restaurantFromDb = await restaurantService.GetRestaurantByNameAndCity(city, restaurant);

                ReserveTableUserServiceModel user = await usersService.GetUserByUsername(this.User.Identity.Name);

                ReservationServiceModel reservation = await reservationsService.MakeReservation(viewModel, user, restaurantFromDb);

                if (reservation == null)
                {
                    ModelState.AddModelError("NoAvailableTables", "There are no available tables.");

                    return(this.View());
                }

                return(this.Redirect("/Reservations/My"));
            }
            else
            {
                ModelState.AddModelError("InvalidData", "Your date is not valid.");
            }

            return(this.View());
        }
        public async Task AddTable_WithCorrectData_ShouldCreateSucessfully()
        {
            var errorMessage = "Table service AddTable() method is not working correctly.";
            var context      = ReserveTableDbContextInMemoryFactory.InitializeContext();

            this.tableService = new TableService(context);
            await SeedData(context);

            AddTableBindingModel model = new AddTableBindingModel
            {
                SeatsCount = 5
            };

            RestaurantServiceModel restaurant = new RestaurantServiceModel
            {
                Id            = "1",
                Address       = "Ivan Vazov",
                AverageRating = 10,
                Name          = "Happy",
                PhoneNumber   = "08888888888",
                Photo         = "src/happy-photo.jpg",
                CityId        = "1"
            };

            var actualResult = await this.tableService.AddTable(model, restaurant);

            Assert.True(actualResult, errorMessage);
        }
        public async Task GetRestaurantTables_WithData_ShouldReturnCorrectResults()
        {
            string errorMessagePrefix = "Table service GetAllProducts() method does not work properly.";

            var context = ReserveTableDbContextInMemoryFactory.InitializeContext();

            await SeedData(context);

            this.tableService = new TableService(context);

            RestaurantServiceModel restaurant = new RestaurantServiceModel
            {
                Id            = "1",
                Address       = "Ivan Vazov",
                AverageRating = 10,
                Name          = "Happy",
                PhoneNumber   = "08888888888",
                Photo         = "src/happy-photo.jpg",
                CityId        = "1"
            };

            var tables = await this.tableService.GetRestaurantTables(restaurant);

            List <TableServiceModel> actualResults   = tables.ToList();
            List <TableServiceModel> expectedResults = GetTableData().To <TableServiceModel>().ToList();

            for (int i = 0; i < expectedResults.Count; i++)
            {
                var expectedEntry = expectedResults[i];
                var actualEntry   = actualResults[i];

                Assert.True(expectedEntry.SeatsCount == actualEntry.SeatsCount, errorMessagePrefix + " " + "Seats count is not returned properly.");
                Assert.True(expectedEntry.RestaurantId == actualEntry.RestaurantId, errorMessagePrefix + " " + "Restaurant Id is not returned properly.");
            }
        }
        public async Task AddTable_InInvalidRestaurant_ShouldNotCreate()
        {
            var context = ReserveTableDbContextInMemoryFactory.InitializeContext();

            this.tableService = new TableService(context);
            await SeedData(context);

            AddTableBindingModel model = new AddTableBindingModel
            {
                SeatsCount = 5
            };

            RestaurantServiceModel restaurant = new RestaurantServiceModel
            {
                Id            = "3",
                Address       = "Ivan Vazov",
                AverageRating = 10,
                Name          = "Happy",
                PhoneNumber   = "08888888888",
                Photo         = "src/happy-photo.jpg",
                CityId        = "1"
            };

            await Assert.ThrowsAsync <ArgumentNullException>(() => tableService.AddTable(model, restaurant));
        }
        public async Task GetRestaurantById_WithData_ShouldReturnCorrectResult()
        {
            var context = ReserveTableDbContextInMemoryFactory.InitializeContext();

            this.restaurantService = new RestaurantService(context);
            await SeedData(context);

            var restaurantId   = "1";
            var expectedResult = new RestaurantServiceModel
            {
                Id          = "1",
                Name        = "Ego",
                Address     = "Egos Address",
                CityId      = "1",
                PhoneNumber = "0888888888",
                Photo       = "/src/ego-photo.jpg"
            };

            var actualResult = await restaurantService.GetRestaurantById(restaurantId);

            Assert.Equal(expectedResult.Name, actualResult.Name);
            Assert.Equal(expectedResult.Address, actualResult.Address);
            Assert.Equal(expectedResult.CityId, actualResult.CityId);
            Assert.Equal(expectedResult.PhoneNumber, actualResult.PhoneNumber);
            Assert.Equal(expectedResult.Photo, actualResult.Photo);
        }
        public async Task <IQueryable <TableServiceModel> > GetRestaurantTables(RestaurantServiceModel restaurant)
        {
            var tables = dbContext.Tables
                         .Where(t => t.RestaurantId == restaurant.Id)
                         .To <TableServiceModel>();

            return(tables);
        }
Beispiel #8
0
        public async Task GetRestaurantsInCity_WithDataAlphabeticallyDescending_ShouldReturnCorrectResults()
        {
            string errorMessagePrefix = "CityService GetRestaurantsInCity() method does not work properly.";

            var context = ReserveTableDbContextInMemoryFactory.InitializeContext();

            await Seed(context);

            this.cityService = new CityService(context);

            var restaurantInPlovdiv = new RestaurantServiceModel
            {
                Id            = "1",
                Name          = "Happy",
                Address       = "Ivan Vazov",
                AverageRating = 10,
                CityId        = "1",
                PhoneNumber   = "0888888888",
                Photo         = "/src/Happy.jpg"
            };

            var restaurantInPlovdiv2 = new RestaurantServiceModel
            {
                Id            = "3",
                Name          = "KFC",
                Address       = "Vasil Levski",
                AverageRating = 7,
                CityId        = "1",
                PhoneNumber   = "0888888899",
                Photo         = "/src/KFC.jpg"
            };

            var restaurantsInCity = await this.cityService.GetRestaurantsInCity("Plovdiv", "alphabetically-z-to-a");

            List <RestaurantServiceModel> actualResults   = restaurantsInCity.ToList();
            List <RestaurantServiceModel> expectedResults = new List <RestaurantServiceModel>
            {
                restaurantInPlovdiv,
                restaurantInPlovdiv2
            }
            .OrderByDescending(r => r.Name)
            .ToList();

            for (int i = 0; i < expectedResults.Count; i++)
            {
                var expectedEntry = expectedResults[i];
                var actualEntry   = actualResults[i];

                Assert.True(expectedEntry.Name == actualEntry.Name, errorMessagePrefix + " " + "Name is not returned properly.");
                Assert.True(expectedEntry.Address == actualEntry.Address, errorMessagePrefix + " " + "Address is not returned properly.");
                Assert.True(expectedEntry.PhoneNumber == actualEntry.PhoneNumber, errorMessagePrefix + " " + "Phone Number is not returned properly.");
                Assert.True(expectedEntry.CityId == actualEntry.CityId, errorMessagePrefix + " " + "City Id is not returned properly.");
                Assert.True(expectedEntry.AverageRating == actualEntry.AverageRating, errorMessagePrefix + " " + "Average Rating is not returned properly.");
                Assert.True(expectedEntry.Photo == actualEntry.Photo, errorMessagePrefix + " " + "Photo is not returned properly.");
            }
        }
        public async Task <double> GetAverageRate(RestaurantServiceModel restaurantServiceModel)
        {
            var reviews = await dbContext.Reviews
                          .Where(r => r.RestaurantId == restaurantServiceModel.Id)
                          .ToListAsync();

            double average = Math.Round((reviews.Sum(r => r.Rate)) / reviews.Count(), 1);

            return(average);
        }
Beispiel #10
0
        public async Task <IActionResult> Add(string city, string restaurant, AddTableBindingModel model)
        {
            RestaurantServiceModel restaurantFromDb = await restaurantService.GetRestaurantByNameAndCity(city, restaurant);

            if (ModelState.IsValid)
            {
                await tablesService.AddTable(model, restaurantFromDb);
            }

            return(this.Redirect($"/Tables/{city}/{restaurant}"));
        }
        public async Task <bool> CreateNewRestaurant(RestaurantServiceModel restaurantServiceModel)
        {
            Restaurant restaurant = AutoMapper.Mapper.Map <Restaurant>(restaurantServiceModel);

            CheckIfCityExists(restaurant);
            ValidateRestaurant(restaurant);

            await dbContext.Restaurants.AddAsync(restaurant);

            var result = await dbContext.SaveChangesAsync();

            return(result > 0);
        }
        public async Task GetRestaurantByNameAndCity_WithInvalidData_ShouldReturnNull()
        {
            string errorMessage = "RestaurantService GetRestaurantByNameAndCity() method does not work properly.";
            var    context      = ReserveTableDbContextInMemoryFactory.InitializeContext();

            this.restaurantService = new RestaurantService(context);
            await SeedData(context);

            string city       = "Plovdiv";
            string restaurant = "Happy";

            RestaurantServiceModel actualResult = await restaurantService.GetRestaurantByNameAndCity(city, restaurant);

            Assert.True(actualResult == null, errorMessage);
        }
Beispiel #13
0
        public async Task MakeReservation_WithNoAvailableTables_ShouldReturnNull()
        {
            string errorMessage = "ReservationService MakeReservation() method does not work properly.";

            var context = ReserveTableDbContextInMemoryFactory.InitializeContext();

            this.reservationService = new ReservationService(context);
            await SeedData(context);

            CreateReservationBindingModel reservationBindingModel = new CreateReservationBindingModel
            {
                Date       = "09/08/2019 20:00:00",
                SeatsCount = 4,
                Restaurant = "Happy"
            };

            ReserveTableUserServiceModel user = new ReserveTableUserServiceModel
            {
                Id       = "1",
                Email    = "*****@*****.**",
                UserName = "******"
            };

            RestaurantServiceModel restaurant = new RestaurantServiceModel
            {
                Id            = "1",
                Address       = "New Street",
                AverageRating = 10,
                CityId        = "1",
                Name          = "Happy",
                PhoneNumber   = "0888888888",
                Photo         = "/src/happy.jpg",
                Tables        = new List <TableServiceModel>()
                {
                    new TableServiceModel
                    {
                        Id           = "1",
                        SeatsCount   = 2,
                        RestaurantId = "1",
                        Reservations = new List <ReservationServiceModel>()
                    }
                }
            };

            var actualResult = await reservationService.MakeReservation(reservationBindingModel, user, restaurant);

            Assert.True(actualResult == null, errorMessage);
        }
        public async Task <bool> CheckIfExists(RestaurantServiceModel restaurantServiceModel, string cityName)
        {
            var allRestaurants = await dbContext.Restaurants
                                 .Include(r => r.City)
                                 .ToListAsync();

            if (allRestaurants
                .Any(r => r.Name == restaurantServiceModel.Name &&
                     r.City.Name == cityName &&
                     r.Address == restaurantServiceModel.Address))
            {
                return(true);
            }

            return(false);
        }
        public async Task <bool> AddTable(AddTableBindingModel model, RestaurantServiceModel restaurantServiceModel)
        {
            var table = new Table
            {
                SeatsCount   = model.SeatsCount,
                RestaurantId = restaurantServiceModel.Id
            };

            ValidateTable(table);
            CheckIfRestaurantExists(restaurantServiceModel);

            await dbContext.Tables.AddAsync(table);

            var result = await dbContext.SaveChangesAsync();

            return(result > 0);
        }
        public async Task CreateNewRestaurant_WithInvalidAddress_ShouldThrowArgumentException(string address)
        {
            var context = ReserveTableDbContextInMemoryFactory.InitializeContext();

            this.restaurantService = new RestaurantService(context);
            await SeedData(context);

            RestaurantServiceModel restaurant = new RestaurantServiceModel
            {
                Name        = "Happy",
                Address     = address,
                CityId      = "1",
                PhoneNumber = "08888888888",
                Photo       = "/src/happy.jpg"
            };

            await Assert.ThrowsAsync <ArgumentException>(() => this.restaurantService.CreateNewRestaurant(restaurant));
        }
        public async Task CreateNewRestaurant_InNotExistentCity_ShouldThrowArgumentNullException()
        {
            var context = ReserveTableDbContextInMemoryFactory.InitializeContext();

            this.restaurantService = new RestaurantService(context);
            await SeedData(context);

            RestaurantServiceModel restaurant = new RestaurantServiceModel
            {
                Name        = "Happy",
                Address     = "Center",
                CityId      = "2",
                PhoneNumber = "08888888888",
                Photo       = "/src/happy.jpg"
            };

            await Assert.ThrowsAsync <ArgumentNullException>(() => this.restaurantService.CreateNewRestaurant(restaurant));
        }
        public async Task CreateNewRestaurant_WithCorrectData_ShouldCreateSucessfully()
        {
            string errorMessage = "RestaurantService CreateNewRestaurant() method does not work properly.";

            var context = ReserveTableDbContextInMemoryFactory.InitializeContext();

            this.restaurantService = new RestaurantService(context);
            await SeedData(context);

            RestaurantServiceModel restaurant = new RestaurantServiceModel
            {
                Name        = "Happy",
                Address     = "Center",
                CityId      = "1",
                PhoneNumber = "08888888888",
                Photo       = "/src/happy.jpg"
            };

            bool actualResult = await this.restaurantService.CreateNewRestaurant(restaurant);

            Assert.True(actualResult, errorMessage);
        }
        public async Task <IActionResult> My()
        {
            var username = this.User.Identity.Name;
            IQueryable <ReservationServiceModel> reservationsServiceModel = await reservationsService.GetMyReservations(username);

            var list = new List <MyReservationViewModel>();

            foreach (var reservation in reservationsServiceModel)
            {
                RestaurantServiceModel restaurant = await restaurantService.GetRestaurantById(reservation.RestaurantId);

                var reservationViewModel = AutoMapper.Mapper.Map <MyReservationViewModel>(reservation);

                list.Add(reservationViewModel);
            }

            MyReservationsListViewModel viewModel = new MyReservationsListViewModel
            {
                Reservations = list.OrderBy(r => r.Date).ToList()
            };

            return(this.View(viewModel));
        }
        public async Task GetAverageRate_WithData_ShouldReturnCorrectResult()
        {
            var context = ReserveTableDbContextInMemoryFactory.InitializeContext();

            this.restaurantService = new RestaurantService(context);
            await SeedData(context);

            var restaurant = new RestaurantServiceModel
            {
                Id          = "1",
                Name        = "Ego",
                Address     = "Egos Address",
                CityId      = "1",
                PhoneNumber = "0888888888",
                Photo       = "/src/ego-photo.jpg"
            };

            var reviews        = context.Reviews.Where(r => r.Restaurant.Name == "Ego").ToList();
            var expectedResult = (reviews.Sum(r => r.Rate)) / (reviews.Count);
            var actualResult   = await restaurantService.GetAverageRate(restaurant);

            Assert.Equal(expectedResult, actualResult);
        }
        public async Task CheckIfExists_WithNotExistingRestaurant_ShouldReturnFalse()
        {
            string errorMessage = "RestaurantService CheckIfExists() method does not work properly.";
            var    context      = ReserveTableDbContextInMemoryFactory.InitializeContext();

            this.restaurantService = new RestaurantService(context);
            await SeedData(context);

            RestaurantServiceModel restaurant = new RestaurantServiceModel
            {
                Id          = "1",
                Name        = "Mc Donalds",
                Address     = "Egos Address",
                CityId      = "1",
                PhoneNumber = "0888888888",
                Photo       = "/src/mcd-photo.jpg"
            };

            string cityName = "Plovdiv";

            var actualResult = await restaurantService.CheckIfExists(restaurant, cityName);

            Assert.False(actualResult, errorMessage);
        }
Beispiel #22
0
        public async Task <ReservationServiceModel> MakeReservation(CreateReservationBindingModel viewModel, ReserveTableUserServiceModel user, RestaurantServiceModel restaurant)
        {
            var dateTime = DateTime.Parse(viewModel.Date + " " + viewModel.Time);

            var tablesWithExactCountSeats = restaurant.Tables
                                            .Where(t => t.SeatsCount == viewModel.SeatsCount)
                                            .ToList();

            var tablesWithSeatsCountPlusOne = restaurant.Tables
                                              .Where(t => t.SeatsCount == viewModel.SeatsCount + 1)
                                              .ToList();

            ReservationServiceModel reservationServiceModel = new ReservationServiceModel();

            if (tablesWithExactCountSeats.Any())
            {
                foreach (var table in tablesWithExactCountSeats)
                {
                    return(await FindTable(viewModel, user, restaurant, dateTime, reservationServiceModel, table));
                }
            }
            else if (tablesWithSeatsCountPlusOne.Any())
            {
                foreach (var biggerTable in tablesWithSeatsCountPlusOne)
                {
                    return(await FindTable(viewModel, user, restaurant, dateTime, reservationServiceModel, biggerTable));
                }
            }

            return(null);
        }
Beispiel #23
0
 private static void InitializeReservation(CreateReservationBindingModel viewModel, ReserveTableUserServiceModel user, RestaurantServiceModel restaurant, DateTime dateTime, ReservationServiceModel reservationServiceModel, TableServiceModel table)
 {
     reservationServiceModel.ForDate      = dateTime;
     reservationServiceModel.SeatsCount   = viewModel.SeatsCount;
     reservationServiceModel.UserId       = user.Id;
     reservationServiceModel.TableId      = table.Id;
     reservationServiceModel.RestaurantId = restaurant.Id;
 }
Beispiel #24
0
        private async Task <ReservationServiceModel> FindTable(CreateReservationBindingModel viewModel, ReserveTableUserServiceModel user, RestaurantServiceModel restaurant, DateTime dateTime, ReservationServiceModel reservationServiceModel, TableServiceModel table)
        {
            if (table.Reservations.Any(t => (dateTime > t.ForDate && dateTime < t.EndOfReservation) && t.IsCancelled == false))
            {
                return(null);
            }
            else
            {
                InitializeReservation(viewModel, user, restaurant, dateTime, reservationServiceModel, table);

                var reservation = AutoMapper.Mapper.Map <Reservation>(reservationServiceModel);

                await dbContext.Reservations.AddAsync(reservation);

                await dbContext.SaveChangesAsync();

                return(reservationServiceModel);
            }
        }
Beispiel #25
0
        public async Task MakeReservation_WithCorrectData_ShouldCreateSucessfully(int seats)
        {
            string errorMessage = "ReservationService MakeReservation() method does not work properly.";

            var context = ReserveTableDbContextInMemoryFactory.InitializeContext();

            this.reservationService = new ReservationService(context);
            await SeedData(context);

            CreateReservationBindingModel reservationBindingModel = new CreateReservationBindingModel
            {
                Date       = "09/08/2019 20:00:00",
                SeatsCount = seats,
                Restaurant = "Happy"
            };

            ReserveTableUserServiceModel user = new ReserveTableUserServiceModel
            {
                Id       = "1",
                Email    = "*****@*****.**",
                UserName = "******"
            };

            RestaurantServiceModel restaurant = new RestaurantServiceModel
            {
                Id            = "1",
                Address       = "New Street",
                AverageRating = 10,
                CityId        = "1",
                Name          = "Happy",
                PhoneNumber   = "0888888888",
                Photo         = "/src/happy.jpg",
                Tables        = new List <TableServiceModel>()
                {
                    new TableServiceModel
                    {
                        Id           = "1",
                        SeatsCount   = 2,
                        RestaurantId = "1",
                        Reservations = new List <ReservationServiceModel>()
                    }
                }
            };

            var expectedResult = new ReservationServiceModel
            {
                ForDate    = new DateTime(2019, 08, 09, 20, 0, 0),
                Restaurant = new RestaurantServiceModel
                {
                    Id            = "1",
                    Address       = "New Street",
                    AverageRating = 10,
                    CityId        = "1",
                    Name          = "Happy",
                    PhoneNumber   = "0888888888",
                    Photo         = "/src/happy.jpg",
                    Tables        = new List <TableServiceModel>()
                    {
                        new TableServiceModel
                        {
                            Id           = "1",
                            SeatsCount   = 2,
                            RestaurantId = "1",
                            Reservations = new List <ReservationServiceModel>()
                        }
                    }
                },
                SeatsCount = seats,
                UserId     = "1"
            };
            var actualResult = await reservationService.MakeReservation(reservationBindingModel, user, restaurant);

            Assert.True(expectedResult.SeatsCount == actualResult.SeatsCount, errorMessage + " " + "Seats Count is not returned properly");
            Assert.True(expectedResult.ForDate == actualResult.ForDate, errorMessage + " " + "For Date is not returned properly");
            Assert.True(expectedResult.UserId == actualResult.UserId, errorMessage + " " + "User Id is not returned properly");
        }