示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#7
0
        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);
        }
示例#10
0
        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));
        }
示例#11
0
        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);
            }
        }
示例#14
0
        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);
            }
        }