107 lines
2.8 KiB
Ruby
107 lines
2.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
RSpec.describe 'Projects::Metrics::Dashboards::BuilderController' do
|
|
let_it_be(:project) { create(:project) }
|
|
let_it_be(:environment) { create(:environment, project: project) }
|
|
let_it_be(:user) { create(:user) }
|
|
let_it_be(:valid_panel_yml) do
|
|
<<~YML
|
|
---
|
|
title: "Super Chart A1"
|
|
type: "area-chart"
|
|
y_label: "y_label"
|
|
weight: 1
|
|
max_value: 1
|
|
metrics:
|
|
- id: metric_a1
|
|
query_range: |+
|
|
avg(
|
|
sum(
|
|
container_memory_usage_bytes{
|
|
container_name!="POD",
|
|
pod_name=~"^{{ci_environment_slug}}-(.*)",
|
|
namespace="{{kube_namespace}}",
|
|
user_def_variable="{{user_def_variable}}"
|
|
}
|
|
) by (job)
|
|
) without (job)
|
|
/1024/1024/1024
|
|
unit: unit
|
|
label: Legend Label
|
|
YML
|
|
end
|
|
|
|
let_it_be(:invalid_panel_yml) do
|
|
<<~YML
|
|
---
|
|
title: "Super Chart A1"
|
|
type: "area-chart"
|
|
y_label: "y_label"
|
|
weight: 1
|
|
max_value: 1
|
|
YML
|
|
end
|
|
|
|
def send_request(params = {})
|
|
post namespace_project_metrics_dashboards_builder_path(namespace_id: project.namespace, project_id: project, format: :json, **params)
|
|
end
|
|
|
|
describe 'POST /:namespace/:project/-/metrics/dashboards/builder' do
|
|
context 'as anonymous user' do
|
|
it 'redirects user to sign in page' do
|
|
send_request
|
|
|
|
expect(response).to redirect_to(new_user_session_path)
|
|
end
|
|
end
|
|
|
|
context 'as user with guest access' do
|
|
before do
|
|
project.add_guest(user)
|
|
login_as(user)
|
|
end
|
|
|
|
it 'returns not found' do
|
|
send_request
|
|
|
|
expect(response).to have_gitlab_http_status(:not_found)
|
|
end
|
|
end
|
|
|
|
context 'as logged in user' do
|
|
before do
|
|
project.add_developer(user)
|
|
login_as(user)
|
|
end
|
|
|
|
context 'valid yaml panel is supplied' do
|
|
it 'returns success' do
|
|
send_request(panel_yaml: valid_panel_yml)
|
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
|
expect(json_response).to include('title' => 'Super Chart A1', 'type' => 'area-chart')
|
|
end
|
|
end
|
|
|
|
context 'invalid yaml panel is supplied' do
|
|
it 'returns unprocessable entity' do
|
|
send_request(panel_yaml: invalid_panel_yml)
|
|
|
|
expect(response).to have_gitlab_http_status(:unprocessable_entity)
|
|
expect(json_response['message']).to eq('Each "panel" must define an array :metrics')
|
|
end
|
|
end
|
|
|
|
context 'invalid panel_yaml is not a yaml string' do
|
|
it 'returns unprocessable entity' do
|
|
send_request(panel_yaml: 1)
|
|
|
|
expect(response).to have_gitlab_http_status(:unprocessable_entity)
|
|
expect(json_response['message']).to eq('Invalid configuration format')
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|