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-02-16 00:08:49 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-02-16 00:08:49 +0300
commitcf1d4237a4f226ba2deed26240544da0675a41e5 (patch)
tree926a71b9279659bc52db0187b463603934718bf2 /spec
parent0ac82f99553ce12009970a14c0afc02d1f6515bb (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/projects/settings/operations_controller_spec.rb70
-rw-r--r--spec/features/projects/services/user_activates_alerts_spec.rb81
-rw-r--r--spec/features/projects/settings/operations_settings_spec.rb50
-rw-r--r--spec/frontend/alerts_service_settings/components/__snapshots__/alerts_service_form_spec.js.snap9
-rw-r--r--spec/frontend/alerts_service_settings/components/alerts_service_form_spec.js168
-rw-r--r--spec/helpers/projects_helper_spec.rb31
-rw-r--r--spec/javascripts/ide/lib/editor_spec.js1
-rw-r--r--spec/lib/gitlab/usage_data_spec.rb8
-rw-r--r--spec/models/error_tracking/project_error_tracking_setting_spec.rb13
-rw-r--r--spec/models/project_spec.rb16
-rw-r--r--spec/requests/api/error_tracking_spec.rb93
-rw-r--r--spec/services/projects/alerting/notify_service_spec.rb52
-rw-r--r--spec/support/shared_contexts/services_shared_context.rb3
13 files changed, 548 insertions, 47 deletions
diff --git a/spec/controllers/projects/settings/operations_controller_spec.rb b/spec/controllers/projects/settings/operations_controller_spec.rb
index 0a2cc6f6aa5..62b906e8507 100644
--- a/spec/controllers/projects/settings/operations_controller_spec.rb
+++ b/spec/controllers/projects/settings/operations_controller_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
describe Projects::Settings::OperationsController do
let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project) }
+ let_it_be(:project, reload: true) { create(:project) }
before do
sign_in(user)
@@ -121,6 +121,74 @@ describe Projects::Settings::OperationsController do
end
end
+ context 'incident management' do
+ describe 'GET #show' do
+ context 'with existing setting' do
+ let!(:incident_management_setting) do
+ create(:project_incident_management_setting, project: project)
+ end
+
+ it 'loads existing setting' do
+ get :show, params: project_params(project)
+
+ expect(controller.helpers.project_incident_management_setting)
+ .to eq(incident_management_setting)
+ end
+ end
+
+ context 'without an existing setting' do
+ it 'builds a new setting' do
+ get :show, params: project_params(project)
+
+ expect(controller.helpers.project_incident_management_setting).to be_new_record
+ end
+ end
+ end
+
+ describe 'PATCH #update' do
+ let(:params) do
+ {
+ incident_management_setting_attributes: {
+ create_issue: 'false',
+ send_email: 'false',
+ issue_template_key: 'some-other-template'
+ }
+ }
+ end
+
+ it_behaves_like 'PATCHable'
+
+ context 'updating each incident management setting' do
+ let(:project) { create(:project) }
+ let(:new_incident_management_settings) { {} }
+
+ before do
+ project.add_maintainer(user)
+ end
+
+ shared_examples 'a gitlab tracking event' do |params, event_key|
+ it "creates a gitlab tracking event #{event_key}" do
+ new_incident_management_settings = params
+
+ expect(Gitlab::Tracking).to receive(:event)
+ .with('IncidentManagement::Settings', event_key, kind_of(Hash))
+
+ patch :update, params: project_params(project, incident_management_setting_attributes: new_incident_management_settings)
+
+ project.reload
+ end
+ end
+
+ it_behaves_like 'a gitlab tracking event', { create_issue: '1' }, 'enabled_issue_auto_creation_on_alerts'
+ it_behaves_like 'a gitlab tracking event', { create_issue: '0' }, 'disabled_issue_auto_creation_on_alerts'
+ it_behaves_like 'a gitlab tracking event', { issue_template_key: 'template' }, 'enabled_issue_template_on_alerts'
+ it_behaves_like 'a gitlab tracking event', { issue_template_key: nil }, 'disabled_issue_template_on_alerts'
+ it_behaves_like 'a gitlab tracking event', { send_email: '1' }, 'enabled_sending_emails'
+ it_behaves_like 'a gitlab tracking event', { send_email: '0' }, 'disabled_sending_emails'
+ end
+ end
+ end
+
context 'error tracking' do
describe 'GET #show' do
context 'with existing setting' do
diff --git a/spec/features/projects/services/user_activates_alerts_spec.rb b/spec/features/projects/services/user_activates_alerts_spec.rb
new file mode 100644
index 00000000000..47de7fab859
--- /dev/null
+++ b/spec/features/projects/services/user_activates_alerts_spec.rb
@@ -0,0 +1,81 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+describe 'User activates Alerts', :js do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user) }
+
+ let(:service_name) { 'alerts' }
+ let(:service_title) { 'Alerts endpoint' }
+
+ before do
+ sign_in(user)
+ project.add_maintainer(user)
+ end
+
+ context 'when service is deactivated' do
+ it 'activates service' do
+ visit_project_services
+
+ expect(page).to have_link(service_title)
+ click_link(service_title)
+
+ expect(page).not_to have_active_service
+
+ click_activate_service
+ wait_for_requests
+
+ expect(page).to have_active_service
+ end
+ end
+
+ context 'when service is activated' do
+ before do
+ visit_alerts_service
+ click_activate_service
+ end
+
+ it 're-generates key' do
+ expect(reset_key.value).to be_blank
+
+ click_reset_key
+ click_confirm_reset_key
+ wait_for_requests
+
+ expect(reset_key.value).to be_present
+ end
+ end
+
+ private
+
+ def visit_project_services
+ visit(project_settings_integrations_path(project))
+ end
+
+ def visit_alerts_service
+ visit(edit_project_service_path(project, service_name))
+ end
+
+ def click_activate_service
+ find('#activated').click
+ end
+
+ def click_reset_key
+ click_button('Reset key')
+ end
+
+ def click_confirm_reset_key
+ within '.modal-content' do
+ click_reset_key
+ end
+ end
+
+ def reset_key
+ find_field('Authorization key')
+ end
+
+ def have_active_service
+ have_selector('.js-service-active-status[data-value="true"]')
+ end
+end
diff --git a/spec/features/projects/settings/operations_settings_spec.rb b/spec/features/projects/settings/operations_settings_spec.rb
index 72e2865dd6a..0181ceed5b9 100644
--- a/spec/features/projects/settings/operations_settings_spec.rb
+++ b/spec/features/projects/settings/operations_settings_spec.rb
@@ -4,7 +4,7 @@ require 'spec_helper'
describe 'Projects > Settings > For a forked project', :js do
let(:user) { create(:user) }
- let(:project) { create(:project, :repository) }
+ let(:project) { create(:project, :repository, create_templates: :issue) }
let(:role) { :maintainer }
before do
@@ -22,6 +22,54 @@ describe 'Projects > Settings > For a forked project', :js do
end
describe 'Settings > Operations' do
+ describe 'Incidents' do
+ let(:create_issue) { 'Create an issue. Issues are created for each alert triggered.' }
+ let(:send_email) { 'Send a separate email notification to Developers.' }
+
+ before do
+ create(:project_incident_management_setting, send_email: true, project: project)
+ visit project_settings_operations_path(project)
+
+ wait_for_requests
+ click_expand_incident_management_button
+ end
+
+ it 'renders form for incident management' do
+ expect(page).to have_selector('h4', text: 'Incidents')
+ end
+
+ it 'sets correct default values' do
+ expect(find_field(create_issue)).not_to be_checked
+ expect(find_field(send_email)).to be_checked
+ end
+
+ it 'updates form values' do
+ check(create_issue)
+ template_select = find_field('Issue template')
+ template_select.find(:xpath, 'option[2]').select_option
+ uncheck(send_email)
+
+ save_form
+ click_expand_incident_management_button
+
+ expect(find_field(create_issue)).to be_checked
+ expect(page).to have_select('Issue template', selected: 'bug')
+ expect(find_field(send_email)).not_to be_checked
+ end
+
+ def click_expand_incident_management_button
+ within '.js-incident-management-settings' do
+ click_button('Expand')
+ end
+ end
+
+ def save_form
+ page.within "#edit_project_#{project.id}" do
+ click_on 'Save changes'
+ end
+ end
+ end
+
context 'error tracking settings form' do
let(:sentry_list_projects_url) { 'http://sentry.example.com/api/0/projects/' }
diff --git a/spec/frontend/alerts_service_settings/components/__snapshots__/alerts_service_form_spec.js.snap b/spec/frontend/alerts_service_settings/components/__snapshots__/alerts_service_form_spec.js.snap
new file mode 100644
index 00000000000..36ec0badade
--- /dev/null
+++ b/spec/frontend/alerts_service_settings/components/__snapshots__/alerts_service_form_spec.js.snap
@@ -0,0 +1,9 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`AlertsServiceForm with default values renders "authorization-key" input 1`] = `"<gl-form-input-stub id=\\"authorization-key\\" readonly=\\"true\\" value=\\"abcedfg123\\"></gl-form-input-stub>"`;
+
+exports[`AlertsServiceForm with default values renders "url" input 1`] = `"<gl-form-input-stub id=\\"url\\" readonly=\\"true\\" value=\\"https://gitlab.com/endpoint-url\\"></gl-form-input-stub>"`;
+
+exports[`AlertsServiceForm with default values renders toggle button 1`] = `"<toggle-button-stub id=\\"activated\\"></toggle-button-stub>"`;
+
+exports[`AlertsServiceForm with default values shows description and "Learn More" link 1`] = `"Each alert source must be authorized using the following URL and authorization key. <a href=\\"https://docs.gitlab.com/ee/user/project/integrations/generic_alerts.md\\" target=\\"_blank\\" rel=\\"noopener noreferrer\\">Learn more</a> about configuring this endpoint to receive alerts."`;
diff --git a/spec/frontend/alerts_service_settings/components/alerts_service_form_spec.js b/spec/frontend/alerts_service_settings/components/alerts_service_form_spec.js
new file mode 100644
index 00000000000..b7a008c78d0
--- /dev/null
+++ b/spec/frontend/alerts_service_settings/components/alerts_service_form_spec.js
@@ -0,0 +1,168 @@
+import axios from 'axios';
+import MockAdapter from 'axios-mock-adapter';
+import { shallowMount } from '@vue/test-utils';
+import { GlModal } from '@gitlab/ui';
+import AlertsServiceForm from '~/alerts_service_settings/components/alerts_service_form.vue';
+import ToggleButton from '~/vue_shared/components/toggle_button.vue';
+import createFlash from '~/flash';
+
+jest.mock('~/flash');
+
+const defaultProps = {
+ initialAuthorizationKey: 'abcedfg123',
+ formPath: 'http://invalid',
+ url: 'https://gitlab.com/endpoint-url',
+ learnMoreUrl: 'https://docs.gitlab.com/ee/user/project/integrations/generic_alerts.md',
+ initialActivated: false,
+};
+
+describe('AlertsServiceForm', () => {
+ let wrapper;
+ let mockAxios;
+
+ const createComponent = (props = defaultProps, { methods } = {}) => {
+ wrapper = shallowMount(AlertsServiceForm, {
+ propsData: {
+ ...defaultProps,
+ ...props,
+ },
+ methods,
+ });
+ };
+
+ const findUrl = () => wrapper.find('#url');
+ const findAuthorizationKey = () => wrapper.find('#authorization-key');
+ const findDescription = () => wrapper.find('p');
+ const findActiveStatusIcon = val =>
+ document.querySelector(`.js-service-active-status[data-value=${val.toString()}]`);
+
+ beforeEach(() => {
+ mockAxios = new MockAdapter(axios);
+ setFixtures(`
+ <div>
+ <span class="js-service-active-status fa fa-circle" data-value="true"></span>
+ <span class="js-service-active-status fa fa-power-off" data-value="false"></span>
+ </div>`);
+ });
+
+ afterEach(() => {
+ wrapper.destroy();
+ mockAxios.restore();
+ });
+
+ describe('with default values', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders "url" input', () => {
+ expect(findUrl().html()).toMatchSnapshot();
+ });
+
+ it('renders "authorization-key" input', () => {
+ expect(findAuthorizationKey().html()).toMatchSnapshot();
+ });
+
+ it('renders toggle button', () => {
+ expect(wrapper.find(ToggleButton).html()).toMatchSnapshot();
+ });
+
+ it('shows description and "Learn More" link', () => {
+ expect(findDescription().element.innerHTML).toMatchSnapshot();
+ });
+ });
+
+ describe('reset key', () => {
+ it('triggers resetKey method', () => {
+ const resetKey = jest.fn();
+ const methods = { resetKey };
+ createComponent(defaultProps, { methods });
+
+ wrapper.find(GlModal).vm.$emit('ok');
+
+ expect(resetKey).toHaveBeenCalled();
+ });
+
+ it('updates the authorization key on success', () => {
+ const formPath = 'some/path';
+ mockAxios.onPut(formPath, { service: { token: '' } }).replyOnce(200, { token: 'newToken' });
+
+ createComponent({ formPath });
+
+ return wrapper.vm.resetKey().then(() => {
+ expect(findAuthorizationKey().attributes('value')).toBe('newToken');
+ });
+ });
+
+ it('shows flash message on error', () => {
+ const formPath = 'some/path';
+ mockAxios.onPut(formPath).replyOnce(404);
+
+ createComponent({ formPath });
+
+ return wrapper.vm.resetKey().then(() => {
+ expect(findAuthorizationKey().attributes('value')).toBe(
+ defaultProps.initialAuthorizationKey,
+ );
+ expect(createFlash).toHaveBeenCalled();
+ });
+ });
+ });
+
+ describe('activate toggle', () => {
+ it('triggers toggleActivated method', () => {
+ const toggleActivated = jest.fn();
+ const methods = { toggleActivated };
+ createComponent(defaultProps, { methods });
+
+ wrapper.find(ToggleButton).vm.$emit('change', true);
+
+ expect(toggleActivated).toHaveBeenCalled();
+ });
+
+ describe('successfully completes', () => {
+ describe.each`
+ initialActivated | value
+ ${false} | ${true}
+ ${true} | ${false}
+ `(
+ 'when initialActivated=$initialActivated and value=$value',
+ ({ initialActivated, value }) => {
+ beforeEach(() => {
+ const formPath = 'some/path';
+ mockAxios
+ .onPut(formPath, { service: { active: value } })
+ .replyOnce(200, { active: value });
+ createComponent({ initialActivated, formPath });
+
+ return wrapper.vm.toggleActivated(value);
+ });
+
+ it(`updates toggle button value to ${value}`, () => {
+ expect(wrapper.find(ToggleButton).props('value')).toBe(value);
+ });
+
+ it('updates visible status icons', () => {
+ expect(findActiveStatusIcon(!value)).toHaveClass('d-none');
+ expect(findActiveStatusIcon(value)).not.toHaveClass('d-none');
+ });
+ },
+ );
+ });
+
+ describe('error is encountered', () => {
+ beforeEach(() => {
+ const formPath = 'some/path';
+ mockAxios.onPut(formPath).replyOnce(500);
+ });
+
+ it('restores previous value', () => {
+ createComponent({ initialActivated: false });
+
+ return wrapper.vm.toggleActivated(true).then(() => {
+ expect(wrapper.find(ToggleButton).props('value')).toBe(false);
+ });
+ });
+ });
+ });
+});
diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb
index d61289dabb6..37bc2b382cb 100644
--- a/spec/helpers/projects_helper_spec.rb
+++ b/spec/helpers/projects_helper_spec.rb
@@ -5,6 +5,37 @@ require 'spec_helper'
describe ProjectsHelper do
include ProjectForksHelper
+ describe '#project_incident_management_setting' do
+ let(:project) { create(:project) }
+
+ before do
+ helper.instance_variable_set(:@project, project)
+ end
+
+ context 'when incident_management_setting exists' do
+ let(:project_incident_management_setting) do
+ create(:project_incident_management_setting, project: project)
+ end
+
+ it 'return project_incident_management_setting' do
+ expect(helper.project_incident_management_setting).to(
+ eq(project_incident_management_setting)
+ )
+ end
+ end
+
+ context 'when incident_management_setting does not exist' do
+ it 'builds incident_management_setting' do
+ setting = helper.project_incident_management_setting
+
+ expect(setting).not_to be_persisted
+ expect(setting.send_email).to be_falsey
+ expect(setting.create_issue).to be_truthy
+ expect(setting.issue_template_key).to be_nil
+ end
+ end
+ end
+
describe '#error_tracking_setting_project_json' do
let(:project) { create(:project) }
diff --git a/spec/javascripts/ide/lib/editor_spec.js b/spec/javascripts/ide/lib/editor_spec.js
index f1973f7798f..556bd45d3a5 100644
--- a/spec/javascripts/ide/lib/editor_spec.js
+++ b/spec/javascripts/ide/lib/editor_spec.js
@@ -74,6 +74,7 @@ describe('Multi-file editor library', () => {
renderSideBySide: true,
renderLineHighlight: 'all',
hideCursorInOverviewRuler: false,
+ theme: 'vs white',
});
});
});
diff --git a/spec/lib/gitlab/usage_data_spec.rb b/spec/lib/gitlab/usage_data_spec.rb
index 9a49d334f52..3f7e412e80b 100644
--- a/spec/lib/gitlab/usage_data_spec.rb
+++ b/spec/lib/gitlab/usage_data_spec.rb
@@ -22,6 +22,10 @@ describe Gitlab::UsageData do
create(:service, project: projects[2], type: 'CustomIssueTrackerService', active: true)
create(:project_error_tracking_setting, project: projects[0])
create(:project_error_tracking_setting, project: projects[1], enabled: false)
+ create(:alerts_service, project: projects[0])
+ create(:alerts_service, :inactive, project: projects[1])
+ create_list(:issue, 2, project: projects[0], author: User.alert_bot)
+ create_list(:issue, 2, project: projects[1], author: User.alert_bot)
create_list(:issue, 4, project: projects[0])
create(:zoom_meeting, project: projects[0], issue: projects[0].issues[0], issue_status: :added)
create_list(:zoom_meeting, 2, project: projects[0], issue: projects[0].issues[1], issue_status: :removed)
@@ -159,6 +163,7 @@ describe Gitlab::UsageData do
issues_with_associated_zoom_link
issues_using_zoom_quick_actions
issues_with_embedded_grafana_charts_approx
+ incident_issues
keys
label_lists
labels
@@ -183,6 +188,7 @@ describe Gitlab::UsageData do
projects_prometheus_active
projects_with_repositories_enabled
projects_with_error_tracking_enabled
+ projects_with_alerts_service_enabled
pages_domains
protected_branches
releases
@@ -220,10 +226,12 @@ describe Gitlab::UsageData do
expect(count_data[:projects_mattermost_active]).to eq(0)
expect(count_data[:projects_with_repositories_enabled]).to eq(3)
expect(count_data[:projects_with_error_tracking_enabled]).to eq(1)
+ expect(count_data[:projects_with_alerts_service_enabled]).to eq(1)
expect(count_data[:issues_created_from_gitlab_error_tracking_ui]).to eq(1)
expect(count_data[:issues_with_associated_zoom_link]).to eq(2)
expect(count_data[:issues_using_zoom_quick_actions]).to eq(3)
expect(count_data[:issues_with_embedded_grafana_charts_approx]).to eq(2)
+ expect(count_data[:incident_issues]).to eq(4)
expect(count_data[:clusters_enabled]).to eq(4)
expect(count_data[:project_clusters_enabled]).to eq(3)
diff --git a/spec/models/error_tracking/project_error_tracking_setting_spec.rb b/spec/models/error_tracking/project_error_tracking_setting_spec.rb
index 41630c71f21..e81480ab88f 100644
--- a/spec/models/error_tracking/project_error_tracking_setting_spec.rb
+++ b/spec/models/error_tracking/project_error_tracking_setting_spec.rb
@@ -19,6 +19,19 @@ describe ErrorTracking::ProjectErrorTrackingSetting do
it { is_expected.to allow_value("http://gitlab.com/api/0/projects/project1/something").for(:api_url) }
it { is_expected.not_to allow_values("http://gitlab.com/api/0/projects/project1/something€").for(:api_url) }
+ it 'disallows non-booleans in enabled column' do
+ is_expected.not_to allow_value(
+ nil
+ ).for(:enabled)
+ end
+
+ it 'allows booleans in enabled column' do
+ is_expected.to allow_value(
+ true,
+ false
+ ).for(:enabled)
+ end
+
it 'rejects invalid api_urls' do
is_expected.not_to allow_values(
"https://replaceme.com/'><script>alert(document.cookie)</script>", # unsafe
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index b3d8ac83075..dc055244af7 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -5607,7 +5607,21 @@ describe Project do
subject { project.alerts_service_activated? }
- it { is_expected.to be_falsey }
+ context 'when project has an activated alerts service' do
+ before do
+ create(:alerts_service, project: project)
+ end
+
+ it { is_expected.to be_truthy }
+ end
+
+ context 'when project has an inactive alerts service' do
+ before do
+ create(:alerts_service, :inactive, project: project)
+ end
+
+ it { is_expected.to be_falsey }
+ end
end
describe '#self_monitoring?' do
diff --git a/spec/requests/api/error_tracking_spec.rb b/spec/requests/api/error_tracking_spec.rb
index 059744898b8..120248bdbc6 100644
--- a/spec/requests/api/error_tracking_spec.rb
+++ b/spec/requests/api/error_tracking_spec.rb
@@ -3,13 +3,13 @@
require 'spec_helper'
describe API::ErrorTracking do
- let(:user) { create(:user) }
+ let_it_be(:user) { create(:user) }
let(:setting) { create(:project_error_tracking_setting) }
let(:project) { setting.project }
shared_examples 'returns project settings' do
it 'returns correct project settings' do
- subject
+ make_request
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to eq(
@@ -23,7 +23,7 @@ describe API::ErrorTracking do
shared_examples 'returns 404' do
it 'returns correct project settings' do
- subject
+ make_request
expect(response).to have_gitlab_http_status(:not_found)
expect(json_response['message'])
@@ -32,7 +32,9 @@ describe API::ErrorTracking do
end
describe "PATCH /projects/:id/error_tracking/settings" do
- def make_patch_request(**params)
+ let(:params) { { active: false } }
+
+ def make_request
patch api("/projects/#{project.id}/error_tracking/settings", user), params: params
end
@@ -42,26 +44,39 @@ describe API::ErrorTracking do
end
context 'patch settings' do
- subject do
- make_patch_request(active: false)
+ it_behaves_like 'returns project settings'
+
+ it 'updates enabled flag' do
+ expect(setting).to be_enabled
+
+ make_request
+
+ expect(json_response).to include('active' => false)
+ expect(setting.reload).not_to be_enabled
end
- it_behaves_like 'returns project settings'
+ context 'active is invalid' do
+ let(:params) { { active: "randomstring" } }
- it 'returns active is invalid if non boolean' do
- make_patch_request(active: "randomstring")
+ it 'returns active is invalid if non boolean' do
+ make_request
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['error'])
- .to eq('active is invalid')
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error'])
+ .to eq('active is invalid')
+ end
end
- it 'returns 400 if active is empty' do
- make_patch_request(active: '')
+ context 'active is empty' do
+ let(:params) { { active: '' } }
+
+ it 'returns 400' do
+ make_request
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['error'])
- .to eq('active is empty')
+ expect(response).to have_gitlab_http_status(:bad_request)
+ expect(json_response['error'])
+ .to eq('active is empty')
+ end
end
end
@@ -73,10 +88,6 @@ describe API::ErrorTracking do
end
context 'patch settings' do
- subject do
- make_patch_request(active: true)
- end
-
it_behaves_like 'returns 404'
end
end
@@ -87,10 +98,12 @@ describe API::ErrorTracking do
project.add_reporter(user)
end
- it 'returns 403 for update request' do
- make_patch_request(active: true)
+ context 'patch request' do
+ it 'returns 403' do
+ make_request
- expect(response).to have_gitlab_http_status(:forbidden)
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
end
end
@@ -99,28 +112,34 @@ describe API::ErrorTracking do
project.add_developer(user)
end
- it 'returns 403 for update request' do
- make_patch_request(active: true)
+ context 'patch request' do
+ it 'returns 403' do
+ make_request
- expect(response).to have_gitlab_http_status(:forbidden)
+ expect(response).to have_gitlab_http_status(:forbidden)
+ end
end
end
context 'when authenticated as non-member' do
- it 'returns 404 for update request' do
- make_patch_request(active: false)
+ context 'patch request' do
+ it 'returns 404' do
+ make_request
- expect(response).to have_gitlab_http_status(:not_found)
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
end
end
context 'when unauthenticated' do
let(:user) { nil }
- it 'returns 401 for update request' do
- make_patch_request(active: true)
+ context 'patch request' do
+ it 'returns 401 for update request' do
+ make_request
- expect(response).to have_gitlab_http_status(:unauthorized)
+ expect(response).to have_gitlab_http_status(:unauthorized)
+ end
end
end
end
@@ -136,10 +155,6 @@ describe API::ErrorTracking do
end
context 'get settings' do
- subject do
- make_request
- end
-
it_behaves_like 'returns project settings'
end
end
@@ -152,10 +167,6 @@ describe API::ErrorTracking do
end
context 'get settings' do
- subject do
- make_request
- end
-
it_behaves_like 'returns 404'
end
end
diff --git a/spec/services/projects/alerting/notify_service_spec.rb b/spec/services/projects/alerting/notify_service_spec.rb
index efd168a0a8a..925d323584e 100644
--- a/spec/services/projects/alerting/notify_service_spec.rb
+++ b/spec/services/projects/alerting/notify_service_spec.rb
@@ -5,6 +5,26 @@ require 'spec_helper'
describe Projects::Alerting::NotifyService do
let_it_be(:project, reload: true) { create(:project) }
+ before do
+ # We use `let_it_be(:project)` so we make sure to clear caches
+ project.clear_memoization(:licensed_feature_available)
+ end
+
+ shared_examples 'processes incident issues' do |amount|
+ let(:create_incident_service) { spy }
+
+ it 'processes issues' do
+ expect(IncidentManagement::ProcessAlertWorker)
+ .to receive(:perform_async)
+ .with(project.id, kind_of(Hash))
+ .exactly(amount).times
+
+ Sidekiq::Testing.inline! do
+ expect(subject.status).to eq(:success)
+ end
+ end
+ end
+
shared_examples 'does not process incident issues' do |http_status:|
it 'does not process issues' do
expect(IncidentManagement::ProcessAlertWorker)
@@ -29,6 +49,36 @@ describe Projects::Alerting::NotifyService do
subject { service.execute(token) }
- it_behaves_like 'does not process incident issues', http_status: 403
+ context 'with activated Alerts Service' do
+ let!(:alerts_service) { create(:alerts_service, project: project) }
+
+ context 'with valid token' do
+ let(:token) { alerts_service.token }
+
+ context 'with a valid payload' do
+ it_behaves_like 'processes incident issues', 1
+ end
+
+ context 'with an invalid payload' do
+ before do
+ allow(Gitlab::Alerting::NotificationPayloadParser)
+ .to receive(:call)
+ .and_raise(Gitlab::Alerting::NotificationPayloadParser::BadPayloadError)
+ end
+
+ it_behaves_like 'does not process incident issues', http_status: 400
+ end
+ end
+
+ context 'with invalid token' do
+ it_behaves_like 'does not process incident issues', http_status: 401
+ end
+ end
+
+ context 'with deactivated Alerts Service' do
+ let!(:alerts_service) { create(:alerts_service, :inactive, project: project) }
+
+ it_behaves_like 'does not process incident issues', http_status: 403
+ end
end
end
diff --git a/spec/support/shared_contexts/services_shared_context.rb b/spec/support/shared_contexts/services_shared_context.rb
index c526c8aba7c..21bc0651c44 100644
--- a/spec/support/shared_contexts/services_shared_context.rb
+++ b/spec/support/shared_contexts/services_shared_context.rb
@@ -32,8 +32,7 @@ Service.available_services_names.each do |service|
{
'github' => :github_project_service_integration,
'jenkins' => :jenkins_integration,
- 'jenkins_deprecated' => :jenkins_integration,
- 'alerts' => :incident_management
+ 'jenkins_deprecated' => :jenkins_integration
}
end