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); }
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); }