summaryrefslogtreecommitdiff
path: root/spec/services/notification_recipients/builder/default_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/services/notification_recipients/builder/default_spec.rb')
-rw-r--r--spec/services/notification_recipients/builder/default_spec.rb146
1 files changed, 141 insertions, 5 deletions
diff --git a/spec/services/notification_recipients/builder/default_spec.rb b/spec/services/notification_recipients/builder/default_spec.rb
index d25410235c2..994138ea828 100644
--- a/spec/services/notification_recipients/builder/default_spec.rb
+++ b/spec/services/notification_recipients/builder/default_spec.rb
@@ -6,7 +6,7 @@ RSpec.describe NotificationRecipients::Builder::Default do
describe '#build!' do
let_it_be(:group) { create(:group, :public) }
let_it_be(:project) { create(:project, :public, group: group).tap { |p| p.add_developer(project_watcher) } }
- let_it_be(:issue) { create(:issue, project: project) }
+ let_it_be(:target) { create(:issue, project: project) }
let_it_be(:current_user) { create(:user) }
let_it_be(:other_user) { create(:user) }
@@ -17,11 +17,11 @@ RSpec.describe NotificationRecipients::Builder::Default do
let_it_be(:notification_setting_project_w) { create(:notification_setting, source: project, user: project_watcher, level: 2) }
let_it_be(:notification_setting_group_w) { create(:notification_setting, source: group, user: group_watcher, level: 2) }
- subject { described_class.new(issue, current_user, action: :new).tap { |s| s.build! } }
+ subject { described_class.new(target, current_user, action: :new).tap { |s| s.build! } }
context 'participants and project watchers' do
before do
- expect(issue).to receive(:participants).and_return([participant, current_user])
+ expect(target).to receive(:participants).and_return([participant, current_user])
end
it 'adds all participants and watchers' do
@@ -34,11 +34,147 @@ RSpec.describe NotificationRecipients::Builder::Default do
it 'adds all subscribers' do
subscriber = create(:user)
non_subscriber = create(:user)
- create(:subscription, project: project, user: subscriber, subscribable: issue, subscribed: true)
- create(:subscription, project: project, user: non_subscriber, subscribable: issue, subscribed: false)
+ create(:subscription, project: project, user: subscriber, subscribable: target, subscribed: true)
+ create(:subscription, project: project, user: non_subscriber, subscribable: target, subscribed: false)
expect(subject.recipients.map(&:user)).to include(subscriber)
end
end
+
+ context 'custom notifications' do
+ shared_examples 'custom notification recipients' do
+ let_it_be(:custom_notification_user) { create(:user) }
+ let_it_be(:another_group) { create(:group) }
+ let_it_be(:another_project) { create(:project, namespace: another_group) }
+
+ context 'with project custom notification setting' do
+ before do
+ create(:notification_setting, source: project, user: custom_notification_user, level: :custom)
+ end
+
+ it 'adds the user to the recipients' do
+ expect(subject.recipients.map(&:user)).to include(custom_notification_user)
+ end
+ end
+
+ context 'with the project custom notification setting in another project' do
+ before do
+ create(:notification_setting, source: another_project, user: custom_notification_user, level: :custom)
+ end
+
+ it 'does not add the user to the recipients' do
+ expect(subject.recipients.map(&:user)).not_to include(custom_notification_user)
+ end
+ end
+
+ context 'with group custom notification setting' do
+ before do
+ create(:notification_setting, source: group, user: custom_notification_user, level: :custom)
+ end
+
+ it 'adds the user to the recipients' do
+ expect(subject.recipients.map(&:user)).to include(custom_notification_user)
+ end
+ end
+
+ context 'with the group custom notification setting in another group' do
+ before do
+ create(:notification_setting, source: another_group, user: custom_notification_user, level: :custom)
+ end
+
+ it 'does not add the user to the recipients' do
+ expect(subject.recipients.map(&:user)).not_to include(custom_notification_user)
+ end
+ end
+
+ context 'with project global custom notification setting' do
+ before do
+ create(:notification_setting, source: project, user: custom_notification_user, level: :global)
+ end
+
+ context 'with global custom notification setting' do
+ before do
+ create(:notification_setting, source: nil, user: custom_notification_user, level: :custom)
+ end
+
+ it 'adds the user to the recipients' do
+ expect(subject.recipients.map(&:user)).to include(custom_notification_user)
+ end
+ end
+
+ context 'without global custom notification setting' do
+ it 'does not add the user to the recipients' do
+ expect(subject.recipients.map(&:user)).not_to include(custom_notification_user)
+ end
+ end
+ end
+
+ context 'with group global custom notification setting' do
+ before do
+ create(:notification_setting, source: group, user: custom_notification_user, level: :global)
+ end
+
+ context 'with global custom notification setting' do
+ before do
+ create(:notification_setting, source: nil, user: custom_notification_user, level: :custom)
+ end
+
+ it 'adds the user to the recipients' do
+ expect(subject.recipients.map(&:user)).to include(custom_notification_user)
+ end
+ end
+
+ context 'without global custom notification setting' do
+ it 'does not add the user to the recipients' do
+ expect(subject.recipients.map(&:user)).not_to include(custom_notification_user)
+ end
+ end
+ end
+
+ context 'with group custom notification setting in deeply nested parent group' do
+ let(:grand_parent_group) { create(:group, :public) }
+ let(:parent_group) { create(:group, :public, parent: grand_parent_group) }
+ let(:group) { create(:group, :public, parent: parent_group) }
+ let(:project) { create(:project, :public, group: group).tap { |p| p.add_developer(project_watcher) } }
+ let(:target) { create(:issue, project: project) }
+
+ before do
+ create(:notification_setting, source: grand_parent_group, user: custom_notification_user, level: :custom)
+ end
+
+ it 'adds the user to the recipients' do
+ expect(subject.recipients.map(&:user)).to include(custom_notification_user)
+ end
+ end
+
+ context 'without a project or group' do
+ let(:target) { create(:snippet) }
+
+ before do
+ create(:notification_setting, source: nil, user: custom_notification_user, level: :custom)
+ end
+
+ it 'does not add the user to the recipients' do
+ expect(subject.recipients.map(&:user)).not_to include(custom_notification_user)
+ end
+ end
+ end
+
+ before do
+ stub_feature_flags(notification_setting_recipient_refactor: enabled)
+ end
+
+ context 'with notification_setting_recipient_refactor enabled' do
+ let(:enabled) { true }
+
+ it_behaves_like 'custom notification recipients'
+ end
+
+ context 'with notification_setting_recipient_refactor disabled' do
+ let(:enabled) { false }
+
+ it_behaves_like 'custom notification recipients'
+ end
+ end
end
end