public void ShouldNotSaveRentalWhenExceptionIsThrown()
        {
            var request = new CreateRentalRequestModel {
                StartDate = new DateTime(2022, 1, 1), EndDate = new DateTime(2022, 1, 3), ClientId = 1, VehicleId = 1
            };

            vehicleRepositoryMock.Setup(x => x.Find(It.IsAny <int>())).Returns(new Vehicle {
                Active = true, Id = 1, Brand = "brand", PricePerDay = 10, Year = 2022
            });
            clientRepositoryMock.Setup(x => x.Find(It.IsAny <int>())).Returns(new Client {
                Active = true, Id = 1, Name = "name", Phone = "1243"
            });
            rentalRepositoryMock.Setup(x => x.VerifyIfVehicleIsAvailableByRangeDates(It.IsAny <int>(), It.IsAny <DateTime>(), It.IsAny <DateTime>())).Returns(true);
            repositoryMock.Setup(x => x.Save()).Throws(new Exception());

            Response response = rentalService.Add(request);

            rentalRepositoryMock.Verify(x => x.VerifyIfVehicleIsAvailableByRangeDates(It.IsAny <int>(), It.IsAny <DateTime>(), It.IsAny <DateTime>()), Times.Once);
            rentalRepositoryMock.Verify(x => x.Add(It.IsAny <Rental>()));
            repositoryMock.Verify(x => x.Save(), Times.Once);

            Assert.True(response.HasErrors());
            Assert.AreEqual(response.Messages.Count(x => x.Type == MessageType.Error), 1);
            Assert.AreEqual(response.Messages.Count(x => x.Type == MessageType.Success), 0);
            Assert.AreEqual(response.Messages.Count(x => x.Code == Constants.GENERAL_ERROR), 1);
        }
