diff options
Diffstat (limited to 'spec/requests/projects/metrics/dashboards/builder_spec.rb')
-rw-r--r-- | spec/requests/projects/metrics/dashboards/builder_spec.rb | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/spec/requests/projects/metrics/dashboards/builder_spec.rb b/spec/requests/projects/metrics/dashboards/builder_spec.rb new file mode 100644 index 00000000000..e59ed591f63 --- /dev/null +++ b/spec/requests/projects/metrics/dashboards/builder_spec.rb @@ -0,0 +1,106 @@ +# 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 |