Streamline controller specs
This commit is contained in:
parent
e1a167ee23
commit
1427ad4f5c
2 changed files with 87 additions and 98 deletions
|
@ -25,10 +25,8 @@ class Projects::Environments::PrometheusApiController < Projects::ApplicationCon
|
|||
if result[:status] == :success
|
||||
render status: result[:http_status], json: result[:body]
|
||||
else
|
||||
render status: result[:http_status] || :bad_request, json: {
|
||||
status: result[:status],
|
||||
message: result[:message]
|
||||
}
|
||||
render status: result[:http_status] || :bad_request,
|
||||
json: { status: result[:status], message: result[:message] }
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -14,121 +14,112 @@ describe Projects::Environments::PrometheusApiController do
|
|||
|
||||
describe 'GET #proxy' do
|
||||
let(:prometheus_proxy_service) { instance_double(Prometheus::ProxyService) }
|
||||
let(:prometheus_response) { { status: :success, body: response_body } }
|
||||
let(:json_response_body) { JSON.parse(response_body) }
|
||||
|
||||
let(:response_body) do
|
||||
"{\"status\":\"success\",\"data\":{\"resultType\":\"scalar\",\"result\":[1553864609.117,\"1\"]}}"
|
||||
end
|
||||
|
||||
before do
|
||||
allow(Prometheus::ProxyService).to receive(:new)
|
||||
.with(environment, 'GET', 'query', anything)
|
||||
.and_return(prometheus_proxy_service)
|
||||
|
||||
allow(prometheus_proxy_service).to receive(:execute)
|
||||
.and_return(prometheus_response)
|
||||
end
|
||||
|
||||
it 'returns prometheus response' do
|
||||
get :proxy, params: environment_params
|
||||
|
||||
expect(response).to have_gitlab_http_status(:ok)
|
||||
expect(json_response).to eq(json_response_body)
|
||||
end
|
||||
|
||||
it 'filters params' do
|
||||
get :proxy, params: environment_params({ extra_param: 'dangerous value' })
|
||||
|
||||
expect(Prometheus::ProxyService).to have_received(:new)
|
||||
.with(environment, 'GET', 'query', ActionController::Parameters.new({ 'query' => '1' }).permit!)
|
||||
end
|
||||
|
||||
context 'Prometheus::ProxyService returns nil' do
|
||||
context 'with valid requests' do
|
||||
before do
|
||||
allow(Prometheus::ProxyService).to receive(:new)
|
||||
.with(environment, 'GET', 'query', anything)
|
||||
.and_return(prometheus_proxy_service)
|
||||
|
||||
allow(prometheus_proxy_service).to receive(:execute)
|
||||
.and_return(nil)
|
||||
.and_return(service_result)
|
||||
end
|
||||
|
||||
it 'returns 202 accepted' do
|
||||
get :proxy, params: environment_params
|
||||
context 'with success result' do
|
||||
let(:service_result) { { status: :success, body: prometheus_body } }
|
||||
let(:prometheus_body) { '{"status":"success"}' }
|
||||
let(:prometheus_json_body) { JSON.parse(prometheus_body) }
|
||||
|
||||
expect(json_response['status']).to eq('processing')
|
||||
expect(json_response['message']).to eq('Not ready yet. Try again later.')
|
||||
expect(response).to have_gitlab_http_status(:accepted)
|
||||
end
|
||||
end
|
||||
|
||||
context 'Prometheus::ProxyService returns status success' do
|
||||
let(:service_response) { { http_status: 404, status: :success, body: '{"body": "value"}' } }
|
||||
|
||||
before do
|
||||
allow(prometheus_proxy_service).to receive(:execute)
|
||||
.and_return(service_response)
|
||||
end
|
||||
|
||||
it 'returns body' do
|
||||
get :proxy, params: environment_params
|
||||
|
||||
expect(response).to have_gitlab_http_status(:not_found)
|
||||
expect(json_response['body']).to eq('value')
|
||||
end
|
||||
end
|
||||
|
||||
context 'Prometheus::ProxyService returns status error' do
|
||||
before do
|
||||
allow(prometheus_proxy_service).to receive(:execute)
|
||||
.and_return(service_response)
|
||||
end
|
||||
|
||||
context 'with http_status' do
|
||||
let(:service_response) do
|
||||
{ http_status: :service_unavailable, status: :error, message: 'error message' }
|
||||
end
|
||||
|
||||
it 'sets the http response status code' do
|
||||
it 'returns prometheus response' do
|
||||
get :proxy, params: environment_params
|
||||
|
||||
expect(response).to have_gitlab_http_status(:service_unavailable)
|
||||
expect(json_response['status']).to eq('error')
|
||||
expect(json_response['message']).to eq('error message')
|
||||
expect(response).to have_gitlab_http_status(:ok)
|
||||
expect(json_response).to eq(prometheus_json_body)
|
||||
end
|
||||
|
||||
it 'filters params' do
|
||||
get :proxy, params: environment_params({ extra_param: 'dangerous value' })
|
||||
|
||||
expect(Prometheus::ProxyService).to have_received(:new)
|
||||
.with(environment, 'GET', 'query', ActionController::Parameters.new({ 'query' => '1' }).permit!)
|
||||
end
|
||||
end
|
||||
|
||||
context 'without http_status' do
|
||||
let(:service_response) { { status: :error, message: 'error message' } }
|
||||
context 'with nil result' do
|
||||
let(:service_result) { nil }
|
||||
|
||||
it 'returns message' do
|
||||
it 'returns 202 accepted' do
|
||||
get :proxy, params: environment_params
|
||||
|
||||
expect(response).to have_gitlab_http_status(:bad_request)
|
||||
expect(json_response['status']).to eq('error')
|
||||
expect(json_response['message']).to eq('error message')
|
||||
expect(json_response['status']).to eq('processing')
|
||||
expect(json_response['message']).to eq('Not ready yet. Try again later.')
|
||||
expect(response).to have_gitlab_http_status(:accepted)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with 404 result' do
|
||||
let(:service_result) { { http_status: 404, status: :success, body: '{"body": "value"}' } }
|
||||
|
||||
it 'returns body' do
|
||||
get :proxy, params: environment_params
|
||||
|
||||
expect(response).to have_gitlab_http_status(:not_found)
|
||||
expect(json_response['body']).to eq('value')
|
||||
end
|
||||
end
|
||||
|
||||
context 'with error result' do
|
||||
context 'with http_status' do
|
||||
let(:service_result) do
|
||||
{ http_status: :service_unavailable, status: :error, message: 'error message' }
|
||||
end
|
||||
|
||||
it 'sets the http response status code' do
|
||||
get :proxy, params: environment_params
|
||||
|
||||
expect(response).to have_gitlab_http_status(:service_unavailable)
|
||||
expect(json_response['status']).to eq('error')
|
||||
expect(json_response['message']).to eq('error message')
|
||||
end
|
||||
end
|
||||
|
||||
context 'without http_status' do
|
||||
let(:service_result) { { status: :error, message: 'error message' } }
|
||||
|
||||
it 'returns bad_request' do
|
||||
get :proxy, params: environment_params
|
||||
|
||||
expect(response).to have_gitlab_http_status(:bad_request)
|
||||
expect(json_response['status']).to eq('error')
|
||||
expect(json_response['message']).to eq('error message')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'with anonymous user' do
|
||||
before do
|
||||
sign_out(user)
|
||||
context 'with inappropriate requests' do
|
||||
context 'with anonymous user' do
|
||||
before do
|
||||
sign_out(user)
|
||||
end
|
||||
|
||||
it 'redirects to signin page' do
|
||||
get :proxy, params: environment_params
|
||||
|
||||
expect(response).to redirect_to(new_user_session_path)
|
||||
end
|
||||
end
|
||||
|
||||
it 'redirects to signin page' do
|
||||
get :proxy, params: environment_params
|
||||
context 'without correct permissions' do
|
||||
before do
|
||||
project.team.truncate
|
||||
end
|
||||
|
||||
expect(response).to redirect_to(new_user_session_path)
|
||||
end
|
||||
end
|
||||
it 'returns 404' do
|
||||
get :proxy, params: environment_params
|
||||
|
||||
context 'without correct permissions' do
|
||||
before do
|
||||
project.team.truncate
|
||||
end
|
||||
|
||||
it 'returns 404' do
|
||||
get :proxy, params: environment_params
|
||||
|
||||
expect(response).to have_gitlab_http_status(:not_found)
|
||||
expect(response).to have_gitlab_http_status(:not_found)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -142,6 +133,6 @@ describe Projects::Environments::PrometheusApiController do
|
|||
project_id: project,
|
||||
proxy_path: 'query',
|
||||
query: '1'
|
||||
}.merge(params)
|
||||
}.reverse_merge(params)
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue