From 973928e0b9d9a7e821cbd4fdef0f6a800eb7915c Mon Sep 17 00:00:00 2001 From: Rodrigo Souto Date: Fri, 6 Sep 2013 01:47:02 +0000 Subject: [PATCH] rails3: fix organization_mailing --- app/mailers/organization_mailing.rb | 30 ++++++++++++++++++++++++++++++ app/models/organization_mailing.rb | 30 ------------------------------ test/unit/organization_mailing_test.rb | 40 +++++++++++++++++++--------------------- 3 files changed, 49 insertions(+), 51 deletions(-) create mode 100644 app/mailers/organization_mailing.rb delete mode 100644 app/models/organization_mailing.rb diff --git a/app/mailers/organization_mailing.rb b/app/mailers/organization_mailing.rb new file mode 100644 index 0000000..0f157c4 --- /dev/null +++ b/app/mailers/organization_mailing.rb @@ -0,0 +1,30 @@ +class OrganizationMailing < Mailing + + def generate_from + "#{person.name} <#{source.environment.contact_email}>" + end + + def recipients(offset=0, limit=100) + 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 }) + end + + def each_recipient + offset = 0 + limit = 50 + while !(people = recipients(offset, limit)).empty? + people.each do |person| + yield person + end + offset = offset + limit + end + end + + def signature_message + _('Sent by community %s.') % source.name + end + + include Rails.application.routes.url_helpers + def url + url_for(source.url) + end +end diff --git a/app/models/organization_mailing.rb b/app/models/organization_mailing.rb deleted file mode 100644 index 482c2dd..0000000 --- a/app/models/organization_mailing.rb +++ /dev/null @@ -1,30 +0,0 @@ -class OrganizationMailing < Mailing - - def generate_from - "#{person.name} <#{source.environment.contact_email}>" - end - - def recipients(offset=0, limit=100) - 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 }) - end - - def each_recipient - offset = 0 - limit = 50 - while !(people = recipients(offset, limit)).empty? - people.each do |person| - yield person - end - offset = offset + limit - end - end - - def signature_message - _('Sent by community %s.') % source.name - end - - include Rails.application.routes.url_helpers - def url - url_for(source.url) - end -end diff --git a/test/unit/organization_mailing_test.rb b/test/unit/organization_mailing_test.rb index 3beaa89..dd26c31 100644 --- a/test/unit/organization_mailing_test.rb +++ b/test/unit/organization_mailing_test.rb @@ -26,92 +26,90 @@ class OrganizationMailingTest < ActiveSupport::TestCase end should 'return community name' do - mailing = OrganizationMailing.new(:source => community) + mailing = build(OrganizationMailing, :source => community) assert_equal community.name, mailing.source.name end should 'return community with source_id' do - mailing = OrganizationMailing.new(:source => community) + mailing = build(OrganizationMailing, :source => community) assert_equal community, mailing.source end should 'return person with person_id' do - mailing = OrganizationMailing.new(:source => community, :person => person) + mailing = build(OrganizationMailing, :source => community, :person => person) assert_equal person, mailing.person end should 'display name and email on generate_from' do - mailing = OrganizationMailing.new(:source => community, :person => person) + mailing = build(OrganizationMailing, :source => community, :person => person) assert_equal "#{person.name} <#{community.environment.contact_email}>", mailing.generate_from end should 'generate subject' do - mailing = OrganizationMailing.new(:source => community, :subject => 'Hello :)') + mailing = build(OrganizationMailing, :source => community, :subject => 'Hello :)') assert_equal "[#{community.name}] #{mailing.subject}", mailing.generate_subject end should 'return signature message' do - mailing = OrganizationMailing.new(:source => community) + mailing = build(OrganizationMailing, :source => community) assert_equal "Sent by community #{community.name}.", mailing.signature_message end should 'return url for organization on url' do - mailing = OrganizationMailing.new(:source => community) - assert_equal "#{community.environment.top_url}/#{community.name.to_slug}", mailing.url + mailing = build(OrganizationMailing, :source => community) + assert_equal "#{community.environment.top_url}/#{community.name.to_slug}/", mailing.url end should 'deliver mailing to each member after create' do - mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) + create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :person => person) process_delayed_job_queue - assert_equal 2, ActionMailer::Base.deliveries.count + assert_equal community.members.compact.count, ActionMailer::Base.deliveries.count end should 'deliver mailing when there are many mailings created' do - 50.times { OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) } + 50.times { create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :person => person) } process_delayed_job_queue - assert_equal 50*community.members_count, ActionMailer::Base.deliveries.count + assert_equal 50*community.members.compact.count, ActionMailer::Base.deliveries.count end should 'create mailing sent to each recipient after delivering mailing' do - mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) + mailing = create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :person => person) assert_difference MailingSent, :count, 2 do process_delayed_job_queue end end should 'change locale according to the mailing locale' do - mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :locale => 'pt', :person => person) + mailing = create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :locale => 'pt', :person => person) Noosfero.expects(:with_locale).with('pt') process_delayed_job_queue end should 'have community by source_id' do - mailing = community.mailings.build(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) - mailing.save! - + mailing = create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :person => person) assert_equal community, Mailing.find(mailing.id).source end should 'return recipient' do - mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) + mailing = create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :person => person) assert_equal [Person['user_one'], Person['user_two']], mailing.recipients end should 'return recipients according to limit' do - mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) + mailing = create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :person => person) assert_equal [Person['user_one']], mailing.recipients(0, 1) end should 'return true if already sent mailing to a recipient' do member = Person['user_one'] - mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) + mailing = create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :person => person) process_delayed_job_queue assert mailing.mailing_sents.find_by_person_id(member.id) end should 'return false if did not sent mailing to a recipient' do recipient = fast_create(Person) - mailing = OrganizationMailing.create(:source => community, :subject => 'Hello', :body => 'We have some news', :person => person) + mailing = create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :person => person) process_delayed_job_queue assert !mailing.mailing_sents.find_by_person_id(recipient.id) -- libgit2 0.21.2