public async Task GetAvailableCars_WhenCarNotAtLocation_DoesntReturnCar() { // Arrange var cars = SeedData.GenerateCars(1); await DbContext.AddRangeAsync(cars); var car1 = cars[0]; var locations = SeedData.GenerateLocations(2); await DbContext.AddRangeAsync(locations); var locationA = locations[0].LocationId; var locationB = locations[1].LocationId; // Car available at location B var previousTravelPlan = new TravelPlan() { StartLocationId = locationB, EndLocationId = locationB, CarId = car1.CarId, StartTimeUtc = new DateTime(2021, 2, 3), EndTimeUtc = new DateTime(2021, 2, 10) }; // Car needs to be at location B at this date var travelPlanInTheFuture = new TravelPlan() { CarId = car1.CarId, StartLocationId = locationB, EndLocationId = locationB, StartTimeUtc = new DateTime(2021, 2, 20), EndTimeUtc = new DateTime(2021, 3, 1) }; await DbContext.TravelPlans.AddRangeAsync(previousTravelPlan, travelPlanInTheFuture); await DbContext.SaveChangesAsync(); var carService = CarServiceFactory(); var timeWhenCarShouldBeAvailable = new DateTime(2021, 2, 11); // Find cars for location B var carOptions = new AvailableCarsOptions() { StartLocationId = locationB, EndLocationId = locationA, StartDateUtc = timeWhenCarShouldBeAvailable, EndDateUtc = timeWhenCarShouldBeAvailable.AddDays(7), }; // Act var(success, resultCars) = await carService.GetAvailableCarsAsync(carOptions); // Assert success.Should().BeFalse(); resultCars.Should().BeEmpty(); }
public async Task <IActionResult> GetAvailableCars(AvailableCarsOptions options) { var(success, cars) = await _carService.GetAvailableCarsAsync(options); if (!success) { return(NoContent()); } var response = new AvailableCarsResponse() { Cars = cars.Adapt <List <CarDto> >(), Count = cars.Count() }; return(Ok(response)); }
public async Task GetAvailableCars_WhenCarBooked_DoesntReturnCar(string tripStartString, string tripEndString) { // Arrange var cars = SeedData.GenerateCars(1); await DbContext.AddRangeAsync(cars); var car1 = cars[0]; var locations = SeedData.GenerateLocations(2); await DbContext.AddRangeAsync(locations); var locationA = locations[0].LocationId; var locationB = locations[1].LocationId; var previousTravelPlan = new TravelPlan() { StartLocationId = locationA, EndLocationId = locationB, CarId = car1.CarId, StartTimeUtc = new DateTime(2021, 2, 3), EndTimeUtc = new DateTime(2021, 2, 10) }; await DbContext.TravelPlans.AddRangeAsync(previousTravelPlan); await DbContext.SaveChangesAsync(); var carService = CarServiceFactory(); var carOptions = new AvailableCarsOptions() { StartLocationId = locationA, EndLocationId = locationB, StartDateUtc = DateTime.Parse(tripStartString), EndDateUtc = DateTime.Parse(tripEndString), }; // Act var(success, resultCars) = await carService.GetAvailableCarsAsync(carOptions); // Assert success.Should().BeFalse(); resultCars.Should().BeEmpty(); }
public async Task <(bool success, IEnumerable <Car> cars)> GetAvailableCarsAsync( AvailableCarsOptions availableCarsOptions) { var tripStart = availableCarsOptions.StartDateUtc; var tripEnd = availableCarsOptions.EndDateUtc; var unavailableCars = _dbContext.TravelPlans.Where(tp => (tripStart >= tp.StartTimeUtc && tripStart <= tp.EndTimeUtc) || (tripEnd >= tp.StartTimeUtc && tripEnd <= tp.EndTimeUtc) || (tripStart <= tp.StartTimeUtc && tripEnd >= tp.EndTimeUtc)); var unavailableCarIds = unavailableCars.Select(c => c.CarId); var availableCars = _dbContext.Cars.Where(c => !unavailableCarIds.Contains(c.CarId)); return(await availableCars.AnyAsync(), await availableCars.ToListAsync()); }
public async Task GetAvailableCars_WhenAvailableCarAtLocation_ReturnsAvailableCars() { // Arrange var cars = SeedData.GenerateCars(2); await DbContext.AddRangeAsync(cars); var car1 = cars[0]; var car2 = cars[1]; var locations = SeedData.GenerateLocations(2); var locationA = locations[0]; var locationB = locations[1]; await DbContext.AddRangeAsync(locations); // Booked from 3.2 - 10.2 , Free from 10.2 - 20.2, Booked from 20.0 - 1.3 var bookedFromAToB = new TravelPlan() { CarId = car1.CarId, StartLocationId = locationA.LocationId, EndLocationId = locationB.LocationId, StartTimeUtc = new DateTime(2021, 2, 3), EndTimeUtc = new DateTime(2021, 2, 10) }; var bookedFromBToA = new TravelPlan() { CarId = car1.CarId, StartLocationId = locationB.LocationId, EndLocationId = locationA.LocationId, StartTimeUtc = new DateTime(2021, 2, 20), EndTimeUtc = new DateTime(2021, 3, 1) }; // Car 2 starting location and available all the time var car2StartLocation = new TravelPlan() { CarId = car2.CarId, StartLocationId = locationB.LocationId, EndLocationId = locationB.LocationId, StartTimeUtc = new DateTime(2020, 1, 1), EndTimeUtc = new DateTime(2020, 1, 2) }; await DbContext.TravelPlans.AddRangeAsync(bookedFromAToB, bookedFromBToA, car2StartLocation); await DbContext.SaveChangesAsync(); var carService = CarServiceFactory(); var timeWhenCarShouldBeAvailable = new DateTime(2021, 2, 11); var carOptions = new AvailableCarsOptions() { StartDateUtc = timeWhenCarShouldBeAvailable, EndDateUtc = timeWhenCarShouldBeAvailable.AddDays(7), StartLocationId = locationB.LocationId, EndLocationId = locationB.LocationId }; // Act var(success, resultCars) = await carService.GetAvailableCarsAsync(carOptions); // Assert success.Should().BeTrue(); resultCars.Should().NotBeEmpty(); resultCars.Should().HaveCount(cars.Count); }