public Vehicle SaveVehicle(Vehicle vehicle)
        {
            var vehicleGreaterThanYearSpec = new VehicleIsGreaterThanRequiredYear();

            if (!vehicleGreaterThanYearSpec.IsSatisfiedBy(vehicle))
            {
                throw new VehicleNotGreaterThanRequiredYearException(vehicleGreaterThanYearSpec.RequiredYear);
            }

            var vehicleVinIsUniqueSpec = new VehicleVinIsUnique(_unitOfWork.Vehicles);

            if (!vehicleVinIsUniqueSpec.IsSatisfiedBy(vehicle))
            {
                throw new DuplicateVehicleVinException(vehicle.VIN);
            }

            vehicle.VIN = vehicle.VIN?.ToUpper();

            if (vehicle.Id == 0)
            {
                _unitOfWork.Vehicles.Add(vehicle);
            }

            _unitOfWork.SaveChanges();

            UpdateSalePrice(vehicle.Id);
            return(vehicle);
        }
        public void VehicleIsGreaterThanRequiredYearSpec_WhenNotSatisfied_ReturnsFalse()
        {
            var vehicle = new Vehicle {
                Year = 1980
            };
            var spec   = new VehicleIsGreaterThanRequiredYear();
            var result = spec.IsSatisfiedBy(vehicle);

            Assert.False(result);
        }
        public void VehicleIsGreaterThanRequiredYearSpec_WhenSatisfied_ReturnsTrue()
        {
            var vehicle = new Vehicle {
                Year = 2000
            };
            var spec   = new VehicleIsGreaterThanRequiredYear();
            var result = spec.IsSatisfiedBy(vehicle);

            Assert.True(result);
        }