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 <IHttpActionResult> EditBooking(BookingBindingModel model) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } await editBookingCommand.Execute(model); return(Ok()); }
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 async Task RegisterBooking_LessZeroRentalId_AwaitFail() { var booking = new BookingBindingModel { RentalId = -999, Nights = 3, Start = DateTime.Now.AddYears(10) }; var postBooking = await client.PostAsync <ExceptionViewModel>("/api/v1/bookings", booking, Code.Unprocessable); Assert.Equal(postBooking.Message, Error.RentalIdLessOrZero); }
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 ResourceIdViewModel Post(BookingBindingModel model) { var key = new ResourceIdViewModel { Id = _bookings.Keys.Count + 1 }; _bookings.Add(key.Id, new BookingViewModel { Id = key.Id, Nights = model.Nights, RentalId = model.RentalId, Start = model.Start.Date, PreparationTimeInDays = _rentals[model.RentalId].PreparationTimeInDays }); return(key); }
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 ResourceIdViewModel Post(BookingBindingModel model) { if (model.Nights <= 0) { throw new ApplicationException("Nigts must be positive"); } if (!_rentals.ContainsKey(model.RentalId)) { throw new ApplicationException("Rental not found"); } for (var i = 0; i < model.Nights; i++) { var count = 0; foreach (var booking in _bookings.Values) { if (booking.RentalId == model.RentalId && (booking.Start <= model.Start.Date && booking.Start.AddDays(booking.Nights) > model.Start.Date) || (booking.Start < model.Start.AddDays(model.Nights) && booking.Start.AddDays(booking.Nights) >= model.Start.AddDays(model.Nights)) || (booking.Start > model.Start && booking.Start.AddDays(booking.Nights) < model.Start.AddDays(model.Nights))) { count++; } } if (count >= _rentals[model.RentalId].Units) { throw new ApplicationException("Not available"); } } var key = new ResourceIdViewModel { Id = _bookings.Keys.Count + 1 }; _bookings.Add(key.Id, new BookingViewModel { Id = key.Id, Nights = model.Nights, RentalId = model.RentalId, Start = model.Start.Date }); return(key); }
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 Task <Booking> Execute(BookingBindingModel model) { var currentBooking = context.Bookings.FirstOrDefault(b => b.BookingId == model.BookingId); if (currentBooking == null) { throw new BookingNotFoundException("Booking not found"); } currentBooking.DriverId = model.DriverId; currentBooking.StartAddress = model.StartAddress; currentBooking.StartPostCode = model.StartPostCode; currentBooking.EndAddress = model.EndAddress; currentBooking.EndPostCode = model.EndPostCode; currentBooking.CompletedDate = model.CompletedDate ?? null; currentBooking.JobType = model.JobType; currentBooking.ExtraInformation = model.ExtraInformation; return(Task.FromResult(currentBooking)); }
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 <Booking> Execute(BookingBindingModel model) { var newBooking = new Booking { BookingId = Guid.NewGuid().ToString(), CustomerId = model.CustomerId, DriverId = model.DriverId, CreatedDate = DateTime.UtcNow.AddHours(1), StartDate = model.StartDate, StartAddress = model.StartAddress, StartPostCode = model.StartPostCode, EndAddress = model.EndAddress, EndPostCode = model.EndPostCode, CompletedDate = model.CompletedDate, JobType = model.JobType, ExtraInformation = model.ExtraInformation }; context.Bookings.Add(newBooking); await context.SaveChangesAsync(); return(newBooking); }
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); } }