DEV: Allow disabling problem checks programatically (#28440)

We need a way to disable certain checks programatically, e.g. on Discourse hosting. This PR adds a configuration option for this, and makes it so that disabled checks aren't run as part of #run_all.
This commit is contained in:
Ted Johansson 2024-08-20 16:42:06 +02:00 committed by GitHub
parent 0636855706
commit 948e7bd55e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 17 additions and 2 deletions

View File

@ -13,7 +13,7 @@ class ProblemCheck
end end
def run_all def run_all
each(&:run) select(&:enabled?).each(&:run)
end end
private private
@ -23,6 +23,7 @@ class ProblemCheck
include ActiveSupport::Configurable include ActiveSupport::Configurable
config_accessor :enabled, default: true, instance_writer: false
config_accessor :priority, default: "low", instance_writer: false config_accessor :priority, default: "low", instance_writer: false
# Determines if the check should be performed at a regular interval, and if # Determines if the check should be performed at a regular interval, and if
@ -112,6 +113,11 @@ class ProblemCheck
end end
delegate :identifier, to: :class delegate :identifier, to: :class
def self.enabled?
enabled
end
delegate :enabled?, to: :class
def self.scheduled? def self.scheduled?
perform_every.present? perform_every.present?
end end

View File

@ -6,6 +6,7 @@ RSpec.describe ProblemCheck do
RealtimeCheck = Class.new(described_class) RealtimeCheck = Class.new(described_class)
InlineCheck = Class.new(described_class) { self.inline = true } InlineCheck = Class.new(described_class) { self.inline = true }
PluginCheck = Class.new(described_class) PluginCheck = Class.new(described_class)
DisabledCheck = Class.new(described_class) { self.enabled = false }
FailingCheck = FailingCheck =
Class.new(described_class) do Class.new(described_class) do
def call def call
@ -30,13 +31,14 @@ RSpec.describe ProblemCheck do
stub_const( stub_const(
described_class, described_class,
"CORE_PROBLEM_CHECKS", "CORE_PROBLEM_CHECKS",
[ScheduledCheck, RealtimeCheck, InlineCheck, FailingCheck, PassingCheck], [ScheduledCheck, RealtimeCheck, InlineCheck, DisabledCheck, FailingCheck, PassingCheck],
&example &example
) )
Object.send(:remove_const, ScheduledCheck.name) Object.send(:remove_const, ScheduledCheck.name)
Object.send(:remove_const, RealtimeCheck.name) Object.send(:remove_const, RealtimeCheck.name)
Object.send(:remove_const, InlineCheck.name) Object.send(:remove_const, InlineCheck.name)
Object.send(:remove_const, DisabledCheck.name)
Object.send(:remove_const, PluginCheck.name) Object.send(:remove_const, PluginCheck.name)
Object.send(:remove_const, FailingCheck.name) Object.send(:remove_const, FailingCheck.name)
Object.send(:remove_const, PassingCheck.name) Object.send(:remove_const, PassingCheck.name)
@ -45,6 +47,8 @@ RSpec.describe ProblemCheck do
let(:scheduled_check) { ScheduledCheck } let(:scheduled_check) { ScheduledCheck }
let(:realtime_check) { RealtimeCheck } let(:realtime_check) { RealtimeCheck }
let(:inline_check) { InlineCheck } let(:inline_check) { InlineCheck }
let(:enabled_check) { RealtimeCheck }
let(:disabled_check) { DisabledCheck }
let(:plugin_check) { PluginCheck } let(:plugin_check) { PluginCheck }
let(:failing_check) { FailingCheck } let(:failing_check) { FailingCheck }
let(:passing_check) { PassingCheck } let(:passing_check) { PassingCheck }
@ -92,6 +96,11 @@ RSpec.describe ProblemCheck do
it { expect(scheduled_check).to_not be_inline } it { expect(scheduled_check).to_not be_inline }
end end
describe ".enabled?" do
it { expect(enabled_check).to be_enabled }
it { expect(disabled_check).not_to be_enabled }
end
describe "plugin problem check registration" do describe "plugin problem check registration" do
before { DiscoursePluginRegistry.register_problem_check(PluginCheck, stub(enabled?: enabled)) } before { DiscoursePluginRegistry.register_problem_check(PluginCheck, stub(enabled?: enabled)) }