DEV: Move non scheduled problem checks to classes (#26122)

In AdminDashboardData we have a bunch of problem checks implemented as methods on that class. This PR absolves it of the responsibility by promoting each of those checks to a first class ProblemCheck. This way each of them can have their own priority and arbitrary functionality can be isolated in its own class.

Think "extract class" refactoring over and over. Since they were all moved we can also get rid of the @@problem_syms class variable which was basically the old version of the registry now replaced by ProblemCheck.realtime.

In addition AdminDashboardData::Problem value object has been entirely replaced with the new ProblemCheck::Problem (with compatible API).

Lastly, I added some RSpec matchers to simplify testing of problem checks and provide helpful error messages when assertions fail.
This commit is contained in:
Ted Johansson
2024-03-14 10:55:01 +08:00
committed by GitHub
parent 9afb0b29f8
commit ea5c3a3bdc
51 changed files with 1447 additions and 477 deletions

View File

@ -4,17 +4,17 @@ RSpec.describe ProblemCheck do
# rubocop:disable RSpec/BeforeAfterAll
before(:all) do
ScheduledCheck = Class.new(described_class) { self.perform_every = 30.minutes }
UnscheduledCheck = Class.new(described_class)
RealtimeCheck = Class.new(described_class)
end
after(:all) do
Object.send(:remove_const, ScheduledCheck.name)
Object.send(:remove_const, UnscheduledCheck.name)
Object.send(:remove_const, RealtimeCheck.name)
end
# rubocop:enable RSpec/BeforeAfterAll
let(:scheduled_check) { ScheduledCheck }
let(:unscheduled_check) { UnscheduledCheck }
let(:realtime_check) { RealtimeCheck }
describe ".[]" do
it { expect(described_class[:scheduled_check]).to eq(scheduled_check) }
@ -26,16 +26,26 @@ RSpec.describe ProblemCheck do
end
describe ".checks" do
it { expect(described_class.checks).to include(scheduled_check, unscheduled_check) }
it { expect(described_class.checks).to include(scheduled_check, realtime_check) }
end
describe ".scheduled" do
it { expect(described_class.scheduled).to include(scheduled_check) }
it { expect(described_class.scheduled).not_to include(unscheduled_check) }
it { expect(described_class.scheduled).not_to include(realtime_check) }
end
describe ".realtime" do
it { expect(described_class.realtime).to include(realtime_check) }
it { expect(described_class.realtime).not_to include(scheduled_check) }
end
describe ".scheduled?" do
it { expect(scheduled_check).to be_scheduled }
it { expect(unscheduled_check).to_not be_scheduled }
it { expect(realtime_check).to_not be_scheduled }
end
describe ".realtime?" do
it { expect(realtime_check).to be_realtime }
it { expect(scheduled_check).to_not be_realtime }
end
end