Commit 7c8e3b6858c950b237146db765c6da4281209166
1 parent
6d2a0edf
Exists in
staging
and in
42 other branches
rails3: fix mailing tests
Showing
5 changed files
with
92 additions
and
90 deletions
Show diff stats
| ... | ... | @@ -0,0 +1,65 @@ |
| 1 | +require 'mailing_job' | |
| 2 | + | |
| 3 | +class Mailing < ActiveRecord::Base | |
| 4 | + | |
| 5 | + attr_accessible :subject, :body | |
| 6 | + validates_presence_of :source_id, :subject, :body | |
| 7 | + belongs_to :source, :foreign_key => :source_id, :polymorphic => true | |
| 8 | + belongs_to :person | |
| 9 | + | |
| 10 | + has_many :mailing_sents | |
| 11 | + | |
| 12 | + xss_terminate :only => [ :subject, :body ], :with => 'white_list', :on => 'validation' | |
| 13 | + | |
| 14 | + after_create do |mailing| | |
| 15 | + mailing.schedule | |
| 16 | + end | |
| 17 | + | |
| 18 | + def schedule | |
| 19 | + Delayed::Job.enqueue MailingJob.new(self.id) | |
| 20 | + end | |
| 21 | + | |
| 22 | + def generate_from | |
| 23 | + "#{source.name} <#{source.contact_email}>" | |
| 24 | + end | |
| 25 | + | |
| 26 | + def generate_subject | |
| 27 | + '[%s] %s' % [source.name, subject] | |
| 28 | + end | |
| 29 | + | |
| 30 | + def signature_message | |
| 31 | + _('Sent by Noosfero.') | |
| 32 | + end | |
| 33 | + | |
| 34 | + def url | |
| 35 | + '' | |
| 36 | + end | |
| 37 | + | |
| 38 | + def deliver | |
| 39 | + each_recipient do |recipient| | |
| 40 | + begin | |
| 41 | + Mailing::Sender.notification(self, recipient.email).deliver | |
| 42 | + self.mailing_sents.create(:person => recipient) | |
| 43 | + rescue Exception | |
| 44 | + # FIXME should not discard errors silently. An idea is to collect all | |
| 45 | + # errors and generate a task (notification) for the +source+ | |
| 46 | + # (environment/organization) listing these errors. | |
| 47 | + end | |
| 48 | + end | |
| 49 | + end | |
| 50 | + | |
| 51 | + class Sender < ActionMailer::Base | |
| 52 | + def notification(mailing, recipient) | |
| 53 | + @message = mailing.body | |
| 54 | + @signature_message = mailing.signature_message | |
| 55 | + @url = mailing.url | |
| 56 | + mail( | |
| 57 | + :content_type => 'text/html', | |
| 58 | + :recipients => recipient, | |
| 59 | + :from => mailing.generate_from, | |
| 60 | + :reply_to => mailing.person.email, | |
| 61 | + :subject => mailing.generate_subject | |
| 62 | + ) | |
| 63 | + end | |
| 64 | + end | |
| 65 | +end | ... | ... |
app/models/mailing.rb
| ... | ... | @@ -1,63 +0,0 @@ |
| 1 | -require 'mailing_job' | |
| 2 | - | |
| 3 | -class Mailing < ActiveRecord::Base | |
| 4 | - | |
| 5 | - attr_accessible :subject, :body | |
| 6 | - validates_presence_of :source_id, :subject, :body | |
| 7 | - belongs_to :source, :foreign_key => :source_id, :polymorphic => true | |
| 8 | - belongs_to :person | |
| 9 | - | |
| 10 | - has_many :mailing_sents | |
| 11 | - | |
| 12 | - xss_terminate :only => [ :subject, :body ], :with => 'white_list', :on => 'validation' | |
| 13 | - | |
| 14 | - after_create do |mailing| | |
| 15 | - mailing.schedule | |
| 16 | - end | |
| 17 | - | |
| 18 | - def schedule | |
| 19 | - Delayed::Job.enqueue MailingJob.new(self.id) | |
| 20 | - end | |
| 21 | - | |
| 22 | - def generate_from | |
| 23 | - "#{source.name} <#{source.contact_email}>" | |
| 24 | - end | |
| 25 | - | |
| 26 | - def generate_subject | |
| 27 | - '[%s] %s' % [source.name, subject] | |
| 28 | - end | |
| 29 | - | |
| 30 | - def signature_message | |
| 31 | - _('Sent by Noosfero.') | |
| 32 | - end | |
| 33 | - | |
| 34 | - def url | |
| 35 | - '' | |
| 36 | - end | |
| 37 | - | |
| 38 | - def deliver | |
| 39 | - each_recipient do |recipient| | |
| 40 | - begin | |
| 41 | - Mailing::Sender.deliver_mail(self, recipient.email) | |
| 42 | - self.mailing_sents.create(:person => recipient) | |
| 43 | - rescue Exception | |
| 44 | - # FIXME should not discard errors silently. An idea is to collect all | |
| 45 | - # errors and generate a task (notification) for the +source+ | |
| 46 | - # (environment/organization) listing these errors. | |
| 47 | - end | |
| 48 | - end | |
| 49 | - end | |
| 50 | - | |
| 51 | - class Sender < ActionMailer::Base | |
| 52 | - def mail(mailing, recipient) | |
| 53 | - content_type 'text/html' | |
| 54 | - recipients recipient | |
| 55 | - from mailing.generate_from | |
| 56 | - reply_to mailing.person.email | |
| 57 | - subject mailing.generate_subject | |
| 58 | - body :message => mailing.body, | |
| 59 | - :signature_message => mailing.signature_message, | |
| 60 | - :url => mailing.url | |
| 61 | - end | |
| 62 | - end | |
| 63 | -end |
app/views/mailing/sender/mail.html.erb
| ... | ... | @@ -1,17 +0,0 @@ |
| 1 | -<!DOCTYPE html> | |
| 2 | -<html> | |
| 3 | - <head> | |
| 4 | - <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> | |
| 5 | - </head> | |
| 6 | - <body> | |
| 7 | - <%= word_wrap(@message) %> | |
| 8 | - <p> | |
| 9 | - --<br/> | |
| 10 | - <%= @signature_message %><br/> | |
| 11 | - <%= @url %> | |
| 12 | - </p> | |
| 13 | - </body> | |
| 14 | -</html> | |
| 15 | - | |
| 16 | - | |
| 17 | - |
| ... | ... | @@ -0,0 +1,17 @@ |
| 1 | +<!DOCTYPE html> | |
| 2 | +<html> | |
| 3 | + <head> | |
| 4 | + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> | |
| 5 | + </head> | |
| 6 | + <body> | |
| 7 | + <%= word_wrap(@message) %> | |
| 8 | + <p> | |
| 9 | + --<br/> | |
| 10 | + <%= @signature_message %><br/> | |
| 11 | + <%= @url %> | |
| 12 | + </p> | |
| 13 | + </body> | |
| 14 | +</html> | |
| 15 | + | |
| 16 | + | |
| 17 | + | ... | ... |
test/unit/mailing_test.rb
| ... | ... | @@ -51,50 +51,50 @@ class MailingTest < ActiveSupport::TestCase |
| 51 | 51 | end |
| 52 | 52 | |
| 53 | 53 | should 'return source' do |
| 54 | - mailing = Mailing.create(:source => environment, :subject => 'Hello', :body => 'We have some news') | |
| 54 | + mailing = create(Mailing, :source => environment, :subject => 'Hello', :body => 'We have some news') | |
| 55 | 55 | assert_equal environment, Mailing.find(mailing.id).source |
| 56 | 56 | end |
| 57 | 57 | |
| 58 | 58 | should 'return source name' do |
| 59 | - mailing = Mailing.new(:source => environment) | |
| 59 | + mailing = build(Mailing, :source => environment) | |
| 60 | 60 | assert_equal environment.name, mailing.source.name |
| 61 | 61 | end |
| 62 | 62 | |
| 63 | 63 | should 'return source with source_id' do |
| 64 | - mailing = Mailing.new(:source => environment) | |
| 64 | + mailing = build(Mailing, :source => environment) | |
| 65 | 65 | assert_equal environment, mailing.source |
| 66 | 66 | end |
| 67 | 67 | |
| 68 | 68 | should 'return person with person_id' do |
| 69 | 69 | person = Person['user_one'] |
| 70 | - mailing = Mailing.new(:source => environment, :person => person) | |
| 70 | + mailing = build(Mailing, :source => environment, :person => person) | |
| 71 | 71 | assert_equal person, mailing.person |
| 72 | 72 | end |
| 73 | 73 | |
| 74 | 74 | should 'display name and email on generate_from' do |
| 75 | 75 | person = Person['user_one'] |
| 76 | - mailing = Mailing.new(:source => environment, :person => person) | |
| 76 | + mailing = build(Mailing, :source => environment, :person => person) | |
| 77 | 77 | assert_equal "#{environment.name} <#{environment.contact_email}>", mailing.generate_from |
| 78 | 78 | end |
| 79 | 79 | |
| 80 | 80 | should 'generate subject' do |
| 81 | - mailing = Mailing.new(:source => environment, :subject => 'Hello :)') | |
| 81 | + mailing = build(Mailing, :source => environment, :subject => 'Hello :)') | |
| 82 | 82 | assert_equal "[#{environment.name}] #{mailing.subject}", mailing.generate_subject |
| 83 | 83 | end |
| 84 | 84 | |
| 85 | 85 | should 'return signature message' do |
| 86 | - mailing = Mailing.new(:source => environment) | |
| 86 | + mailing = build(Mailing, :source => environment) | |
| 87 | 87 | assert_equal 'Sent by Noosfero.', mailing.signature_message |
| 88 | 88 | end |
| 89 | 89 | |
| 90 | 90 | should 'return blank string on url' do |
| 91 | - mailing = Mailing.new(:source => environment) | |
| 92 | - environment.domains << Domain.create(:name => 'noosfero.net', :is_default => true) | |
| 91 | + mailing = build(Mailing, :source => environment) | |
| 92 | + environment.domains << create(Domain, :name => 'noosfero.net', :is_default => true) | |
| 93 | 93 | assert_equal '', mailing.url |
| 94 | 94 | end |
| 95 | 95 | |
| 96 | 96 | should 'process the entire batch even if individual emails crash' do |
| 97 | - mailing = Mailing.new(:source => environment, :person => Person['user_one'], :body => 'test', :subject => 'test') | |
| 97 | + mailing = build(Mailing, :source => environment, :person => Person['user_one'], :body => 'test', :subject => 'test') | |
| 98 | 98 | def mailing.each_recipient |
| 99 | 99 | user_one = Person['user_one'] |
| 100 | 100 | user_two = Person['user_two'] | ... | ... |