diff options
author | Claudio Ortolina <claudio@new-bamboo.co.uk> | 2015-01-11 12:45:08 +0000 |
---|---|---|
committer | Claudio Ortolina <claudio@new-bamboo.co.uk> | 2015-01-31 14:25:00 +0000 |
commit | ff5fcf65ec1f5963e5168786277eb4437c065524 (patch) | |
tree | 8223020eebdfa698f7dd935c20bea00c219b1242 | |
parent | 7bb620869725ad6de603f6a5393ee17df13aa96c (diff) | |
download | rails-ff5fcf65ec1f5963e5168786277eb4437c065524.tar.gz rails-ff5fcf65ec1f5963e5168786277eb4437c065524.tar.bz2 rails-ff5fcf65ec1f5963e5168786277eb4437c065524.zip |
ActionMailer::Base can unregister interceptor(s).
One or multiple mail interceptors can be unregistered using
`ActionMailer::Base.unregister_interceptors` or
`ActionMailer::Base.unregister_interceptor`.
For preview interceptors, it's possible to use
`ActionMailer::Base.unregister_preview_interceptors` or
`ActionMailer::Base.unregister_preview_interceptor`.
Refactors logic to constantize a string/symbol into separate method.
-rw-r--r-- | actionmailer/CHANGELOG.md | 7 | ||||
-rw-r--r-- | actionmailer/lib/action_mailer/base.rb | 38 | ||||
-rw-r--r-- | actionmailer/lib/action_mailer/preview.rb | 32 | ||||
-rw-r--r-- | actionmailer/test/base_test.rb | 78 |
4 files changed, 136 insertions, 19 deletions
diff --git a/actionmailer/CHANGELOG.md b/actionmailer/CHANGELOG.md index 008760f2fc..a0a2f6b541 100644 --- a/actionmailer/CHANGELOG.md +++ b/actionmailer/CHANGELOG.md @@ -1,3 +1,10 @@ +* Add `Base.unregister_interceptor`, `Base.unregister_interceptors`, + `Base.unregister_preview_interceptor` and `Base.unregister_preview_interceptors`. + This makes it possible to dynamically add and remove email interceptors + at runtime in the same way they're registered. + + *Claudio Ortolina* + * Add `assert_enqueued_emails` and `assert_no_enqueued_emails`. def test_emails diff --git a/actionmailer/lib/action_mailer/base.rb b/actionmailer/lib/action_mailer/base.rb index 53cc1fdb31..d5d124cbb8 100644 --- a/actionmailer/lib/action_mailer/base.rb +++ b/actionmailer/lib/action_mailer/base.rb @@ -434,6 +434,7 @@ module ActionMailer helper ActionMailer::MailHelper private_class_method :new #:nodoc: + private_class_method :find_class #:nodoc: class_attribute :default_params self.default_params = { @@ -454,16 +455,16 @@ module ActionMailer interceptors.flatten.compact.each { |interceptor| register_interceptor(interceptor) } end + # Unregister one or more Interceptors which would be called before mail is sent. + def unregister_interceptors(*interceptors) + interceptors.flatten.compact.each { |interceptor| unregister_interceptor(interceptor) } + end + # Register an Observer which will be notified when mail is delivered. # Either a class, string or symbol can be passed in as the Observer. # If a string or symbol is passed in it will be camelized and constantized. def register_observer(observer) - delivery_observer = case observer - when String, Symbol - observer.to_s.camelize.constantize - else - observer - end + delivery_observer = find_class(observer) Mail.register_observer(delivery_observer) end @@ -472,16 +473,20 @@ module ActionMailer # Either a class, string or symbol can be passed in as the Interceptor. # If a string or symbol is passed in it will be camelized and constantized. def register_interceptor(interceptor) - delivery_interceptor = case interceptor - when String, Symbol - interceptor.to_s.camelize.constantize - else - interceptor - end + delivery_interceptor = find_class(interceptor) Mail.register_interceptor(delivery_interceptor) end + # Unregister a previously registered interceptor. + # Either a class, string or symbol can be passed in as the Interceptor. + # If a string or symbol is passed in it will be camelized and constantized. + def unregister_interceptor(interceptor) + delivery_interceptor = find_class(interceptor) + + Mail.unregister_interceptor(delivery_interceptor) + end + # Returns the name of current mailer. This method is also being used as a path for a view lookup. # If this is an anonymous mailer, this method will return +anonymous+ instead. def mailer_name @@ -835,6 +840,15 @@ module ActionMailer m end + def self.find_class(klass_or_string_or_symbol) + case klass_or_string_or_symbol + when String, Symbol + klass_or_string_or_symbol.to_s.camelize.constantize + else + klass_or_string_or_symbol + end + end + protected # Used by #mail to set the content type of the message. diff --git a/actionmailer/lib/action_mailer/preview.rb b/actionmailer/lib/action_mailer/preview.rb index 44cf6665ba..6fd3b0b120 100644 --- a/actionmailer/lib/action_mailer/preview.rb +++ b/actionmailer/lib/action_mailer/preview.rb @@ -30,21 +30,39 @@ module ActionMailer interceptors.flatten.compact.each { |interceptor| register_preview_interceptor(interceptor) } end + # Unregister one or more previously registered Interceptors. + def unregister_preview_interceptors(*interceptors) + interceptors.flatten.compact.each { |interceptor| unregister_preview_interceptor(interceptor) } + end + # Register an Interceptor which will be called before mail is previewed. # Either a class or a string can be passed in as the Interceptor. If a # string is passed in it will be <tt>constantize</tt>d. def register_preview_interceptor(interceptor) - preview_interceptor = case interceptor - when String, Symbol - interceptor.to_s.camelize.constantize - else - interceptor - end - + preview_interceptor = find_class(interceptor) unless preview_interceptors.include?(preview_interceptor) preview_interceptors << preview_interceptor end end + + # Unregister a previously registered Interceptor. + # Either a class or a string can be passed in as the Interceptor. If a + # string is passed in it will be <tt>constantize</tt>d. + def unregister_preview_interceptor(interceptor) + preview_interceptor = find_class(interceptor) + preview_interceptors.delete(preview_interceptor) + end + + private + + def find_class(klass_or_string_or_symbol) #:nodoc: + case klass_or_string_or_symbol + when String, Symbol + klass_or_string_or_symbol.to_s.camelize.constantize + else + klass_or_string_or_symbol + end + end end end diff --git a/actionmailer/test/base_test.rb b/actionmailer/test/base_test.rb index 5d9eda2555..7f624fda34 100644 --- a/actionmailer/test/base_test.rb +++ b/actionmailer/test/base_test.rb @@ -688,6 +688,47 @@ class BaseTest < ActiveSupport::TestCase end end + test "you can unregister an interceptor to the mail object that gets passed the mail object before delivery" do + mail_side_effects do + ActionMailer::Base.register_interceptor(MyInterceptor) + ActionMailer::Base.unregister_interceptor(MyInterceptor) + mail = BaseMailer.welcome + MyInterceptor.expects(:delivering_email).with(mail).never + mail.deliver_now + end + end + + test "you can unregister an interceptor using its stringified name to the mail object that gets passed the mail object before delivery" do + mail_side_effects do + ActionMailer::Base.register_interceptor("BaseTest::MyInterceptor") + ActionMailer::Base.unregister_interceptor("BaseTest::MyInterceptor") + mail = BaseMailer.welcome + MyInterceptor.expects(:delivering_email).with(mail).never + mail.deliver_now + end + end + + test "you can unregister an interceptor using its symbolized underscored name to the mail object that gets passed the mail object before delivery" do + mail_side_effects do + ActionMailer::Base.register_interceptor(:"base_test/my_interceptor") + ActionMailer::Base.unregister_interceptor(:"base_test/my_interceptor") + mail = BaseMailer.welcome + MyInterceptor.expects(:delivering_email).with(mail).never + mail.deliver_now + end + end + + test "you can unregister multiple interceptors to the mail object that both get passed the mail object before delivery" do + mail_side_effects do + ActionMailer::Base.register_interceptors("BaseTest::MyInterceptor", MySecondInterceptor) + ActionMailer::Base.unregister_interceptors("BaseTest::MyInterceptor", MySecondInterceptor) + mail = BaseMailer.welcome + MyInterceptor.expects(:delivering_email).with(mail).never + MySecondInterceptor.expects(:delivering_email).with(mail).never + mail.deliver_now + end + end + test "being able to put proc's into the defaults hash and they get evaluated on mail sending" do mail1 = ProcMailer.welcome['X-Proc-Method'] yesterday = 1.day.ago @@ -907,4 +948,41 @@ class BasePreviewInterceptorsTest < ActiveSupport::TestCase MySecondInterceptor.expects(:previewing_email).with(mail) BaseMailerPreview.call(:welcome) end + + test "you can unregister a preview interceptor to the mail object that gets passed the mail object before previewing" do + ActionMailer::Base.register_preview_interceptor(MyInterceptor) + ActionMailer::Base.unregister_preview_interceptor(MyInterceptor) + mail = BaseMailer.welcome + BaseMailerPreview.any_instance.stubs(:welcome).returns(mail) + MyInterceptor.expects(:previewing_email).with(mail).never + BaseMailerPreview.call(:welcome) + end + + test "you can unregister a preview interceptor using its stringified name to the mail object that gets passed the mail object before previewing" do + ActionMailer::Base.register_preview_interceptor("BasePreviewInterceptorsTest::MyInterceptor") + ActionMailer::Base.unregister_preview_interceptor("BasePreviewInterceptorsTest::MyInterceptor") + mail = BaseMailer.welcome + BaseMailerPreview.any_instance.stubs(:welcome).returns(mail) + MyInterceptor.expects(:previewing_email).with(mail).never + BaseMailerPreview.call(:welcome) + end + + test "you can unregister an interceptor using its symbolized underscored name to the mail object that gets passed the mail object before previewing" do + ActionMailer::Base.register_preview_interceptor(:"base_preview_interceptors_test/my_interceptor") + ActionMailer::Base.unregister_preview_interceptor(:"base_preview_interceptors_test/my_interceptor") + mail = BaseMailer.welcome + BaseMailerPreview.any_instance.stubs(:welcome).returns(mail) + MyInterceptor.expects(:previewing_email).with(mail).never + BaseMailerPreview.call(:welcome) + end + + test "you can unregister multiple preview interceptors to the mail object that both get passed the mail object before previewing" do + ActionMailer::Base.register_preview_interceptors("BasePreviewInterceptorsTest::MyInterceptor", MySecondInterceptor) + ActionMailer::Base.unregister_preview_interceptors("BasePreviewInterceptorsTest::MyInterceptor", MySecondInterceptor) + mail = BaseMailer.welcome + BaseMailerPreview.any_instance.stubs(:welcome).returns(mail) + MyInterceptor.expects(:previewing_email).with(mail).never + MySecondInterceptor.expects(:previewing_email).with(mail).never + BaseMailerPreview.call(:welcome) + end end |