aboutsummaryrefslogtreecommitdiffstats
path: root/actionmailer
diff options
context:
space:
mode:
Diffstat (limited to 'actionmailer')
-rw-r--r--actionmailer/lib/action_mailer/async.rb25
-rw-r--r--actionmailer/lib/action_mailer/base.rb2
-rw-r--r--actionmailer/test/base_test.rb21
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