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
diff options
context:
space:
mode:
Diffstat (limited to 'spec/controllers/projects/alerting/notifications_controller_spec.rb')
-rw-r--r--spec/controllers/projects/alerting/notifications_controller_spec.rb109
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