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:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-09-19 04:45:44 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-09-19 04:45:44 +0300
commit85dc423f7090da0a52c73eb66faf22ddb20efff9 (patch)
tree9160f299afd8c80c038f08e1545be119f5e3f1e1 /spec/presenters
parent15c2c8c66dbe422588e5411eee7e68f1fa440bb8 (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.rb134
-rw-r--r--spec/presenters/alert_management/prometheus_alert_presenter_spec.rb85
-rw-r--r--spec/presenters/ci/build_presenter_spec.rb6
-rw-r--r--spec/presenters/ci/pipeline_artifacts/code_coverage_presenter_spec.rb62
-rw-r--r--spec/presenters/ci/pipeline_presenter_spec.rb2
-rw-r--r--spec/presenters/clusters/cluster_presenter_spec.rb2
-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.rb127
-rw-r--r--spec/presenters/packages/nuget/search_results_presenter_spec.rb2
-rw-r--r--spec/presenters/projects/prometheus/alert_presenter_spec.rb124
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