organization_mailing_test.rb 4.75 KB
require_relative "../test_helper"

class OrganizationMailingTest < ActiveSupport::TestCase

  def setup
    ActionMailer::Base.delivery_method = :test
    ActionMailer::Base.perform_deliveries = true
    ActionMailer::Base.deliveries = []
    @community = fast_create(Community)
    @person = create_user('john').person
    member_1 = create_user('user_one').person
    member_2 = create_user('user_two').person
    @community.add_member(member_1)
    @community.add_member(member_2)
  end
  attr_reader :community, :person

  should 'require source_id' do
    mailing = OrganizationMailing.new
    mailing.valid?
    assert mailing.errors[:source_id.to_s].present?

    mailing.source_id = community.id
    mailing.valid?
    assert !mailing.errors[:source_id.to_s].present?
  end

  should 'return community name' do
    mailing = build(OrganizationMailing, :source => community)
    assert_equal community.name, mailing.source.name
  end

  should 'return community with source_id' do
    mailing = build(OrganizationMailing, :source => community)
    assert_equal community, mailing.source
  end

  should 'return person with person_id' do
    mailing = build(OrganizationMailing, :source => community, :person => person)
    assert_equal person, mailing.person
  end

  should 'display name and email on generate_from' do
    mailing = build(OrganizationMailing, :source => community, :person => person)
    assert_equal "#{person.name} <#{community.environment.noreply_email}>", mailing.generate_from
  end

  should 'generate subject' do
    mailing = build(OrganizationMailing, :source => community, :subject => 'Hello :)')
    assert_equal "[#{community.name}] #{mailing.subject}", mailing.generate_subject
  end

  should 'return signature message' do
    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 = 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 = create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :person => person)
    community.reload
    process_delayed_job_queue
    assert_equal 2, ActionMailer::Base.deliveries.count
  end

  should 'deliver mailing when there are many mailings created' do
    50.times { create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :person => person) }
    community.reload
    process_delayed_job_queue
    assert_equal 50*community.members_count, ActionMailer::Base.deliveries.count
  end

  should 'create mailing sent to each recipient after delivering mailing' do
    mailing = create(OrganizationMailing, :source => community, :subject => 'Hello', :body => 'We have some news', :person => person)
    community.reload
    assert_difference 'MailingSent.count', 2 do
      process_delayed_job_queue
    end
  end

  should 'change locale according to the mailing locale' do
    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 = 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 = 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 = 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 = 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 = 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)
  end

  protected
  include NoosferoTestHelper

end