Commit f6035552e5d83b36f69e1ac7fa4b40ee5f7ab4fb
1 parent
6507c108
Exists in
master
and in
4 other branches
New IssueObserver class and spec.
Handles emails for new issues and reassigned issues. Need to add creating a Note on Issue close.
Showing
2 changed files
with
84 additions
and
0 deletions
Show diff stats
| ... | ... | @@ -0,0 +1,17 @@ |
| 1 | +class IssueObserver < ActiveRecord::Observer | |
| 2 | + cattr_accessor :current_user | |
| 3 | + | |
| 4 | + def after_create(issue) | |
| 5 | + Notify.new_issue_email(issue.id) if issue.assignee != current_user | |
| 6 | + end | |
| 7 | + | |
| 8 | + def after_change(issue) | |
| 9 | + if issue.assignee_id_changed? | |
| 10 | + recipient_ids = [issue.assignee_id, issue.assignee_id_was].keep_if {|id| id != current_user.id } | |
| 11 | + | |
| 12 | + recipient_ids.each do |recipient_id| | |
| 13 | + Notify.reassigned_issue_email(recipient_id, issue.id, issue.assignee_id_was) | |
| 14 | + end | |
| 15 | + end | |
| 16 | + end | |
| 17 | +end | ... | ... |
| ... | ... | @@ -0,0 +1,67 @@ |
| 1 | +require 'spec_helper' | |
| 2 | + | |
| 3 | +describe IssueObserver do | |
| 4 | + let(:some_user) { Factory.new(:user, :id => 1) } | |
| 5 | + let(:assignee) { Factory.new(:user, :id => 2) } | |
| 6 | + let(:issue) { Factory.new(:issue, :id => 42, :assignee => assignee) } | |
| 7 | + | |
| 8 | + before(:each) { subject.stub(:current_user).and_return(some_user) } | |
| 9 | + | |
| 10 | + subject { IssueObserver.instance } | |
| 11 | + | |
| 12 | + context 'when an issue is created' do | |
| 13 | + | |
| 14 | + it 'sends an email to the assignee' do | |
| 15 | + Notify.should_receive(:new_issue_email).with(issue.id) | |
| 16 | + | |
| 17 | + subject.after_create(issue) | |
| 18 | + end | |
| 19 | + | |
| 20 | + it 'does not send an email to the assignee if assignee created the issue' do | |
| 21 | + subject.stub(:current_user).and_return(assignee) | |
| 22 | + Notify.should_not_receive(:new_issue_email) | |
| 23 | + | |
| 24 | + subject.after_create(issue) | |
| 25 | + end | |
| 26 | + end | |
| 27 | + | |
| 28 | + context 'when an issue is modified' do | |
| 29 | + it 'but not reassigned, does not send a reassigned email' do | |
| 30 | + issue.stub(:assignee_id_changed?).and_return(false) | |
| 31 | + Notify.should_not_receive(:reassigned_issue_email) | |
| 32 | + | |
| 33 | + subject.after_change(issue) | |
| 34 | + end | |
| 35 | + | |
| 36 | + context 'and is reassigned' do | |
| 37 | + let(:previous_assignee) { Factory.new(:user, :id => 3) } | |
| 38 | + | |
| 39 | + before(:each) do | |
| 40 | + issue.stub(:assignee_id_changed?).and_return(true) | |
| 41 | + issue.stub(:assignee_id_was).and_return(previous_assignee.id) | |
| 42 | + end | |
| 43 | + | |
| 44 | + it 'sends a reassigned email to the previous and current assignees' do | |
| 45 | + Notify.should_receive(:reassigned_issue_email).with(assignee.id, issue.id, previous_assignee.id) | |
| 46 | + Notify.should_receive(:reassigned_issue_email).with(previous_assignee.id, issue.id, previous_assignee.id) | |
| 47 | + | |
| 48 | + subject.after_change(issue) | |
| 49 | + end | |
| 50 | + | |
| 51 | + context 'does not send an email to the user who made the reassignment' do | |
| 52 | + it 'if the user is the assignee' do | |
| 53 | + subject.stub(:current_user).and_return(assignee) | |
| 54 | + Notify.should_not_receive(:reassigned_issue_email).with(assignee.id, issue.id, previous_assignee.id) | |
| 55 | + | |
| 56 | + subject.after_change(issue) | |
| 57 | + end | |
| 58 | + it 'if the user is the previous assignee' do | |
| 59 | + subject.stub(:current_user).and_return(previous_assignee) | |
| 60 | + Notify.should_not_receive(:reassigned_issue_email).with(previous_assignee.id, issue.id, previous_assignee.id) | |
| 61 | + | |
| 62 | + subject.after_change(issue) | |
| 63 | + end | |
| 64 | + end | |
| 65 | + end | |
| 66 | + end | |
| 67 | +end | ... | ... |