diff options
Diffstat (limited to 'spec')
11 files changed, 279 insertions, 17 deletions
diff --git a/spec/controllers/projects/import/jira_controller_spec.rb b/spec/controllers/projects/import/jira_controller_spec.rb index f692f976bc0..57e0aa098c0 100644 --- a/spec/controllers/projects/import/jira_controller_spec.rb +++ b/spec/controllers/projects/import/jira_controller_spec.rb @@ -59,6 +59,7 @@ describe Projects::Import::JiraController do context 'when feature flag enabled' do before do stub_feature_flags(jira_issue_import: true) + stub_feature_flags(jira_issue_import_vue: false) end context 'when jira service is enabled for the project' do diff --git a/spec/controllers/projects/prometheus/metrics_controller_spec.rb b/spec/controllers/projects/prometheus/metrics_controller_spec.rb index 314214ceefb..36f694cda29 100644 --- a/spec/controllers/projects/prometheus/metrics_controller_spec.rb +++ b/spec/controllers/projects/prometheus/metrics_controller_spec.rb @@ -3,8 +3,8 @@ require 'spec_helper' describe Projects::Prometheus::MetricsController do - let(:user) { create(:user) } - let(:project) { create(:project) } + let_it_be(:user) { create(:user) } + let_it_be(:project) { create(:prometheus_project) } let(:prometheus_adapter) { double('prometheus_adapter', can_query?: true) } @@ -71,6 +71,8 @@ describe Projects::Prometheus::MetricsController do end context 'when prometheus_adapter is disabled' do + let(:project) { create(:project) } + it 'renders 404' do get :active_common, params: project_params(format: :json) @@ -79,6 +81,106 @@ describe Projects::Prometheus::MetricsController do end end + describe 'POST #validate_query' do + before do + allow(controller).to receive(:prometheus_adapter).and_return(prometheus_adapter) + allow(prometheus_adapter).to receive(:query).with(:validate, query) { validation_result } + end + + let(:query) { 'avg(metric)' } + + context 'validation information is ready' do + let(:validation_result) { { valid: true } } + + it 'validation data is returned' do + post :validate_query, params: project_params(format: :json, query: query) + + expect(json_response).to eq('valid' => true) + end + end + + context 'validation information is not ready' do + let(:validation_result) { nil } + + it 'validation data is returned' do + post :validate_query, params: project_params(format: :json, query: query) + + expect(response).to have_gitlab_http_status(:accepted) + end + end + end + + describe 'GET #index' do + context 'with custom metric present' do + let!(:prometheus_metric) { create(:prometheus_metric, project: project) } + + it 'returns a list of metrics' do + get :index, params: project_params(format: :json) + + expect(response).to have_gitlab_http_status(:ok) + expect(response).to match_response_schema('prometheus/metrics') + end + end + + context 'without custom metrics ' do + it 'returns an empty json' do + get :index, params: project_params(format: :json) + + expect(response).to have_gitlab_http_status(:ok) + expect(json_response).to eq({}) + end + end + end + + describe 'POST #create' do + context 'metric is valid' do + let(:valid_metric) { { prometheus_metric: { title: 'title', query: 'query', group: 'business', y_label: 'label', unit: 'u', legend: 'legend' } } } + + it 'shows a success flash message' do + post :create, params: project_params(valid_metric) + + expect(flash[:notice]).to include('Metric was successfully added.') + + expect(response).to redirect_to(edit_project_service_path(project, PrometheusService)) + end + end + + context 'metric is invalid' do + let(:invalid_metric) { { prometheus_metric: { title: 'title' } } } + + it 'renders new metric page' do + post :create, params: project_params(invalid_metric) + + expect(response).to have_gitlab_http_status(:ok) + expect(response).to render_template('new') + end + end + end + + describe 'DELETE #destroy' do + context 'format html' do + let!(:metric) { create(:prometheus_metric, project: project) } + + it 'destroys the metric' do + delete :destroy, params: project_params(id: metric.id) + + expect(response).to redirect_to(edit_project_service_path(project, PrometheusService)) + expect(PrometheusMetric.find_by(id: metric.id)).to be_nil + end + end + + context 'format json' do + let!(:metric) { create(:prometheus_metric, project: project) } + + it 'destroys the metric' do + delete :destroy, params: project_params(id: metric.id, format: :json) + + expect(response).to have_gitlab_http_status(:ok) + expect(PrometheusMetric.find_by(id: metric.id)).to be_nil + end + end + end + describe '#prometheus_adapter' do before do allow(controller).to receive(:project).and_return(project) diff --git a/spec/controllers/projects/registry/repositories_controller_spec.rb b/spec/controllers/projects/registry/repositories_controller_spec.rb index e68959b6a96..c641a45a216 100644 --- a/spec/controllers/projects/registry/repositories_controller_spec.rb +++ b/spec/controllers/projects/registry/repositories_controller_spec.rb @@ -110,6 +110,7 @@ describe Projects::Registry::RepositoriesController do delete_repository(repository) + expect(repository.reload).to be_delete_scheduled expect(response).to have_gitlab_http_status(:no_content) end diff --git a/spec/fixtures/api/schemas/prometheus/metrics.json b/spec/fixtures/api/schemas/prometheus/metrics.json new file mode 100644 index 00000000000..0a13f5efc77 --- /dev/null +++ b/spec/fixtures/api/schemas/prometheus/metrics.json @@ -0,0 +1,28 @@ +{ + "type": "object", + "properties": { + "metrics": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "title": { + "type": "string" + }, + "group": { + "type": "string" + }, + "group_title": { + "type": "string" + }, + "edit_path": { + "type": "string" + } + } + } + } + } +} diff --git a/spec/fixtures/api/schemas/registry/repository.json b/spec/fixtures/api/schemas/registry/repository.json index d0a068b65a7..f7469aad235 100644 --- a/spec/fixtures/api/schemas/registry/repository.json +++ b/spec/fixtures/api/schemas/registry/repository.json @@ -32,6 +32,12 @@ "destroy_path": { "type": "string" }, + "status": { + "oneOf": [ + { "type": "null" }, + { "type": "string", "enum": ["delete_scheduled", "delete_failed"] } + ] + }, "tags": { "$ref": "tags.json" } }, "additionalProperties": false diff --git a/spec/helpers/environments_helper_spec.rb b/spec/helpers/environments_helper_spec.rb index aaa90a7d2af..152e9c84ec5 100644 --- a/spec/helpers/environments_helper_spec.rb +++ b/spec/helpers/environments_helper_spec.rb @@ -34,7 +34,10 @@ describe EnvironmentsHelper do 'has-metrics' => "#{environment.has_metrics?}", 'prometheus-status' => "#{environment.prometheus_status}", 'external-dashboard-url' => nil, - 'environment-state' => environment.state + 'environment-state' => environment.state, + 'custom-metrics-path' => project_prometheus_metrics_path(project), + 'validate-query-path' => validate_query_project_prometheus_metrics_path(project), + 'custom-metrics-available' => 'true' ) end @@ -58,4 +61,22 @@ describe EnvironmentsHelper do it { is_expected.to include('environment-state' => 'stopped') } end end + + describe '#custom_metrics_available?' do + subject { helper.custom_metrics_available?(project) } + + before do + project.add_maintainer(user) + + allow(helper).to receive(:current_user).and_return(user) + + allow(helper).to receive(:can?) + .with(user, :admin_project, project) + .and_return(true) + end + + it 'returns true' do + expect(subject).to eq(true) + end + end end diff --git a/spec/javascripts/notebook/cells/code_spec.js b/spec/javascripts/notebook/cells/code_spec.js index 4659b83d1b6..f3f97145ad3 100644 --- a/spec/javascripts/notebook/cells/code_spec.js +++ b/spec/javascripts/notebook/cells/code_spec.js @@ -11,14 +11,19 @@ describe('Code component', () => { json = getJSONFixture('blob/notebook/basic.json'); }); + const setupComponent = cell => { + const comp = new Component({ + propsData: { + cell, + }, + }); + comp.$mount(); + return comp; + }; + describe('without output', () => { beforeEach(done => { - vm = new Component({ - propsData: { - cell: json.cells[0], - }, - }); - vm.$mount(); + vm = setupComponent(json.cells[0]); setTimeout(() => { done(); @@ -32,12 +37,7 @@ describe('Code component', () => { describe('with output', () => { beforeEach(done => { - vm = new Component({ - propsData: { - cell: json.cells[2], - }, - }); - vm.$mount(); + vm = setupComponent(json.cells[2]); setTimeout(() => { done(); @@ -52,4 +52,23 @@ describe('Code component', () => { expect(vm.$el.querySelector('.output')).toBeDefined(); }); }); + + describe('with string for cell.source', () => { + beforeEach(done => { + const cell = json.cells[0]; + cell.source = cell.source.join(''); + + vm = setupComponent(cell); + + setTimeout(() => { + done(); + }); + }); + + it('renders the same input as when cell.source is an array', () => { + const expected = "console.log('test')"; + + expect(vm.$el.querySelector('.input').innerText).toContain(expected); + }); + }); }); diff --git a/spec/lib/gitlab/prometheus/queries/validate_query_spec.rb b/spec/lib/gitlab/prometheus/queries/validate_query_spec.rb new file mode 100644 index 00000000000..9c0170718f4 --- /dev/null +++ b/spec/lib/gitlab/prometheus/queries/validate_query_spec.rb @@ -0,0 +1,62 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Gitlab::Prometheus::Queries::ValidateQuery do + include PrometheusHelpers + + let(:api_url) { 'https://prometheus.example.com' } + let(:client) { Gitlab::PrometheusClient.new(api_url) } + let(:query) { 'avg(metric)' } + + subject { described_class.new(client) } + + context 'valid query' do + before do + allow(client).to receive(:query).with(query) + end + + it 'passess query to prometheus' do + expect(subject.query(query)).to eq(valid: true) + + expect(client).to have_received(:query).with(query) + end + end + + context 'invalid query' do + let(:query) { 'invalid query' } + let(:error_message) { "invalid parameter 'query': 1:9: parse error: unexpected identifier \"query\"" } + + it 'returns invalid' do + Timecop.freeze do + stub_prometheus_query_error( + prometheus_query_with_time_url(query, Time.now), + error_message + ) + + expect(subject.query(query)).to eq(valid: false, error: error_message) + end + end + end + + context 'when exceptions occur' do + context 'Gitlab::HTTP::BlockedUrlError' do + let(:api_url) { 'http://192.168.1.1' } + + let(:message) do + "URL 'http://192.168.1.1/api/v1/query?query=avg%28metric%29&time=#{Time.now.to_f}'" \ + " is blocked: Requests to the local network are not allowed" + end + + before do + stub_application_setting(allow_local_requests_from_web_hooks_and_services: false) + end + + it 'catches exception and returns invalid' do + Timecop.freeze do + expect(subject.query(query)).to eq(valid: false, error: message) + end + end + end + end +end diff --git a/spec/models/project_services/prometheus_service_spec.rb b/spec/models/project_services/prometheus_service_spec.rb index 297411f7980..f663f0ab7cb 100644 --- a/spec/models/project_services/prometheus_service_spec.rb +++ b/spec/models/project_services/prometheus_service_spec.rb @@ -48,6 +48,18 @@ describe PrometheusService, :use_clean_rails_memory_store_caching do it 'does not validate presence of api_url' do expect(service).not_to validate_presence_of(:api_url) + expect(service.valid?).to eq(true) + end + + context 'local connections allowed' do + before do + stub_application_setting(allow_local_requests_from_web_hooks_and_services: true) + end + + it 'does not validate presence of api_url' do + expect(service).not_to validate_presence_of(:api_url) + expect(service.valid?).to eq(true) + end end end diff --git a/spec/services/projects/container_repository/destroy_service_spec.rb b/spec/services/projects/container_repository/destroy_service_spec.rb index cc8fd2716e1..753b7540d7f 100644 --- a/spec/services/projects/container_repository/destroy_service_spec.rb +++ b/spec/services/projects/container_repository/destroy_service_spec.rb @@ -36,6 +36,16 @@ describe Projects::ContainerRepository::DestroyService do expect(repository).to receive(:delete_tags!).and_call_original expect { described_class.new(project, user).execute(repository) }.to change { ContainerRepository.all.count }.by(-1) end + + context 'when destroy fails' do + it 'set delete_status' do + allow(repository).to receive(:destroy).and_return(false) + + subject.execute(repository) + + expect(repository).to be_delete_failed + end + end end end end diff --git a/spec/support/helpers/api_helpers.rb b/spec/support/helpers/api_helpers.rb index dc263d64bcc..b1e6078c4f2 100644 --- a/spec/support/helpers/api_helpers.rb +++ b/spec/support/helpers/api_helpers.rb @@ -51,11 +51,11 @@ module ApiHelpers expect(json_response).to be_an Array end - def expect_paginated_array_response(items) + def expect_paginated_array_response(*items) expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array - expect(json_response.map { |item| item['id'] }).to eq(Array(items)) + expect(json_response.map { |item| item['id'] }).to eq(items.flatten) end def expect_response_contain_exactly(*items) |