Finished phase006
CI / scan_ruby (push) Failing after 7s
CI / scan_js (push) Failing after 7s
CI / lint (push) Failing after 8s

This commit is contained in:
2026-09-16 16:37:03 -06:00
parent 0826d267f2
commit 87d2141ed0
22 changed files with 754 additions and 10 deletions
+147
View File
@@ -111,6 +111,7 @@ RSpec.describe "Vehicles" do
expect(response.body).to include(vehicle.make)
expect(response.body).to include(vehicle.model)
expect(response.body).to include("Maintenance Schedules")
expect(response.body).to include("Manage maintenance schedules")
expect(response.body).to include("Fuel History")
expect(response.body).to include("Maintenance History")
expect(response.body).to include(vehicle.maintenance_schedules.first.maintenance_type)
@@ -121,6 +122,141 @@ RSpec.describe "Vehicles" do
expect(response.body.index("12,000")).to be < response.body.index("11,000")
expect(response.body.index(newer_maintenance_entry.notes)).to be < response.body.index(older_maintenance_entry.notes)
end
it "shows overdue maintenance alerts" do
vehicle = create(:vehicle, current_odometer: 15_000)
create(
:maintenance_schedule,
vehicle: vehicle,
maintenance_type: "Oil Change",
mileage_interval: 5_000,
baseline_odometer: 10_000,
baseline_date: Date.current
)
get vehicle_path(vehicle)
expect(response).to have_http_status(:ok)
expect(response.body).to include("Overdue Maintenance")
expect(response.body).to include("Oil Change is overdue")
end
it "shows upcoming maintenance warnings" do
vehicle = create(:vehicle, current_odometer: 14_750)
create(
:maintenance_schedule,
vehicle: vehicle,
maintenance_type: "Oil Change",
mileage_interval: 5_000,
baseline_odometer: 10_000,
baseline_date: Date.current
)
get vehicle_path(vehicle)
expect(response).to have_http_status(:ok)
expect(response.body).to include("Upcoming Maintenance")
expect(response.body).to include("Oil Change is upcoming")
end
it "shows no-history maintenance status without marking it overdue" do
vehicle = create(:vehicle, current_odometer: 10_100)
create(
:maintenance_schedule,
vehicle: vehicle,
maintenance_type: "Oil Change",
mileage_interval: 5_000,
baseline_odometer: 10_000,
baseline_date: Date.current
)
get vehicle_path(vehicle)
expect(response).to have_http_status(:ok)
expect(response.body).to include("No Maintenance History")
expect(response.body).to include("Oil Change has no matching maintenance entry yet")
expect(response.body).not_to include("Oil Change is overdue")
end
it "logs overdue notifications only when schedule status changes" do
vehicle = create(:vehicle, current_odometer: 15_000)
schedule = create(
:maintenance_schedule,
vehicle: vehicle,
maintenance_type: "Oil Change",
mileage_interval: 5_000,
baseline_odometer: 10_000,
baseline_date: Date.current
)
allow(Rails.logger).to receive(:warn)
get vehicle_path(vehicle)
get vehicle_path(vehicle)
expect(schedule.reload.last_status).to eq("overdue")
expect(Rails.logger).to have_received(:warn).once.with(/Maintenance schedule overdue: vehicle_id=#{vehicle.id}/)
end
end
describe "maintenance schedule CRUD" do
before { identify_user }
it "lists maintenance schedules" do
vehicle = create(:vehicle)
create(:maintenance_schedule, vehicle: vehicle, maintenance_type: "Oil Change")
get vehicle_maintenance_schedules_path(vehicle)
expect(response).to have_http_status(:ok)
expect(response.body).to include("Maintenance Schedules")
expect(response.body).to include("Oil Change")
end
it "creates a maintenance schedule" do
vehicle = create(:vehicle)
expect do
post vehicle_maintenance_schedules_path(vehicle), params: { maintenance_schedule: valid_maintenance_schedule_params }
end.to change(MaintenanceSchedule, :count).by(1)
expect(response).to redirect_to(vehicle_maintenance_schedules_path(vehicle))
expect(MaintenanceSchedule.last.baseline_odometer).to eq(10_000)
end
it "rejects invalid maintenance schedule params" do
vehicle = create(:vehicle)
expect do
post vehicle_maintenance_schedules_path(vehicle), params: { maintenance_schedule: valid_maintenance_schedule_params.merge(mileage_interval: 0) }
end.not_to change(MaintenanceSchedule, :count)
expect(response).to have_http_status(:unprocessable_content)
expect(response.body).to include("prevented this maintenance schedule from being saved")
end
it "updates a maintenance schedule" do
vehicle = create(:vehicle)
schedule = create(:maintenance_schedule, vehicle: vehicle, maintenance_type: "Oil Change")
patch vehicle_maintenance_schedule_path(vehicle, schedule), params: {
maintenance_schedule: valid_maintenance_schedule_params.merge(maintenance_type: "Tire Rotation")
}
expect(response).to redirect_to(vehicle_maintenance_schedules_path(vehicle))
expect(schedule.reload.maintenance_type).to eq("Tire Rotation")
end
it "soft deactivates a maintenance schedule" do
vehicle = create(:vehicle)
schedule = create(:maintenance_schedule, vehicle: vehicle, active: true)
expect do
patch deactivate_vehicle_maintenance_schedule_path(vehicle, schedule)
end.not_to change(MaintenanceSchedule, :count)
expect(response).to redirect_to(vehicle_maintenance_schedules_path(vehicle))
expect(schedule.reload).not_to be_active
end
end
describe "POST /vehicles/:vehicle_id/fuel_entries" do
@@ -368,6 +504,17 @@ RSpec.describe "Vehicles" do
}
end
def valid_maintenance_schedule_params
{
maintenance_type: "Oil Change",
mileage_interval: 5_000,
time_interval: 180,
baseline_odometer: 10_000,
baseline_date: Date.current,
active: "1"
}
end
def identify_user(user = create(:user))
@identified_user = user
access_key = AccessKey.current