예제 #1
0
        public void Should_load_a_file()
        {
            var hotelsAdapter = new HotelsAndRoomsAdapter(Constants.RelativePathForHotelIntegrationFiles, new FakeBus());

            hotelsAdapter.LoadHotelFile("New York Sofitel-availabilities.json");
            Check.That(hotelsAdapter.Hotels).HasSize(1);

            hotelsAdapter.LoadHotelFile("THE GRAND BUDAPEST HOTEL-availabilities.json");
            Check.That(hotelsAdapter.Hotels).HasSize(2);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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
        }
예제 #4
0
        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);
        }
예제 #5
0
        public void Should_get_hotel_from_its_id()
        {
            var hotelsAdapter = new HotelsAndRoomsAdapter(Constants.RelativePathForHotelIntegrationFiles, new FakeBus());

            hotelsAdapter.LoadHotelFile("New York Sofitel-availabilities.json");

            var readFacade = CompositionRootHelper.BuildTheReadModelHexagon(hotelsAdapter, hotelsAdapter);

            var hotelId = 1;
            var hotel   = readFacade.GetHotel(hotelId: hotelId);

            Check.That(hotel.Identifier).IsEqualTo(hotelId);
            Check.That(hotel.Name).IsEqualTo("New York Sofitel");
            Check.That(hotel.Location).IsEqualTo("New York");
            Check.That(hotel.NumberOfRooms).IsEqualTo(405);
        }
예제 #6
0
        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);
        }
예제 #7
0
        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);
        }
예제 #8
0
        public void Should_retrieve_updated_list_of_reservations()
        {
            var bus     = new FakeBus();
            var adapter = new HotelsAndRoomsAdapter(Constants.RelativePathForHotelIntegrationFiles, bus);

            adapter.LoadHotelFile("New York Sofitel-availabilities.json");
            var reservationAdapter = new ReservationAdapter(bus);
            var readFacade         = CompositionRootHelper.BuildTheReadModelHexagon(adapter, adapter, reservationAdapter, bus);

            var clientId = "*****@*****.**";
            IEnumerable <Reservation> reservations = readFacade.GetReservationsFor(clientId);

            Check.That(reservations).IsEmpty();

            var bookingAndClientsRepository = new BookingAndClientsRepository();

            CompositionRootHelper.BuildTheWriteModelHexagon(bookingAndClientsRepository, bookingAndClientsRepository, bus, bus);

            var hotelId      = 1;
            var hotelName    = "New York Sofitel";
            var roomNumber   = "101";
            var checkInDate  = Constants.MyFavoriteSaturdayIn2017;
            var checkOutDate = checkInDate.AddDays(1);

            bus.Send(new BookingCommand(clientId, hotelName, hotelId, roomNumber, checkInDate, checkOutDate));

            reservations = readFacade.GetReservationsFor(clientId);
            Check.That(reservations).HasSize(1);
            var reservation = reservations.First();

            Check.That(reservation.ClientId).IsEqualTo(clientId);
            Check.That(reservation.HotelId).IsEqualTo(hotelId.ToString()); // TODO: make the hotelId a string and not an int.
            Check.That(reservation.RoomNumber).IsEqualTo(roomNumber);
            Check.That(reservation.CheckInDate).IsEqualTo(checkInDate);
            Check.That(reservation.CheckOutDate).IsEqualTo(checkOutDate);
        }