public async void Availability_Returns_CorrectResult(DateTime depDate, DateTime returnDate, string location, int expectedPilotId)
        {
            var options = new DbContextOptionsBuilder <CrewOnDemandContext>()
                          .UseInMemoryDatabase(databaseName: "db_seeded_with_bookings_1")
                          .Options;

            using (var context = new CrewOnDemandContext(options))
            {
                context.Database.EnsureCreated();
                context.Bookings.AddRange(_fakeBookings);
                context.SaveChanges();

                var repository = new CrewOnDemandRepository(context);
                var service    = new CrewOnDemandService(repository, _telemetryClient, new BookingCreatedPublisher(_telemetryClient));
                var sut        = new PilotsController(service);

                var actionResult = await sut.Availability(new AvailabilitySearch
                {
                    DepDateTime    = depDate,
                    ReturnDateTime = returnDate,
                    Location       = location
                });

                Assert.IsType <OkObjectResult>(actionResult.Result);

                var result      = actionResult.Result as OkObjectResult;
                var pilotResult = result.Value as Pilot;

                Assert.Equal(expectedPilotId, pilotResult.Id);
            }
        }
        public async void Availability_Returns_BadRequest_When_DepartureAfterReturn()
        {
            var options = new DbContextOptionsBuilder <CrewOnDemandContext>()
                          .UseInMemoryDatabase(databaseName: "db_empty")
                          .Options;

            using (var context = new CrewOnDemandContext(options))
            {
                var repository = new CrewOnDemandRepository(context);
                var service    = new CrewOnDemandService(repository, _telemetryClient, new BookingCreatedPublisher(_telemetryClient));
                var sut        = new PilotsController(service);

                var actionResult = await sut.Availability(new AvailabilitySearch
                {
                    DepDateTime    = new DateTime(2020, 1, 1),
                    ReturnDateTime = new DateTime(2000, 1, 1),
                    Location       = "munich"
                });

                Assert.IsType <BadRequestObjectResult>(actionResult.Result);
            }
        }
        public async void Book_Returns_CorrectResult(DateTime depDate, DateTime returnDate, int pilotId, bool expectedResult)
        {
            var options = new DbContextOptionsBuilder <CrewOnDemandContext>()
                          .UseInMemoryDatabase(databaseName: "db_seeded_with_bookings")
                          .Options;

            using (var context = new CrewOnDemandContext(options))
            {
                context.Database.EnsureCreated();
                context.Bookings.AddRange(_fakeBookings);
                context.SaveChanges();

                var repository = new CrewOnDemandRepository(context);
                var service    = new CrewOnDemandService(repository, _telemetryClient, new BookingCreatedPublisher(_telemetryClient));
                var sut        = new FlightsController(service);

                var actionResult = await sut.Book(new BookingRequest
                {
                    DepDateTime    = depDate,
                    ReturnDateTime = returnDate,
                    PilotId        = pilotId
                });

                if (expectedResult)
                {
                    Assert.IsType <StatusCodeResult>(actionResult);

                    var result = actionResult as StatusCodeResult;

                    Assert.Equal(201, result.StatusCode);
                }
                else
                {
                    Assert.IsType <ConflictObjectResult>(actionResult);
                }
            }
        }