Commit 973928e0b9d9a7e821cbd4fdef0f6a800eb7915c

Authored by Rodrigo Souto
1 parent bd238bbe

rails3: fix organization_mailing

app/mailers/organization_mailing.rb 0 → 100644
@@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
  1 +class OrganizationMailing < Mailing
  2 +
  3 + def generate_from
  4 + "#{person.name} <#{source.environment.contact_email}>"
  5 + end
  6 +
  7 + def recipients(offset=0, limit=100)
  8 + source.members.all(:order => :id, :offset => offset, :limit => limit, :joins => "LEFT OUTER JOIN mailing_sents m ON (m.mailing_id = #{id} AND m.person_id = profiles.id)", :conditions => { "m.person_id" => nil })
  9 + end
  10 +
  11 + def each_recipient
  12 + offset = 0
  13 + limit = 50
  14 + while !(people = recipients(offset, limit)).empty?
  15 + people.each do |person|
  16 + yield person
  17 + end
  18 + offset = offset + limit
  19 + end
  20 + end
  21 +
  22 + def signature_message
  23 + _('Sent by community %s.') % source.name
  24 + end
  25 +
  26 + include Rails.application.routes.url_helpers
  27 + def url
  28 + url_for(source.url)
  29 + end
  30 +end
app/models/organization_mailing.rb
@@ -1,30 +0,0 @@ @@ -1,30 +0,0 @@
1 -class OrganizationMailing < Mailing  
2 -  
3 - def generate_from  
4 - "#{person.name} <#{source.environment.contact_email}>"  
5 - end  
6 -  
7 - def recipients(offset=0, limit=100)  
8 - source.members.all(:order => :id, :offset => offset, :limit => limit, :joins => "LEFT OUTER JOIN mailing_sents m ON (m.mailing_id = #{id} AND m.person_id = profiles.id)", :conditions => { "m.person_id" => nil })  
9 - end  
10 -  
11 - def each_recipient  
12 - offset = 0  
13 - limit = 50  
14 - while !(people = recipients(offset, limit)).empty?  
15 - people.each do |person|  
16 - yield person  
17 - end  
18 - offset = offset + limit  
19 - end  
20 - end  
21 -  
22 - def signature_message  
23 - _('Sent by community %s.') % source.name  
24 - end  
25 -  
26 - include Rails.application.routes.url_helpers  
27 - def url  
28 - url_for(source.url)  
29 - end  
30 -end  
test/unit/organization_mailing_test.rb
@@ -26,92 +26,90 @@ class OrganizationMailingTest &lt; ActiveSupport::TestCase @@ -26,92 +26,90 @@ class OrganizationMailingTest &lt; ActiveSupport::TestCase
26 end 26 end
27 27
28 should 'return community name' do 28 should 'return community name' do
29 - mailing = OrganizationMailing.new(:source => community) 29 + mailing = build(OrganizationMailing, :source => community)
30 assert_equal community.name, mailing.source.name 30 assert_equal community.name, mailing.source.name
31 end 31 end
32 32
33 should 'return community with source_id' do 33 should 'return community with source_id' do
34 - mailing = OrganizationMailing.new(:source => community) 34 + mailing = build(OrganizationMailing, :source => community)
35 assert_equal community, mailing.source 35 assert_equal community, mailing.source
36 end 36 end
37 37
38 should 'return person with person_id' do 38 should 'return person with person_id' do
39 - mailing = OrganizationMailing.new(:source => community, :person => person) 39 + mailing = build(OrganizationMailing, :source => community, :person => person)
40 assert_equal person, mailing.person 40 assert_equal person, mailing.person
41 end 41 end
42 42
43 should 'display name and email on generate_from' do 43 should 'display name and email on generate_from' do
44 - mailing = OrganizationMailing.new(:source => community, :person => person) 44 + mailing = build(OrganizationMailing, :source => community, :person => person)
45 assert_equal "#{person.name} <#{community.environment.contact_email}>", mailing.generate_from 45 assert_equal "#{person.name} <#{community.environment.contact_email}>", mailing.generate_from
46 end 46 end
47 47
48 should 'generate subject' do 48 should 'generate subject' do
49 - mailing = OrganizationMailing.new(:source => community, :subject => 'Hello :)') 49 + mailing = build(OrganizationMailing, :source => community, :subject => 'Hello :)')
50 assert_equal "[#{community.name}] #{mailing.subject}", mailing.generate_subject 50 assert_equal "[#{community.name}] #{mailing.subject}", mailing.generate_subject
51 end 51 end
52 52
53 should 'return signature message' do 53 should 'return signature message' do
54 - mailing = OrganizationMailing.new(:source => community) 54 + mailing = build(OrganizationMailing, :source => community)
55 assert_equal "Sent by community #{community.name}.", mailing.signature_message 55 assert_equal "Sent by community #{community.name}.", mailing.signature_message
56 end 56 end
57 57
58 should 'return url for organization on url' do 58 should 'return url for organization on url' do
59 - mailing = OrganizationMailing.new(:source => community)  
60 - assert_equal "#{community.environment.top_url}/#{community.name.to_slug}", mailing.url 59 + mailing = build(OrganizationMailing, :source => community)
  60 + assert_equal "#{community.environment.top_url}/#{community.name.to_slug}/", mailing.url
