Skip to content

Commit

Permalink
Support for custom queues on the mailer
Browse files Browse the repository at this point in the history
Credit goes to *Aaron Patterson* (tenderlove)
  • Loading branch information
bcardarella committed Jun 24, 2012
1 parent dee0b23 commit 812d1e8
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 18 deletions.
25 changes: 13 additions & 12 deletions actionmailer/lib/action_mailer/async.rb
Original file line number Original file line Diff line number Diff line change
@@ -1,22 +1,23 @@
require 'delegate' require 'delegate'


module ActionMailer::Async module ActionMailer::Async
def self.included(base) def method_missing(method_name, *args)
base.extend(ClassMethods) if action_methods.include?(method_name.to_s)
QueuedMessage.new(queue, self, method_name, *args)
else
super
end
end end


module ClassMethods def queue
def method_missing(method_name, *args) Rails.queue
if action_methods.include?(method_name.to_s)
QueuedMessage.new(self, method_name, *args)
else
super
end
end
end end


class QueuedMessage < ::Delegator 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 @mailer_class = mailer_class
@method_name = method_name @method_name = method_name
@args = args @args = args
Expand All @@ -37,7 +38,7 @@ def deliver(force = false)
if force if force
run run
else else
Rails.queue << self @queue << self
end end
end end
end end
Expand Down
2 changes: 1 addition & 1 deletion actionmailer/lib/action_mailer/base.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -460,7 +460,7 @@ def respond_to?(method, include_private = false) #:nodoc:
def async=(truth) def async=(truth)
if truth if truth
require 'action_mailer/async' require 'action_mailer/async'
include ActionMailer::Async extend ActionMailer::Async
end end
end end


Expand Down
21 changes: 16 additions & 5 deletions actionmailer/test/base_test.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -422,22 +422,33 @@ def teardown
assert_equal(1, BaseMailer.deliveries.length) assert_equal(1, BaseMailer.deliveries.length)
end end


def stub_queue klass, queue
Class.new(klass) {
extend Module.new {
define_method :queue do
queue
end
}
}
end

test "delivering message asynchronously" do test "delivering message asynchronously" do
Rails.stubs(:queue).returns(Rails::Queueing::TestQueue.new) testing_queue = Rails::Queueing::TestQueue.new
AsyncMailer.delivery_method = :test AsyncMailer.delivery_method = :test
AsyncMailer.deliveries.clear AsyncMailer.deliveries.clear
AsyncMailer.welcome.deliver stub_queue(AsyncMailer, testing_queue).welcome.deliver
assert_equal(0, AsyncMailer.deliveries.length) assert_equal(0, AsyncMailer.deliveries.length)
Rails.queue.drain testing_queue.drain
assert_equal(1, AsyncMailer.deliveries.length) assert_equal(1, AsyncMailer.deliveries.length)
end end


test "forcing message delivery despite asynchronous" do 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.delivery_method = :test
AsyncMailer.deliveries.clear AsyncMailer.deliveries.clear
AsyncMailer.welcome.deliver(true) stub_queue(AsyncMailer, testing_queue).welcome.deliver(true)
assert_equal(1, AsyncMailer.deliveries.length) assert_equal(1, AsyncMailer.deliveries.length)
assert_predicate testing_queue, :empty?
end end


test "calling deliver, ActionMailer should yield back to mail to let it call :do_delivery on itself" do test "calling deliver, ActionMailer should yield back to mail to let it call :do_delivery on itself" do
Expand Down

0 comments on commit 812d1e8

Please sign in to comment.