Skip to content

Commit 350e3d7

Browse files
committed
Merge pull request rails#14964 from zuhao/refactor_actionmailer_tests
WIP: Make ActionMailer tests order-independent.
2 parents 6dd0b72 + 1401637 commit 350e3d7

File tree

1 file changed

+157
-102
lines changed

1 file changed

+157
-102
lines changed

actionmailer/test/base_test.rb

Lines changed: 157 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,15 @@
1010
require 'mailers/asset_mailer'
1111

1212
class BaseTest < ActiveSupport::TestCase
13-
def teardown
14-
ActionMailer::Base.asset_host = nil
15-
ActionMailer::Base.assets_dir = nil
16-
ActionMailer::Base.preview_interceptors.clear
13+
setup do
14+
@original_asset_host = ActionMailer::Base.asset_host
15+
@original_assets_dir = ActionMailer::Base.assets_dir
16+
end
17+
18+
teardown do
19+
ActionMailer::Base.asset_host = @original_asset_host
20+
ActionMailer::Base.assets_dir = @original_assets_dir
21+
BaseMailer.deliveries.clear
1722
end
1823

1924
test "method call to mail does not raise error" do
@@ -104,6 +109,7 @@ def teardown
104109
test "attachment gets content type from filename" do
105110
email = BaseMailer.attachment_with_content
106111
assert_equal('invoice.pdf', email.attachments[0].filename)
112+
assert_equal('application/pdf', email.attachments[0].mime_type)
107113
end
108114

109115
test "attachment with hash" do
@@ -201,25 +207,29 @@ def teardown
201207
end
202208

203209
test "subject gets default from I18n" do
204-
BaseMailer.default subject: nil
205-
email = BaseMailer.welcome(subject: nil)
206-
assert_equal "Welcome", email.subject
210+
with_default BaseMailer, subject: nil do
211+
email = BaseMailer.welcome(subject: nil)
212+
assert_equal "Welcome", email.subject
207213

208-
I18n.backend.store_translations('en', base_mailer: {welcome: {subject: "New Subject!"}})
209-
email = BaseMailer.welcome(subject: nil)
210-
assert_equal "New Subject!", email.subject
214+
with_translation 'en', base_mailer: {welcome: {subject: "New Subject!"}} do
215+
email = BaseMailer.welcome(subject: nil)
216+
assert_equal "New Subject!", email.subject
217+
end
218+
end
211219
end
212220

213221
test 'default subject can have interpolations' do
214-
I18n.backend.store_translations('en', base_mailer: {with_subject_interpolations: {subject: 'Will the real %{rapper_or_impersonator} please stand up?'}})
215-
email = BaseMailer.with_subject_interpolations
216-
assert_equal 'Will the real Slim Shady please stand up?', email.subject
222+
with_translation 'en', base_mailer: {with_subject_interpolations: {subject: 'Will the real %{rapper_or_impersonator} please stand up?'}} do
223+
email = BaseMailer.with_subject_interpolations
224+
assert_equal 'Will the real Slim Shady please stand up?', email.subject
225+
end
217226
end
218227

219228
test "translations are scoped properly" do
220-
I18n.backend.store_translations('en', base_mailer: {email_with_translations: {greet_user: "Hello %{name}!"}})
221-
email = BaseMailer.email_with_translations
222-
assert_equal 'Hello lifo!', email.body.encoded
229+
with_translation 'en', base_mailer: {email_with_translations: {greet_user: "Hello %{name}!"}} do
230+
email = BaseMailer.email_with_translations
231+
assert_equal 'Hello lifo!', email.body.encoded
232+
end
223233
end
224234

225235
# Implicit multipart
@@ -407,22 +417,19 @@ def teardown
407417
end
408418

409419
test "calling just the action should return the generated mail object" do
410-
BaseMailer.deliveries.clear
411420
email = BaseMailer.welcome
412421
assert_equal(0, BaseMailer.deliveries.length)
413422
assert_equal('The first email on new API!', email.subject)
414423
end
415424

416425
test "calling deliver on the action should deliver the mail object" do
417-
BaseMailer.deliveries.clear
418426
BaseMailer.expects(:deliver_mail).once
419427
mail = BaseMailer.welcome.deliver
420428
assert_equal 'The first email on new API!', mail.subject
421429
end
422430

