Commit 2bd1682a authored by Alex Denisov's avatar Alex Denisov

Merge branch 'master' into api_project_creation

parents 9811e64d ed954eba
...@@ -83,6 +83,14 @@ class Notify < ActionMailer::Base ...@@ -83,6 +83,14 @@ class Notify < ActionMailer::Base
subject: subject("access to project was granted")) subject: subject("access to project was granted"))
end end
def issue_status_changed_email(recipient_id, issue_id, status, updated_by_user_id)
@issue = Issue.find issue_id
@issue_status = status
@updated_by = User.find updated_by_user_id
mail(to: recipient(recipient_id),
subject: subject("changed issue ##{@issue.id}", @issue.title))
end
private private
# Look up a User by their ID and return their email address # Look up a User by their ID and return their email address
......
...@@ -9,8 +9,16 @@ class IssueObserver < ActiveRecord::Observer ...@@ -9,8 +9,16 @@ class IssueObserver < ActiveRecord::Observer
def after_update(issue) def after_update(issue)
send_reassigned_email(issue) if issue.is_being_reassigned? send_reassigned_email(issue) if issue.is_being_reassigned?
Note.create_status_change_note(issue, current_user, 'closed') if issue.is_being_closed?
Note.create_status_change_note(issue, current_user, 'reopened') if issue.is_being_reopened? status = nil
status = 'closed' if issue.is_being_closed?
status = 'reopened' if issue.is_being_reopened?
if status
Note.create_status_change_note(issue, current_user, status)
[issue.author, issue.assignee].compact.each do |recipient|
Notify.issue_status_changed_email(recipient.id, issue.id, status, current_user)
end
end
end end
protected protected
......
%td.content{align: "left", style: "font-family: Helvetica, Arial, sans-serif; padding: 20px 0 0;", valign: "top", width: "600"}
%table{border: "0", cellpadding: "0", cellspacing: "0", style: "color: #717171; font: normal 11px Helvetica, Arial, sans-serif; margin: 0; padding: 0;", width: "600"}
%tr
%td{style: "font-size: 1px; line-height: 1px;", width: "21"}
%td{align: "left", style: "padding: 20px 0 0;"}
%h2{style: "color:#646464; font-weight: bold; margin: 0; padding: 0; line-height: 26px; font-size: 18px; font-family: Helvetica, Arial, sans-serif; "}
= "Issue was #{@issue_status} by #{@updated_by.name}"
%td{style: "font-size: 1px; line-height: 1px;", width: "21"}
%tr
%td{style: "font-size: 1px; line-height: 1px;", width: "21"}
%td{align: "left", style: "padding: 20px 0 0;"}
%h2{style: "color:#646464 !important; font-weight: bold; margin: 0; padding: 0; line-height: 26px; font-size: 18px; font-family: Helvetica, Arial, sans-serif; "}
= "Issue ##{@issue.id}"
= link_to_gfm truncate(@issue.title, length: 45), project_issue_url(@issue.project, @issue), title: @issue.title
%br
...@@ -91,6 +91,29 @@ describe Notify do ...@@ -91,6 +91,29 @@ describe Notify do
should have_body_text /#{project_issue_path project, issue}/ should have_body_text /#{project_issue_path project, issue}/
end end
end end
describe 'status changed' do
let(:current_user) { Factory.create :user, email: "current@email.com" }
let(:status) { 'closed' }
subject { Notify.issue_status_changed_email(recipient.id, issue.id, status, current_user) }
it 'has the correct subject' do
should have_subject /changed issue ##{issue.id} \| #{issue.title}/i
end
it 'contains the new status' do
should have_body_text /#{status}/i
end
it 'contains the user name' do
should have_body_text /#{current_user.name}/i
end
it 'contains a link to the issue' do
should have_body_text /#{project_issue_path project, issue}/
end
end
end end
context 'for merge requests' do context 'for merge requests' do
......
...@@ -3,7 +3,8 @@ require 'spec_helper' ...@@ -3,7 +3,8 @@ require 'spec_helper'
describe IssueObserver do describe IssueObserver do
let(:some_user) { double(:user, id: 1) } let(:some_user) { double(:user, id: 1) }
let(:assignee) { double(:user, id: 2) } let(:assignee) { double(:user, id: 2) }
let(:issue) { double(:issue, id: 42, assignee: assignee) } let(:author) { double(:user, id: 3) }
let(:issue) { double(:issue, id: 42, assignee: assignee, author: author) }
before(:each) { subject.stub(:current_user).and_return(some_user) } before(:each) { subject.stub(:current_user).and_return(some_user) }
...@@ -67,36 +68,90 @@ describe IssueObserver do ...@@ -67,36 +68,90 @@ describe IssueObserver do
end end
end end
context 'a status "closed" note' do context 'a status "closed"' do
it 'is created if the issue is being closed' do it 'note is created if the issue is being closed' do
issue.should_receive(:is_being_closed?).and_return(true) issue.should_receive(:is_being_closed?).and_return(true)
Note.should_receive(:create_status_change_note).with(issue, some_user, 'closed') Note.should_receive(:create_status_change_note).with(issue, some_user, 'closed')
subject.after_update(issue) subject.after_update(issue)
end end
it 'is not created if the issue is not being closed' do it 'note is not created if the issue is not being closed' do
issue.should_receive(:is_being_closed?).and_return(false) issue.should_receive(:is_being_closed?).and_return(false)
Note.should_not_receive(:create_status_change_note).with(issue, some_user, 'closed') Note.should_not_receive(:create_status_change_note).with(issue, some_user, 'closed')
subject.after_update(issue) subject.after_update(issue)
end end
it 'notification is delivered if the issue being closed' do
issue.stub(:is_being_closed?).and_return(true)
Notify.should_receive(:issue_status_changed_email).twice
Note.should_receive(:create_status_change_note).with(issue, some_user, 'closed')
subject.after_update(issue)
end
it 'notification is not delivered if the issue not being closed' do
issue.stub(:is_being_closed?).and_return(false)
Notify.should_not_receive(:issue_status_changed_email)
Note.should_not_receive(:create_status_change_note).with(issue, some_user, 'closed')
subject.after_update(issue)
end
it 'notification is delivered only to author if the issue being closed' do
issue_without_assignee = double(:issue, id: 42, author: author, assignee: nil)
issue_without_assignee.stub(:is_being_reassigned?).and_return(false)
issue_without_assignee.stub(:is_being_closed?).and_return(true)
issue_without_assignee.stub(:is_being_reopened?).and_return(false)
Notify.should_receive(:issue_status_changed_email).once
Note.should_receive(:create_status_change_note).with(issue_without_assignee, some_user, 'closed')
subject.after_update(issue_without_assignee)
end
end end
context 'a status "reopened" note' do context 'a status "reopened"' do
it 'is created if the issue is being reopened' do it 'note is created if the issue is being reopened' do
issue.should_receive(:is_being_reopened?).and_return(true) issue.should_receive(:is_being_reopened?).and_return(true)
Note.should_receive(:create_status_change_note).with(issue, some_user, 'reopened') Note.should_receive(:create_status_change_note).with(issue, some_user, 'reopened')
subject.after_update(issue) subject.after_update(issue)
end end
it 'is not created if the issue is not being reopened' do it 'note is not created if the issue is not being reopened' do
issue.should_receive(:is_being_reopened?).and_return(false) issue.should_receive(:is_being_reopened?).and_return(false)
Note.should_not_receive(:create_status_change_note).with(issue, some_user, 'reopened') Note.should_not_receive(:create_status_change_note).with(issue, some_user, 'reopened')
subject.after_update(issue) subject.after_update(issue)
end end
it 'notification is delivered if the issue being reopened' do
issue.stub(:is_being_reopened?).and_return(true)
Notify.should_receive(:issue_status_changed_email).twice
Note.should_receive(:create_status_change_note).with(issue, some_user, 'reopened')
subject.after_update(issue)
end
it 'notification is not delivered if the issue not being reopened' do
issue.stub(:is_being_reopened?).and_return(false)
Notify.should_not_receive(:issue_status_changed_email)
Note.should_not_receive(:create_status_change_note).with(issue, some_user, 'reopened')
subject.after_update(issue)
end
it 'notification is delivered only to author if the issue being reopened' do
issue_without_assignee = double(:issue, id: 42, author: author, assignee: nil)
issue_without_assignee.stub(:is_being_reassigned?).and_return(false)
issue_without_assignee.stub(:is_being_closed?).and_return(false)
issue_without_assignee.stub(:is_being_reopened?).and_return(true)
Notify.should_receive(:issue_status_changed_email).once
Note.should_receive(:create_status_change_note).with(issue_without_assignee, some_user, 'reopened')
subject.after_update(issue_without_assignee)
end
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment