diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-08-13 00:09:54 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-08-13 00:09:54 +0300 |
commit | 14245e7755fb19d2429aa6a85273097a6b2eb43f (patch) | |
tree | 75ec4975479646f8bc484fae8eab59e90f2620d5 /spec/services/incident_management | |
parent | 5982b74e32546cda6aa4d3e4fa856b6ec4dad30d (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/services/incident_management')
-rw-r--r-- | spec/services/incident_management/create_issue_service_spec.rb | 240 |
1 files changed, 0 insertions, 240 deletions
diff --git a/spec/services/incident_management/create_issue_service_spec.rb b/spec/services/incident_management/create_issue_service_spec.rb deleted file mode 100644 index 6c77779fd92..00000000000 --- a/spec/services/incident_management/create_issue_service_spec.rb +++ /dev/null @@ -1,240 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe IncidentManagement::CreateIssueService do - let(:project) { create(:project, :repository, :private) } - let_it_be(:user) { User.alert_bot } - let(:alert_starts_at) { Time.current } - let(:alert_title) { 'TITLE' } - let(:alert_annotations) { { title: alert_title } } - - let(:alert_payload) do - build_alert_payload( - annotations: alert_annotations, - starts_at: alert_starts_at - ) - end - - let(:alert) { create(:alert_management_alert, :prometheus, project: project, payload: alert_payload) } - let(:service) { described_class.new(project, alert) } - - let(:alert_presenter) do - Gitlab::Alerting::Alert.for_alert_management_alert(project: project, alert: alert).present - end - - let!(:setting) do - create(:project_incident_management_setting, project: project) - end - - subject(:execute) { service.execute } - - context 'when create_issue enabled' do - let(:issue) { execute.payload[:issue] } - - before do - setting.update!(create_issue: true) - end - - context 'without issue_template_content' do - it 'creates an issue with alert summary only' do - expect(execute).to be_success - - expect(issue.author).to eq(user) - expect(issue.title).to eq(alert_title) - expect(issue.description).to include(alert_presenter.issue_summary_markdown.strip) - expect(separator_count(issue.description)).to eq(0) - end - end - - context 'with erroneous issue service' do - let(:invalid_issue) do - build(:issue, project: project, title: nil).tap(&:valid?) - end - - let(:issue_error) { invalid_issue.errors.full_messages.to_sentence } - - it 'returns and logs the issue error' do - expect_next_instance_of(Issues::CreateService) do |issue_service| - expect(issue_service).to receive(:execute).and_return(invalid_issue) - end - - expect(service) - .to receive(:log_error) - .with(error_message(issue_error)) - - expect(execute).to be_error - expect(execute.message).to eq(issue_error) - end - end - - shared_examples 'GFM template' do - context 'plain content' do - let(:template_content) { 'some content' } - - it 'creates an issue appending issue template' do - expect(execute).to be_success - - expect(issue.description).to include(alert_presenter.issue_summary_markdown) - expect(separator_count(issue.description)).to eq(1) - expect(issue.description).to include(template_content) - end - end - - context 'quick actions' do - let(:user) { create(:user) } - let(:plain_text) { 'some content' } - - let(:template_content) do - <<~CONTENT - #{plain_text} - /due tomorrow - /assign @#{user.username} - CONTENT - end - - before do - project.add_maintainer(user) - end - - it 'creates an issue interpreting quick actions' do - expect(execute).to be_success - - expect(issue.description).to include(plain_text) - expect(issue.due_date).to be_present - expect(issue.assignees).to eq([user]) - end - end - end - - context 'with gitlab_incident_markdown' do - let(:alert_annotations) do - { title: alert_title, gitlab_incident_markdown: template_content } - end - - it_behaves_like 'GFM template' - end - - context 'with issue_template_content' do - before do - create_issue_template('bug', template_content) - setting.update!(issue_template_key: 'bug') - end - - it_behaves_like 'GFM template' - - context 'and gitlab_incident_markdown' do - let(:template_content) { 'plain text'} - let(:alt_template) { 'alternate text' } - let(:alert_annotations) do - { title: alert_title, gitlab_incident_markdown: alt_template } - end - - it 'includes both templates' do - expect(execute).to be_success - - expect(issue.description).to include(alert_presenter.issue_summary_markdown) - expect(issue.description).to include(template_content) - expect(issue.description).to include(alt_template) - expect(separator_count(issue.description)).to eq(2) - end - end - - private - - def create_issue_template(name, content) - project.repository.create_file( - project.creator, - ".gitlab/issue_templates/#{name}.md", - content, - message: 'message', - branch_name: 'master' - ) - end - end - - context 'with gitlab alert' do - let(:gitlab_alert) { create(:prometheus_alert, project: project) } - - before do - alert_payload['labels'] = { - 'gitlab_alert_id' => gitlab_alert.prometheus_metric_id.to_s - } - end - - it 'creates an issue' do - query_title = "#{gitlab_alert.title} #{gitlab_alert.computed_operator} #{gitlab_alert.threshold}" - - expect(execute).to be_success - - expect(issue.author).to eq(user) - expect(issue.title).to eq(alert_presenter.full_title) - expect(issue.title).to include(gitlab_alert.environment.name) - expect(issue.title).to include(query_title) - expect(issue.title).to include('for 5 minutes') - expect(issue.description).to include(alert_presenter.issue_summary_markdown.strip) - expect(separator_count(issue.description)).to eq(0) - end - end - - describe 'with invalid alert payload' do - shared_examples 'invalid alert' do - it 'does not create an issue' do - expect(service) - .to receive(:log_error) - .with(error_message('invalid alert')) - - expect(execute).to be_error - expect(execute.message).to eq('invalid alert') - end - end - - context 'without title' do - let(:alert_annotations) { {} } - - it_behaves_like 'invalid alert' - end - - context 'without startsAt' do - let(:alert_starts_at) { nil } - - it_behaves_like 'invalid alert' - end - end - end - - context 'when create_issue disabled' do - before do - setting.update!(create_issue: false) - end - - it 'returns an error' do - expect(service) - .to receive(:log_error) - .with(error_message('setting disabled')) - - expect(execute).to be_error - expect(execute.message).to eq('setting disabled') - end - end - - private - - def build_alert_payload(annotations: {}, starts_at: Time.current) - { - 'annotations' => annotations.stringify_keys - }.tap do |payload| - payload['startsAt'] = starts_at.rfc3339 if starts_at - end - end - - def error_message(message) - %{Cannot create incident issue for "#{project.full_name}": #{message}} - end - - def separator_count(text) - summary_separator = "\n\n---\n\n" - - text.scan(summary_separator).size - end -end |