423431
test "calling deliver on the action should increment the deliveries collection if using the test mailer" do
424432
BaseMailer.delivery_method = :test
425-
BaseMailer.deliveries.clear
426433
BaseMailer.welcome.deliver
427434
assert_equal(1, BaseMailer.deliveries.length)
428435
end
@@ -442,7 +449,6 @@ def teardown
442449
end
443450

444451
test "should raise if missing template in implicit render" do
445-
BaseMailer.deliveries.clear
446452
assert_raises ActionView::MissingTemplate do
447453
BaseMailer.implicit_different_template('missing_template').deliver
448454
end
@@ -479,18 +485,17 @@ def teardown
479485
end
480486

481487
test "assets tags should use a Mailer's asset_host settings when available" do
482-
begin
483-
ActionMailer::Base.config.asset_host = "http://global.com"
484-
ActionMailer::Base.config.assets_dir = "global/"
488+
ActionMailer::Base.config.asset_host = "http://global.com"
489+
ActionMailer::Base.config.assets_dir = "global/"
485490

486-
AssetMailer.asset_host = "http://local.com"
491+
TempAssetMailer = Class.new(AssetMailer) do
492+
self.mailer_name = "asset_mailer"
493+
self.asset_host = "http://local.com"
494+
end
487495

488-
mail = AssetMailer.welcome
496+
mail = TempAssetMailer.welcome
489497

490-
assert_equal(%{<img alt="Dummy" src="http://local.com/images/dummy.png" />}, mail.body.to_s.strip)
491-
ensure
492-
AssetMailer.asset_host = ActionMailer::Base.config.asset_host
493-
end
498+
assert_equal(%{<img alt="Dummy" src="http://local.com/images/dummy.png" />}, mail.body.to_s.strip)
494499
end
495500

496501
test 'the view is not rendered when mail was never called' do
@@ -518,32 +523,40 @@ def self.delivered_email(mail)
518523
end
519524

520525
test "you can register an observer to the mail object that gets informed on email delivery" do
521-
ActionMailer::Base.register_observer(MyObserver)
522-
mail = BaseMailer.welcome
523-
MyObserver.expects(:delivered_email).with(mail)
524-
mail.deliver
526+
mail_side_effects do
527+
ActionMailer::Base.register_observer(MyObserver)
528+
mail = BaseMailer.welcome
529+
MyObserver.expects(:delivered_email).with(mail)
530+
mail.deliver
531+
end
525532
end
526533

527534
test "you can register an observer using its stringified name to the mail object that gets informed on email delivery" do
528-
ActionMailer::Base.register_observer("BaseTest::MyObserver")
529-
mail = BaseMailer.welcome
530-
MyObserver.expects(:delivered_email).with(mail)
531-
mail.deliver
535+
mail_side_effects do
536+
ActionMailer::Base.register_observer("BaseTest::MyObserver")
537+
mail = BaseMailer.welcome
538+
MyObserver.expects(:delivered_email).with(mail)
539+
mail.deliver
540+
end
532541
end
533542

534543
test "you can register an observer using its symbolized underscored name to the mail object that gets informed on email delivery" do
535-
ActionMailer::Base.register_observer(:"base_test/my_observer")
536-
mail = BaseMailer.welcome
537-
MyObserver.expects(:delivered_email).with(mail)
538-
mail.deliver
544+
mail_side_effects do
545+
ActionMailer::Base.register_observer(:"base_test/my_observer")
546+
mail = BaseMailer.welcome
547+
MyObserver.expects(:delivered_email).with(mail)
548+
mail.deliver
549+
end
539550
end
540551

541552
test "you can register multiple observers to the mail object that both get informed on email delivery" do
542-
ActionMailer::Base.register_observers("BaseTest::MyObserver", MySecondObserver)
543-
mail = BaseMailer.welcome
544-
MyObserver.expects(:delivered_email).with(mail)
545-
MySecondObserver.expects(:delivered_email).with(mail)
546-
mail.deliver
553+
mail_side_effects do
554+
ActionMailer::Base.register_observers("BaseTest::MyObserver", MySecondObserver)
555+
mail = BaseMailer.welcome
556+
MyObserver.expects(:delivered_email).with(mail)
557+
MySecondObserver.expects(:delivered_email).with(mail)
558+
mail.deliver
559+
end
547560
end
548561

