diff options
Diffstat (limited to 'actionmailer')
-rw-r--r-- | actionmailer/lib/action_mailer/async.rb | 25 | ||||
-rw-r--r-- | actionmailer/lib/action_mailer/base.rb | 2 | ||||
-rw-r--r-- | actionmailer/test/base_test.rb | 21 |
3 files changed, 30 insertions, 18 deletions
diff --git a/actionmailer/lib/action_mailer/async.rb b/actionmailer/lib/action_mailer/async.rb index 6fcc94d50e..d7c34c1a7b 100644 --- a/actionmailer/lib/action_mailer/async.rb +++ b/actionmailer/lib/action_mailer/async.rb @@ -1,22 +1,23 @@ require 'delegate' module ActionMailer::Async - def self.included(base) - base.extend(ClassMethods) + def method_missing(method_name, *args) + if action_methods.include?(method_name.to_s) + QueuedMessage.new(queue, self, method_name, *args) + else + super + end end - module ClassMethods - def method_missing(method_name, *args) - if action_methods.include?(method_name.to_s) - QueuedMessage.new(self, method_name, *args) - else - super - end - end + def queue + Rails.queue end class QueuedMessage < ::Delegator - def initialize(mailer_class, method_name, *args) + attr_reader :queue + + def initialize(queue, mailer_class, method_name, *args) + @queue = queue @mailer_class = mailer_class @method_name = method_name @args = args @@ -37,7 +38,7 @@ module ActionMailer::Async if force run else - Rails.queue << self + @queue << self end end end diff --git a/actionmailer/lib/action_mailer/base.rb b/actionmailer/lib/action_mailer/base.rb index 5686e78dfc..1f6c00ce11 100644 --- a/actionmailer/lib/action_mailer/base.rb +++ b/actionmailer/lib/action_mailer/base.rb @@ -460,7 +460,7 @@ module ActionMailer #:nodoc: def async=(truth) if truth require 'action_mailer/async' - include ActionMailer::Async + extend ActionMailer::Async end end diff --git a/actionmailer/test/base_test.rb b/actionmailer/test/base_test.rb index 908ce719b5..f1988a8230 100644 --- a/actionmailer/test/base_test.rb +++ b/actionmailer/test/base_test.rb @@ -422,22 +422,33 @@ class BaseTest < ActiveSupport::TestCase assert_equal(1, BaseMailer.deliveries.length) end + def stub_queue klass, queue + Class.new(klass) { + extend Module.new { + define_method :queue do + queue + end + } + } + end + test "delivering message asynchronously" do - Rails.stubs(:queue).returns(Rails::Queueing::TestQueue.new) + testing_queue = Rails::Queueing::TestQueue.new AsyncMailer.delivery_method = :test AsyncMailer.deliveries.clear - AsyncMailer.welcome.deliver + stub_queue(AsyncMailer, testing_queue).welcome.deliver assert_equal(0, AsyncMailer.deliveries.length) - Rails.queue.drain + testing_queue.drain assert_equal(1, AsyncMailer.deliveries.length) end test "forcing message delivery despite asynchronous" do - Rails.stubs(:queue).returns(Rails::Queueing::TestQueue.new) + testing_queue = Rails::Queueing::TestQueue.new AsyncMailer.delivery_method = :test AsyncMailer.deliveries.clear - AsyncMailer.welcome.deliver(true) + stub_queue(AsyncMailer, testing_queue).welcome.deliver(true) assert_equal(1, AsyncMailer.deliveries.length) + assert_predicate testing_queue, :empty? end test "calling deliver, ActionMailer should yield back to mail to let it call :do_delivery on itself" do |