Example #1
0
        public void Run_WithCancelReservationOptionAndNoExistingReservation_ShouldCancelReservation()
        {
            // Arrange.
            var car = new Car {
                CarId = 1, Model = "Camry", Quantity = 2
            };
            var user = new User {
                UserId = 2, Email = "*****@*****.**", FirstName = "Ananth", LastName = "Tatachar"
            };
            var reservationOption = new ReservationOptions
            {
                NewReservation    = false,
                CancelReservation = true,
                CarModel          = car.Model,
                Email             = user.Email,
                FromDate          = new DateTime(2018, 01, 03),
                ToDate            = new DateTime(2018, 01, 05),
                UserName          = $"{user.FirstName} {user.LastName}"
            };

            _carInfoProvider.GetCar(reservationOption.CarModel).ReturnsForAnyArgs(car);
            _userInfoProvider.GetUser(new Tuple <string, string>(user.FirstName, user.LastName), user.Email).ReturnsForAnyArgs(user);
            _reservationsRepository.GetReservation(user.UserId, car.CarId, reservationOption.FromDate,
                                                   reservationOption.ToDate).ReturnsNullForAnyArgs();

            _reservationsService.TryCancel(null, car, user).Returns(1);

            // Act + Assert.
            var ex = Assert.Throws <ArgumentException>(() => _target.Run(reservationOption));

            Assert.That(ex.ToString().Contains("Reservation does not exist"));
        }
Example #2
0
        public void Run_WithMakeReservationOption_ShouldMakeNewReservation()
        {
            // Arrange.
            var car = new Car {
                CarId = 1, Model = "Camry", Quantity = 2
            };
            var user = new User {
                UserId = 2, Email = "*****@*****.**", FirstName = "Ananth", LastName = "Tatachar"
            };
            var reservationOption = new ReservationOptions
            {
                NewReservation = true, CancelReservation = false, CarModel = car.Model, Email = user.Email,
                FromDate       = new DateTime(2018, 01, 03), ToDate = new DateTime(2018, 01, 05),
                UserName       = $"{user.FirstName} {user.LastName}"
            };

            _carInfoProvider.GetCar(reservationOption.CarModel).ReturnsForAnyArgs(car);
            _userInfoProvider.GetUser(new Tuple <string, string>(user.FirstName, user.LastName), user.Email).ReturnsForAnyArgs(user);
            _reservationsRepository.GetReservation(user.UserId, car.CarId, reservationOption.FromDate,
                                                   reservationOption.ToDate).ReturnsNullForAnyArgs();

            _reservationsService.TryReserve(reservationOption, car, user).Returns(1);

            // Act.
            var result = _target.Run(reservationOption);

            // Assert.
            Assert.That(result == 1);
        }
Example #3
0
        public void TryReserve_WithZeroCarQtyAndPreviousNonOverLappingBookings_ShouldBeReserved()
        {
            // Arrange .
            const int carQuantity = 0;
            var       car         = new Car {
                CarId = 1, Model = "Camry", Quantity = carQuantity
            };
            var user = new User {
                UserId = 2, Email = "*****@*****.**", FirstName = "Ananth", LastName = "Tatachar"
            };
            var reservationOption = new ReservationOptions
            {
                NewReservation    = true,
                CancelReservation = false,
                CarModel          = car.Model,
                Email             = user.Email,
                FromDate          = new DateTime(2018, 01, 01),
                ToDate            = new DateTime(2018, 01, 05),
                UserName          = $"{user.FirstName} {user.LastName}"
            };

            _reservationsRepository.GetCountOfPreviousReservation(car.CarId, reservationOption.FromDate)
            .ReturnsForAnyArgs(1);

            // Act .
            var result = _target.TryReserve(reservationOption, car, user);

            // Assert .
            Assert.That(result == 1);
        }
