Skip to content

Commit

Permalink
Write failing test: Should_Book_a_room()
Browse files Browse the repository at this point in the history
  • Loading branch information
tpierrain committed Sep 21, 2016
1 parent 1d88838 commit 963e881
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 14 deletions.
2 changes: 1 addition & 1 deletion MiscNotes.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@
[http://www.programmableweb.com/category/hotels/apis?category=20057]()



Even if the objective is to illustrate the CQRS pattern, the Domain part of the current is somehow anemic as of today... To be improved.
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,21 @@
namespace BookARoom.Domain.ReadModel
{
/// <summary>
/// Search BookingProposals or details about Places.
/// Allow to search BookingProposals or to get details about Places.
/// </summary>
public class ReadFacade : ISearchBookingProposals, IProvidePlaces
public class ReadModelFacade : ISearchBookingProposals, IProvidePlaces
{
// TODO: question: find a domain name instead or keep focus on the CQRS pattern to ease understanding of the MS experiences'16 audience?

private readonly IProvideRooms roomsProvider;
private readonly IProvidePlaces placesProvider;

/// <summary>
/// Instantiates a <see cref="ReadFacade"/>.
/// Instantiates a <see cref="ReadModelFacade"/>.
/// </summary>
/// <param name="roomsProvider"></param>
/// <param name="placesProvider"></param>
public ReadFacade(IProvideRooms roomsProvider, IProvidePlaces placesProvider)
public ReadModelFacade(IProvideRooms roomsProvider, IProvidePlaces placesProvider)
{
this.roomsProvider = roomsProvider;
this.placesProvider = placesProvider;
Expand Down
48 changes: 47 additions & 1 deletion test/BookARoom.Tests/Acceptance/BookingEngineTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,53 @@ public class BookingEngineTests
[Test]
public void Should_Book_an_available_room()
{
throw new NotImplementedException("next step ;-)");
var bookingStore = new BookingStore();
var bookingHandler = new BookingCommandHandler(bookingStore);

Assert.AreEqual(0, bookingStore.BookingCount);

var bookingRequest = new BookARoomCommand(placeId: 1, roomNumber: "2", checkinDate: DateTime.Parse("2016-09-17"), checkoutDate: DateTime.Parse("2016-09-18"));
bookingHandler.Handle(bookingRequest);

Assert.AreEqual(1, bookingStore.BookingCount);
}
}

public class BookingStore
{
public long BookingCount { get; }


}

public class BookingCommandHandler
{
public BookingStore BookingStore { get; }

public BookingCommandHandler(BookingStore bookingStore)
{
this.BookingStore = bookingStore;
}

public void Handle(BookARoomCommand command)
{

}
}

public class BookARoomCommand
{
public int PlaceId { get; }
public string RoomNumber { get; }
public DateTime CheckinDate { get; }
public DateTime CheckoutDate { get; set; }

public BookARoomCommand(int placeId, string roomNumber, DateTime checkinDate, DateTime checkoutDate)
{
this.PlaceId = placeId;
this.RoomNumber = roomNumber;
this.CheckinDate = checkinDate;
CheckoutDate = checkoutDate;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
namespace BookARoom.Tests.Acceptance
{
[TestFixture]
public class ReadFacadeTests
public class ReadModelFacadeTests
{
private DateTime myFavoriteSaturdayIn2017 = new DateTime(2017, 09, 16);

Expand All @@ -16,7 +16,7 @@ public void Should_find_no_room_when_searching_an_empty_location_catalog()
{
var placesAdapter = new PlacesAndRoomsAdapter(@"../../IntegrationFiles/");

var readFacade = new ReadFacade(placesAdapter, placesAdapter);
var readFacade = new ReadModelFacade(placesAdapter, placesAdapter);
var bookingProposals = readFacade.SearchBookingProposals(checkInDate: DateTime.Now, checkOutDate: DateTime.Now.AddDays(1), location: "Paris", adultsCount: 2, roomNumber: 1, childrenCount: 0);
Assert.AreEqual(0, bookingProposals.Count());
}
Expand All @@ -27,7 +27,7 @@ public void Should_find_matching_and_available_place()
var placesAdapter = new PlacesAndRoomsAdapter(@"../../IntegrationFiles/");
placesAdapter.LoadPlaceFile("New York Sofitel-availabilities.json");

var readFacade = new ReadFacade(placesAdapter, placesAdapter);
var readFacade = new ReadModelFacade(placesAdapter, placesAdapter);
var bookingProposals = readFacade.SearchBookingProposals(myFavoriteSaturdayIn2017, checkOutDate: myFavoriteSaturdayIn2017.AddDays(1), location: "New York", adultsCount: 2, roomNumber: 1, childrenCount: 0);

Assert.AreEqual(1, bookingProposals.Count());
Expand All @@ -46,7 +46,7 @@ public void Should_find_only_places_that_match_location_and_available_for_this_p
placesAdapter.LoadPlaceFile("Danubius Health Spa Resort Helia-availabilities.json"); // available
placesAdapter.LoadPlaceFile("BudaFull-the-always-unavailable-hotel-availabilities.json"); // unavailable

var readFacade = new ReadFacade(placesAdapter, placesAdapter);
var readFacade = new ReadModelFacade(placesAdapter, placesAdapter);
var bookingProposals = readFacade.SearchBookingProposals(myFavoriteSaturdayIn2017, checkOutDate: myFavoriteSaturdayIn2017.AddDays(1), location: "Budapest", adultsCount: 2, roomNumber: 1, childrenCount: 0);

Assert.AreEqual(2, bookingProposals.Count());
Expand All @@ -56,7 +56,7 @@ public void Should_find_only_places_that_match_location_and_available_for_this_p
public void Should_throw_exception_when_checkinDate_is_after_checkOutDate()
{
var placesAdapter = new PlacesAndRoomsAdapter(@"../../IntegrationFiles/");
var readFacade = new ReadFacade(placesAdapter, placesAdapter);
var readFacade = new ReadModelFacade(placesAdapter, placesAdapter);

Assert.Throws<InvalidOperationException>( () => readFacade.SearchBookingProposals(checkInDate: DateTime.Now.AddDays(1), checkOutDate: DateTime.Now, location: "Kunming", adultsCount: 1));
}
Expand All @@ -67,7 +67,7 @@ public void Should_find_places_despite_wrong_case_location()
var placesAdapter = new PlacesAndRoomsAdapter(@"../../IntegrationFiles/");
placesAdapter.LoadPlaceFile("New York Sofitel-availabilities.json");

var readFacade = new ReadFacade(placesAdapter, placesAdapter);
var readFacade = new ReadModelFacade(placesAdapter, placesAdapter);
var searchedLocation = "new york";
var bookingProposals = readFacade.SearchBookingProposals(myFavoriteSaturdayIn2017, checkOutDate: myFavoriteSaturdayIn2017.AddDays(1), location: searchedLocation, adultsCount: 2, roomNumber: 1, childrenCount: 0);

Expand All @@ -78,7 +78,7 @@ public void Should_find_places_despite_wrong_case_location()
public void Should_find_new_matching_places_after_new_place_is_integrated()
{
var placesAdapter = new PlacesAndRoomsAdapter(@"../../IntegrationFiles/");
var readFacade = new ReadFacade(placesAdapter, placesAdapter);
var readFacade = new ReadModelFacade(placesAdapter, placesAdapter);

// Integrates a first place
placesAdapter.LoadPlaceFile("THE GRAND BUDAPEST HOTEL-availabilities.json");
Expand All @@ -97,7 +97,7 @@ public void Should_get_place_from_its_id()
var placesAdapter = new PlacesAndRoomsAdapter(@"../../IntegrationFiles/");
placesAdapter.LoadPlaceFile("New York Sofitel-availabilities.json");

var readFacade = new ReadFacade(placesAdapter, placesAdapter);
var readFacade = new ReadModelFacade(placesAdapter, placesAdapter);

var placeId = 1;
var place = readFacade.GetPlace(placeId: placeId);
Expand Down

0 comments on commit 963e881

Please sign in to comment.