diff options
Diffstat (limited to 'spec/controllers')
-rw-r--r-- | spec/controllers/projects/grafana_api_controller_spec.rb | 97 | ||||
-rw-r--r-- | spec/controllers/projects/merge_requests/diffs_controller_spec.rb | 130 |
2 files changed, 227 insertions, 0 deletions
diff --git a/spec/controllers/projects/grafana_api_controller_spec.rb b/spec/controllers/projects/grafana_api_controller_spec.rb new file mode 100644 index 00000000000..352a364295b --- /dev/null +++ b/spec/controllers/projects/grafana_api_controller_spec.rb @@ -0,0 +1,97 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe Projects::GrafanaApiController do + let_it_be(:project) { create(:project) } + let_it_be(:user) { create(:user) } + + before do + project.add_reporter(user) + sign_in(user) + end + + describe 'GET #proxy' do + let(:proxy_service) { instance_double(Grafana::ProxyService) } + let(:params) do + { + namespace_id: project.namespace.full_path, + project_id: project.name, + proxy_path: 'api/v1/query_range', + datasource_id: '1', + query: 'rate(relevant_metric)', + start: '1570441248', + end: '1570444848', + step: '900' + } + end + + before do + allow(Grafana::ProxyService).to receive(:new).and_return(proxy_service) + allow(proxy_service).to receive(:execute).and_return(service_result) + end + + shared_examples_for 'error response' do |http_status| + it "returns #{http_status}" do + get :proxy, params: params + + expect(response).to have_gitlab_http_status(http_status) + expect(json_response['status']).to eq('error') + expect(json_response['message']).to eq('error message') + end + end + + context 'with a successful result' do + let(:service_result) { { status: :success, body: '{}' } } + + it 'returns a grafana datasource response' do + get :proxy, params: params + + expect(Grafana::ProxyService) + .to have_received(:new) + .with(project, '1', 'api/v1/query_range', + params.slice(:query, :start, :end, :step).stringify_keys) + + expect(response).to have_gitlab_http_status(:ok) + expect(json_response).to eq({}) + end + end + + context 'when the request is still unavailable' do + let(:service_result) { nil } + + it 'returns 204 no content' do + get :proxy, params: params + + expect(response).to have_gitlab_http_status(:no_content) + expect(json_response['status']).to eq('processing') + expect(json_response['message']).to eq('Not ready yet. Try again later.') + end + end + + context 'when an error has occurred' do + context 'with an error accessing grafana' do + let(:service_result) do + { + http_status: :service_unavailable, + status: :error, + message: 'error message' + } + end + + it_behaves_like 'error response', :service_unavailable + end + + context 'with a processing error' do + let(:service_result) do + { + status: :error, + message: 'error message' + } + end + + it_behaves_like 'error response', :bad_request + end + end + end +end diff --git a/spec/controllers/projects/merge_requests/diffs_controller_spec.rb b/spec/controllers/projects/merge_requests/diffs_controller_spec.rb index 302de3246c2..e677e836145 100644 --- a/spec/controllers/projects/merge_requests/diffs_controller_spec.rb +++ b/spec/controllers/projects/merge_requests/diffs_controller_spec.rb @@ -100,6 +100,136 @@ describe Projects::MergeRequests::DiffsController do it_behaves_like 'persisted preferred diff view cookie' end + describe 'GET diffs_metadata' do + def go(extra_params = {}) + params = { + namespace_id: project.namespace.to_param, + project_id: project, + id: merge_request.iid, + format: 'json' + } + + get :diffs_metadata, params: params.merge(extra_params) + end + + context 'when not authorized' do + let(:another_user) { create(:user) } + + before do + sign_in(another_user) + end + + it 'returns 404 when not a member' do + go + + expect(response).to have_gitlab_http_status(404) + end + + it 'returns 404 when visibility level is not enough' do + project.add_guest(another_user) + + go + + expect(response).to have_gitlab_http_status(404) + end + end + + context 'when diffable does not exists' do + it 'returns 404' do + go(diff_id: 9999) + + expect(response).to have_gitlab_http_status(404) + end + end + + context 'with valid diff_id' do + it 'returns success' do + go(diff_id: merge_request.merge_request_diff.id) + + expect(response).to have_gitlab_http_status(200) + end + + it 'serializes diffs metadata with expected arguments' do + expected_options = { + environment: nil, + merge_request: merge_request, + merge_request_diff: merge_request.merge_request_diff, + merge_request_diffs: merge_request.merge_request_diffs, + start_version: nil, + start_sha: nil, + commit: nil, + latest_diff: true + } + + expect_next_instance_of(DiffsMetadataSerializer) do |instance| + expect(instance).to receive(:represent) + .with(an_instance_of(Gitlab::Diff::FileCollection::MergeRequestDiff), expected_options) + .and_call_original + end + + go(diff_id: merge_request.merge_request_diff.id) + end + end + + context 'with MR regular diff params' do + it 'returns success' do + go + + expect(response).to have_gitlab_http_status(200) + end + + it 'serializes diffs metadata with expected arguments' do + expected_options = { + environment: nil, + merge_request: merge_request, + merge_request_diff: merge_request.merge_request_diff, + merge_request_diffs: merge_request.merge_request_diffs, + start_version: nil, + start_sha: nil, + commit: nil, + latest_diff: true + } + + expect_next_instance_of(DiffsMetadataSerializer) do |instance| + expect(instance).to receive(:represent) + .with(an_instance_of(Gitlab::Diff::FileCollection::MergeRequestDiff), expected_options) + .and_call_original + end + + go + end + end + + context 'with commit param' do + it 'returns success' do + go(commit_id: merge_request.diff_head_sha) + + expect(response).to have_gitlab_http_status(200) + end + + it 'serializes diffs metadata with expected arguments' do + expected_options = { + environment: nil, + merge_request: merge_request, + merge_request_diff: nil, + merge_request_diffs: merge_request.merge_request_diffs, + start_version: nil, + start_sha: nil, + commit: merge_request.diff_head_commit, + latest_diff: nil + } + + expect_next_instance_of(DiffsMetadataSerializer) do |instance| + expect(instance).to receive(:represent) + .with(an_instance_of(Gitlab::Diff::FileCollection::Commit), expected_options) + .and_call_original + end + + go(commit_id: merge_request.diff_head_sha) + end + end + end + describe 'GET diff_for_path' do def diff_for_path(extra_params = {}) params = { |