Exemplo n.º 2
0
        public IActionResult Post([FromBody] CreateRentalRequestModel request)
        {
            logger.LogInformation($"POST /api/rental reach with body: {request}");

            var response = rentalService.Add(request);

            return(response.CreateResponse(this));
        }
        /// <summary>
        /// Create new rental
        /// </summary>
        /// <param name="request"></param>
        public Response Add(CreateRentalRequestModel request)
        {
            var response = new Response();

            try
            {
                logger.LogInformation("Starting request validation");

                DateUtils.ValidateRangeDates(response, request.StartDate, request.EndDate);

                var vehicle = ValidateVehicle(request, response);

                ValidateClient(request, response);

                if (response.HasErrors())
                {
                    return(response);
                }

                logger.LogInformation("Request validated success");

                logger.LogInformation("Calling rental repository to find availables vehicles by range dates");

                var isVehicleAvailable = repository.RentalRepository.VerifyIfVehicleIsAvailableByRangeDates(request.VehicleId.Value, request.StartDate.Value, request.EndDate.Value);

                if (!isVehicleAvailable)
                {
                    response.AddError(Constants.VEHICLE_NOT_AVAILABLE, "Vehicle is not available");
                    return(response);
                }

                var totalDays = request.EndDate.Value.Subtract(request.StartDate.Value).TotalDays + 1;

                var rental = new Rental
                {
                    ClientId  = request.ClientId.Value,
                    VehicleId = request.VehicleId.Value,
                    StartDate = request.StartDate.Value,
                    EndDate   = request.EndDate.Value,
                    Price     = vehicle.PricePerDay * totalDays,
                    Status    = RentalStatus.Reserved
                };

                logger.LogInformation("Calling rental repository to save new rental");

                repository.RentalRepository.Add(rental);
                repository.Save();

                response.AddSuccess(Constants.RENTAL_SAVED, "A vehicle was reserved succesfully");
            }
            catch (Exception e)
            {
                ExceptionUtils.HandleGeneralError(response, logger, e);
            }

            return(response);
        }
        /// <summary>
        /// Client validations
        /// </summary>
        /// <param name="request"></param>
        /// <param name="response"></param>
        private void ValidateClient(CreateRentalRequestModel request, Response response)
        {
            if (!request.ClientId.HasValue)
            {
                response.AddError(Constants.CLIENTID_EMPTY, "The field ClientId is required");
            }
            else
            {
                var client = repository.ClientRepository.Find(request.ClientId.Value);

                if (client == null || !client.Active)
                {
                    response.AddError(Constants.CLIENT_NOT_FOUND, "Client not found");
                }
            }
        }
        public void ShouldValidateRequest()
        {
            var request = new CreateRentalRequestModel {
                StartDate = new DateTime(2020, 1, 1), EndDate = new DateTime(2020, 1, 3), ClientId = null, VehicleId = null
            };

            Response response = rentalService.Add(request);

            rentalRepositoryMock.Verify(x => x.VerifyIfVehicleIsAvailableByRangeDates(It.IsAny <int>(), It.IsAny <DateTime>(), It.IsAny <DateTime>()), Times.Never);
            repositoryMock.Verify(x => x.Save(), Times.Never);

            Assert.True(response.HasErrors());
            Assert.AreEqual(response.Messages.Count(x => x.Type == MessageType.Error), 4);
            Assert.AreEqual(response.Messages.Count(x => x.Code == Constants.START_DATE_INVALID), 1);
            Assert.AreEqual(response.Messages.Count(x => x.Code == Constants.END_DATE_INVALID), 1);
            Assert.AreEqual(response.Messages.Count(x => x.Code == Constants.VEHICLEID_EMPTY), 1);
            Assert.AreEqual(response.Messages.Count(x => x.Code == Constants.CLIENTID_EMPTY), 1);
        }
        /// <summary>
        /// Vehicle validations
        /// </summary>
        /// <param name="request"></param>
        /// <param name="response"></param>
        private Vehicle ValidateVehicle(CreateRentalRequestModel request, Response response)
        {
            if (!request.VehicleId.HasValue)
            {
                response.AddError(Constants.VEHICLEID_EMPTY, "The field VehicleId is required");
                return(null);
            }
            else
            {
                var vehicle = repository.VehicleRepository.Find(request.VehicleId.Value);

                if (vehicle == null || !vehicle.Active)
                {
                    response.AddError(Constants.VEHICLE_NOT_FOUND, "Vehicle not found");
                }

                return(vehicle);
            }
        }
        public void ShouldValidateClientAndVehicleNotFound()
        {
            var request = new CreateRentalRequestModel {
                StartDate = new DateTime(2022, 1, 1), EndDate = new DateTime(2022, 1, 3), ClientId = 1, VehicleId = 1
            };

            vehicleRepositoryMock.Setup(x => x.Find(It.IsAny <int>())).Returns((Vehicle)null);
            clientRepositoryMock.Setup(x => x.Find(It.IsAny <int>())).Returns((Client)null);

            Response response = rentalService.Add(request);

            rentalRepositoryMock.Verify(x => x.VerifyIfVehicleIsAvailableByRangeDates(It.IsAny <int>(), It.IsAny <DateTime>(), It.IsAny <DateTime>()), Times.Never);
            repositoryMock.Verify(x => x.Save(), Times.Never);

            Assert.True(response.HasErrors());
            Assert.AreEqual(response.Messages.Count(x => x.Type == MessageType.Error), 2);
            Assert.AreEqual(response.Messages.Count(x => x.Code == Constants.CLIENT_NOT_FOUND), 1);
            Assert.AreEqual(response.Messages.Count(x => x.Code == Constants.VEHICLE_NOT_FOUND), 1);
        }
        public void ShouldValidateVehicleNotAvailable()
        {
            var request = new CreateRentalRequestModel {
                StartDate = new DateTime(2022, 1, 1), EndDate = new DateTime(2022, 1, 3), ClientId = 1, VehicleId = 1
            };

            vehicleRepositoryMock.Setup(x => x.Find(It.IsAny <int>())).Returns(new Vehicle {
                Active = true, Id = 1
            });
            clientRepositoryMock.Setup(x => x.Find(It.IsAny <int>())).Returns(new Client {
                Active = true, Id = 1
            });
            rentalRepositoryMock.Setup(x => x.VerifyIfVehicleIsAvailableByRangeDates(It.IsAny <int>(), It.IsAny <DateTime>(), It.IsAny <DateTime>())).Returns(false);

            Response response = rentalService.Add(request);

            rentalRepositoryMock.Verify(x => x.VerifyIfVehicleIsAvailableByRangeDates(It.IsAny <int>(), It.IsAny <DateTime>(), It.IsAny <DateTime>()), Times.Once);
            repositoryMock.Verify(x => x.Save(), Times.Never);

            Assert.True(response.HasErrors());
            Assert.AreEqual(response.Messages.Count(x => x.Type == MessageType.Error), 1);
            Assert.AreEqual(response.Messages.Count(x => x.Code == Constants.VEHICLE_NOT_AVAILABLE), 1);
        }