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 VehicleVinIsUniqueSpec_WhenUpdatingVehicleButNotVin_IsSatisfied_ReturnsTrue()
        {
            var vehicle = _vehicleRepo.GetById(1);

            vehicle.Year = 2015;

            var spec = new VehicleVinIsUnique(_vehicleRepo);

            var result = spec.IsSatisfiedBy(vehicle);

            Assert.True(result);
        }
        public void VehicleVinIsUniqueSpec_WhenUpdatingVin_IsSatisfied_ReturnsTrue()
        {
            var vehicle = _vehicleRepo.GetById(1);

            vehicle.VIN = "new vin number for tests";

            var spec = new VehicleVinIsUnique(_vehicleRepo);

            var result = spec.IsSatisfiedBy(vehicle);

            Assert.True(result);
        }
        public void VehicleVinIsUniqueSpec_WhenSatisfied_ReturnsTrue()
        {
            var vehicle = new Vehicle {
                VIN = "1234-1234-NEW-TESTING"
            };

            var spec = new VehicleVinIsUnique(_vehicleRepo);

            var result = spec.IsSatisfiedBy(vehicle);

            Assert.True(result);
        }
        public void VehicleVinIsUniqueSpec_WhenNotSatisfied_ReturnsFalse()
        {
            var vehicle = new Vehicle {
                VIN = "1234-1234"
            };

            var spec = new VehicleVinIsUnique(_vehicleRepo);

            var result = spec.IsSatisfiedBy(vehicle);

            Assert.False(result);
        }