215 lines
7.1 KiB
Ruby
215 lines
7.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
RSpec.describe Gitlab::Metrics::Dashboard::Finder, :use_clean_rails_memory_store_caching do
|
|
include MetricsDashboardHelpers
|
|
|
|
let_it_be(:project) { create(:project) }
|
|
let_it_be(:user) { create(:user) }
|
|
let_it_be(:environment) { create(:environment, project: project) }
|
|
|
|
before do
|
|
project.add_maintainer(user)
|
|
end
|
|
|
|
describe '.find' do
|
|
let(:dashboard_path) { '.gitlab/dashboards/test.yml' }
|
|
let(:service_call) { described_class.find(project, user, environment: environment, dashboard_path: dashboard_path) }
|
|
|
|
it_behaves_like 'misconfigured dashboard service response', :not_found
|
|
|
|
context 'when the dashboard exists' do
|
|
let(:project) { project_with_dashboard(dashboard_path) }
|
|
|
|
it_behaves_like 'valid dashboard service response'
|
|
end
|
|
|
|
context 'when the dashboard is configured incorrectly' do
|
|
let(:project) { project_with_dashboard(dashboard_path, {}) }
|
|
|
|
it_behaves_like 'misconfigured dashboard service response', :unprocessable_entity
|
|
end
|
|
|
|
context 'when the dashboard contains a metric without a query' do
|
|
let(:dashboard) { { 'panel_groups' => [{ 'panels' => [{ 'metrics' => [{ 'id' => 'mock' }] }] }] } }
|
|
let(:project) { project_with_dashboard(dashboard_path, dashboard.to_yaml) }
|
|
|
|
it_behaves_like 'misconfigured dashboard service response', :unprocessable_entity
|
|
end
|
|
|
|
context 'when the system dashboard is specified' do
|
|
let(:dashboard_path) { system_dashboard_path }
|
|
|
|
it_behaves_like 'valid dashboard service response'
|
|
end
|
|
|
|
context 'when the self-monitoring dashboard is specified' do
|
|
let(:dashboard_path) { self_monitoring_dashboard_path }
|
|
|
|
it_behaves_like 'valid dashboard service response'
|
|
end
|
|
|
|
context 'when no dashboard is specified' do
|
|
let(:service_call) { described_class.find(project, user, environment: environment) }
|
|
|
|
it_behaves_like 'valid dashboard service response'
|
|
end
|
|
|
|
context 'when the dashboard is expected to be embedded' do
|
|
let(:service_call) { described_class.find(project, user, **params) }
|
|
let(:params) { { environment: environment, embedded: true } }
|
|
|
|
it_behaves_like 'valid embedded dashboard service response'
|
|
|
|
context 'when params are incomplete' do
|
|
let(:params) { { environment: environment, embedded: true, dashboard_path: system_dashboard_path } }
|
|
|
|
it_behaves_like 'valid embedded dashboard service response'
|
|
end
|
|
|
|
context 'when the panel is specified' do
|
|
context 'as a custom metric' do
|
|
let(:params) do
|
|
{
|
|
environment: environment,
|
|
embedded: true,
|
|
dashboard_path: system_dashboard_path,
|
|
group: business_metric_title,
|
|
title: 'title',
|
|
y_label: 'y_label'
|
|
}
|
|
end
|
|
|
|
it_behaves_like 'misconfigured dashboard service response', :not_found
|
|
|
|
context 'when the metric exists' do
|
|
before do
|
|
create(:prometheus_metric, project: project)
|
|
end
|
|
|
|
it_behaves_like 'valid embedded dashboard service response'
|
|
end
|
|
end
|
|
|
|
context 'as a project-defined panel' do
|
|
let(:dashboard_path) { '.gitlab/dashboard/test.yml' }
|
|
let(:params) do
|
|
{
|
|
environment: environment,
|
|
embedded: true,
|
|
dashboard_path: dashboard_path,
|
|
group: 'Group A',
|
|
title: 'Super Chart A1',
|
|
y_label: 'y_label'
|
|
}
|
|
end
|
|
|
|
it_behaves_like 'misconfigured dashboard service response', :not_found
|
|
|
|
context 'when the metric exists' do
|
|
let(:project) { project_with_dashboard(dashboard_path) }
|
|
|
|
it_behaves_like 'valid embedded dashboard service response'
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '.find_raw' do
|
|
let(:dashboard) { load_dashboard_yaml(File.read(Rails.root.join('config', 'prometheus', 'common_metrics.yml'))) }
|
|
let(:params) { {} }
|
|
|
|
subject { described_class.find_raw(project, **params) }
|
|
|
|
it { is_expected.to eq dashboard }
|
|
|
|
context 'when the system dashboard is specified' do
|
|
let(:params) { { dashboard_path: system_dashboard_path } }
|
|
|
|
it { is_expected.to eq dashboard }
|
|
end
|
|
|
|
context 'when an existing project dashboard is specified' do
|
|
let(:dashboard) { load_sample_dashboard }
|
|
let(:params) { { dashboard_path: '.gitlab/dashboards/test.yml' } }
|
|
let(:project) { project_with_dashboard(params[:dashboard_path]) }
|
|
|
|
it { is_expected.to eq dashboard }
|
|
end
|
|
end
|
|
|
|
describe '.find_all_paths' do
|
|
let(:all_dashboard_paths) { described_class.find_all_paths(project) }
|
|
let(:system_dashboard) { { path: system_dashboard_path, display_name: 'Overview', default: true, system_dashboard: true, out_of_the_box_dashboard: true } }
|
|
let(:k8s_pod_health_dashboard) { { path: pod_dashboard_path, display_name: 'K8s pod health', default: false, system_dashboard: false, out_of_the_box_dashboard: true } }
|
|
|
|
it 'includes OOTB dashboards by default' do
|
|
expect(all_dashboard_paths).to eq([k8s_pod_health_dashboard, system_dashboard])
|
|
end
|
|
|
|
context 'when the project contains dashboards' do
|
|
let(:dashboard_content) { fixture_file('lib/gitlab/metrics/dashboard/sample_dashboard.yml') }
|
|
let(:project) { project_with_dashboards(dashboards) }
|
|
|
|
let(:dashboards) do
|
|
{
|
|
'.gitlab/dashboards/metrics.yml' => dashboard_content,
|
|
'.gitlab/dashboards/better_metrics.yml' => dashboard_content
|
|
}
|
|
end
|
|
|
|
it 'includes OOTB and project dashboards' do
|
|
project_dashboard1 = {
|
|
path: '.gitlab/dashboards/metrics.yml',
|
|
display_name: 'metrics.yml',
|
|
default: false,
|
|
system_dashboard: false,
|
|
out_of_the_box_dashboard: false
|
|
}
|
|
|
|
project_dashboard2 = {
|
|
path: '.gitlab/dashboards/better_metrics.yml',
|
|
display_name: 'better_metrics.yml',
|
|
default: false,
|
|
system_dashboard: false,
|
|
out_of_the_box_dashboard: false
|
|
}
|
|
|
|
expect(all_dashboard_paths).to eq([project_dashboard2, k8s_pod_health_dashboard, project_dashboard1, system_dashboard])
|
|
end
|
|
end
|
|
|
|
context 'when the project is self-monitoring' do
|
|
let(:self_monitoring_dashboard) do
|
|
{
|
|
path: self_monitoring_dashboard_path,
|
|
display_name: 'Overview',
|
|
default: true,
|
|
system_dashboard: true,
|
|
out_of_the_box_dashboard: true
|
|
}
|
|
end
|
|
|
|
let(:dashboard_path) { '.gitlab/dashboards/test.yml' }
|
|
let(:project) { project_with_dashboard(dashboard_path) }
|
|
|
|
before do
|
|
stub_application_setting(self_monitoring_project_id: project.id)
|
|
end
|
|
|
|
it 'includes self-monitoring and project dashboards' do
|
|
project_dashboard = {
|
|
path: dashboard_path,
|
|
display_name: 'test.yml',
|
|
default: false,
|
|
system_dashboard: false,
|
|
out_of_the_box_dashboard: false
|
|
}
|
|
|
|
expect(all_dashboard_paths).to eq([self_monitoring_dashboard, project_dashboard])
|
|
end
|
|
end
|
|
end
|
|
end
|