From 6db0f4702e9fef85f2e1122dbf270997cd7ab0b4 Mon Sep 17 00:00:00 2001 From: Sean Devine Date: Sun, 30 Nov 2014 21:23:37 -0500 Subject: [PATCH] use deliver_now if possible in preparation for Rails 5 --- lib/devise/async/backend/base.rb | 14 +++++++++++++- test/devise/async/backend/base_test.rb | 21 +++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/lib/devise/async/backend/base.rb b/lib/devise/async/backend/base.rb index adb1206..69153ce 100644 --- a/lib/devise/async/backend/base.rb +++ b/lib/devise/async/backend/base.rb @@ -13,7 +13,8 @@ def self.enqueue(*args) def perform(method, resource_class, resource_id, *args) resource = resource_class.constantize.to_adapter.get!(resource_id) args[-1] = args.last.symbolize_keys if args.last.is_a?(Hash) - mailer_class(resource).send(method, resource, *args).deliver + mailer = mailer_class(resource).send(method, resource, *args) + mailer.send(deliver_method(mailer)) end private @@ -21,6 +22,17 @@ def perform(method, resource_class, resource_id, *args) def mailer_class(resource = nil) @mailer_class ||= resource.try(:devise_mailer) || Devise.mailer end + + # Use #deliver_now if supported, otherwise falls back to #deliver. + # Added in preparation for the planned removal of #deliver in Rails 5. + def deliver_method(mailer) + if mailer.respond_to?(:deliver_now) + :deliver_now + else + :deliver + end + end + end end end diff --git a/test/devise/async/backend/base_test.rb b/test/devise/async/backend/base_test.rb index 444cab6..3659982 100644 --- a/test/devise/async/backend/base_test.rb +++ b/test/devise/async/backend/base_test.rb @@ -22,6 +22,27 @@ module Backend Base.new.perform(:confirmation_instructions, "UserWithMailer", user.id, {}) end + describe "the delivery method" do + before do + Devise.mailer = "MyMailer" + @user = create_user + end + + it "uses #deliver_now when possible" do + mailer_instance = mock(:deliver_now => true) + + MyMailer.expects(:confirmation_instructions).once.returns(mailer_instance) + Base.new.perform(:confirmation_instructions, "User", @user.id, {}) + end + + it "uses #deliver otherwise" do + mailer_instance = mock(:deliver => true) + + MyMailer.expects(:confirmation_instructions).once.returns(mailer_instance) + Base.new.perform(:confirmation_instructions, "User", @user.id, {}) + end + end + after do Devise.mailer = "Devise::Mailer" end