Commit bca260ad authored by Robert Speicher's avatar Robert Speicher

Merge branch 'ee-slack-protected-branch-notification' into 'master'

[EE port]  Support notifications to be fired for protected branches also

See merge request gitlab-org/gitlab!16405
parents 1d197c06 3e12f61a
...@@ -10,6 +10,7 @@ module ServiceParams ...@@ -10,6 +10,7 @@ module ServiceParams
:api_url, :api_url,
:api_version, :api_version,
:bamboo_url, :bamboo_url,
:branches_to_be_notified,
:build_key, :build_key,
:build_type, :build_type,
:ca_pem, :ca_pem,
...@@ -41,7 +42,6 @@ module ServiceParams ...@@ -41,7 +42,6 @@ module ServiceParams
:new_issue_url, :new_issue_url,
:notify, :notify,
:notify_only_broken_pipelines, :notify_only_broken_pipelines,
:notify_only_default_branch,
:password, :password,
:priority, :priority,
:project_key, :project_key,
......
# frozen_string_literal: true
# Concern handling functionality around deciding whether to send notification
# for activities on a specified branch or not. Will be included in
# ChatNotificationService and PipelinesEmailService classes.
module NotificationBranchSelection
extend ActiveSupport::Concern
BRANCH_CHOICES = [
[_('All branches'), 'all'],
[_('Default branch'), 'default'],
[_('Protected branches'), 'protected'],
[_('Default branch and protected branches'), 'default_and_protected']
].freeze
def notify_for_branch?(data)
ref = if data[:ref]
Gitlab::Git.ref_name(data[:ref])
else
data.dig(:object_attributes, :ref)
end
is_default_branch = ref == project.default_branch
is_protected_branch = project.protected_branches.exists?(name: ref)
case branches_to_be_notified
when "all"
true
when "default"
is_default_branch
when "protected"
is_protected_branch
when "default_and_protected"
is_default_branch || is_protected_branch
else
false
end
end
end
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
# This class is not meant to be used directly, but only to inherit from. # This class is not meant to be used directly, but only to inherit from.
class ChatNotificationService < Service class ChatNotificationService < Service
include ChatMessage include ChatMessage
include NotificationBranchSelection
SUPPORTED_EVENTS = %w[ SUPPORTED_EVENTS = %w[
push issue confidential_issue merge_request note confidential_note push issue confidential_issue merge_request note confidential_note
...@@ -14,7 +15,7 @@ class ChatNotificationService < Service ...@@ -14,7 +15,7 @@ class ChatNotificationService < Service
default_value_for :category, 'chat' default_value_for :category, 'chat'
prop_accessor :webhook, :username, :channel prop_accessor :webhook, :username, :channel, :branches_to_be_notified
# Custom serialized properties initialization # Custom serialized properties initialization
prop_accessor(*SUPPORTED_EVENTS.map { |event| EVENT_CHANNEL[event] }) prop_accessor(*SUPPORTED_EVENTS.map { |event| EVENT_CHANNEL[event] })
...@@ -27,7 +28,16 @@ class ChatNotificationService < Service ...@@ -27,7 +28,16 @@ class ChatNotificationService < Service
if properties.nil? if properties.nil?
self.properties = {} self.properties = {}
self.notify_only_broken_pipelines = true self.notify_only_broken_pipelines = true
self.notify_only_default_branch = true self.branches_to_be_notified = "default"
elsif !self.notify_only_default_branch.nil?
# In older versions, there was only a boolean property named
# `notify_only_default_branch`. Now we have a string property named
# `branches_to_be_notified`. Instead of doing a background migration, we
# opted to set a value for the new property based on the old one, if
# users hasn't specified one already. When users edit the service and
# selects a value for this new property, it will override everything.
self.branches_to_be_notified ||= notify_only_default_branch? ? "default" : "all"
end end
end end
...@@ -52,7 +62,7 @@ class ChatNotificationService < Service ...@@ -52,7 +62,7 @@ class ChatNotificationService < Service
{ type: 'text', name: 'webhook', placeholder: "e.g. #{webhook_placeholder}", required: true }, { type: 'text', name: 'webhook', placeholder: "e.g. #{webhook_placeholder}", required: true },
{ type: 'text', name: 'username', placeholder: 'e.g. GitLab' }, { type: 'text', name: 'username', placeholder: 'e.g. GitLab' },
{ type: 'checkbox', name: 'notify_only_broken_pipelines' }, { type: 'checkbox', name: 'notify_only_broken_pipelines' },
{ type: 'checkbox', name: 'notify_only_default_branch' } { type: 'select', name: 'branches_to_be_notified', choices: BRANCH_CHOICES }
] ]
end end
...@@ -168,15 +178,8 @@ class ChatNotificationService < Service ...@@ -168,15 +178,8 @@ class ChatNotificationService < Service
def notify_for_ref?(data) def notify_for_ref?(data)
return true if data[:object_kind] == 'tag_push' return true if data[:object_kind] == 'tag_push'
return true if data.dig(:object_attributes, :tag) return true if data.dig(:object_attributes, :tag)
return true unless notify_only_default_branch?
ref = if data[:ref] notify_for_branch?(data)
Gitlab::Git.ref_name(data[:ref])
else
data.dig(:object_attributes, :ref)
end
ref == project.default_branch
end end
def notify_for_pipeline?(data) def notify_for_pipeline?(data)
......
...@@ -42,7 +42,7 @@ class DiscordService < ChatNotificationService ...@@ -42,7 +42,7 @@ class DiscordService < ChatNotificationService
[ [
{ type: "text", name: "webhook", placeholder: "e.g. https://discordapp.com/api/webhooks/…" }, { type: "text", name: "webhook", placeholder: "e.g. https://discordapp.com/api/webhooks/…" },
{ type: "checkbox", name: "notify_only_broken_pipelines" }, { type: "checkbox", name: "notify_only_broken_pipelines" },
{ type: "checkbox", name: "notify_only_default_branch" } { type: 'select', name: 'branches_to_be_notified', choices: BRANCH_CHOICES }
] ]
end end
......
...@@ -44,7 +44,7 @@ class HangoutsChatService < ChatNotificationService ...@@ -44,7 +44,7 @@ class HangoutsChatService < ChatNotificationService
[ [
{ type: 'text', name: 'webhook', placeholder: "e.g. #{webhook_placeholder}" }, { type: 'text', name: 'webhook', placeholder: "e.g. #{webhook_placeholder}" },
{ type: 'checkbox', name: 'notify_only_broken_pipelines' }, { type: 'checkbox', name: 'notify_only_broken_pipelines' },
{ type: 'checkbox', name: 'notify_only_default_branch' } { type: 'select', name: 'branches_to_be_notified', choices: BRANCH_CHOICES }
] ]
end end
......
...@@ -42,7 +42,7 @@ class MicrosoftTeamsService < ChatNotificationService ...@@ -42,7 +42,7 @@ class MicrosoftTeamsService < ChatNotificationService
[ [
{ type: 'text', name: 'webhook', placeholder: "e.g. #{webhook_placeholder}" }, { type: 'text', name: 'webhook', placeholder: "e.g. #{webhook_placeholder}" },
{ type: 'checkbox', name: 'notify_only_broken_pipelines' }, { type: 'checkbox', name: 'notify_only_broken_pipelines' },
{ type: 'checkbox', name: 'notify_only_default_branch' } { type: 'select', name: 'branches_to_be_notified', choices: BRANCH_CHOICES }
] ]
end end
......
# frozen_string_literal: true # frozen_string_literal: true
class PipelinesEmailService < Service class PipelinesEmailService < Service
prop_accessor :recipients include NotificationBranchSelection
prop_accessor :recipients, :branches_to_be_notified
boolean_accessor :notify_only_broken_pipelines, :notify_only_default_branch boolean_accessor :notify_only_broken_pipelines, :notify_only_default_branch
validates :recipients, presence: true, if: :valid_recipients? validates :recipients, presence: true, if: :valid_recipients?
def initialize_properties def initialize_properties
self.properties ||= { notify_only_broken_pipelines: true, notify_only_default_branch: false } if properties.nil?
self.properties = {}
self.notify_only_broken_pipelines = true
self.branches_to_be_notified = "default"
elsif !self.notify_only_default_branch.nil?
# In older versions, there was only a boolean property named
# `notify_only_default_branch`. Now we have a string property named
# `branches_to_be_notified`. Instead of doing a background migration, we
# opted to set a value for the new property based on the old one, if
# users hasn't specified one already. When users edit the service and
# selects a value for this new property, it will override everything.
self.branches_to_be_notified ||= notify_only_default_branch? ? "default" : "all"
end
end end
def title def title
...@@ -55,8 +70,9 @@ class PipelinesEmailService < Service ...@@ -55,8 +70,9 @@ class PipelinesEmailService < Service
required: true }, required: true },
{ type: 'checkbox', { type: 'checkbox',
name: 'notify_only_broken_pipelines' }, name: 'notify_only_broken_pipelines' },
{ type: 'checkbox', { type: 'select',
name: 'notify_only_default_branch' } name: 'branches_to_be_notified',
choices: BRANCH_CHOICES }
] ]
end end
...@@ -69,13 +85,7 @@ class PipelinesEmailService < Service ...@@ -69,13 +85,7 @@ class PipelinesEmailService < Service
end end
def should_pipeline_be_notified?(data) def should_pipeline_be_notified?(data)
notify_for_pipeline_branch?(data) && notify_for_pipeline?(data) notify_for_branch?(data) && notify_for_pipeline?(data)
end
def notify_for_pipeline_branch?(data)
return true unless notify_only_default_branch?
data[:object_attributes][:ref] == data[:project][:default_branch]
end end
def notify_for_pipeline?(data) def notify_for_pipeline?(data)
......
---
title: Support chat notifications to be fired for protected branches
merge_request: 32176
author:
type: added
...@@ -436,7 +436,8 @@ Parameters: ...@@ -436,7 +436,8 @@ Parameters:
| --------- | ---- | -------- | ----------- | | --------- | ---- | -------- | ----------- |
| `webhook` | string | true | The Hangouts Chat webhook. For example, `https://chat.googleapis.com/v1/spaces...`. | | `webhook` | string | true | The Hangouts Chat webhook. For example, `https://chat.googleapis.com/v1/spaces...`. |
| `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines | | `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines |
| `notify_only_default_branch` | boolean | false | Send notifications only for the default branch | | `notify_only_default_branch` | boolean | false | DEPRECATED: This parameter has been replaced with `branches_to_be_notified` |
| `branches_to_be_notified` | string | all | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected" |
| `push_events` | boolean | false | Enable notifications for push events | | `push_events` | boolean | false | Enable notifications for push events |
| `issues_events` | boolean | false | Enable notifications for issue events | | `issues_events` | boolean | false | Enable notifications for issue events |
| `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events | | `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events |
...@@ -745,7 +746,8 @@ Parameters: ...@@ -745,7 +746,8 @@ Parameters:
| `recipients` | string | yes | Comma-separated list of recipient email addresses | | `recipients` | string | yes | Comma-separated list of recipient email addresses |
| `add_pusher` | boolean | no | Add pusher to recipients list | | `add_pusher` | boolean | no | Add pusher to recipients list |
| `notify_only_broken_pipelines` | boolean | no | Notify only broken pipelines | | `notify_only_broken_pipelines` | boolean | no | Notify only broken pipelines |
| `notify_only_default_branch` | boolean | no | Send notifications only for the default branch ([introduced in GitLab 12.0](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/28271)) | | `notify_only_default_branch` | boolean | no | DEPRECATED: This parameter has been replaced with `branches_to_be_notified` ([introduced in GitLab 12.0](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/28271)) |
| `branches_to_be_notified` | string | all | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected" |
| `pipeline_events` | boolean | false | Enable notifications for pipeline events | | `pipeline_events` | boolean | false | Enable notifications for pipeline events |
### Delete Pipeline-Emails service ### Delete Pipeline-Emails service
...@@ -933,7 +935,8 @@ Parameters: ...@@ -933,7 +935,8 @@ Parameters:
| `username` | string | false | username | | `username` | string | false | username |
| `channel` | string | false | Default channel to use if others are not configured | | `channel` | string | false | Default channel to use if others are not configured |
| `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines | | `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines |
| `notify_only_default_branch` | boolean | false | Send notifications only for the default branch | | `notify_only_default_branch` | boolean | false | DEPRECATED: This parameter has been replaced with `branches_to_be_notified` |
| `branches_to_be_notified` | string | all | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected" |
| `commit_events` | boolean | false | Enable notifications for commit events | | `commit_events` | boolean | false | Enable notifications for commit events |
| `confidential_issue_channel` | string | false | The name of the channel to receive confidential issues events notifications | | `confidential_issue_channel` | string | false | The name of the channel to receive confidential issues events notifications |
| `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events | | `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events |
...@@ -991,7 +994,8 @@ Parameters: ...@@ -991,7 +994,8 @@ Parameters:
| --------- | ---- | -------- | ----------- | | --------- | ---- | -------- | ----------- |
| `webhook` | string | true | The Microsoft Teams webhook. For example, `https://outlook.office.com/webhook/...` | | `webhook` | string | true | The Microsoft Teams webhook. For example, `https://outlook.office.com/webhook/...` |
| `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines | | `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines |
| `notify_only_default_branch` | boolean | false | Send notifications only for the default branch | | `notify_only_default_branch` | boolean | false | DEPRECATED: This parameter has been replaced with `branches_to_be_notified` |
| `branches_to_be_notified` | string | all | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected" |
| `push_events` | boolean | false | Enable notifications for push events | | `push_events` | boolean | false | Enable notifications for push events |
| `issues_events` | boolean | false | Enable notifications for issue events | | `issues_events` | boolean | false | Enable notifications for issue events |
| `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events | | `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events |
...@@ -1040,7 +1044,8 @@ Parameters: ...@@ -1040,7 +1044,8 @@ Parameters:
| `username` | string | false | username | | `username` | string | false | username |
| `channel` | string | false | Default channel to use if others are not configured | | `channel` | string | false | Default channel to use if others are not configured |
| `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines | | `notify_only_broken_pipelines` | boolean | false | Send notifications for broken pipelines |
| `notify_only_default_branch` | boolean | false | Send notifications only for the default branch | | `notify_only_default_branch` | boolean | false | DEPRECATED: This parameter has been replaced with `branches_to_be_notified` |
| `branches_to_be_notified` | string | all | Branches to send notifications for. Valid options are "all", "default", "protected", and "default_and_protected" |
| `push_events` | boolean | false | Enable notifications for push events | | `push_events` | boolean | false | Enable notifications for push events |
| `issues_events` | boolean | false | Enable notifications for issue events | | `issues_events` | boolean | false | Enable notifications for issue events |
| `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events | | `confidential_issues_events` | boolean | false | Enable notifications for confidential issue events |
......
...@@ -27,6 +27,12 @@ module API ...@@ -27,6 +27,12 @@ module API
name: :channel, name: :channel,
type: String, type: String,
desc: 'The default chat channel' desc: 'The default chat channel'
},
{
required: false,
name: :branches_to_be_notified,
type: String,
desc: 'Branches for which notifications are to be sent'
} }
].freeze ].freeze
end end
...@@ -38,12 +44,6 @@ module API ...@@ -38,12 +44,6 @@ module API
name: :notify_only_broken_pipelines, name: :notify_only_broken_pipelines,
type: Boolean, type: Boolean,
desc: 'Send notifications for broken pipelines' desc: 'Send notifications for broken pipelines'
},
{
required: false,
name: :notify_only_default_branch,
type: Boolean,
desc: 'Send notifications only for the default branch'
} }
].freeze ].freeze
end end
...@@ -540,9 +540,9 @@ module API ...@@ -540,9 +540,9 @@ module API
}, },
{ {
required: false, required: false,
name: :notify_only_default_branch, name: :branches_to_be_notified,
type: Boolean, type: String,
desc: 'Send notifications only for the default branch' desc: 'Branches for which notifications are to be sent'
} }
], ],
'pivotaltracker' => [ 'pivotaltracker' => [
......
...@@ -1228,6 +1228,9 @@ msgstr "" ...@@ -1228,6 +1228,9 @@ msgstr ""
msgid "All Members" msgid "All Members"
msgstr "" msgstr ""
msgid "All branches"
msgstr ""
msgid "All changes are committed" msgid "All changes are committed"
msgstr "" msgstr ""
...@@ -4650,6 +4653,12 @@ msgstr "" ...@@ -4650,6 +4653,12 @@ msgstr ""
msgid "Default artifacts expiration" msgid "Default artifacts expiration"
msgstr "" msgstr ""
msgid "Default branch"
msgstr ""
msgid "Default branch and protected branches"
msgstr ""
msgid "Default classification label" msgid "Default classification label"
msgstr "" msgstr ""
...@@ -12343,6 +12352,9 @@ msgstr "" ...@@ -12343,6 +12352,9 @@ msgstr ""
msgid "Protected Tag" msgid "Protected Tag"
msgstr "" msgstr ""
msgid "Protected branches"
msgstr ""
msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?" msgid "ProtectedEnvironment|%{environment_name} will be writable for developers. Are you sure?"
msgstr "" msgstr ""
......
...@@ -216,7 +216,7 @@ describe 'Admin updates settings' do ...@@ -216,7 +216,7 @@ describe 'Admin updates settings' do
fill_in 'Username', with: 'test_user' fill_in 'Username', with: 'test_user'
fill_in 'service_push_channel', with: '#test_channel' fill_in 'service_push_channel', with: '#test_channel'
page.check('Notify only broken pipelines') page.check('Notify only broken pipelines')
page.check('Notify only default branch') page.select 'All branches', from: 'Branches to be notified'
check_all_events check_all_events
click_on 'Save' click_on 'Save'
......
...@@ -3,5 +3,5 @@ ...@@ -3,5 +3,5 @@
require 'spec_helper' require 'spec_helper'
describe MattermostService do describe MattermostService do
it_behaves_like "slack or mattermost notifications" it_behaves_like "slack or mattermost notifications", "Mattermost"
end end
...@@ -226,9 +226,10 @@ describe MicrosoftTeamsService do ...@@ -226,9 +226,10 @@ describe MicrosoftTeamsService do
) )
end end
shared_examples 'call Microsoft Teams API' do shared_examples 'call Microsoft Teams API' do |branches_to_be_notified: nil|
before do before do
WebMock.stub_request(:post, webhook_url) WebMock.stub_request(:post, webhook_url)
chat_service.branches_to_be_notified = branches_to_be_notified if branches_to_be_notified
end end
it 'calls Microsoft Teams API for pipeline events' do it 'calls Microsoft Teams API for pipeline events' do
...@@ -245,6 +246,18 @@ describe MicrosoftTeamsService do ...@@ -245,6 +246,18 @@ describe MicrosoftTeamsService do
end end
end end
shared_examples 'does not call Microsoft Teams API' do |branches_to_be_notified: nil|
before do
chat_service.branches_to_be_notified = branches_to_be_notified if branches_to_be_notified
end
it 'does not call Microsoft Teams API for pipeline events' do
data = Gitlab::DataBuilder::Pipeline.build(pipeline)
result = chat_service.execute(data)
expect(result).to be_falsy
end
end
context 'with failed pipeline' do context 'with failed pipeline' do
let(:status) { 'failed' } let(:status) { 'failed' }
...@@ -272,35 +285,73 @@ describe MicrosoftTeamsService do ...@@ -272,35 +285,73 @@ describe MicrosoftTeamsService do
end end
end end
context 'only notify for the default branch' do context 'with default branch' do
context 'when enabled' do let(:pipeline) do
let(:pipeline) do create(:ci_pipeline, project: project, status: 'failed', sha: project.commit.sha, ref: project.default_branch)
create(:ci_pipeline, project: project, status: 'failed', ref: 'not-the-default-branch') end
end
before do context 'only notify for the default branch' do
chat_service.notify_only_default_branch = true it_behaves_like 'call Microsoft Teams API', branches_to_be_notified: "default"
end end
it 'does not call the Microsoft Teams API for pipeline events' do context 'notify for only protected branches' do
data = Gitlab::DataBuilder::Pipeline.build(pipeline) it_behaves_like 'does not call Microsoft Teams API', branches_to_be_notified: "protected"
result = chat_service.execute(data) end
expect(result).to be_falsy context 'notify for only default and protected branches' do
end it_behaves_like 'call Microsoft Teams API', branches_to_be_notified: "default_and_protected"
end end
context 'when disabled' do context 'notify for all branches' do
let(:pipeline) do it_behaves_like 'call Microsoft Teams API', branches_to_be_notified: "all"
create(:ci_pipeline, :failed, project: project, end
sha: project.commit.sha, ref: 'not-the-default-branch') end
end
before do context 'with protected branch' do
chat_service.notify_only_default_branch = false before do
end create(:protected_branch, project: project, name: 'a-protected-branch')
end
it_behaves_like 'call Microsoft Teams API' let(:pipeline) do
create(:ci_pipeline, project: project, status: 'failed', sha: project.commit.sha, ref: 'a-protected-branch')
end
context 'only notify for the default branch' do
it_behaves_like 'does not call Microsoft Teams API', branches_to_be_notified: "default"
end
context 'notify for only protected branches' do
it_behaves_like 'call Microsoft Teams API', branches_to_be_notified: "protected"
end
context 'notify for only default and protected branches' do
it_behaves_like 'call Microsoft Teams API', branches_to_be_notified: "default_and_protected"
end
context 'notify for all branches' do
it_behaves_like 'call Microsoft Teams API', branches_to_be_notified: "all"
end
end
context 'with neither protected nor default branch' do
let(:pipeline) do
create(:ci_pipeline, project: project, status: 'failed', sha: project.commit.sha, ref: 'a-random-branch')
end
context 'only notify for the default branch' do
it_behaves_like 'does not call Microsoft Teams API', branches_to_be_notified: "default"
end
context 'notify for only protected branches' do
it_behaves_like 'does not call Microsoft Teams API', branches_to_be_notified: "protected"
end
context 'notify for only default and protected branches' do
it_behaves_like 'does not call Microsoft Teams API', branches_to_be_notified: "default_and_protected"
end
context 'notify for all branches' do
it_behaves_like 'call Microsoft Teams API', branches_to_be_notified: "all"
end end
end end
end end
......
...@@ -53,9 +53,10 @@ describe PipelinesEmailService, :mailer do ...@@ -53,9 +53,10 @@ describe PipelinesEmailService, :mailer do
end end
end end
shared_examples 'sending email' do shared_examples 'sending email' do |branches_to_be_notified: nil|
before do before do
subject.recipients = recipients subject.recipients = recipients
subject.branches_to_be_notified = branches_to_be_notified if branches_to_be_notified
perform_enqueued_jobs do perform_enqueued_jobs do
run run
...@@ -69,9 +70,10 @@ describe PipelinesEmailService, :mailer do ...@@ -69,9 +70,10 @@ describe PipelinesEmailService, :mailer do
end end
end end
shared_examples 'not sending email' do shared_examples 'not sending email' do |branches_to_be_notified: nil|
before do before do
subject.recipients = recipients subject.recipients = recipients
subject.branches_to_be_notified = branches_to_be_notified if branches_to_be_notified
perform_enqueued_jobs do perform_enqueued_jobs do
run run
...@@ -101,27 +103,84 @@ describe PipelinesEmailService, :mailer do ...@@ -101,27 +103,84 @@ describe PipelinesEmailService, :mailer do
it_behaves_like 'sending email' it_behaves_like 'sending email'
end end
context 'when pipeline is failed and on a non-default branch' do context 'when the pipeline failed' do
before do context 'on default branch' do
data[:object_attributes][:ref] = 'not-the-default-branch' before do
pipeline.update(ref: 'not-the-default-branch') data[:object_attributes][:ref] = project.default_branch
pipeline.update(ref: project.default_branch)
end
context 'notifications are enabled only for default branch' do
it_behaves_like 'sending email', branches_to_be_notified: "default"
end
context 'notifications are enabled only for protected branch' do
it_behaves_like 'sending email', branches_to_be_notified: "protected"
end
context 'notifications are enabled only for default and protected branches ' do
it_behaves_like 'sending email', branches_to_be_notified: "default_and_protected"
end
context 'notifications are enabled only for all branches' do
it_behaves_like 'sending email', branches_to_be_notified: "all"
end
end end
context 'with notify_only_default branch on' do context 'on a protected branch' do
before do before do
subject.notify_only_default_branch = true create(:protected_branch, project: project, name: 'a-protected-branch')
data[:object_attributes][:ref] = 'a-protected-branch'
pipeline.update(ref: 'a-protected-branch')
end end
it_behaves_like 'sending email' context 'notifications are enabled only for default branch' do
it_behaves_like 'sending email', branches_to_be_notified: "default"
end
context 'notifications are enabled only for protected branch' do
it_behaves_like 'sending email', branches_to_be_notified: "protected"
end
context 'notifications are enabled only for default and protected branches ' do
it_behaves_like 'sending email', branches_to_be_notified: "default_and_protected"
end
context 'notifications are enabled only for all branches' do
it_behaves_like 'sending email', branches_to_be_notified: "all"
end
end end
context 'with notify_only_default_branch off' do context 'on a neither protected nor default branch' do
it_behaves_like 'sending email' before do
data[:object_attributes][:ref] = 'a-random-branch'
pipeline.update(ref: 'a-random-branch')
end
context 'notifications are enabled only for default branch' do
it_behaves_like 'sending email', branches_to_be_notified: "default"
end
context 'notifications are enabled only for protected branch' do
it_behaves_like 'sending email', branches_to_be_notified: "protected"
end
context 'notifications are enabled only for default and protected branches ' do
it_behaves_like 'sending email', branches_to_be_notified: "default_and_protected"
end
context 'notifications are enabled only for all branches' do
it_behaves_like 'sending email', branches_to_be_notified: "all"
end
end end
end end
end end
describe '#execute' do describe '#execute' do
before do
subject.project = project
end
def run def run
subject.execute(data) subject.execute(data)
end end
...@@ -159,37 +218,75 @@ describe PipelinesEmailService, :mailer do ...@@ -159,37 +218,75 @@ describe PipelinesEmailService, :mailer do
end end
end end
context 'with notify_only_default_branch off' do context 'when the pipeline failed' do
context 'with default branch' do context 'on default branch' do
it_behaves_like 'sending email' before do
data[:object_attributes][:ref] = project.default_branch
pipeline.update(ref: project.default_branch)
end
context 'notifications are enabled only for default branch' do
it_behaves_like 'sending email', branches_to_be_notified: "default"
end
context 'notifications are enabled only for protected branch' do
it_behaves_like 'not sending email', branches_to_be_notified: "protected"
end
context 'notifications are enabled only for default and protected branches ' do
it_behaves_like 'sending email', branches_to_be_notified: "default_and_protected"
end
context 'notifications are enabled only for all branches' do
it_behaves_like 'sending email', branches_to_be_notified: "all"
end
end end
context 'with non default branch' do context 'on a protected branch' do
before do before do
data[:object_attributes][:ref] = 'not-the-default-branch' create(:protected_branch, project: project, name: 'a-protected-branch')
pipeline.update(ref: 'not-the-default-branch') data[:object_attributes][:ref] = 'a-protected-branch'
pipeline.update(ref: 'a-protected-branch')
end end
it_behaves_like 'sending email' context 'notifications are enabled only for default branch' do
end it_behaves_like 'not sending email', branches_to_be_notified: "default"
end end
context 'with notify_only_default_branch on' do context 'notifications are enabled only for protected branch' do
before do it_behaves_like 'sending email', branches_to_be_notified: "protected"
subject.notify_only_default_branch = true end
end
context 'with default branch' do context 'notifications are enabled only for default and protected branches ' do
it_behaves_like 'sending email' it_behaves_like 'sending email', branches_to_be_notified: "default_and_protected"
end
context 'notifications are enabled only for all branches' do
it_behaves_like 'sending email', branches_to_be_notified: "all"
end
end end
context 'with non default branch' do context 'on a neither protected nor default branch' do
before do before do
data[:object_attributes][:ref] = 'not-the-default-branch' data[:object_attributes][:ref] = 'a-random-branch'
pipeline.update(ref: 'not-the-default-branch') pipeline.update(ref: 'a-random-branch')
end end
it_behaves_like 'not sending email' context 'notifications are enabled only for default branch' do
it_behaves_like 'not sending email', branches_to_be_notified: "default"
end
context 'notifications are enabled only for protected branch' do
it_behaves_like 'not sending email', branches_to_be_notified: "protected"
end
context 'notifications are enabled only for default and protected branches ' do
it_behaves_like 'not sending email', branches_to_be_notified: "default_and_protected"
end
context 'notifications are enabled only for all branches' do
it_behaves_like 'sending email', branches_to_be_notified: "all"
end
end end
end end
end end
......
...@@ -3,5 +3,5 @@ ...@@ -3,5 +3,5 @@
require 'spec_helper' require 'spec_helper'
describe SlackService do describe SlackService do
it_behaves_like "slack or mattermost notifications" it_behaves_like "slack or mattermost notifications", "Slack"
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment