Esempio n. 1
0
        /// <summary>
        /// Precondition: The given reservation must exist in the database
        /// Activates the given reservation. This means the car has been rented to a customer.
        /// A car is assigned and the car mileage is tracked.
        /// </summary>
        /// <param name="reservationId"></param>
        /// <returns>Returns the ActivatedReservation class that was created.</returns>
        ///

        public async Task <ActivatedReservation> activateReservation(int reservationId)
        {
            RentalCar car = await db.getAvailableRentalCar(reservationId);

            var res = await db.getReservation(reservationId);

            if (res.cancelled)
            {
                throw new InvalidOperationException("A cancelled reservation cannot be activated.");
            }

            ActivatedReservation activatedReservation = new ActivatedReservation(res, car, car.currentMileage, true);

            if (activatedReservation.reservation.expectedReturnDate < DateTime.Now ||
                activatedReservation.reservation.rentalDate > DateTime.Now)
            {
                throw new InvalidOperationException("The rental date has not yet been passed. " +
                                                    "Cannot activate reservation. " +
                                                    "\nGiven startDate: " + activatedReservation.reservation.rentalDate +
                                                    "\nGiven endDate: " + activatedReservation.reservation.rentalDate);
            }

            context.activatedReservations.Add(activatedReservation);
            await context.SaveChangesAsync();

            return(activatedReservation);
        }
Esempio n. 2
0
        public void SuccessfullyActivatesReservationAfterCollidingActivatedReservationIsDeactivated()
        {
            var customerMockSet             = new Mock <DbSet <BasicCustomer> >();
            var rentalCarMockSet            = new Mock <DbSet <RentalCar> >();
            var carTypeMockSet              = new Mock <DbSet <RentalCarType> >();
            var mockContext                 = new Mock <CarRentalContext>();
            var reservationMockSet          = new Mock <DbSet <Reservation> >();
            var activatedReservationMockSet = new Mock <DbSet <ActivatedReservation> >();

            unitTestHelper.setUpMockBasicCustomers(customerMockSet, mockContext);
            unitTestHelper.setUpMockCars(rentalCarMockSet, carTypeMockSet, mockContext);

            var carTypes = carTypeMockSet.Object.ToArray();
            var carType1 = carTypes[0];
            var carType2 = carTypes[1];
            var customer = customerMockSet.Object.ToArray()[0];

            var reservation1 = new Reservation(
                customer,
                carType2,
                DateTime.Now,
                DateTime.Now.AddDays(2));

            var reservation2 = new Reservation(
                customer,
                carType2,
                DateTime.Now,
                DateTime.Now.AddDays(2));

            reservation1.id = 0;
            reservation2.id = 1;

            unitTestHelper.setUpMockReservations(new List <Reservation> {
                reservation1, reservation2
            }, carTypeMockSet, customerMockSet, reservationMockSet, mockContext);

            using (var csr = new CarReservationService(mockContext.Object))
            {
                var reservations = reservationMockSet.Object.ToArray();
                var rentalcars   = rentalCarMockSet.Object.ToArray();
                var existingActivatedReservation = new ActivatedReservation(reservations[0], rentalcars[1], 0, false);

                unitTestHelper.setUpMockActivatedReservations(new List <ActivatedReservation> {
                    existingActivatedReservation
                }, activatedReservationMockSet, mockContext);

                var asyncActivatedReservation = csr.activateReservation(reservation1.id);
                asyncActivatedReservation.Wait();
                var activatedReservation = asyncActivatedReservation.Result;


                activatedReservationMockSet.Verify(a => a.Add(It.IsAny <ActivatedReservation>()), Times.Once());
                mockContext.Verify(a => a.SaveChangesAsync(), Times.Once());
            }
        }
