public async Task RegisterTwoBooking_OneUnit_FirstBookingEndDate_Same_SecondStartDate_AwaitFail() { var rental = new RentalBindingModel { Units = 1 }; var postRental = await client.PostAsync <ResourceIdViewModel>("/api/v1/rentals", rental); int nights = 10; var booking1 = new BookingBindingModel { RentalId = postRental.Id, Nights = nights, Start = DateTime.Now.AddDays(1) }; var booking2 = new BookingBindingModel { RentalId = postRental.Id, Nights = nights, Start = DateTime.Now.AddDays(1 + nights) }; var postBooking1 = await client.PostAsync <ResourceIdViewModel>("/api/v1/bookings", booking1, Code.OK); var postBooking2 = await client.PostAsync <ExceptionViewModel>("/api/v1/bookings", booking2, Code.Unprocessable); Assert.Equal(postBooking2.Message, Error.NoVacancy); }
public async Task ChangeRentalUnits_ZeroBooking_AwaitSuccess() { var rental = new RentalBindingModel { Units = 25, PreparationTimeInDays = 1 }; var postRentalResult = await client.PostAsync <ResourceIdViewModel>("/api/v1/rentals", rental, Code.OK); var getRentalResult = await client.GetAsync <RentalViewModel>($"/api/v1/rentals/{postRentalResult.Id}", Code.OK); Assert.Equal(getRentalResult.Units, rental.Units); Assert.Equal(getRentalResult.PreparationTimeInDays, rental.PreparationTimeInDays); var putRental = new RentalBindingModel { Units = 10, PreparationTimeInDays = 2 }; var putRentalResult = await client.PutAsync <RentalViewModel>($"/api/v1/rentals/{postRentalResult.Id}", putRental, Code.OK); Assert.Equal(putRentalResult.Units, putRental.Units); Assert.Equal(putRentalResult.PreparationTimeInDays, putRental.PreparationTimeInDays); Assert.NotEqual(putRentalResult.Units, getRentalResult.Units); Assert.NotEqual(putRentalResult.PreparationTimeInDays, getRentalResult.PreparationTimeInDays); }
public async Task AttemptCreateRental_LessZeroUnits_AwaitFail() { var request = new RentalBindingModel { Units = -10 }; var postRental = await client.PostAsync <ExceptionViewModel>("/api/v1/rentals", request, Code.Unprocessable); Assert.True(postRental.Message == Error.RentalUnitsZero); }
public async Task DecrementRentalUnits_3Bookings_OneBookingIntersect_AwaitFail() { var rental = new RentalBindingModel { Units = 2, PreparationTimeInDays = 0 }; var postRentalResult = await client.PostAsync <ResourceIdViewModel>("/api/v1/rentals", rental, Code.OK); var getRentalResult = await client.GetAsync <RentalViewModel>($"/api/v1/rentals/{postRentalResult.Id}", Code.OK); Assert.Equal(getRentalResult.Units, rental.Units); Assert.Equal(getRentalResult.PreparationTimeInDays, rental.PreparationTimeInDays); var booking1 = new BookingBindingModel { RentalId = postRentalResult.Id, Nights = 2, Start = DateTime.Now }; var booking2 = new BookingBindingModel { RentalId = postRentalResult.Id, Nights = 2, Start = DateTime.Now }; var booking3 = new BookingBindingModel { RentalId = postRentalResult.Id, Nights = 2, Start = DateTime.Now.AddDays(5) }; var postBooking1 = await client.PostAsync <ResourceIdViewModel>("/api/v1/bookings", booking1, Code.OK); var postBooking2 = await client.PostAsync <ResourceIdViewModel>("/api/v1/bookings", booking2, Code.OK); var postBooking3 = await client.PostAsync <ResourceIdViewModel>("/api/v1/bookings", booking3, Code.OK); Assert.Equal(1, postBooking1.Id); Assert.Equal(2, postBooking2.Id); Assert.Equal(3, postBooking3.Id); var putRental = new RentalBindingModel { Units = 1, PreparationTimeInDays = 0 }; var putRentalResult = await client.PutAsync <ExceptionViewModel>($"/api/v1/rentals/{postRentalResult.Id}", putRental, Code.Unprocessable); Assert.Equal(putRentalResult.Message, Error.UnallowedRentalEditing); }
public ResourceIdViewModel Post(RentalBindingModel model) { var key = new ResourceIdViewModel { Id = _rentals.Keys.Count + 1 }; _rentals.Add(key.Id, new RentalViewModel { Id = key.Id, Units = model.Units }); return(key); }
public async Task GivenCompleteRequest_WhenGetCalendar_ThenAGetReturnsTheCalculatedCalendar() { var postRentalRequest = new RentalBindingModel { Units = 2 }; var postRentalResult = await client.PostAsync <ResourceIdViewModel>("/api/v1/rentals", postRentalRequest, Code.OK); var postBooking1Request = new BookingBindingModel { RentalId = postRentalResult.Id, Nights = 2, Start = new DateTime(2030, 01, 02) }; var postBooking1Result = await client.PostAsync <ResourceIdViewModel>($"/api/v1/bookings", postBooking1Request, Code.OK); var postBooking2Request = new BookingBindingModel { RentalId = postRentalResult.Id, Nights = 2, Start = new DateTime(2030, 01, 03) }; var postBooking2Result = await client.PostAsync <ResourceIdViewModel>($"/api/v1/bookings", postBooking2Request); string url = $"/api/v1/calendar?rentalId={postRentalResult.Id}&start=2030-01-01&nights=5"; CalendarViewModel getCalendarResponse = await client.GetAsync <CalendarViewModel>(url, Code.OK); Assert.Equal(postRentalResult.Id, getCalendarResponse.RentalId); Assert.Equal(5, getCalendarResponse.Dates.Count); Assert.Equal(new DateTime(2030, 01, 01), getCalendarResponse.Dates[0].Date); Assert.Empty(getCalendarResponse.Dates[0].Bookings); Assert.Equal(new DateTime(2030, 01, 02), getCalendarResponse.Dates[1].Date); Assert.Single(getCalendarResponse.Dates[1].Bookings); Assert.Contains(getCalendarResponse.Dates[1].Bookings, x => x.Id == postBooking1Result.Id); Assert.Equal(new DateTime(2030, 01, 03), getCalendarResponse.Dates[2].Date); Assert.Equal(2, getCalendarResponse.Dates[2].Bookings.Count); Assert.Contains(getCalendarResponse.Dates[2].Bookings, x => x.Id == postBooking1Result.Id); Assert.Contains(getCalendarResponse.Dates[2].Bookings, x => x.Id == postBooking2Result.Id); Assert.Equal(new DateTime(2030, 01, 04), getCalendarResponse.Dates[3].Date); Assert.Single(getCalendarResponse.Dates[1].Bookings); Assert.Contains(getCalendarResponse.Dates[3].Bookings, x => x.Id == postBooking2Result.Id); Assert.Equal(new DateTime(2030, 01, 05), getCalendarResponse.Dates[4].Date); Assert.Empty(getCalendarResponse.Dates[0].Bookings); }
public async Task RegisterRental_CompareRequest_To_Responce_Parameters_AwaitSuccess() { var request = new RentalBindingModel { Units = 25, PreparationTimeInDays = 10 }; var postRental = await client.PostAsync <ResourceIdViewModel>("/api/v1/rentals", request, Code.OK); var getRental = await client.GetAsync <RentalViewModel>($"/api/v1/rentals/{postRental.Id}", Code.OK); Assert.Equal(request.Units, getRental.Units); Assert.Equal(request.PreparationTimeInDays, getRental.PreparationTimeInDays); }
public RentalViewModel Put(int rentalId, [FromBody] RentalBindingModel model) { var rental = _rentals[rentalId]; rental.PreparationTimeInDays = model.PreparationTimeInDays; rental.Units = model.Units; var bookings = _bookings.Where(x => x.Value.RentalId == rental.Id).ToList(); bookings.ForEach(booking => { booking.Value.PreparationTimeInDays = model.PreparationTimeInDays; }); return(_rentals[rentalId]); }
public async Task RegisterBooking_ZeroNights_AwaitFail() { var rental = new RentalBindingModel { Units = 4 }; var postRental = await client.PostAsync <ResourceIdViewModel>("/api/v1/rentals", rental, Code.OK); var booking = new BookingBindingModel { RentalId = postRental.Id, Nights = 0, Start = DateTime.Now.AddYears(10) }; var postBooking = await client.PostAsync <ExceptionViewModel>("/api/v1/bookings", booking, Code.Unprocessable); Assert.Equal(postBooking.Message, Error.BookingNightsZero); }
public async Task IncrementRentalUnits_3Bookings_StartAndEndDatesNotIntersect_AwaitSuccess() { var rental = new RentalBindingModel { Units = 1, PreparationTimeInDays = 0 }; var postRentalResult = await client.PostAsync <ResourceIdViewModel>("/api/v1/rentals", rental, Code.OK); var getRentalResult = await client.GetAsync <RentalViewModel>($"/api/v1/rentals/{postRentalResult.Id}", Code.OK); Assert.Equal(getRentalResult.Units, rental.Units); Assert.Equal(getRentalResult.PreparationTimeInDays, rental.PreparationTimeInDays); int nights = 1; for (int i = 0; i < 3; i++) { var booking = new BookingBindingModel { RentalId = postRentalResult.Id, Nights = nights - i, Start = DateTime.Now.AddDays(nights + i) }; var postBooking = await client.PostAsync <ResourceIdViewModel>("/api/v1/bookings", booking, Code.OK); Assert.Equal(postBooking.Id, nights); nights++; } var putRental = new RentalBindingModel { Units = 3, PreparationTimeInDays = 0 }; var putRentalResult = await client.PutAsync <RentalViewModel>($"/api/v1/rentals/{postRentalResult.Id}", putRental, Code.OK); Assert.Equal(putRentalResult.Units, putRental.Units); Assert.Equal(putRentalResult.PreparationTimeInDays, putRental.PreparationTimeInDays); }
public async Task RegisterTwoBookingInSameTim_OneUnit_AwaitFail() { var rental = new RentalBindingModel { Units = 1 }; var postRental = await client.PostAsync <ResourceIdViewModel>("/api/v1/rentals", rental); var booking = new BookingBindingModel { RentalId = postRental.Id, Nights = 15, Start = DateTime.Now.AddYears(10) }; var postBooking1 = await client.PostAsync <ResourceIdViewModel>("/api/v1/bookings", booking, Code.OK); var postBooking2 = await client.PostAsync <ExceptionViewModel>("/api/v1/bookings", booking, Code.Unprocessable); Assert.Equal(postBooking2.Message, Error.NoVacancy); }
public async Task GivenCompleteRequest_WhenPostBooking_ThenAPostReturnsErrorWhenThereIsOverbooking() { var postRentalRequest = new RentalBindingModel { Units = 1 }; ResourceIdViewModel postRentalResult; using (var postRentalResponse = await _client.PostAsJsonAsync($"/api/v1/rentals", postRentalRequest)) { Assert.True(postRentalResponse.IsSuccessStatusCode); postRentalResult = await postRentalResponse.Content.ReadAsAsync <ResourceIdViewModel>(); } var postBooking1Request = new BookingBindingModel { RentalId = postRentalResult.Id, Nights = 3, Start = new DateTime(2002, 01, 01) }; using (var postBooking1Response = await _client.PostAsJsonAsync($"/api/v1/bookings", postBooking1Request)) { Assert.True(postBooking1Response.IsSuccessStatusCode); } var postBooking2Request = new BookingBindingModel { RentalId = postRentalResult.Id, Nights = 1, Start = new DateTime(2002, 01, 02) }; await Assert.ThrowsAsync <ApplicationException>(async() => { using (var postBooking2Response = await _client.PostAsJsonAsync($"/api/v1/bookings", postBooking2Request)) { } }); }
public async Task GivenCompleteRequest_WhenPostBooking_ThenAGetReturnsTheCreatedBooking() { var postRentalRequest = new RentalBindingModel { Units = 4 }; ResourceIdViewModel postRentalResult; using (var postRentalResponse = await _client.PostAsJsonAsync($"/api/v1/rentals", postRentalRequest)) { Assert.True(postRentalResponse.IsSuccessStatusCode); postRentalResult = await postRentalResponse.Content.ReadAsAsync <ResourceIdViewModel>(); } var postBookingRequest = new BookingBindingModel { RentalId = postRentalResult.Id, Nights = 3, Start = new DateTime(2001, 01, 01) }; ResourceIdViewModel postBookingResult; using (var postBookingResponse = await _client.PostAsJsonAsync($"/api/v1/bookings", postBookingRequest)) { Assert.True(postBookingResponse.IsSuccessStatusCode); postBookingResult = await postBookingResponse.Content.ReadAsAsync <ResourceIdViewModel>(); } using (var getBookingResponse = await _client.GetAsync($"/api/v1/bookings/{postBookingResult.Id}")) { Assert.True(getBookingResponse.IsSuccessStatusCode); var getBookingResult = await getBookingResponse.Content.ReadAsAsync <BookingViewModel>(); Assert.Equal(postBookingRequest.RentalId, getBookingResult.RentalId); Assert.Equal(postBookingRequest.Nights, getBookingResult.Nights); Assert.Equal(postBookingRequest.Start, getBookingResult.Start); } }
public async Task RegisterBooking_Today_AwaitSuccess() { var rental = new RentalBindingModel { Units = 4 }; var postRental = await client.PostAsync <ResourceIdViewModel>("/api/v1/rentals", rental, Code.OK); var booking = new BookingBindingModel { RentalId = postRental.Id, Nights = 10, Start = DateTime.Now }; var postBooking = await client.PostAsync <ResourceIdViewModel>("/api/v1/bookings", booking, Code.OK); var getBookingResult = await client.GetAsync <BookingViewModel>($"/api/v1/bookings/{postBooking.Id}", Code.OK); Assert.Equal(getBookingResult.Nights, booking.Nights); Assert.Equal(getBookingResult.RentalId, booking.RentalId); Assert.Equal(getBookingResult.Start, booking.Start); }
public async Task ChangeRental_LessZeroUnits_AwaitFail() { var rental = new RentalBindingModel { Units = 25, PreparationTimeInDays = 1 }; var postRentalResult = await client.PostAsync <ResourceIdViewModel>("/api/v1/rentals", rental, Code.OK); var getRentalResult = await client.GetAsync <RentalViewModel>($"/api/v1/rentals/{postRentalResult.Id}", Code.OK); Assert.Equal(getRentalResult.Units, rental.Units); Assert.Equal(getRentalResult.PreparationTimeInDays, rental.PreparationTimeInDays); var putRental = new RentalBindingModel { Units = -100, PreparationTimeInDays = 2 }; var putRentalResult = await client.PutAsync <ExceptionViewModel>($"/api/v1/rentals/{postRentalResult.Id}", putRental, Code.Unprocessable); Assert.Equal(putRentalResult.Message, Error.RentalUnitsZero); }
public async Task GivenCompleteRequest_WhenPostRental_ThenAGetReturnsTheCreatedRental() { var request = new RentalBindingModel { Units = 25 }; ResourceIdViewModel postResult; using (var postResponse = await _client.PostAsJsonAsync($"/api/v1/rentals", request)) { Assert.True(postResponse.IsSuccessStatusCode); postResult = await postResponse.Content.ReadAsAsync <ResourceIdViewModel>(); } using (var getResponse = await _client.GetAsync($"/api/v1/rentals/{postResult.Id}")) { Assert.True(getResponse.IsSuccessStatusCode); var getResult = await getResponse.Content.ReadAsAsync <RentalViewModel>(); Assert.Equal(request.Units, getResult.Units); } }
public async Task GivenCompleteRequest_WhenGetCalendar_ThenAGetReturnsTheCalculatedCalendar() { var postRentalRequest = new RentalBindingModel { Units = 2 }; ResourceIdViewModel postRentalResult; using (var postRentalResponse = await _client.PostAsJsonAsync($"/api/v1/rentals", postRentalRequest)) { Assert.True(postRentalResponse.IsSuccessStatusCode); postRentalResult = await postRentalResponse.Content.ReadAsAsync <ResourceIdViewModel>(); } var postBooking1Request = new BookingBindingModel { RentalId = postRentalResult.Id, Nights = 2, Start = new DateTime(2000, 01, 02) }; ResourceIdViewModel postBooking1Result; using (var postBooking1Response = await _client.PostAsJsonAsync($"/api/v1/bookings", postBooking1Request)) { Assert.True(postBooking1Response.IsSuccessStatusCode); postBooking1Result = await postBooking1Response.Content.ReadAsAsync <ResourceIdViewModel>(); } var postBooking2Request = new BookingBindingModel { RentalId = postRentalResult.Id, Nights = 2, Start = new DateTime(2000, 01, 03) }; ResourceIdViewModel postBooking2Result; using (var postBooking2Response = await _client.PostAsJsonAsync($"/api/v1/bookings", postBooking2Request)) { Assert.True(postBooking2Response.IsSuccessStatusCode); postBooking2Result = await postBooking2Response.Content.ReadAsAsync <ResourceIdViewModel>(); } using (var getCalendarResponse = await _client.GetAsync($"/api/v1/calendar?rentalId={postRentalResult.Id}&start=2000-01-01&nights=5")) { Assert.True(getCalendarResponse.IsSuccessStatusCode); var getCalendarResult = await getCalendarResponse.Content.ReadAsAsync <CalendarViewModel>(); Assert.Equal(postRentalResult.Id, getCalendarResult.RentalId); Assert.Equal(5, getCalendarResult.Dates.Count); Assert.Equal(new DateTime(2000, 01, 01), getCalendarResult.Dates[0].Date); Assert.Empty(getCalendarResult.Dates[0].Bookings); Assert.Equal(new DateTime(2000, 01, 02), getCalendarResult.Dates[1].Date); Assert.Single(getCalendarResult.Dates[1].Bookings); Assert.Contains(getCalendarResult.Dates[1].Bookings, x => x.Id == postBooking1Result.Id); Assert.Equal(new DateTime(2000, 01, 03), getCalendarResult.Dates[2].Date); Assert.Equal(2, getCalendarResult.Dates[2].Bookings.Count); Assert.Contains(getCalendarResult.Dates[2].Bookings, x => x.Id == postBooking1Result.Id); Assert.Contains(getCalendarResult.Dates[2].Bookings, x => x.Id == postBooking2Result.Id); Assert.Equal(new DateTime(2000, 01, 04), getCalendarResult.Dates[3].Date); Assert.Single(getCalendarResult.Dates[3].Bookings); Assert.Contains(getCalendarResult.Dates[3].Bookings, x => x.Id == postBooking2Result.Id); Assert.Equal(new DateTime(2000, 01, 05), getCalendarResult.Dates[4].Date); Assert.Empty(getCalendarResult.Dates[4].Bookings); } }