debian-mirror-gitlab/spec/services/metrics/dashboard/custom_metric_embed_service_spec.rb
2019-10-12 21:52:04 +05:30

146 lines
3.5 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
describe Metrics::Dashboard::CustomMetricEmbedService do
include MetricsDashboardHelpers
set(:project) { build(:project) }
set(:user) { create(:user) }
set(:environment) { create(:environment, project: project) }
before do
project.add_maintainer(user)
end
let(:dashboard_path) { system_dashboard_path }
let(:group) { business_metric_title }
let(:title) { 'title' }
let(:y_label) { 'y_label' }
describe '.valid_params?' do
let(:valid_params) do
{
embedded: true,
dashboard_path: dashboard_path,
group: group,
title: title,
y_label: y_label
}
end
subject { described_class.valid_params?(params) }
let(:params) { valid_params }
it { is_expected.to be_truthy }
context 'not embedded' do
let(:params) { valid_params.except(:embedded) }
it { is_expected.to be_falsey }
end
context 'non-system dashboard' do
let(:dashboard_path) { '.gitlab/dashboards/test.yml' }
it { is_expected.to be_falsey }
end
context 'undefined dashboard' do
let(:params) { valid_params.except(:dashboard_path) }
it { is_expected.to be_truthy }
end
context 'non-custom metric group' do
let(:group) { 'Different Group' }
it { is_expected.to be_falsey }
end
context 'missing group' do
let(:group) { nil }
it { is_expected.to be_falsey }
end
context 'missing title' do
let(:title) { nil }
it { is_expected.to be_falsey }
end
context 'undefined y-axis label' do
let(:params) { valid_params.except(:y_label) }
it { is_expected.to be_falsey }
end
end
describe '#get_dashboard' do
let(:service_params) do
[
project,
user,
{
embedded: true,
environment: environment,
dashboard_path: dashboard_path,
group: group,
title: title,
y_label: y_label
}
]
end
let(:service_call) { described_class.new(*service_params).get_dashboard }
it_behaves_like 'misconfigured dashboard service response', :not_found
it_behaves_like 'raises error for users with insufficient permissions'
context 'the custom metric exists' do
let!(:metric) { create(:prometheus_metric, project: project) }
it_behaves_like 'valid embedded dashboard service response'
it 'does not cache the unprocessed dashboard' do
expect(Gitlab::Metrics::Dashboard::Cache).not_to receive(:fetch)
described_class.new(*service_params).get_dashboard
end
context 'multiple metrics meet criteria' do
let!(:metric_2) { create(:prometheus_metric, project: project, query: 'avg(metric_2)') }
it_behaves_like 'valid embedded dashboard service response'
it 'includes both metrics' do
result = service_call
included_queries = all_queries(result[:dashboard])
expect(included_queries).to include('avg(metric_2)', 'avg(metric)')
end
end
end
context 'when the metric exists in another project' do
let!(:metric) { create(:prometheus_metric, project: create(:project)) }
it_behaves_like 'misconfigured dashboard service response', :not_found
end
end
private
def all_queries(dashboard)
dashboard[:panel_groups].flat_map do |group|
group[:panels].flat_map do |panel|
panel[:metrics].map do |metric|
metric[:query_range]
end
end
end
end
end