Example #4
0
        public void TryReserve_ValidArguments_ShouldBeReserved()
        {
            // Arrange .
            const int carQuantity = 2;
            var       car         = new Car {
                CarId = 1, Model = "Camry", Quantity = carQuantity
            };
            var user = new User {
                UserId = 2, Email = "*****@*****.**", FirstName = "Ananth", LastName = "Tatachar"
            };
            var reservationOption = new ReservationOptions
            {
                NewReservation    = true,
                CancelReservation = false,
                CarModel          = car.Model,
                Email             = user.Email,
                FromDate          = new DateTime(2018, 01, 01),
                ToDate            = new DateTime(2018, 01, 05),
                UserName          = $"{user.FirstName} {user.LastName}"
            };

            // Act .
            var result = _target.TryReserve(reservationOption, car, user);

            // Assert .
            Assert.That(result == 1);
            Assert.That(car.Quantity == carQuantity - 1);
        }
        public void ValidateAction(ReservationOptions reservationOptions)
        {
            if (!reservationOptions.NewReservation || !reservationOptions.CancelReservation)
            {
                return;
            }
            const string errorMessage = "Cannot cancel and make reservation at the same time";

            Logger.Error(errorMessage);
            throw new ArgumentException(errorMessage);
        }
        public void ValidateBookingDates_WithValidBookingDates_ShouldNotThrowException()
        {
            // Arrange .
            var reservationOptions = new ReservationOptions
            {
                FromDate = new DateTime(2018, 01, 01), ToDate = new DateTime(2018, 01, 04)
            };

            // Act + Arrange .
            _target.ValidateBookingDates(reservationOptions);
        }
 public void ValidateBookingDates(ReservationOptions reservationOptions)
 {
     if (reservationOptions.ToDate > reservationOptions.FromDate)
     {
         return;
     }
     {
         var errorMessage = $" {reservationOptions.FromDate} should be less than {reservationOptions.ToDate} ";
         Logger.Error(errorMessage);
         throw new ArgumentException(errorMessage);
     }
 }
        public void ValidateAction_WithMakeReservationAndCancelReservationSet_ShouldThrowError()
        {
            // Arrange.
            var reservationOption = new ReservationOptions {
                CancelReservation = true, NewReservation = true
            };

            // Act + Arrange .
            var ex = Assert.Throws <ArgumentException>(() => _target.ValidateAction(reservationOption));

            Assert.That(ex.ToString().Contains("Cannot cancel and make reservation at the same time"));
        }
        public void ValidateBookingDates_WithInvalidBookingDates_ShouldThrowException()
        {
            // Arrange .
            var reservationOptions = new ReservationOptions
            {
                FromDate = new DateTime(2018, 01, 04), ToDate = new DateTime(2018, 01, 02)
            };

            // Act + Arrange .
            var ex = Assert.Throws <ArgumentException>(() => _target.ValidateBookingDates(reservationOptions));

            Assert.That(ex.ToString().Contains($" {reservationOptions.FromDate} should be less than {reservationOptions.ToDate} "));
        }
        public void Validate(ReservationOptions reservationOptions)
        {
            ValidateAction(reservationOptions);
            ValidateBookingDates(reservationOptions);
            ValidateAndRegisterUserIfNotExist(reservationOptions.UserName, reservationOptions.Email);

            if (_carInfoProvider.CarExists(reservationOptions.CarModel))
            {
                return;
            }
            var errorMessage =
                $" Invalid car model: {reservationOptions.CarModel}, available car models are: . {Environment.NewLine} {_carInfoProvider.GetAllCarModels()}";

            Logger.Error(errorMessage);
            throw new ArgumentException(errorMessage);
        }
        public void Validate_WithInvalidCarModelOption_ShouldThrowException()
        {
            // Arrange .
            var reservationOptions = new ReservationOptions
            {
                UserName = "******", NewReservation = true, CancelReservation = false, CarModel = "Unknown",
                Email    = "*****@*****.**", FromDate = new DateTime(2018, 01, 02),
                ToDate   = new DateTime(2018, 01, 04)
            };

            _carInfoProvider.CarExists(reservationOptions.CarModel).ReturnsForAnyArgs(false);
            _carInfoProvider.GetAllCarModels().ReturnsForAnyArgs(new StringBuilder("Benz"));

            // Act + Arrange .
            var ex = Assert.Throws <ArgumentException>(() => _target.Validate(reservationOptions));

            Assert.That(ex.ToString().Contains("Invalid car model"));
        }
Example #12
0
        public int TryReserve(ReservationOptions reservationOptions, Car car, User user)
        {
            var countOfPreviousReservations =
                _reservationsRepository.GetCountOfPreviousReservation(car.CarId, reservationOptions.FromDate);

            if (car.Quantity <= 0 && (car.Quantity + countOfPreviousReservations) <= 0)
            {
                Logger.Error("Unable to make reservation as no cars of this model are available.");
                return(0);
            }

            using (var connection = new SqlConnection(_connectionString))
            {
                connection.Open();
                var transaction = connection.BeginTransaction();
                try
                {
                    car.Quantity = car.Quantity - 1;
                    _carInfoProvider.ReserveCar(car, connection, transaction);
                    _reservationsRepository.MakeReservation(
                        new Reservation
                    {
                        CarId    = car.CarId,
                        UserId   = user.UserId,
                        Status   = Constants.ReservationStatus.Reserved,
                        FromDate = reservationOptions.FromDate,
                        ToDate   = reservationOptions.ToDate
                    }, connection, transaction);
                    transaction.Commit();
                    return(1);
                }
                catch (Exception e)
                {
                    transaction.Rollback();
                    Logger.Error(e.ToString());
                    throw;
                }
            }
        }
Example #13
0
        public int Run(ReservationOptions reservationOptions)
        {
            var user = GetUser(reservationOptions);
            var car  = _carInfoProvider.GetCar(reservationOptions.CarModel);

            var existingReservation = _reservationsRepository.GetReservation(user.UserId, car.CarId,
                                                                             reservationOptions.FromDate, reservationOptions.ToDate);

            if (reservationOptions.NewReservation)
            {
                if (existingReservation != null)
                {
                    const string errorMessage = " Reservation already exists ";
                    Logger.Error(errorMessage);
                    throw new ArgumentException(errorMessage);
                }

                var result = _reservationsService.TryReserve(reservationOptions, car, user);
                Logger.Info(result == 1 ? "Reservation made successfully." : "Unable to make reservation.");
                return(result);
            }

            if (!reservationOptions.CancelReservation)
            {
                return(0);
            }
            {
                if (existingReservation == null && reservationOptions.CancelReservation)
                {
                    const string errorMessage = " Reservation does not exist ";
                    Logger.Error(errorMessage);
                    throw new ArgumentException(errorMessage);
                }
                var result = _reservationsService.TryCancel(existingReservation, car, user);
                Logger.Info(result == 1 ? "Reservation cancelled successfully." : "Unable to make reservation.");
                return(result);
            }
        }
Example #14
0
        private User GetUser(ReservationOptions reservationOptions)
        {
            var userName = _userInfoProvider.GetFirstAndLastNames(reservationOptions.UserName);

            return(_userInfoProvider.GetUser(userName, reservationOptions.Email));
        }