mirror of
https://github.com/discourse/discourse.git
synced 2025-05-28 22:47:46 +08:00
DEV: Database backed admin notices (#26192)
This PR introduces a basic AdminNotice model to store these notices. Admin notices are categorized by their source/type (currently only notices from problem check.) They also have a priority.
This commit is contained in:
@ -1,11 +1,13 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
RSpec.describe ProblemCheckTracker do
|
||||
before { described_class.any_instance.stubs(:check).returns(stub(max_blips: 1, priority: "low")) }
|
||||
|
||||
describe "validations" do
|
||||
let(:record) { described_class.new(identifier: "twitter_login") }
|
||||
|
||||
it { expect(record).to validate_presence_of(:identifier) }
|
||||
it { expect(record).to validate_uniqueness_of(:identifier) }
|
||||
it { expect(record).to validate_uniqueness_of(:identifier).scoped_to(:target) }
|
||||
|
||||
it { expect(record).to validate_numericality_of(:blips).is_greater_than_or_equal_to(0) }
|
||||
end
|
||||
@ -44,14 +46,63 @@ RSpec.describe ProblemCheckTracker do
|
||||
end
|
||||
end
|
||||
|
||||
describe "#failing?" do
|
||||
before { freeze_time }
|
||||
|
||||
let(:problem_tracker) { described_class.new(last_problem_at:, last_run_at:, last_success_at:) }
|
||||
|
||||
context "when the last run passed" do
|
||||
let(:last_run_at) { 1.minute.ago }
|
||||
let(:last_success_at) { 1.minute.ago }
|
||||
let(:last_problem_at) { 11.minutes.ago }
|
||||
|
||||
it { expect(problem_tracker).not_to be_failing }
|
||||
end
|
||||
|
||||
context "when the last run had a problem" do
|
||||
let(:last_run_at) { 1.minute.ago }
|
||||
let(:last_success_at) { 11.minutes.ago }
|
||||
let(:last_problem_at) { 1.minute.ago }
|
||||
|
||||
it { expect(problem_tracker).to be_failing }
|
||||
end
|
||||
end
|
||||
|
||||
describe "#passing?" do
|
||||
before { freeze_time }
|
||||
|
||||
let(:problem_tracker) { described_class.new(last_problem_at:, last_run_at:, last_success_at:) }
|
||||
|
||||
context "when the last run passed" do
|
||||
let(:last_run_at) { 1.minute.ago }
|
||||
let(:last_success_at) { 1.minute.ago }
|
||||
let(:last_problem_at) { 11.minutes.ago }
|
||||
|
||||
it { expect(problem_tracker).to be_passing }
|
||||
end
|
||||
|
||||
context "when the last run had a problem" do
|
||||
let(:last_run_at) { 1.minute.ago }
|
||||
let(:last_success_at) { 11.minutes.ago }
|
||||
let(:last_problem_at) { 1.minute.ago }
|
||||
|
||||
it { expect(problem_tracker).not_to be_passing }
|
||||
end
|
||||
end
|
||||
|
||||
describe "#problem!" do
|
||||
let(:problem_tracker) do
|
||||
Fabricate(:problem_check_tracker, identifier: "twitter_login", **original_attributes)
|
||||
Fabricate(
|
||||
:problem_check_tracker,
|
||||
identifier: "twitter_login",
|
||||
target: "foo",
|
||||
**original_attributes,
|
||||
)
|
||||
end
|
||||
|
||||
let(:original_attributes) do
|
||||
{
|
||||
blips: 0,
|
||||
blips:,
|
||||
last_problem_at: 1.week.ago,
|
||||
last_success_at: 24.hours.ago,
|
||||
last_run_at: 24.hours.ago,
|
||||
@ -59,6 +110,7 @@ RSpec.describe ProblemCheckTracker do
|
||||
}
|
||||
end
|
||||
|
||||
let(:blips) { 0 }
|
||||
let(:updated_attributes) { { blips: 1 } }
|
||||
|
||||
it do
|
||||
@ -68,6 +120,61 @@ RSpec.describe ProblemCheckTracker do
|
||||
problem_tracker.attributes
|
||||
}.to(hash_including(updated_attributes))
|
||||
end
|
||||
|
||||
context "when the maximum number of blips have been surpassed" do
|
||||
let(:blips) { 1 }
|
||||
|
||||
it "sounds the alarm" do
|
||||
expect { problem_tracker.problem!(next_run_at: 24.hours.from_now) }.to change {
|
||||
AdminNotice.problem.count
|
||||
}.by(1)
|
||||
end
|
||||
end
|
||||
|
||||
context "when there's an alarm sounding for multi-target trackers" do
|
||||
let(:blips) { 1 }
|
||||
|
||||
before do
|
||||
Fabricate(
|
||||
:admin_notice,
|
||||
subject: "problem",
|
||||
identifier: "twitter_login",
|
||||
details: {
|
||||
target: target,
|
||||
},
|
||||
)
|
||||
end
|
||||
|
||||
context "when the alarm is for a different target" do
|
||||
let(:target) { "bar" }
|
||||
|
||||
it "sounds the alarm" do
|
||||
expect { problem_tracker.problem!(next_run_at: 24.hours.from_now) }.to change {
|
||||
AdminNotice.problem.count
|
||||
}.by(1)
|
||||
end
|
||||
end
|
||||
|
||||
context "when the alarm is for a the same target" do
|
||||
let(:target) { "foo" }
|
||||
|
||||
it "does not duplicate the alarm" do
|
||||
expect { problem_tracker.problem!(next_run_at: 24.hours.from_now) }.not_to change {
|
||||
AdminNotice.problem.count
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "when there are still blips to go" do
|
||||
let(:blips) { 0 }
|
||||
|
||||
it "does not sound the alarm" do
|
||||
expect { problem_tracker.problem!(next_run_at: 24.hours.from_now) }.not_to change {
|
||||
AdminNotice.problem.count
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "#no_problem!" do
|
||||
@ -94,5 +201,15 @@ RSpec.describe ProblemCheckTracker do
|
||||
problem_tracker.attributes
|
||||
}.to(hash_including(updated_attributes))
|
||||
end
|
||||
|
||||
context "when there's an alarm sounding" do
|
||||
before { Fabricate(:admin_notice, subject: "problem", identifier: "twitter_login") }
|
||||
|
||||
it "silences the alarm" do
|
||||
expect { problem_tracker.no_problem!(next_run_at: 24.hours.from_now) }.to change {
|
||||
AdminNotice.problem.count
|
||||
}.by(-1)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user