Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/migrations/20220629184402_unset_escalation_policies_for_alert_incidents_spec.rb')
-rw-r--r--spec/migrations/20220629184402_unset_escalation_policies_for_alert_incidents_spec.rb72
1 files changed, 72 insertions, 0 deletions
diff --git a/spec/migrations/20220629184402_unset_escalation_policies_for_alert_incidents_spec.rb b/spec/migrations/20220629184402_unset_escalation_policies_for_alert_incidents_spec.rb
new file mode 100644
index 00000000000..bd821714605
--- /dev/null
+++ b/spec/migrations/20220629184402_unset_escalation_policies_for_alert_incidents_spec.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+require_migration!
+
+RSpec.describe UnsetEscalationPoliciesForAlertIncidents do
+ let(:namespaces) { table(:namespaces) }
+ let(:projects) { table(:projects) }
+ let(:issues) { table(:issues) }
+ let(:alerts) { table(:alert_management_alerts) }
+ let(:escalation_policies) { table(:incident_management_escalation_policies) }
+ let(:escalation_statuses) { table(:incident_management_issuable_escalation_statuses) }
+ let(:current_time) { Time.current.change(usec: 0) }
+
+ let!(:namespace) { namespaces.create!(name: 'namespace', path: 'namespace') }
+ let!(:project_namespace) { namespaces.create!(name: 'project', path: 'project', type: 'project') }
+ let!(:project) { projects.create!(namespace_id: namespace.id, project_namespace_id: project_namespace.id) }
+ let!(:policy) { escalation_policies.create!(project_id: project.id, name: 'escalation policy') }
+
+ # Escalation status with policy from alert; Policy & escalation start time should be nullified
+ let!(:issue_1) { create_issue }
+ let!(:escalation_status_1) { create_status(issue_1, policy, current_time) }
+ let!(:alert_1) { create_alert(1, issue_1) }
+
+ # Escalation status without policy, but with alert; Should be ignored
+ let!(:issue_2) { create_issue }
+ let!(:escalation_status_2) { create_status(issue_2, nil, current_time) }
+ let!(:alert_2) { create_alert(2, issue_2) }
+
+ # Escalation status without alert, but with policy; Should be ignored
+ let!(:issue_3) { create_issue }
+ let!(:escalation_status_3) { create_status(issue_3, policy, current_time) }
+
+ # Alert without issue; Should be ignored
+ let!(:alert_3) { create_alert(3) }
+
+ it 'removes the escalation policy if the incident corresponds to an alert' do
+ expect { migrate! }
+ .to change { escalation_status_1.reload.policy_id }.from(policy.id).to(nil)
+ .and change { escalation_status_1.escalations_started_at }.from(current_time).to(nil)
+ .and not_change { policy_attrs(escalation_status_2) }
+ .and not_change { policy_attrs(escalation_status_3) }
+ end
+
+ private
+
+ def create_issue
+ issues.create!(project_id: project.id)
+ end
+
+ def create_status(issue, policy = nil, escalations_started_at = nil)
+ escalation_statuses.create!(
+ issue_id: issue.id,
+ policy_id: policy&.id,
+ escalations_started_at: escalations_started_at
+ )
+ end
+
+ def create_alert(iid, issue = nil)
+ alerts.create!(
+ project_id: project.id,
+ started_at: current_time,
+ title: "alert #{iid}",
+ iid: iid.to_s,
+ issue_id: issue&.id
+ )
+ end
+
+ def policy_attrs(escalation_status)
+ escalation_status.reload.slice(:policy_id, :escalations_started_at)
+ end
+end