61 end 61 end
62 62
63 should 'deliver mailing to each member after create' do 63 should 'deliver mailing to each member after create' do
64 - mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) 64 + create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :person => person)
65 process_delayed_job_queue 65 process_delayed_job_queue
66 - assert_equal 2, ActionMailer::Base.deliveries.count 66 + assert_equal community.members.compact.count, ActionMailer::Base.deliveries.count
67 end 67 end
68 68
69 should 'deliver mailing when there are many mailings created' do 69 should 'deliver mailing when there are many mailings created' do
70 - 50.times { OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) } 70 + 50.times { create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :person => person) }
71 process_delayed_job_queue 71 process_delayed_job_queue
72 - assert_equal 50*community.members_count, ActionMailer::Base.deliveries.count 72 + assert_equal 50*community.members.compact.count, ActionMailer::Base.deliveries.count
73 end 73 end
74 74
75 should 'create mailing sent to each recipient after delivering mailing' do 75 should 'create mailing sent to each recipient after delivering mailing' do
76 - mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) 76 + mailing = create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :person => person)
77 assert_difference MailingSent, :count, 2 do 77 assert_difference MailingSent, :count, 2 do
78 process_delayed_job_queue 78 process_delayed_job_queue
79 end 79 end
80 end 80 end
81 81
82 should 'change locale according to the mailing locale' do 82 should 'change locale according to the mailing locale' do
83 - mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :locale => 'pt', :person => person) 83 + mailing = create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :locale => 'pt', :person => person)
84 Noosfero.expects(:with_locale).with('pt') 84 Noosfero.expects(:with_locale).with('pt')
85 process_delayed_job_queue 85 process_delayed_job_queue
86 end 86 end
87 87
88 should 'have community by source_id' do 88 should 'have community by source_id' do
89 - mailing = community.mailings.build(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person)  
90 - mailing.save!  
91 - 89 + mailing = create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :person => person)
92 assert_equal community, Mailing.find(mailing.id).source 90 assert_equal community, Mailing.find(mailing.id).source
93 end 91 end
94 92
95 should 'return recipient' do 93 should 'return recipient' do
96 - mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) 94 + mailing = create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :person => person)
97 assert_equal [Person['user_one'], Person['user_two']], mailing.recipients 95 assert_equal [Person['user_one'], Person['user_two']], mailing.recipients
98 end 96 end
99 97
100 should 'return recipients according to limit' do 98 should 'return recipients according to limit' do
101 - mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) 99 + mailing = create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :person => person)
102 assert_equal [Person['user_one']], mailing.recipients(0, 1) 100 assert_equal [Person['user_one']], mailing.recipients(0, 1)
103 end 101 end
104 102
105 should 'return true if already sent mailing to a recipient' do 103 should 'return true if already sent mailing to a recipient' do
106 member = Person['user_one'] 104 member = Person['user_one']
107 - mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) 105 + mailing = create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :person => person)
108 process_delayed_job_queue 106 process_delayed_job_queue
109 assert mailing.mailing_sents.find_by_person_id(member.id) 107 assert mailing.mailing_sents.find_by_person_id(member.id)
110 end 108 end
111 109
112 should 'return false if did not sent mailing to a recipient' do 110 should 'return false if did not sent mailing to a recipient' do
113 recipient = fast_create(Person) 111 recipient = fast_create(Person)
114 - mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) 112 + mailing = create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :person => person)
115 process_delayed_job_queue 113 process_delayed_job_queue
116 114
117 assert !mailing.mailing_sents.find_by_person_id(recipient.id) 115 assert !mailing.mailing_sents.find_by_person_id(recipient.id)