diff options
Diffstat (limited to 'spec/controllers/projects/alerting/notifications_controller_spec.rb')
-rw-r--r-- | spec/controllers/projects/alerting/notifications_controller_spec.rb | 109 |
1 files changed, 60 insertions, 49 deletions
diff --git a/spec/controllers/projects/alerting/notifications_controller_spec.rb b/spec/controllers/projects/alerting/notifications_controller_spec.rb index 9d26c2278b1..33fd73c762a 100644 --- a/spec/controllers/projects/alerting/notifications_controller_spec.rb +++ b/spec/controllers/projects/alerting/notifications_controller_spec.rb @@ -2,90 +2,101 @@ require 'spec_helper' -describe Projects::Alerting::NotificationsController do +RSpec.describe Projects::Alerting::NotificationsController do let_it_be(:project) { create(:project) } let_it_be(:environment) { create(:environment, project: project) } describe 'POST #create' do - let(:service_response) { ServiceResponse.success } - let(:notify_service) { instance_double(Projects::Alerting::NotifyService, execute: service_response) } - around do |example| ForgeryProtection.with_forgery_protection { example.run } end - before do - allow(Projects::Alerting::NotifyService).to receive(:new).and_return(notify_service) - end + shared_examples 'process alert payload' do |notify_service_class| + let(:service_response) { ServiceResponse.success } + let(:notify_service) { instance_double(notify_service_class, execute: service_response) } - def make_request(body = {}) - post :create, params: project_params, body: body.to_json, as: :json - end + before do + allow(notify_service_class).to receive(:new).and_return(notify_service) + end - context 'when notification service succeeds' do - let(:payload) do - { - title: 'Alert title', - hosts: 'https://gitlab.com' - } + def make_request + post :create, params: project_params, body: payload.to_json, as: :json end - let(:permitted_params) { ActionController::Parameters.new(payload).permit! } + context 'when notification service succeeds' do + let(:permitted_params) { ActionController::Parameters.new(payload).permit! } - it 'responds with ok' do - make_request + it 'responds with ok' do + make_request - expect(response).to have_gitlab_http_status(:ok) - end + expect(response).to have_gitlab_http_status(:ok) + end - it 'does not pass excluded parameters to the notify service' do - make_request(payload) + it 'does not pass excluded parameters to the notify service' do + make_request - expect(Projects::Alerting::NotifyService) - .to have_received(:new) - .with(project, nil, permitted_params) + expect(notify_service_class) + .to have_received(:new) + .with(project, nil, permitted_params) + end end - end - context 'when notification service fails' do - let(:service_response) { ServiceResponse.error(message: 'Unauthorized', http_status: :unauthorized) } + context 'when notification service fails' do + let(:service_response) { ServiceResponse.error(message: 'Unauthorized', http_status: :unauthorized) } - it 'responds with the service response' do - make_request + it 'responds with the service response' do + make_request - expect(response).to have_gitlab_http_status(:unauthorized) + expect(response).to have_gitlab_http_status(:unauthorized) + end end - end - context 'bearer token' do - context 'when set' do - it 'extracts bearer token' do - request.headers['HTTP_AUTHORIZATION'] = 'Bearer some token' + context 'bearer token' do + context 'when set' do + it 'extracts bearer token' do + request.headers['HTTP_AUTHORIZATION'] = 'Bearer some token' - expect(notify_service).to receive(:execute).with('some token') + expect(notify_service).to receive(:execute).with('some token') - make_request - end + make_request + end - it 'pass nil if cannot extract a non-bearer token' do - request.headers['HTTP_AUTHORIZATION'] = 'some token' + it 'pass nil if cannot extract a non-bearer token' do + request.headers['HTTP_AUTHORIZATION'] = 'some token' - expect(notify_service).to receive(:execute).with(nil) + expect(notify_service).to receive(:execute).with(nil) - make_request + make_request + end end - end - context 'when missing' do - it 'passes nil' do - expect(notify_service).to receive(:execute).with(nil) + context 'when missing' do + it 'passes nil' do + expect(notify_service).to receive(:execute).with(nil) - make_request + make_request + end end end end + + context 'generic alert payload' do + it_behaves_like 'process alert payload', Projects::Alerting::NotifyService do + let(:payload) { { title: 'Alert title' } } + end + end + + context 'Prometheus alert payload' do + include PrometheusHelpers + + it_behaves_like 'process alert payload', Projects::Prometheus::Alerts::NotifyService do + let(:payload) { prometheus_alert_payload } + end + end end + private + def project_params(opts = {}) opts.reverse_merge(namespace_id: project.namespace, project_id: project) end |