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();
        }
Esempio n. 2
0
        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();
        }
Esempio n. 4
0
        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);
        }