diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-19 04:45:44 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-09-19 04:45:44 +0300 |
commit | 85dc423f7090da0a52c73eb66faf22ddb20efff9 (patch) | |
tree | 9160f299afd8c80c038f08e1545be119f5e3f1e1 /spec/presenters | |
parent | 15c2c8c66dbe422588e5411eee7e68f1fa440bb8 (diff) |
Add latest changes from gitlab-org/gitlab@13-4-stable-ee
Diffstat (limited to 'spec/presenters')
-rw-r--r-- | spec/presenters/alert_management/alert_presenter_spec.rb | 134 | ||||
-rw-r--r-- | spec/presenters/alert_management/prometheus_alert_presenter_spec.rb | 85 | ||||
-rw-r--r-- | spec/presenters/ci/build_presenter_spec.rb | 6 | ||||
-rw-r--r-- | spec/presenters/ci/pipeline_artifacts/code_coverage_presenter_spec.rb | 62 | ||||
-rw-r--r-- | spec/presenters/ci/pipeline_presenter_spec.rb | 2 | ||||
-rw-r--r-- | spec/presenters/clusters/cluster_presenter_spec.rb | 2 | ||||
-rw-r--r-- | spec/presenters/dev_ops_report/metric_presenter_spec.rb (renamed from spec/presenters/dev_ops_score/metric_presenter_spec.rb) | 4 | ||||
-rw-r--r-- | spec/presenters/packages/conan/package_presenter_spec.rb | 127 | ||||
-rw-r--r-- | spec/presenters/packages/nuget/search_results_presenter_spec.rb | 2 | ||||
-rw-r--r-- | spec/presenters/projects/prometheus/alert_presenter_spec.rb | 124 |
10 files changed, 277 insertions, 271 deletions
diff --git a/spec/presenters/alert_management/alert_presenter_spec.rb b/spec/presenters/alert_management/alert_presenter_spec.rb index 394007a802f..243301502ce 100644 --- a/spec/presenters/alert_management/alert_presenter_spec.rb +++ b/spec/presenters/alert_management/alert_presenter_spec.rb @@ -4,58 +4,117 @@ require 'spec_helper' RSpec.describe AlertManagement::AlertPresenter do let_it_be(:project) { create(:project) } - - let_it_be(:generic_payload) do + let_it_be(:payload) do { 'title' => 'Alert title', 'start_time' => '2020-04-27T10:10:22.265949279Z', - 'custom' => { 'param' => 73 }, - 'runbook' => 'https://runbook.com' + 'custom' => { + 'alert' => { + 'fields' => %w[one two] + } + }, + 'yet' => { + 'another' => 73 + } } end - let_it_be(:alert) do - create(:alert_management_alert, :with_description, :with_host, :with_service, :with_monitoring_tool, project: project, payload: generic_payload) - end - + let_it_be(:alert) { create(:alert_management_alert, project: project, payload: payload) } let(:alert_url) { "http://localhost/#{project.full_path}/-/alert_management/#{alert.iid}/details" } subject(:presenter) { described_class.new(alert) } describe '#issue_description' do + let_it_be(:alert) { create(:alert_management_alert, project: project, payload: {}) } + let(:markdown_line_break) { ' ' } - it 'returns an alert issue description' do - expect(presenter.issue_description).to eq( - <<~MARKDOWN.chomp - #### Summary + subject { presenter.issue_description } - **Start time:** #{presenter.start_time}#{markdown_line_break} - **Severity:** #{presenter.severity}#{markdown_line_break} - **Service:** #{alert.service}#{markdown_line_break} - **Monitoring tool:** #{alert.monitoring_tool}#{markdown_line_break} - **Hosts:** #{alert.hosts.join(' ')}#{markdown_line_break} - **Description:** #{alert.description}#{markdown_line_break} - **GitLab alert:** #{alert_url} + context 'with an empty payload' do + it do + is_expected.to eq( + <<~MARKDOWN.chomp + **Start time:** #{presenter.start_time}#{markdown_line_break} + **Severity:** #{presenter.severity}#{markdown_line_break} + **GitLab alert:** #{alert_url} - #### Alert Details + MARKDOWN + ) + end + end - **custom.param:** 73#{markdown_line_break} - **runbook:** https://runbook.com - MARKDOWN - ) + context 'with optional alert attributes' do + let_it_be(:alert) do + create(:alert_management_alert, :with_description, :with_host, :with_service, :with_monitoring_tool, project: project, payload: payload) + end + + before do + allow(alert.parsed_payload).to receive(:full_query).and_return('metric > 1') + end + + it do + is_expected.to eq( + <<~MARKDOWN.chomp + **Start time:** #{presenter.start_time}#{markdown_line_break} + **Severity:** #{presenter.severity}#{markdown_line_break} + **full_query:** `metric > 1`#{markdown_line_break} + **Service:** #{alert.service}#{markdown_line_break} + **Monitoring tool:** #{alert.monitoring_tool}#{markdown_line_break} + **Hosts:** #{alert.hosts.join(' ')}#{markdown_line_break} + **Description:** #{alert.description}#{markdown_line_break} + **GitLab alert:** #{alert_url} + + MARKDOWN + ) + end end - end - describe '#metrics_dashboard_url' do - it 'is not defined' do - expect(presenter.metrics_dashboard_url).to be_nil + context 'with incident markdown' do + before do + allow(alert.parsed_payload).to receive(:alert_markdown).and_return('**`markdown example`**') + end + + it do + is_expected.to eq( + <<~MARKDOWN.chomp + **Start time:** #{presenter.start_time}#{markdown_line_break} + **Severity:** #{presenter.severity}#{markdown_line_break} + **GitLab alert:** #{alert_url} + + + --- + + **`markdown example`** + MARKDOWN + ) + end + end + + context 'with metrics_dashboard_url' do + before do + allow(alert.parsed_payload).to receive(:metrics_dashboard_url).and_return('https://gitlab.com/metrics') + end + + it do + is_expected.to eq( + <<~MARKDOWN.chomp + **Start time:** #{presenter.start_time}#{markdown_line_break} + **Severity:** #{presenter.severity}#{markdown_line_break} + **GitLab alert:** #{alert_url} + + [](https://gitlab.com/metrics) + MARKDOWN + ) + end end end - describe '#runbook' do - it 'shows the runbook from the payload' do - expect(presenter.runbook).to eq('https://runbook.com') + describe '#start_time' do + it 'formats the start time of the alert' do + alert.started_at = Time.utc(2019, 5, 5) + + expect(presenter.start_time). to eq('05 May 2019, 12:00AM (UTC)') end end @@ -64,4 +123,17 @@ RSpec.describe AlertManagement::AlertPresenter do expect(presenter.details_url).to match(%r{#{project.web_url}/-/alert_management/#{alert.iid}/details}) end end + + describe '#details' do + subject { presenter.details } + + it 'renders the payload as inline hash' do + is_expected.to eq( + 'title' => 'Alert title', + 'start_time' => '2020-04-27T10:10:22.265949279Z', + 'custom.alert.fields' => %w[one two], + 'yet.another' => 73 + ) + end + end end diff --git a/spec/presenters/alert_management/prometheus_alert_presenter_spec.rb b/spec/presenters/alert_management/prometheus_alert_presenter_spec.rb deleted file mode 100644 index 3cfff3c1b2f..00000000000 --- a/spec/presenters/alert_management/prometheus_alert_presenter_spec.rb +++ /dev/null @@ -1,85 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe AlertManagement::PrometheusAlertPresenter do - let_it_be(:project) { create(:project) } - let(:payload) do - { - 'annotations' => { - 'title' => 'Alert title', - 'gitlab_incident_markdown' => '**`markdown example`**', - 'custom annotation' => 'custom annotation value' - }, - 'startsAt' => '2020-04-27T10:10:22.265949279Z', - 'generatorURL' => 'http://8d467bd4607a:9090/graph?g0.expr=vector%281%29&g0.tab=1' - } - end - - let!(:alert) do - create(:alert_management_alert, :prometheus, project: project, payload: payload) - end - - let(:alert_url) { "http://localhost/#{project.full_path}/-/alert_management/#{alert.iid}/details" } - - subject(:presenter) { described_class.new(alert) } - - describe '#issue_description' do - let(:markdown_line_break) { ' ' } - - it 'returns an alert issue description' do - expect(presenter.issue_description).to eq( - <<~MARKDOWN.chomp - #### Summary - - **Start time:** #{presenter.start_time}#{markdown_line_break} - **Severity:** #{presenter.severity}#{markdown_line_break} - **full_query:** `vector(1)`#{markdown_line_break} - **Monitoring tool:** Prometheus#{markdown_line_break} - **GitLab alert:** #{alert_url} - - #### Alert Details - - **custom annotation:** custom annotation value - - --- - - **`markdown example`** - MARKDOWN - ) - end - end - - describe '#metrics_dashboard_url' do - subject { presenter.metrics_dashboard_url } - - context 'for a non-prometheus alert' do - it { is_expected.to be_nil } - end - - context 'for a self-managed prometheus alert' do - include_context 'self-managed prometheus alert attributes' - - it { is_expected.to eq(dashboard_url_for_alert) } - end - - context 'for a gitlab-managed prometheus alert' do - include_context 'gitlab-managed prometheus alert attributes' - - it { is_expected.to eq(dashboard_url_for_alert) } - end - end - - describe '#runbook' do - subject { presenter.runbook } - - it { is_expected.to be_nil } - - context 'with runbook in payload' do - let(:expected_runbook) { 'https://awesome-runbook.com' } - let(:payload) { { 'annotations' => { 'runbook' => expected_runbook } } } - - it { is_expected.to eq(expected_runbook) } - end - end -end diff --git a/spec/presenters/ci/build_presenter_spec.rb b/spec/presenters/ci/build_presenter_spec.rb index 8d302b242b3..1ff2ea3d225 100644 --- a/spec/presenters/ci/build_presenter_spec.rb +++ b/spec/presenters/ci/build_presenter_spec.rb @@ -228,7 +228,7 @@ RSpec.describe Ci::BuildPresenter do let(:build) { create(:ci_build, :scheduled) } it 'returns execution time' do - Timecop.freeze do + freeze_time do is_expected.to be_like_time(60.0) end end @@ -238,7 +238,7 @@ RSpec.describe Ci::BuildPresenter do let(:build) { create(:ci_build, :expired_scheduled) } it 'returns execution time' do - Timecop.freeze do + freeze_time do is_expected.to eq(0) end end @@ -249,7 +249,7 @@ RSpec.describe Ci::BuildPresenter do let(:build) { create(:ci_build) } it 'does not return execution time' do - Timecop.freeze do + freeze_time do is_expected.to be_falsy end end diff --git a/spec/presenters/ci/pipeline_artifacts/code_coverage_presenter_spec.rb b/spec/presenters/ci/pipeline_artifacts/code_coverage_presenter_spec.rb new file mode 100644 index 00000000000..e679f5fa144 --- /dev/null +++ b/spec/presenters/ci/pipeline_artifacts/code_coverage_presenter_spec.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Ci::PipelineArtifacts::CodeCoveragePresenter do + let(:pipeline_artifact) { create(:ci_pipeline_artifact, :with_code_coverage_with_multiple_files) } + + subject(:presenter) { described_class.new(pipeline_artifact) } + + describe '#for_files' do + subject { presenter.for_files(filenames) } + + context 'when code coverage has data' do + context 'when filenames is empty' do + let(:filenames) { %w() } + + it 'returns hash without coverage' do + expect(subject).to match(files: {}) + end + end + + context 'when filenames do not match code coverage data' do + let(:filenames) { %w(demo.rb) } + + it 'returns hash without coverage' do + expect(subject).to match(files: {}) + end + end + + context 'when filenames matches code coverage data' do + context 'when asking for one filename' do + let(:filenames) { %w(file_a.rb) } + + it 'returns coverage for the given filename' do + expect(subject).to match(files: { "file_a.rb" => { "1" => 1, "2" => 1, "3" => 1 } }) + end + end + + context 'when asking for multiple filenames' do + let(:filenames) { %w(file_a.rb file_b.rb) } + + it 'returns coverage for a the given filenames' do + expect(subject).to match( + files: { + "file_a.rb" => { + "1" => 1, + "2" => 1, + "3" => 1 + }, + "file_b.rb" => { + "1" => 0, + "2" => 0, + "3" => 0 + } + } + ) + end + end + end + end + end +end diff --git a/spec/presenters/ci/pipeline_presenter_spec.rb b/spec/presenters/ci/pipeline_presenter_spec.rb index 158daad97f5..18f79bc930c 100644 --- a/spec/presenters/ci/pipeline_presenter_spec.rb +++ b/spec/presenters/ci/pipeline_presenter_spec.rb @@ -65,7 +65,7 @@ RSpec.describe Ci::PipelinePresenter do describe '#failure_reason' do context 'when pipeline has a failure reason' do - ::Ci::PipelineEnums.failure_reasons.keys.each do |failure_reason| + Enums::Ci::Pipeline.failure_reasons.keys.each do |failure_reason| context "when failure reason is #{failure_reason}" do before do pipeline.failure_reason = failure_reason diff --git a/spec/presenters/clusters/cluster_presenter_spec.rb b/spec/presenters/clusters/cluster_presenter_spec.rb index e99b04fda8d..2d38c91499a 100644 --- a/spec/presenters/clusters/cluster_presenter_spec.rb +++ b/spec/presenters/clusters/cluster_presenter_spec.rb @@ -264,7 +264,7 @@ RSpec.describe Clusters::ClusterPresenter do it do is_expected.to include('clusters-path': clusterable_presenter.index_path, 'dashboard-endpoint': clusterable_presenter.metrics_dashboard_path(cluster), - 'documentation-path': help_page_path('user/project/clusters/index', anchor: 'monitoring-your-kubernetes-cluster-ultimate'), + 'documentation-path': help_page_path('user/project/clusters/index', anchor: 'monitoring-your-kubernetes-cluster'), 'add-dashboard-documentation-path': help_page_path('operations/metrics/dashboards/index.md', anchor: 'add-a-new-dashboard-to-your-project'), 'empty-getting-started-svg-path': match_asset_path('/assets/illustrations/monitoring/getting_started.svg'), 'empty-loading-svg-path': match_asset_path('/assets/illustrations/monitoring/loading.svg'), diff --git a/spec/presenters/dev_ops_score/metric_presenter_spec.rb b/spec/presenters/dev_ops_report/metric_presenter_spec.rb index 8b7b2c88578..306b5592c33 100644 --- a/spec/presenters/dev_ops_score/metric_presenter_spec.rb +++ b/spec/presenters/dev_ops_report/metric_presenter_spec.rb @@ -2,10 +2,10 @@ require 'spec_helper' -RSpec.describe DevOpsScore::MetricPresenter do +RSpec.describe DevOpsReport::MetricPresenter do subject { described_class.new(metric) } - let(:metric) { build(:dev_ops_score_metric) } + let(:metric) { build(:dev_ops_report_metric) } describe '#cards' do it 'includes instance score, leader score and percentage score' do diff --git a/spec/presenters/packages/conan/package_presenter_spec.rb b/spec/presenters/packages/conan/package_presenter_spec.rb index 3bc649c5da4..4e8af752f3e 100644 --- a/spec/presenters/packages/conan/package_presenter_spec.rb +++ b/spec/presenters/packages/conan/package_presenter_spec.rb @@ -4,34 +4,39 @@ require 'spec_helper' RSpec.describe ::Packages::Conan::PackagePresenter do let_it_be(:user) { create(:user) } - let_it_be(:project) { create(:project) } + let_it_be(:package) { create(:conan_package) } + let_it_be(:project) { package.project } let_it_be(:conan_package_reference) { '123456789'} + let(:params) { { package_scope: :instance } } - RSpec.shared_examples 'not selecting a package with the wrong type' do - context 'with a nuget package with same name and version' do - let_it_be(:wrong_package) { create(:nuget_package, name: 'wrong', version: '1.0.0', project: project) } - - let(:recipe) { "#{wrong_package.name}/#{wrong_package.version}" } + shared_examples 'no existing package' do + context 'when package does not exist' do + let(:package) { nil } it { is_expected.to be_empty } end end - describe '#recipe_urls' do - subject { described_class.new(recipe, user, project).recipe_urls } - - context 'no existing package' do - let(:recipe) { "my-pkg/v1.0.0/#{project.full_path}/stable" } + shared_examples 'conan_file_metadatum is not found' do + context 'when no conan_file_metadatum exists' do + before do + package.package_files.each do |file| + file.conan_file_metadatum.delete + file.reload + end + end it { is_expected.to be_empty } end + end - it_behaves_like 'not selecting a package with the wrong type' + describe '#recipe_urls' do + subject { described_class.new(package, user, project, params).recipe_urls } - context 'existing package' do - let(:package) { create(:conan_package, project: project) } - let(:recipe) { package.conan_recipe } + it_behaves_like 'no existing package' + it_behaves_like 'conan_file_metadatum is not found' + context 'existing package' do let(:expected_result) do { "conanfile.py" => "#{Settings.build_base_gitlab_url}/api/v4/packages/conan/v1/files/#{package.conan_recipe_path}/0/export/conanfile.py", @@ -40,24 +45,37 @@ RSpec.describe ::Packages::Conan::PackagePresenter do end it { is_expected.to eq(expected_result) } - end - end - describe '#recipe_snapshot' do - subject { described_class.new(recipe, user, project).recipe_snapshot } + context 'when there are multiple channels for the same package' do + let(:conan_metadatum) { create(:conan_metadatum, package_channel: 'newest' ) } + let!(:newest_package) { create(:conan_package, name: package.name, version: package.version, project: project, conan_metadatum: conan_metadatum) } + + it { is_expected.to eq(expected_result) } + end - context 'no existing package' do - let(:recipe) { "my-pkg/v1.0.0/#{project.full_path}/stable" } + context 'with package_scope of project' do + # #recipe_file_url checks for params[:id] + let(:params) { { id: project.id } } - it { is_expected.to be_empty } + let(:expected_result) do + { + "conanfile.py" => "#{Settings.build_base_gitlab_url}/api/v4/projects/#{project.id}/packages/conan/v1/files/#{package.conan_recipe_path}/0/export/conanfile.py", + "conanmanifest.txt" => "#{Settings.build_base_gitlab_url}/api/v4/projects/#{project.id}/packages/conan/v1/files/#{package.conan_recipe_path}/0/export/conanmanifest.txt" + } + end + + it { is_expected.to eq(expected_result) } + end end + end - it_behaves_like 'not selecting a package with the wrong type' + describe '#recipe_snapshot' do + subject { described_class.new(package, user, project).recipe_snapshot } - context 'existing package' do - let(:package) { create(:conan_package, project: project) } - let(:recipe) { package.conan_recipe } + it_behaves_like 'no existing package' + it_behaves_like 'conan_file_metadatum is not found' + context 'existing package' do let(:expected_result) do { "conanfile.py" => '12345abcde', @@ -72,24 +90,23 @@ RSpec.describe ::Packages::Conan::PackagePresenter do describe '#package_urls' do let(:reference) { conan_package_reference } + let(:params) do + { + conan_package_reference: reference, + package_scope: :instance + } + end + subject do described_class.new( - recipe, user, project, conan_package_reference: reference + package, user, project, params ).package_urls end - context 'no existing package' do - let(:recipe) { "my-pkg/v1.0.0/#{project.full_path}/stable" } - - it { is_expected.to be_empty } - end - - it_behaves_like 'not selecting a package with the wrong type' + it_behaves_like 'no existing package' + it_behaves_like 'conan_file_metadatum is not found' context 'existing package' do - let(:package) { create(:conan_package, project: project) } - let(:recipe) { package.conan_recipe } - let(:expected_result) do { "conaninfo.txt" => "#{Settings.build_base_gitlab_url}/api/v4/packages/conan/v1/files/#{package.conan_recipe_path}/0/package/#{conan_package_reference}/0/conaninfo.txt", @@ -100,6 +117,26 @@ RSpec.describe ::Packages::Conan::PackagePresenter do it { is_expected.to eq(expected_result) } + context 'with package_scope of project' do + # #package_file_url checks for params[:id] + let(:params) do + { + conan_package_reference: reference, + id: project.id + } + end + + let(:expected_result) do + { + "conaninfo.txt" => "#{Settings.build_base_gitlab_url}/api/v4/projects/#{project.id}/packages/conan/v1/files/#{package.conan_recipe_path}/0/package/#{conan_package_reference}/0/conaninfo.txt", + "conanmanifest.txt" => "#{Settings.build_base_gitlab_url}/api/v4/projects/#{project.id}/packages/conan/v1/files/#{package.conan_recipe_path}/0/package/#{conan_package_reference}/0/conanmanifest.txt", + "conan_package.tgz" => "#{Settings.build_base_gitlab_url}/api/v4/projects/#{project.id}/packages/conan/v1/files/#{package.conan_recipe_path}/0/package/#{conan_package_reference}/0/conan_package.tgz" + } + end + + it { is_expected.to eq(expected_result) } + end + context 'multiple packages with different references' do let(:info_file) { create(:conan_package_file, :conan_package_info, package: package) } let(:manifest_file) { create(:conan_package_file, :conan_package_manifest, package: package) } @@ -131,7 +168,7 @@ RSpec.describe ::Packages::Conan::PackagePresenter do it 'returns empty if the reference does not exist' do result = described_class.new( - recipe, user, project, conan_package_reference: 'doesnotexist' + package, user, project, conan_package_reference: 'doesnotexist' ).package_urls expect(result).to eq({}) @@ -145,22 +182,14 @@ RSpec.describe ::Packages::Conan::PackagePresenter do subject do described_class.new( - recipe, user, project, conan_package_reference: reference + package, user, project, conan_package_reference: reference ).package_snapshot end - context 'no existing package' do - let(:recipe) { "my-pkg/v1.0.0/#{project.full_path}/stable" } - - it { is_expected.to be_empty } - end - - it_behaves_like 'not selecting a package with the wrong type' + it_behaves_like 'no existing package' + it_behaves_like 'conan_file_metadatum is not found' context 'existing package' do - let(:package) { create(:conan_package, project: project) } - let(:recipe) { package.conan_recipe } - let(:expected_result) do { "conaninfo.txt" => '12345abcde', diff --git a/spec/presenters/packages/nuget/search_results_presenter_spec.rb b/spec/presenters/packages/nuget/search_results_presenter_spec.rb index 29ec8579dc1..fed20c8e39d 100644 --- a/spec/presenters/packages/nuget/search_results_presenter_spec.rb +++ b/spec/presenters/packages/nuget/search_results_presenter_spec.rb @@ -37,7 +37,7 @@ RSpec.describe Packages::Nuget::SearchResultsPresenter do expect(package_json[:summary]).to be_blank expect(package_json[:total_downloads]).to eq 0 expect(package_json[:verified]).to be - expect(package_json[:version]).to eq VersionSorter.sort(versions).last # rubocop: disable Style/UnneededSort + expect(package_json[:version]).to eq VersionSorter.sort(versions).last # rubocop: disable Style/RedundantSort versions.zip(package_json[:versions]).each do |version, version_json| expect(version_json[:json_url]).to end_with("#{version}.json") expect(version_json[:downloads]).to eq 0 diff --git a/spec/presenters/projects/prometheus/alert_presenter_spec.rb b/spec/presenters/projects/prometheus/alert_presenter_spec.rb index 2d58a7f2cfa..98dba28829e 100644 --- a/spec/presenters/projects/prometheus/alert_presenter_spec.rb +++ b/spec/presenters/projects/prometheus/alert_presenter_spec.rb @@ -63,119 +63,62 @@ RSpec.describe Projects::Prometheus::AlertPresenter do it do is_expected.to eq( <<~MARKDOWN.chomp - #### Summary - - **Start time:** #{presenter.start_time} - - MARKDOWN - ) - end - end - - context 'with annotations' do - before do - payload['annotations'] = { 'title' => 'Alert Title', 'foo' => 'value1', 'bar' => 'value2' } - end - - it do - is_expected.to eq( - <<~MARKDOWN.chomp - #### Summary - **Start time:** #{presenter.start_time} - #### Alert Details - - **foo:** value1#{markdown_line_break} - **bar:** value2 MARKDOWN ) end end - context 'with full query' do + context 'with optional attributes' do before do + payload['annotations'] = { + 'title' => 'Alert Title', + 'foo' => 'value1', + 'bar' => 'value2', + 'description' => 'Alert Description', + 'monitoring_tool' => 'monitoring_tool_name', + 'service' => 'service_name', + 'hosts' => ['http://localhost:3000', 'http://localhost:3001'] + } payload['generatorURL'] = 'http://host?g0.expr=query' end it do is_expected.to eq( <<~MARKDOWN.chomp - #### Summary - **Start time:** #{presenter.start_time}#{markdown_line_break} - **full_query:** `query` + **full_query:** `query`#{markdown_line_break} + **Service:** service_name#{markdown_line_break} + **Monitoring tool:** monitoring_tool_name#{markdown_line_break} + **Hosts:** http://localhost:3000 http://localhost:3001 MARKDOWN ) end end - context 'with the Generic Alert parameters' do - let(:generic_alert_params) do - { - 'title' => 'The Generic Alert Title', - 'description' => 'The Generic Alert Description', - 'monitoring_tool' => 'monitoring_tool_name', - 'service' => 'service_name', - 'hosts' => ['http://localhost:3000', 'http://localhost:3001'] - } - end - + context 'when hosts is a string' do before do - payload['annotations'] = generic_alert_params + payload['annotations'] = { 'hosts' => 'http://localhost:3000' } end it do is_expected.to eq( <<~MARKDOWN.chomp - #### Summary - - **Start time:** #{presenter.start_time}#{markdown_line_break} - **Service:** service_name#{markdown_line_break} - **Monitoring tool:** monitoring_tool_name#{markdown_line_break} - **Hosts:** http://localhost:3000 http://localhost:3001 - - #### Alert Details + **Start time:** #{presenter.start_time}#{markdown_line_break} + **Hosts:** http://localhost:3000 - **description:** The Generic Alert Description MARKDOWN ) end - - context 'when hosts is a string' do - before do - payload['annotations'] = { 'hosts' => 'http://localhost:3000' } - end - - it do - is_expected.to eq( - <<~MARKDOWN.chomp - #### Summary - - **Start time:** #{presenter.start_time}#{markdown_line_break} - **Hosts:** http://localhost:3000 - - MARKDOWN - ) - end - end end context 'with embedded metrics' do let(:starts_at) { '2018-03-12T09:06:00Z' } shared_examples_for 'markdown with metrics embed' do - let(:expected_markdown) do - <<~MARKDOWN.chomp - #### Summary - - **Start time:** #{presenter.start_time}#{markdown_line_break} - **full_query:** `avg(metric) > 1.0` - - [](#{presenter.metrics_dashboard_url}) - MARKDOWN - end + let(:embed_regex) { /\n\[\]\(#{Regexp.quote(presenter.metrics_dashboard_url)}\)\z/ } context 'without a starting time available' do around do |example| @@ -186,11 +129,11 @@ RSpec.describe Projects::Prometheus::AlertPresenter do payload.delete('startsAt') end - it { is_expected.to eq(expected_markdown) } + it { is_expected.to match(embed_regex) } end context 'with a starting time available' do - it { is_expected.to eq(expected_markdown) } + it { is_expected.to match(embed_regex) } end end @@ -220,14 +163,8 @@ RSpec.describe Projects::Prometheus::AlertPresenter do end context 'when not enough information is present for an embed' do - let(:expected_markdown) do - <<~MARKDOWN.chomp - #### Summary - - **Start time:** #{presenter.start_time}#{markdown_line_break} - **full_query:** `avg(metric) > 1.0` - - MARKDOWN + shared_examples_for 'does not include an embed' do + it { is_expected.not_to match(/\[\]\(.+\)/) } end context 'without title' do @@ -235,7 +172,7 @@ RSpec.describe Projects::Prometheus::AlertPresenter do payload['annotations'].delete('title') end - it { is_expected.to eq(expected_markdown) } + it_behaves_like 'does not include an embed' end context 'without environment' do @@ -243,24 +180,15 @@ RSpec.describe Projects::Prometheus::AlertPresenter do payload['labels'].delete('gitlab_environment_name') end - it { is_expected.to eq(expected_markdown) } + it_behaves_like 'does not include an embed' end context 'without full_query' do - let(:expected_markdown) do - <<~MARKDOWN.chomp - #### Summary - - **Start time:** #{presenter.start_time} - - MARKDOWN - end - before do payload.delete('generatorURL') end - it { is_expected.to eq(expected_markdown) } + it_behaves_like 'does not include an embed' end end end |