fix multiple notifications from being sent for multiple labels

This also refactor the email_helper support spec to watch for multiple
emails being sent.
This commit is contained in:
micael.bergeron 2017-10-10 14:45:43 -04:00
parent f9df0e13e3
commit e5ed2e4f4e
3 changed files with 20 additions and 8 deletions

View file

@ -397,7 +397,7 @@ class NotificationService
end end
def relabeled_resource_email(target, labels, current_user, method) def relabeled_resource_email(target, labels, current_user, method)
recipients = labels.flat_map { |l| l.subscribers(target.project) } recipients = labels.flat_map { |l| l.subscribers(target.project) }.uniq
recipients = notifiable_users( recipients = notifiable_users(
recipients, :subscription, recipients, :subscription,
target: target, target: target,

View file

@ -743,6 +743,18 @@ describe NotificationService, :mailer do
should_not_email(@u_participating) should_not_email(@u_participating)
end end
it "doesn't send multiple email when a user is subscribed to multiple given labels" do
subscriber_to_both = create(:user) do |user|
[label_1, label_2].each { |label| label.toggle_subscription(user, project) }
end
notification.relabeled_issue(issue, [label_1, label_2], @u_disabled)
should_email(subscriber_to_label_1)
should_email(subscriber_to_label_2)
should_email(subscriber_to_both)
end
context 'confidential issues' do context 'confidential issues' do
let(:author) { create(:user) } let(:author) { create(:user) }
let(:assignee) { create(:user) } let(:assignee) { create(:user) }

View file

@ -1,6 +1,6 @@
module EmailHelpers module EmailHelpers
def sent_to_user?(user, recipients = email_recipients) def sent_to_user(user, recipients: email_recipients)
recipients.include?(user.notification_email) recipients.count { |to| to == user.notification_email }
end end
def reset_delivered_emails! def reset_delivered_emails!
@ -10,17 +10,17 @@ module EmailHelpers
def should_only_email(*users, kind: :to) def should_only_email(*users, kind: :to)
recipients = email_recipients(kind: kind) recipients = email_recipients(kind: kind)
users.each { |user| should_email(user, recipients) } users.each { |user| should_email(user, recipients: recipients) }
expect(recipients.count).to eq(users.count) expect(recipients.count).to eq(users.count)
end end
def should_email(user, recipients = email_recipients) def should_email(user, times: 1, recipients: email_recipients)
expect(sent_to_user?(user, recipients)).to be_truthy expect(sent_to_user(user, recipients: recipients)).to eq(times)
end end
def should_not_email(user, recipients = email_recipients) def should_not_email(user, recipients: email_recipients)
expect(sent_to_user?(user, recipients)).to be_falsey should_email(user, times: 0)
end end
def should_not_email_anyone def should_not_email_anyone