Rename NoteObserver methods and clarify things

This commit is contained in:
Riyad Preukschas 2012-10-13 22:46:27 +02:00
parent 853c69c48a
commit 413778b645
2 changed files with 53 additions and 29 deletions

View file

@ -1,9 +1,14 @@
class NoteObserver < ActiveRecord::Observer class NoteObserver < ActiveRecord::Observer
def after_create(note) def after_create(note)
send_notify_mails(note)
end
protected
def send_notify_mails(note)
if note.notify if note.notify
# Notify whole team except author of note notify_team(note)
notify_team_of_new_note(note)
elsif note.notify_author elsif note.notify_author
# Notify only author of resource # Notify only author of resource
Notify.note_commit_email(note.commit_author.id, note.id).deliver Notify.note_commit_email(note.commit_author.id, note.id).deliver
@ -13,15 +18,15 @@ class NoteObserver < ActiveRecord::Observer
end end
end end
protected # Notifies the whole team except the author of note
def notify_team(note)
def notify_team_of_new_note(note) # Note: wall posts are not "attached" to anything, so fall back to "Wall"
note_is_on = note.noteable_type || 'Wall' noteable_type = note.noteable_type || "Wall"
notify_method = 'note_' + note_is_on.underscore + '_email' notify_method = "note_#{noteable_type.underscore}_email".to_sym
if Notify.respond_to? notify_method if Notify.respond_to? notify_method
team_without_note_author(note).map do |u| team_without_note_author(note).map do |u|
Notify.send(notify_method.to_sym, u.id, note.id).deliver Notify.send(notify_method, u.id, note.id).deliver
end end
end end
end end

View file

@ -3,8 +3,11 @@ require 'spec_helper'
describe NoteObserver do describe NoteObserver do
subject { NoteObserver.instance } subject { NoteObserver.instance }
let(:team_without_author) { (1..2).map { |n| double :user, id: n } }
let(:delivery_success) { double deliver: true }
describe '#after_create' do describe '#after_create' do
let(:note) { double :note, notify: false, notify_author: false } let(:note) { double :note }
it 'is called after a note is created' do it 'is called after a note is created' do
subject.should_receive :after_create subject.should_receive :after_create
@ -14,40 +17,51 @@ describe NoteObserver do
end end
end end
it 'sends out notifications' do
subject.should_receive(:send_notify_mails).with(note)
subject.after_create(note)
end
end
describe "#send_notify_mails" do
let(:note) { double :note, notify: false, notify_author: false }
it 'notifies team of new note when flagged to notify' do it 'notifies team of new note when flagged to notify' do
note.stub(:notify).and_return(true) note.stub(:notify).and_return(true)
subject.should_receive(:notify_team_of_new_note).with(note) subject.should_receive(:notify_team).with(note)
subject.after_create(note) subject.after_create(note)
end end
it 'does not notify team of new note when not flagged to notify' do it 'does not notify team of new note when not flagged to notify' do
subject.should_not_receive(:notify_team_of_new_note).with(note) subject.should_not_receive(:notify_team).with(note)
subject.after_create(note) subject.after_create(note)
end end
it 'notifies the author of a commit when flagged to notify the author' do it 'notifies the author of a commit when flagged to notify the author' do
note.stub(:notify_author).and_return(true) note.stub(:notify_author).and_return(true)
note.stub(:id).and_return(42) note.stub(:id).and_return(42)
author = double :user, id: 1 author = double :user, id: 1
note.stub(:commit_author).and_return(author) note.stub(:commit_author).and_return(author)
Notify.should_receive(:note_commit_email).and_return(double(deliver: true)) Notify.should_receive(:note_commit_email).and_return(delivery_success)
subject.after_create(note) subject.after_create(note)
end end
it 'does not notify the author of a commit when not flagged to notify the author' do it 'does not notify the author of a commit when not flagged to notify the author' do
Notify.should_not_receive(:note_commit_email) Notify.should_not_receive(:note_commit_email)
subject.after_create(note) subject.after_create(note)
end end
it 'does nothing if no notify flags are set' do it 'does nothing if no notify flags are set' do
subject.after_create(note).should be_nil subject.after_create(note).should be_nil
end end
end end
describe '#notify_team' do
let(:team_without_author) { (1..2).map { |n| double :user, id: n } }
describe '#notify_team_of_new_note' do
let(:note) { double :note, id: 1 } let(:note) { double :note, id: 1 }
before :each do before :each do
@ -57,40 +71,45 @@ describe NoteObserver do
context 'notifies team of a new note on' do context 'notifies team of a new note on' do
it 'a commit' do it 'a commit' do
note.stub(:noteable_type).and_return('Commit') note.stub(:noteable_type).and_return('Commit')
Notify.should_receive(:note_commit_email).twice.and_return(double(deliver: true)) Notify.should_receive(:note_commit_email).twice.and_return(delivery_success)
subject.send(:notify_team_of_new_note, note) subject.send(:notify_team, note)
end end
it 'an issue' do it 'an issue' do
note.stub(:noteable_type).and_return('Issue') note.stub(:noteable_type).and_return('Issue')
Notify.should_receive(:note_issue_email).twice.and_return(double(deliver: true)) Notify.should_receive(:note_issue_email).twice.and_return(delivery_success)
subject.send(:notify_team_of_new_note, note) subject.send(:notify_team, note)
end end
it 'a wiki page' do it 'a wiki page' do
note.stub(:noteable_type).and_return('Wiki') note.stub(:noteable_type).and_return('Wiki')
Notify.should_receive(:note_wiki_email).twice.and_return(double(deliver: true)) Notify.should_receive(:note_wiki_email).twice.and_return(delivery_success)
subject.send(:notify_team_of_new_note, note) subject.send(:notify_team, note)
end end
it 'a merge request' do it 'a merge request' do
note.stub(:noteable_type).and_return('MergeRequest') note.stub(:noteable_type).and_return('MergeRequest')
Notify.should_receive(:note_merge_request_email).twice.and_return(double(deliver: true)) Notify.should_receive(:note_merge_request_email).twice.and_return(delivery_success)
subject.send(:notify_team_of_new_note, note) subject.send(:notify_team, note)
end end
it 'a wall' do
note.stub(:noteable_type).and_return(nil)
Notify.should_receive(:note_wall_email).twice.and_return(double(deliver: true))
subject.send(:notify_team_of_new_note, note) it 'a wall' do
# Note: wall posts have #noteable_type of nil
note.stub(:noteable_type).and_return(nil)
Notify.should_receive(:note_wall_email).twice.and_return(delivery_success)
subject.send(:notify_team, note)
end end
end end
it 'does nothing for a new note on a snippet' do it 'does nothing for a new note on a snippet' do
note.stub(:noteable_type).and_return('Snippet') note.stub(:noteable_type).and_return('Snippet')
subject.send(:notify_team_of_new_note, note).should be_nil subject.send(:notify_team, note).should be_nil
end end
end end