Esempio n. 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);
        }
        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);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
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 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]);
        }
Esempio n. 9
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);
        }
Esempio n. 10
0
        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);
        }
Esempio n. 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);
            }
        }
Esempio n. 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);
        }
Esempio n. 15
0
        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);
        }
Esempio n. 16
0
        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);
            }
        }