Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-04-07 15:09:34 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-04-07 15:09:34 +0300
commit903ccf7c93eb9490c76857bffe744249cc07de09 (patch)
tree603a3162e91999160e4efc74f351f9405f422d61 /spec
parent41cb558299b483b44b45351730ee4c0e9fe4ca2c (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/projects/import/jira_controller_spec.rb1
-rw-r--r--spec/controllers/projects/prometheus/metrics_controller_spec.rb106
-rw-r--r--spec/controllers/projects/registry/repositories_controller_spec.rb1
-rw-r--r--spec/fixtures/api/schemas/prometheus/metrics.json28
-rw-r--r--spec/fixtures/api/schemas/registry/repository.json6
-rw-r--r--spec/helpers/environments_helper_spec.rb23
-rw-r--r--spec/javascripts/notebook/cells/code_spec.js43
-rw-r--r--spec/lib/gitlab/prometheus/queries/validate_query_spec.rb62
-rw-r--r--spec/models/project_services/prometheus_service_spec.rb12
-rw-r--r--spec/services/projects/container_repository/destroy_service_spec.rb10
-rw-r--r--spec/support/helpers/api_helpers.rb4
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)