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 | ... | ... |