public void Should_find_no_room_when_searching_an_empty_location_catalog() { var hotelsAdapter = new HotelsAndRoomsAdapter(Constants.RelativePathForHotelIntegrationFiles, new FakeBus()); var readFacade = CompositionRootHelper.BuildTheReadModelHexagon(hotelsAdapter, hotelsAdapter); var searchQuery = new SearchBookingOptions(checkInDate: DateTime.Now, checkOutDate: DateTime.Now.AddDays(1), location: "Paris", numberOfAdults: 2, numberOfRoomsNeeded: 1, childrenCount: 0); var bookingOptions = readFacade.SearchBookingOptions(searchQuery); Check.That(bookingOptions).IsNotNull().And.IsEmpty(); }
public IActionResult Index(SearchRoomQueryViewModel queryViewModel) { var searchQuery = new SearchBookingOptions(queryViewModel.CheckInDate, queryViewModel.CheckOutDate, queryViewModel.Destination, queryViewModel.NumberOfAdults); var searchResult = this.searchService.SearchBookingOptions(searchQuery); var bookingOptionsViewModel = new BookingOptionsViewModel(queryViewModel, queryViewModel.Destination, searchResult); bookingOptionsViewModel.Location = searchQuery.Location; return(View(bookingOptionsViewModel)); }
public void Should_throw_exception_when_checkinDate_is_after_checkOutDate() { var hotelsAdapter = new HotelsAndRoomsAdapter(Constants.RelativePathForHotelIntegrationFiles, new FakeBus()); var readFacade = CompositionRootHelper.BuildTheReadModelHexagon(hotelsAdapter, hotelsAdapter); Check.ThatCode(() => { var searchQuery = new SearchBookingOptions(checkInDate: DateTime.Now.AddDays(1), checkOutDate: DateTime.Now, location: "Kunming", numberOfAdults: 1); return(readFacade.SearchBookingOptions(searchQuery)); }) .Throws <InvalidOperationException>(); }
public void Should_find_hotels_despite_incorrect_case_for_location() { var hotelsAdapter = new HotelsAndRoomsAdapter(Constants.RelativePathForHotelIntegrationFiles, new FakeBus()); hotelsAdapter.LoadHotelFile("New York Sofitel-availabilities.json"); var readFacade = CompositionRootHelper.BuildTheReadModelHexagon(hotelsAdapter, hotelsAdapter); var searchedLocation = "new york"; var searchQuery = new SearchBookingOptions(Constants.MyFavoriteSaturdayIn2017, checkOutDate: Constants.MyFavoriteSaturdayIn2017.AddDays(1), location: searchedLocation, numberOfAdults: 2, numberOfRoomsNeeded: 1, childrenCount: 0); var bookingOptions = readFacade.SearchBookingOptions(searchQuery); Check.That(bookingOptions).HasSize(1); }
public void Should_find_only_hotels_that_match_location_and_availability_for_this_period() { var hotelsAdapter = new HotelsAndRoomsAdapter(Constants.RelativePathForHotelIntegrationFiles, new FakeBus()); hotelsAdapter.LoadHotelFile("THE GRAND BUDAPEST HOTEL-availabilities.json"); // available hotelsAdapter.LoadHotelFile("Danubius Health Spa Resort Helia-availabilities.json"); // available hotelsAdapter.LoadHotelFile("BudaFull-the-always-unavailable-hotel-availabilities.json"); // unavailable var readFacade = CompositionRootHelper.BuildTheReadModelHexagon(hotelsAdapter, hotelsAdapter); var searchQuery = new SearchBookingOptions(Constants.MyFavoriteSaturdayIn2017, checkOutDate: Constants.MyFavoriteSaturdayIn2017.AddDays(1), location: "Budapest", numberOfAdults: 2, numberOfRoomsNeeded: 1, childrenCount: 0); var bookingOptions = readFacade.SearchBookingOptions(searchQuery); Check.That(bookingOptions).HasSize(2); }
public void Should_impact_both_write_and_read_models_when_sending_a_booking_command() { // Initialize Read-model side var bus = new FakeBus(synchronousPublication: true); var hotelsAdapter = new HotelsAndRoomsAdapter(Constants.RelativePathForHotelIntegrationFiles, bus); var reservationsAdapter = new ReservationAdapter(bus); hotelsAdapter.LoadHotelFile("New York Sofitel-availabilities.json"); var readFacade = CompositionRootHelper.BuildTheReadModelHexagon(hotelsAdapter, hotelsAdapter, reservationsAdapter, bus); // Search Rooms availabilities var checkInDate = Constants.MyFavoriteSaturdayIn2017; var checkOutDate = checkInDate.AddDays(1); var searchQuery = new SearchBookingOptions(checkInDate, checkOutDate, location: "New York", numberOfAdults: 2); var bookingOptions = readFacade.SearchBookingOptions(searchQuery); // We should get 1 booking option with 13 available rooms in it. Check.That(bookingOptions).HasSize(1); var bookingOption = bookingOptions.First(); var initialRoomsNumbers = 13; Check.That(bookingOption.AvailableRoomsWithPrices).HasSize(initialRoomsNumbers); // Now, let's book that room! var firstRoomOfThisBookingOption = bookingOption.AvailableRoomsWithPrices.First(); var bookingCommand = new BookingCommand(clientId: "*****@*****.**", hotelName: "New York Sofitel", hotelId: bookingOption.Hotel.Identifier, roomNumber: firstRoomOfThisBookingOption.RoomIdentifier, checkInDate: checkInDate, checkOutDate: checkOutDate); // Initialize Write-model side var bookingRepository = new BookingAndClientsRepository(); CompositionRootHelper.BuildTheWriteModelHexagon(bookingRepository, bookingRepository, bus, bus); // We send the BookARoom command bus.Send(bookingCommand); // We check that both the BookingRepository (Write model) and the available rooms (Read model) have been updated. Check.That(bookingRepository.GetBookingsFrom("*****@*****.**").Count()).IsEqualTo(1); // Fetch rooms availabilities now. One room should have disappeared from the search result bookingOptions = readFacade.SearchBookingOptions(searchQuery); Check.That(bookingOptions).HasSize(1); Check.That(bookingOption.AvailableRoomsWithPrices).As("available matching rooms").HasSize(initialRoomsNumbers - 1); }
public void Should_find_one_more_matching_hotel_after_new_hotel_is_integrated() { var hotelsAdapter = new HotelsAndRoomsAdapter(Constants.RelativePathForHotelIntegrationFiles, new FakeBus()); var readFacade = CompositionRootHelper.BuildTheReadModelHexagon(hotelsAdapter, hotelsAdapter); // Integrates a first hotel hotelsAdapter.LoadHotelFile("THE GRAND BUDAPEST HOTEL-availabilities.json"); var searchQuery = new SearchBookingOptions(Constants.MyFavoriteSaturdayIn2017, checkOutDate: Constants.MyFavoriteSaturdayIn2017.AddDays(1), location: "Budapest", numberOfAdults: 2, numberOfRoomsNeeded: 1, childrenCount: 0); var bookingOptions = readFacade.SearchBookingOptions(searchQuery); Check.That(bookingOptions).HasSize(1); // Loads a new hotel that has available room matching our research hotelsAdapter.LoadHotelFile("Danubius Health Spa Resort Helia-availabilities.json"); bookingOptions = readFacade.SearchBookingOptions(searchQuery); Check.That(bookingOptions).HasSize(2); // has found one more available hotel }
public void Should_find_matching_and_available_hotels() { var hotelsAdapter = new HotelsAndRoomsAdapter(Constants.RelativePathForHotelIntegrationFiles, new FakeBus()); hotelsAdapter.LoadHotelFile("New York Sofitel-availabilities.json"); var readFacade = CompositionRootHelper.BuildTheReadModelHexagon(hotelsAdapter, hotelsAdapter); var requestedLocation = "New York"; var searchQuery = new SearchBookingOptions(Constants.MyFavoriteSaturdayIn2017, checkOutDate: Constants.MyFavoriteSaturdayIn2017.AddDays(1), location: requestedLocation, numberOfAdults: 2, numberOfRoomsNeeded: 1, childrenCount: 0); var bookingOptions = readFacade.SearchBookingOptions(searchQuery); Check.That(bookingOptions).HasSize(1); var bookingOption = bookingOptions.First(); Check.That(bookingOption.Hotel.Location).IsEqualTo(requestedLocation); Check.That(bookingOption.Hotel.Name).IsEqualTo("New York Sofitel"); Check.That(bookingOption.AvailableRoomsWithPrices).HasSize(13); }