Resolve "Email notifications do not work properly (issue due date)"

This commit is contained in:
Eugenia Grieff 2019-06-12 15:55:09 +00:00 committed by Nick Thomas
parent 14fef15194
commit ef5235cb2d
3 changed files with 241 additions and 2 deletions

View file

@ -101,6 +101,7 @@ class NotificationRecipient
end
def excluded_watcher_action?
return false unless @type == :watch
return false unless @custom_action
NotificationSetting::EXCLUDED_WATCHER_EVENTS.include?(@custom_action)
@ -140,7 +141,7 @@ class NotificationRecipient
return project_setting unless project_setting.nil? || project_setting.global?
group_setting = closest_non_global_group_notification_settting
group_setting = closest_non_global_group_notification_setting
return group_setting unless group_setting.nil?
@ -148,7 +149,7 @@ class NotificationRecipient
end
# Returns the notification_setting of the lowest group in hierarchy with non global level
def closest_non_global_group_notification_settting
def closest_non_global_group_notification_setting
return unless @group
@group

View file

@ -0,0 +1,5 @@
---
title: Fix email notifications for user excluded actions
merge_request: 28835
author:
type: fixed

View file

@ -91,4 +91,237 @@ describe NotificationRecipient do
end
end
end
describe '#suitable_notification_level?' do
context 'when notification level is mention' do
before do
user.notification_settings_for(project).mention!
end
context 'when type is mention' do
let(:recipient) { described_class.new(user, :mention, target: target, project: project) }
it 'returns true' do
expect(recipient.suitable_notification_level?).to eq true
end
end
context 'when type is not mention' do
it 'returns false' do
expect(recipient.suitable_notification_level?).to eq false
end
end
end
context 'when notification level is participating' do
let(:notification_setting) { user.notification_settings_for(project) }
context 'when type is participating' do
let(:recipient) { described_class.new(user, :participating, target: target, project: project) }
it 'returns true' do
expect(recipient.suitable_notification_level?).to eq true
end
end
context 'when type is mention' do
let(:recipient) { described_class.new(user, :mention, target: target, project: project) }
it 'returns true' do
expect(recipient.suitable_notification_level?).to eq true
end
end
context 'with custom action' do
context "when action is failed_pipeline" do
let(:recipient) do
described_class.new(
user,
:watch,
custom_action: :failed_pipeline,
target: target,
project: project
)
end
before do
notification_setting.update!(failed_pipeline: true)
end
it 'returns true' do
expect(recipient.suitable_notification_level?).to eq true
end
end
context "when action is not failed_pipeline" do
let(:recipient) do
described_class.new(
user,
:watch,
custom_action: :success_pipeline,
target: target,
project: project
)
end
before do
notification_setting.update!(success_pipeline: true)
end
it 'returns false' do
expect(recipient.suitable_notification_level?).to eq false
end
end
end
end
context 'when notification level is custom' do
before do
user.notification_settings_for(project).custom!
end
context 'when type is participating' do
let(:notification_setting) { user.notification_settings_for(project) }
let(:recipient) do
described_class.new(
user,
:participating,
custom_action: :new_note,
target: target,
project: project
)
end
context 'with custom event enabled' do
before do
notification_setting.update!(new_note: true)
end
it 'returns true' do
expect(recipient.suitable_notification_level?).to eq true
end
end
context 'without custom event enabled' do
before do
notification_setting.update!(new_note: false)
end
it 'returns true' do
expect(recipient.suitable_notification_level?).to eq true
end
end
end
context 'when type is mention' do
let(:notification_setting) { user.notification_settings_for(project) }
let(:recipient) do
described_class.new(
user,
:mention,
custom_action: :new_issue,
target: target,
project: project
)
end
context 'with custom event enabled' do
before do
notification_setting.update!(new_issue: true)
end
it 'returns true' do
expect(recipient.suitable_notification_level?).to eq true
end
end
context 'without custom event enabled' do
before do
notification_setting.update!(new_issue: false)
end
it 'returns true' do
expect(recipient.suitable_notification_level?).to eq true
end
end
end
context 'when type is watch' do
let(:notification_setting) { user.notification_settings_for(project) }
let(:recipient) do
described_class.new(
user,
:watch,
custom_action: :failed_pipeline,
target: target,
project: project
)
end
context 'with custom event enabled' do
before do
notification_setting.update!(failed_pipeline: true)
end
it 'returns true' do
expect(recipient.suitable_notification_level?).to eq true
end
end
context 'without custom event enabled' do
before do
notification_setting.update!(failed_pipeline: false)
end
it 'returns false' do
expect(recipient.suitable_notification_level?).to eq false
end
end
end
end
context 'when notification level is watch' do
before do
user.notification_settings_for(project).watch!
end
context 'when type is watch' do
context 'without excluded watcher events' do
it 'returns true' do
expect(recipient.suitable_notification_level?).to eq true
end
end
context 'with excluded watcher events' do
let(:recipient) do
described_class.new(user, :watch, custom_action: :issue_due, target: target, project: project)
end
it 'returns false' do
expect(recipient.suitable_notification_level?).to eq false
end
end
end
context 'when type is not watch' do
context 'without excluded watcher events' do
let(:recipient) { described_class.new(user, :participating, target: target, project: project) }
it 'returns true' do
expect(recipient.suitable_notification_level?).to eq true
end
end
context 'with excluded watcher events' do
let(:recipient) do
described_class.new(user, :participating, custom_action: :issue_due, target: target, project: project)
end
it 'returns true' do
expect(recipient.suitable_notification_level?).to eq true
end
end
end
end
end
end