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
+29 -4
View File
@@ -6,18 +6,43 @@ RSpec.describe MaintenanceSchedule do
end
it "requires all fields" do
schedule = build(:maintenance_schedule, vehicle: nil, maintenance_type: nil, mileage_interval: nil, time_interval: nil)
schedule = build(
:maintenance_schedule,
vehicle: nil,
maintenance_type: nil,
mileage_interval: nil,
time_interval: nil,
baseline_odometer: nil,
baseline_date: nil,
active: nil
)
expect(schedule).not_to be_valid
expect(schedule.errors.attribute_names).to include(:vehicle, :maintenance_type, :mileage_interval, :time_interval)
expect(schedule.errors.attribute_names).to include(
:vehicle,
:maintenance_type,
:mileage_interval,
:time_interval,
:baseline_odometer,
:baseline_date,
:active
)
end
it "requires positive integer intervals" do
schedule = build(:maintenance_schedule, mileage_interval: 0, time_interval: 0)
it "requires valid numeric values" do
schedule = build(:maintenance_schedule, mileage_interval: 0, time_interval: 0, baseline_odometer: -1)
expect(schedule).not_to be_valid
expect(schedule.errors[:mileage_interval]).to be_present
expect(schedule.errors[:time_interval]).to be_present
expect(schedule.errors[:baseline_odometer]).to be_present
end
it "rejects future baseline dates" do
schedule = build(:maintenance_schedule, baseline_date: Date.current + 1.day)
expect(schedule).not_to be_valid
expect(schedule.errors[:baseline_date]).to be_present
end
it "requires maintenance type to be unique per vehicle case-insensitively" do
@@ -0,0 +1,58 @@
require "rails_helper"
RSpec.describe MaintenanceScheduleStatus do
it "marks a schedule overdue when the mileage interval is reached" do
schedule = build(:maintenance_schedule, mileage_interval: 5_000, baseline_odometer: 10_000, time_interval: 180)
status = described_class.new(schedule, nil, current_odometer: 15_000)
expect(status.status).to eq("overdue")
expect(status.reason).to include("mileage interval reached")
end
it "marks a schedule overdue when the time interval is reached" do
schedule = build(:maintenance_schedule, time_interval: 180, baseline_date: Date.current - 180.days)
status = described_class.new(schedule, nil, current_odometer: 10_000)
expect(status.status).to eq("overdue")
expect(status.reason).to include("time interval reached")
end
it "marks a schedule upcoming within five percent of the mileage interval" do
schedule = build(:maintenance_schedule, mileage_interval: 5_000, baseline_odometer: 10_000, baseline_date: Date.current)
status = described_class.new(schedule, nil, current_odometer: 14_750)
expect(status.status).to eq("upcoming")
expect(status.reason).to include("within 250 miles")
end
it "marks a schedule upcoming within five percent of the time interval" do
schedule = build(:maintenance_schedule, time_interval: 180, baseline_date: Date.current - 171.days)
status = described_class.new(schedule, nil, current_odometer: 10_000)
expect(status.status).to eq("upcoming")
expect(status.reason).to include("within 9 days")
end
it "marks a no-history schedule as no history when it is not upcoming or overdue" do
schedule = build(:maintenance_schedule, baseline_odometer: 10_000, mileage_interval: 5_000, baseline_date: Date.current)
status = described_class.new(schedule, nil, current_odometer: 10_100)
expect(status.status).to eq("no_history")
end
it "marks a schedule current when matching history exists and no interval is near" do
schedule = build(:maintenance_schedule, mileage_interval: 5_000, time_interval: 180)
entry = build(:maintenance_entry, odometer: 12_000, date: Date.current - 10.days)
status = described_class.new(schedule, entry, current_odometer: 12_500)
expect(status.status).to eq("current")
expect(status.due_odometer).to eq(17_000)
expect(status.due_date).to eq(entry.date + 180.days)
end
end