549562
class MyInterceptor
@@ -556,72 +569,41 @@ def self.delivering_email(mail); end
556569
def self.previewing_email(mail); end
557570
end
558571

559-
class BaseMailerPreview < ActionMailer::Preview
560-
def welcome
561-
BaseMailer.welcome
562-
end
563-
end
564-
565572
test "you can register an interceptor to the mail object that gets passed the mail object before delivery" do
566-
ActionMailer::Base.register_interceptor(MyInterceptor)
567-
mail = BaseMailer.welcome
568-
MyInterceptor.expects(:delivering_email).with(mail)
569-
mail.deliver
573+
mail_side_effects do
574+
ActionMailer::Base.register_interceptor(MyInterceptor)
575+
mail = BaseMailer.welcome
576+
MyInterceptor.expects(:delivering_email).with(mail)
577+
mail.deliver
578+
end
570579
end
571580

572581
test "you can register an interceptor using its stringified name to the mail object that gets passed the mail object before delivery" do
573-
ActionMailer::Base.register_interceptor("BaseTest::MyInterceptor")
574-
mail = BaseMailer.welcome
575-
MyInterceptor.expects(:delivering_email).with(mail)
576-
mail.deliver
582+
mail_side_effects do
583+
ActionMailer::Base.register_interceptor("BaseTest::MyInterceptor")
584+
mail = BaseMailer.welcome
585+
MyInterceptor.expects(:delivering_email).with(mail)
586+
mail.deliver
587+
end
577588
end
578589

579590
test "you can register an interceptor using its symbolized underscored name to the mail object that gets passed the mail object before delivery" do
580-
ActionMailer::Base.register_interceptor(:"base_test/my_interceptor")
581-
mail = BaseMailer.welcome
582-
MyInterceptor.expects(:delivering_email).with(mail)
583-
mail.deliver
591+
mail_side_effects do
592+
ActionMailer::Base.register_interceptor(:"base_test/my_interceptor")
593+
mail = BaseMailer.welcome
594+
MyInterceptor.expects(:delivering_email).with(mail)
595+
mail.deliver
596+
end
584597
end
585598

586599
test "you can register multiple interceptors to the mail object that both get passed the mail object before delivery" do
587-
ActionMailer::Base.register_interceptors("BaseTest::MyInterceptor", MySecondInterceptor)
588-
mail = BaseMailer.welcome
589-
MyInterceptor.expects(:delivering_email).with(mail)
590-
MySecondInterceptor.expects(:delivering_email).with(mail)
591-
mail.deliver
592-
end
593-
594-
test "you can register a preview interceptor to the mail object that gets passed the mail object before previewing" do
595-
ActionMailer::Base.register_preview_interceptor(MyInterceptor)
596-
mail = BaseMailer.welcome
597-
BaseMailerPreview.any_instance.stubs(:welcome).returns(mail)
598-
MyInterceptor.expects(:previewing_email).with(mail)
599-
BaseMailerPreview.call(:welcome)
600-
end
601-
602-
test "you can register a preview interceptor using its stringified name to the mail object that gets passed the mail object before previewing" do
603-
ActionMailer::Base.register_preview_interceptor("BaseTest::MyInterceptor")
604-
mail = BaseMailer.welcome
605-
BaseMailerPreview.any_instance.stubs(:welcome).returns(mail)
606-
MyInterceptor.expects(:previewing_email).with(mail)
607-
BaseMailerPreview.call(:welcome)
608-
end
609-
610-
test "you can register an interceptor using its symbolized underscored name to the mail object that gets passed the mail object before previewing" do
611-
ActionMailer::Base.register_preview_interceptor(:"base_test/my_interceptor")
612-
mail = BaseMailer.welcome
613-
BaseMailerPreview.any_instance.stubs(:welcome).returns(mail)
614-
MyInterceptor.expects(:previewing_email).with(mail)
615-
BaseMailerPreview.call(:welcome)
616-
end
617-
618-
test "you can register multiple preview interceptors to the mail object that both get passed the mail object before previewing" do
619-
ActionMailer::Base.register_preview_interceptors("BaseTest::MyInterceptor", MySecondInterceptor)
620-
mail = BaseMailer.welcome
621-
BaseMailerPreview.any_instance.stubs(:welcome).returns(mail)
622-
MyInterceptor.expects(:previewing_email).with(mail)
623-
MySecondInterceptor.expects(:previewing_email).with(mail)
624-
BaseMailerPreview.call(:welcome)
600+
mail_side_effects do
601+
ActionMailer::Base.register_interceptors("BaseTest::MyInterceptor", MySecondInterceptor)
602+
mail = BaseMailer.welcome
603+
MyInterceptor.expects(:delivering_email).with(mail)
604+
MySecondInterceptor.expects(:delivering_email).with(mail)
605+
mail.deliver
606+
end
625607
end
626608

