mirror of
https://github.com/discourse/discourse.git
synced 2024-12-01 10:44:50 +08:00
c3708c4276
We updated scheduled admin checks to run concurrently in their own jobs. The main reason for this was so that we can implement re-check functionality for especially flaky checks (e.g. group e-mail credentials check.) This works in the following way: 1. The check declares its retry policy using class methods. 2. A block can be yielded to if there are problems, but before they are committed to Redis. 3. The job uses this block to either a) schedule a retry if there are any remaining or b) do nothing and let the check commit.
102 lines
3.4 KiB
Ruby
102 lines
3.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
RSpec.describe Jobs::ProblemCheck do
|
|
after do
|
|
Discourse.redis.flushdb
|
|
AdminDashboardData.reset_problem_checks
|
|
end
|
|
|
|
class TestCheck
|
|
def self.max_retries = 0
|
|
def self.retry_wait = 30.seconds
|
|
end
|
|
|
|
it "runs the scheduled problem check that has been added and adds the messages to the load_found_scheduled_check_problems array" do
|
|
AdminDashboardData.add_scheduled_problem_check(:test_identifier, TestCheck) do
|
|
AdminDashboardData::Problem.new("big problem")
|
|
end
|
|
|
|
described_class.new.execute(check_identifier: :test_identifier)
|
|
problems = AdminDashboardData.load_found_scheduled_check_problems
|
|
expect(problems.count).to eq(1)
|
|
expect(problems.first).to be_a(AdminDashboardData::Problem)
|
|
expect(problems.first.to_s).to eq("big problem")
|
|
end
|
|
|
|
it "can handle the problem check returning multiple problems" do
|
|
AdminDashboardData.add_scheduled_problem_check(:test_identifier, TestCheck) do
|
|
[
|
|
AdminDashboardData::Problem.new("big problem"),
|
|
AdminDashboardData::Problem.new(
|
|
"yuge problem",
|
|
priority: "high",
|
|
identifier: "config_is_a_mess",
|
|
),
|
|
]
|
|
end
|
|
|
|
described_class.new.execute(check_identifier: :test_identifier)
|
|
problems = AdminDashboardData.load_found_scheduled_check_problems
|
|
expect(problems.map(&:to_s)).to match_array(["big problem", "yuge problem"])
|
|
end
|
|
|
|
it "does not add the same problem twice if the identifier already exists" do
|
|
AdminDashboardData.add_scheduled_problem_check(:test_identifier, TestCheck) do
|
|
[
|
|
AdminDashboardData::Problem.new(
|
|
"yuge problem",
|
|
priority: "high",
|
|
identifier: "config_is_a_mess",
|
|
),
|
|
AdminDashboardData::Problem.new(
|
|
"nasty problem",
|
|
priority: "high",
|
|
identifier: "config_is_a_mess",
|
|
),
|
|
]
|
|
end
|
|
|
|
described_class.new.execute(check_identifier: :test_identifier)
|
|
problems = AdminDashboardData.load_found_scheduled_check_problems
|
|
expect(problems.map(&:to_s)).to match_array(["yuge problem"])
|
|
end
|
|
|
|
it "schedules a retry if there are attempts remaining" do
|
|
AdminDashboardData.add_scheduled_problem_check(:test_identifier, TestCheck) do
|
|
AdminDashboardData::Problem.new("big problem")
|
|
end
|
|
|
|
TestCheck.stubs(:max_retries).returns(1)
|
|
|
|
expect_enqueued_with(
|
|
job: :problem_check,
|
|
args: {
|
|
check_identifier: :test_identifier,
|
|
retry_count: 1,
|
|
},
|
|
) { described_class.new.execute(check_identifier: :test_identifier) }
|
|
end
|
|
|
|
it "does not schedule a retry if there are no more attempts remaining" do
|
|
AdminDashboardData.add_scheduled_problem_check(:test_identifier, TestCheck) do
|
|
AdminDashboardData::Problem.new("big problem")
|
|
end
|
|
|
|
TestCheck.stubs(:max_retries).returns(1)
|
|
|
|
expect_not_enqueued_with(job: :problem_check) do
|
|
described_class.new.execute(check_identifier: :test_identifier, retry_count: 1)
|
|
end
|
|
end
|
|
|
|
it "handles errors from a troublesome check" do
|
|
AdminDashboardData.add_scheduled_problem_check(:test_identifier, TestCheck) do
|
|
raise StandardError.new("something went wrong")
|
|
AdminDashboardData::Problem.new("polling issue")
|
|
end
|
|
|
|
described_class.new.execute(check_identifier: :test_identifier)
|
|
expect(AdminDashboardData.load_found_scheduled_check_problems.count).to eq(0)
|
|
end
|
|
end
|