Commit 4fdb1cf0afeffb67c519fc3405388164f3592ea4

Authored by Rodrigo Souto
1 parent 7c8e3b68

rails3: fix and rewrite task_mailer

app/models/task_mailer.rb
1 1 class TaskMailer < ActionMailer::Base
2 2  
3   - def method_missing(name, *args)
4   - task = args.shift
5   - if task.kind_of?(Task) && task.respond_to?("#{name}_message")
6   - send_message(task, task.send("#{name}_message"), *args)
7   - else
8   - super
9   - end
10   - end
11   -
12 3 def target_notification(task, message)
13   - msg = extract_message(message)
14   -
15   - recipients task.target.notification_emails
16   -
  4 + @message = extract_message(message)
  5 + @target = task.target.name
  6 + @environment = task.environment.name
  7 + @url = generate_environment_url(task, :controller => 'home')
17 8 url_for_tasks_list = task.target.kind_of?(Environment) ? '' : url_for(task.target.tasks_url)
  9 + @tasks_url = url_for_tasks_list
18 10  
19   - from self.class.generate_from(task)
20   - subject '[%s] %s' % [task.environment.name, task.target_notification_description]
21   - body :target => task.target.name,
22   - :message => msg,
23   - :environment => task.environment.name,
24   - :url => generate_environment_url(task, :controller => 'home'),
25   - :tasks_url => url_for_tasks_list
  11 + mail(
  12 + to: task.target.notification_emails,
  13 + from: self.class.generate_from(task),
  14 + subject: "[%s] %s" % [task.environment.name, task.target_notification_description]
  15 + )
26 16 end
27 17  
28 18 def invitation_notification(task)
29 19 msg = task.expanded_message
30   - msg = msg.gsub /<url>/, generate_environment_url(task, :controller => 'account', :action => 'signup', :invitation_code => task.code)
  20 + @message = msg.gsub /<url>/, generate_environment_url(task, :controller => 'account', :action => 'signup', :invitation_code => task.code)
31 21  
32   - recipients task.friend_email
  22 + mail(
  23 + to: task.friend_email,
  24 + from: self.class.generate_from(task),
  25 + subject: '[%s] %s' % [ task.requestor.environment.name, task.target_notification_description ]
  26 + )
  27 + end
33 28  
34   - from self.class.generate_from(task)
35   - subject '[%s] %s' % [ task.requestor.environment.name, task.target_notification_description ]
36   - body :message => msg
  29 + def generic_message(name, task)
  30 + return if !task.respond_to?("#{name}_message")
  31 +
  32 + @message = extract_message(task.send("#{name}_message"))
  33 + @requestor = task.requestor.name
  34 + @environment = task.requestor.environment.name
  35 + @url = url_for(:host => task.requestor.environment.default_hostname, :controller => 'home')
  36 +
  37 + mail(
  38 + to: task.requestor.notification_emails,
  39 + from: self.class.generate_from(task),
  40 + subject: '[%s] %s' % [task.requestor.environment.name, task.target_notification_description]
  41 + )
37 42 end
38 43  
39 44 protected
... ... @@ -46,19 +51,6 @@ class TaskMailer &lt; ActionMailer::Base
46 51 end
47 52 end
48 53  
49   - def send_message(task, message)
50   -
51   - text = extract_message(message)
52   -
53   - recipients task.requestor.notification_emails
54   - from self.class.generate_from(task)
55   - subject '[%s] %s' % [task.requestor.environment.name, task.target_notification_description]
56   - body :requestor => task.requestor.name,
57   - :message => text,
58   - :environment => task.requestor.environment.name,
59   - :url => url_for(:host => task.requestor.environment.default_hostname, :controller => 'home')
60   - end
61   -
62 54 def self.generate_from(task)
63 55 "#{task.environment.name} <#{task.environment.contact_email}>"
64 56 end
... ...
test/unit/task_mailer_test.rb
... ... @@ -4,8 +4,6 @@ class TaskMailerTest &lt; ActiveSupport::TestCase
4 4 FIXTURES_PATH = File.dirname(__FILE__) + '/../fixtures'
5 5 CHARSET = "utf-8"
6 6  
7   - include ActionMailer::Quoting
8   -
9 7 def setup
10 8 ActionMailer::Base.delivery_method = :test
11 9 ActionMailer::Base.perform_deliveries = true
... ... @@ -32,7 +30,7 @@ class TaskMailerTest &lt; ActiveSupport::TestCase
32 30 requestor.expects(:environment).returns(environment).at_least_once
33 31 task.expects(:environment).returns(environment).at_least_once
34 32  
35   - TaskMailer.deliver_task_finished(task)
  33 + TaskMailer.generic_message(:task_finished, task).deliver
36 34 assert !ActionMailer::Base.deliveries.empty?
37 35 end
38 36  
... ... @@ -55,7 +53,7 @@ class TaskMailerTest &lt; ActiveSupport::TestCase
55 53 requestor.expects(:environment).returns(environment).at_least_once
56 54 task.expects(:environment).returns(environment).at_least_once
57 55  
58   - TaskMailer.deliver_task_cancelled(task)
  56 + TaskMailer.generic_message(:task_cancelled, task).deliver
59 57 assert !ActionMailer::Base.deliveries.empty?
60 58 end
61 59  
... ... @@ -79,15 +77,17 @@ class TaskMailerTest &lt; ActiveSupport::TestCase
79 77 requestor.expects(:environment).returns(environment).at_least_once
80 78 task.expects(:environment).returns(environment).at_least_once
81 79  
82   - TaskMailer.deliver_task_created(task)
  80 + TaskMailer.generic_message(:task_created, task).deliver
83 81 assert !ActionMailer::Base.deliveries.empty?
84 82 end
85 83  
86 84 should 'be able to send a "target notification" message' do
87   - task = Task.new(:target => fast_create(Person))
  85 + requestor = fast_create(Person)
  86 + requestor.expects(:notification_emails).returns(['requestor@example.com'])
  87 + task = Task.new(:target => requestor)
88 88 task.expects(:target_notification_description).returns('the task')
89 89  
90   - TaskMailer.deliver_target_notification(task, 'the message')
  90 + TaskMailer.target_notification(task, 'the message').deliver
91 91 assert !ActionMailer::Base.deliveries.empty?
92 92 end
93 93  
... ... @@ -114,13 +114,13 @@ class TaskMailerTest &lt; ActiveSupport::TestCase
114 114 requestor.expects(:environment).returns(environment).at_least_once
115 115 task.expects(:environment).returns(environment).at_least_once
116 116  
117   - mail = TaskMailer.create_invitation_notification(task)
  117 + mail = TaskMailer.invitation_notification(task)
118 118  
119 119 assert_match(/#{task.target_notification_description}/, mail.subject)
120 120  
121   - assert_equal "Hello friend name, my name invite you, please follow this link: http://example.com/account/signup?invitation_code=123456", mail.body
  121 + assert_equal "Hello friend name, my name invite you, please follow this link: http://example.com/account/signup?invitation_code=123456", mail.body.to_s
122 122  
123   - TaskMailer.deliver(mail)
  123 + mail.deliver
124 124 assert !ActionMailer::Base.deliveries.empty?
125 125 end
126 126  
... ...