627609
test "being able to put proc's into the defaults hash and they get evaluated on mail sending" do
@@ -770,4 +752,77 @@ def with_default(klass, new_values)
770752
ensure
771753
klass.default_params = old
772754
end
755+
756+
# A simple hack to restore the observers and interceptors for Mail, as it
757+
# does not have an unregister API yet.
758+
def mail_side_effects
759+
old_observers = Mail.class_variable_get(:@@delivery_notification_observers)
760+
old_delivery_interceptors = Mail.class_variable_get(:@@delivery_interceptors)
761+
yield
762+
ensure
763+
Mail.class_variable_set(:@@delivery_notification_observers, old_observers)
764+
Mail.class_variable_set(:@@delivery_interceptors, old_delivery_interceptors)
765+
end
766+
767+
def with_translation(locale, data)
768+
I18n.backend.store_translations(locale, data)
769+
yield
770+
ensure
771+
I18n.backend.reload!
772+
end
773+
end
774+
775+
class BasePreviewInterceptorsTest < ActiveSupport::TestCase
776+
teardown do
777+
ActionMailer::Base.preview_interceptors.clear
778+
end
779+
780+
class BaseMailerPreview < ActionMailer::Preview
781+
def welcome
782+
BaseMailer.welcome
783+
end
784+
end
785+
786+
class MyInterceptor
787+
def self.delivering_email(mail); end
788+
def self.previewing_email(mail); end
789+
end
790+
791+
class MySecondInterceptor
792+
def self.delivering_email(mail); end
793+
def self.previewing_email(mail); end
794+
end
795+
796+
test "you can register a preview interceptor to the mail object that gets passed the mail object before previewing" do
797+
ActionMailer::Base.register_preview_interceptor(MyInterceptor)
798+
mail = BaseMailer.welcome
799+
BaseMailerPreview.any_instance.stubs(:welcome).returns(mail)
800+
MyInterceptor.expects(:previewing_email).with(mail)
801+
BaseMailerPreview.call(:welcome)
802+
end
803+
804+
test "you can register a preview interceptor using its stringified name to the mail object that gets passed the mail object before previewing" do
805+
ActionMailer::Base.register_preview_interceptor("BasePreviewInterceptorsTest::MyInterceptor")
806+
mail = BaseMailer.welcome
807+
BaseMailerPreview.any_instance.stubs(:welcome).returns(mail)
808+
MyInterceptor.expects(:previewing_email).with(mail)
809+
BaseMailerPreview.call(:welcome)
810+
end
811+
812+
test "you can register an interceptor using its symbolized underscored name to the mail object that gets passed the mail object before previewing" do
813+
ActionMailer::Base.register_preview_interceptor(:"base_preview_interceptors_test/my_interceptor")
814+
mail = BaseMailer.welcome
815+
BaseMailerPreview.any_instance.stubs(:welcome).returns(mail)
816+
MyInterceptor.expects(:previewing_email).with(mail)
817+
BaseMailerPreview.call(:welcome)
818+
end
819+
820+
test "you can register multiple preview interceptors to the mail object that both get passed the mail object before previewing" do
821+
ActionMailer::Base.register_preview_interceptors("BasePreviewInterceptorsTest::MyInterceptor", MySecondInterceptor)
822+
mail = BaseMailer.welcome
823+
BaseMailerPreview.any_instance.stubs(:welcome).returns(mail)
824+
MyInterceptor.expects(:previewing_email).with(mail)
825+
MySecondInterceptor.expects(:previewing_email).with(mail)
826+
BaseMailerPreview.call(:welcome)
827+
end
773828
end

0 commit comments

Comments
 (0)