Esempio n. 3
0
        public void FailsToDeactivateActivatedReservationWhenItIsAlreadyDeactivated()
        {
            var customerMockSet             = new Mock <DbSet <BasicCustomer> >();
            var rentalCarMockSet            = new Mock <DbSet <RentalCar> >();
            var carTypeMockSet              = new Mock <DbSet <RentalCarType> >();
            var mockContext                 = new Mock <CarRentalContext>();
            var reservationMockSet          = new Mock <DbSet <Reservation> >();
            var activatedReservationMockSet = new Mock <DbSet <ActivatedReservation> >();

            unitTestHelper.setUpMockBasicCustomers(customerMockSet, mockContext);
            unitTestHelper.setUpMockCars(rentalCarMockSet, carTypeMockSet, mockContext);

            var carTypes = carTypeMockSet.Object.ToArray();
            var carType1 = carTypes[0];
            var carType2 = carTypes[1];
            var customer = customerMockSet.Object.ToArray()[0];

            var reservation1 = new Reservation(
                customer,
                carType2,
                DateTime.Now,
                DateTime.Now.AddDays(2));

            reservation1.id = 0;

            var rentalcars = rentalCarMockSet.Object.ToArray();
            var existingActivatedReservation = new ActivatedReservation(reservation1, rentalcars[1], 0, false);

            existingActivatedReservation.id = 1;

            unitTestHelper.setUpMockActivatedReservations(new List <ActivatedReservation> {
                existingActivatedReservation
            }, activatedReservationMockSet, mockContext);

            using (var csr = new CarReservationService(mockContext.Object))
            {
                try
                {
                    var asyncActivatedReservation = csr.deactivateActivatedReservation(existingActivatedReservation.id);
                    asyncActivatedReservation.Wait();
                    var activatedReservation = asyncActivatedReservation.Result;

                    activatedReservationMockSet.Verify(a => a.Add(It.IsAny <ActivatedReservation>()), Times.Never());
                    mockContext.Verify(a => a.SaveChangesAsync(), Times.Never());
                }
                catch (Exception e)
                {
                    Assert.IsTrue(e.GetType() == new InvalidOperationException().GetType() || e.InnerException is InvalidOperationException);
                }
            }
        }
Esempio n. 4
0
        public void SuccessfullyCalculateRentalRate()
        {
            double kmPrice            = 15;
            double baseDayRentalPrice = 20;
            double mileage            = 100;

            var configMockSet               = new Mock <DbSet <ConfigItem> >();
            var customerMockSet             = new Mock <DbSet <BasicCustomer> >();
            var rentalCarMockSet            = new Mock <DbSet <RentalCar> >();
            var carTypeMockSet              = new Mock <DbSet <RentalCarType> >();
            var mockContext                 = new Mock <CarRentalContext>();
            var reservationMockSet          = new Mock <DbSet <Reservation> >();
            var activatedReservationMockSet = new Mock <DbSet <ActivatedReservation> >();

            unitTestHelper.setUpMockBasicCustomers(customerMockSet, mockContext);
            unitTestHelper.setUpMockCars(rentalCarMockSet, carTypeMockSet, mockContext);

            var carTypes = carTypeMockSet.Object.ToArray();
            var carType1 = carTypes[0];
            var carType2 = carTypes[1];
            var customer = customerMockSet.Object.ToArray()[0];

            var reservation = new Reservation(
                customer,
                carType2,
                DateTime.Now.AddDays(1),
                DateTime.Now.AddDays(2));

            reservation.id = 0;

            var rentalCar            = rentalCarMockSet.Object.FirstOrDefault(car => car.rentalCarType.carTypeName == carType2.carTypeName);
            var activatedReservation = new ActivatedReservation(reservation, rentalCar, 0, true);

            activatedReservation.endMileage        = 100;
            activatedReservation.actualReturnDate  = DateTime.Now;
            activatedReservation.isCurrentlyActive = false;

            unitTestHelper.setUpMockReservations(new List <Reservation> {
                reservation
            }, carTypeMockSet, customerMockSet, reservationMockSet, mockContext);
            unitTestHelper.setUpMockActivatedReservations(new List <ActivatedReservation> {
                activatedReservation
            }, activatedReservationMockSet, mockContext);

            var configList = new List <ConfigItem> {
                new ConfigItem {
                    configName = "kmPrice", value = kmPrice.ToString()
                },
                new ConfigItem {
                    configName = "baseDayRentalPrice", value = baseDayRentalPrice.ToString()
                }
            };

            unitTestHelper.setUpMockConfigItems(configList, configMockSet, mockContext);

            double kmPriceModifier   = carType2.kmPriceModifier;
            double basePriceModifier = carType2.basePriceModifier;
            double dayDiff           = (reservation.expectedReturnDate - reservation.rentalDate).Days;

            double expectedCost = baseDayRentalPrice * dayDiff * basePriceModifier + kmPrice * mileage * kmPriceModifier;

            using (var rrcs = new RentalRateCalculatorService(mockContext.Object))
            {
                var asyncCost = rrcs.calculateCost(activatedReservation.id);
                asyncCost.Wait();
                var cost = asyncCost.Result;
                Assert.AreEqual(expectedCost, cost);
            }
        }