/// <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); }
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()); } }
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); } } }
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); } }