1010require  'mailers/asset_mailer' 
1111
1212class  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 
773828end 
0 commit comments