require "rails_helper" RSpec.describe Vehicle do it "has a valid factory" do expect(build(:vehicle)).to be_valid end it "defaults to active" do expect(described_class.new.active).to be(true) end it "requires all fields" do vehicle = build( :vehicle, make: nil, model: nil, year: nil, color: nil, vin: nil, licence_plate: nil, current_odometer: nil, fuel_tank_size: nil, active: nil ) expect(vehicle).not_to be_valid expect(vehicle.errors.attribute_names).to include( :make, :model, :year, :color, :vin, :licence_plate, :current_odometer, :fuel_tank_size, :active ) end it "normalizes VIN to uppercase" do vehicle = build(:vehicle, vin: "abc123") vehicle.valid? expect(vehicle.vin).to eq("ABC123") end it "normalizes licence plate to uppercase" do vehicle = build(:vehicle, licence_plate: "kj7cyt") vehicle.valid? expect(vehicle.licence_plate).to eq("KJ7CYT") end it "requires VIN to be unique after normalization" do create(:vehicle, vin: "ABC123") vehicle = build(:vehicle, vin: "abc123") expect(vehicle).not_to be_valid expect(vehicle.errors[:vin]).to be_present end it "requires licence plate to be unique case-insensitively" do create(:vehicle, licence_plate: "ABC123") vehicle = build(:vehicle, licence_plate: "abc123") expect(vehicle).not_to be_valid expect(vehicle.errors[:licence_plate]).to be_present end it "requires a realistic year" do too_old = build(:vehicle, year: 1979) future = build(:vehicle, year: Date.current.year + 1) expect(too_old).not_to be_valid expect(future).not_to be_valid end it "requires numeric mileage and fuel tank values" do vehicle = build(:vehicle, current_odometer: -1, fuel_tank_size: 0) expect(vehicle).not_to be_valid expect(vehicle.errors[:current_odometer]).to be_present expect(vehicle.errors[:fuel_tank_size]).to be_present end it "cannot be destroyed when entries reference it" do vehicle = create(:vehicle) create(:maintenance_schedule, vehicle: vehicle) expect(vehicle.destroy).to be(false) expect(vehicle.errors[:base]).to be_present end end