require 'isolation/abstract_unit' require 'rack/test' require 'base64' module ApplicationTests class MailerPreviewsTest < ActiveSupport::TestCase include ActiveSupport::Testing::Isolation include Rack::Test::Methods def setup build_app boot_rails end def teardown teardown_app end test "/rails/mailers is accessible in development" do app("development") get "/rails/mailers" assert_equal 200, last_response.status end test "/rails/mailers is not accessible in production" do app("production") get "/rails/mailers" assert_equal 404, last_response.status end test "/rails/mailers is accessible with correct configuraiton" do add_to_config "config.action_mailer.show_previews = true" app("production") get "/rails/mailers", {}, {"REMOTE_ADDR" => "4.2.42.42"} assert_equal 200, last_response.status end test "/rails/mailers is not accessible with show_previews = false" do add_to_config "config.action_mailer.show_previews = false" app("development") get "/rails/mailers" assert_equal 404, last_response.status end test "/rails/mailers is accessible with globbing route present" do app_file "config/routes.rb", <<-RUBY Rails.application.routes.draw do get '*foo', to: 'foo#index' end RUBY app("development") get "/rails/mailers" assert_equal 200, last_response.status end test "mailer previews are loaded from the default preview_path" do mailer 'notifier', <<-RUBY class Notifier < ActionMailer::Base default from: "from@example.com" def foo mail to: "to@example.org" end end RUBY text_template 'notifier/foo', <<-RUBY Hello, World! RUBY mailer_preview 'notifier', <<-RUBY class NotifierPreview < ActionMailer::Preview def foo Notifier.foo end end RUBY app('development') get "/rails/mailers" assert_match '

Notifier

', last_response.body assert_match '
  • foo
  • ', last_response.body end test "mailer previews are loaded from a custom preview_path" do add_to_config "config.action_mailer.preview_path = '#{app_path}/lib/mailer_previews'" mailer 'notifier', <<-RUBY class Notifier < ActionMailer::Base default from: "from@example.com" def foo mail to: "to@example.org" end end RUBY text_template 'notifier/foo', <<-RUBY Hello, World! RUBY app_file 'lib/mailer_previews/notifier_preview.rb', <<-RUBY class NotifierPreview < ActionMailer::Preview def foo Notifier.foo end end RUBY app('development') get "/rails/mailers" assert_match '

    Notifier

    ', last_response.body assert_match '
  • foo
  • ', last_response.body end test "mailer previews are reloaded across requests" do app('development') get "/rails/mailers" assert_no_match '

    Notifier

    ', last_response.body mailer 'notifier', <<-RUBY class Notifier < ActionMailer::Base default from: "from@example.com" def foo mail to: "to@example.org" end end RUBY text_template 'notifier/foo', <<-RUBY Hello, World! RUBY mailer_preview 'notifier', <<-RUBY class NotifierPreview < ActionMailer::Preview def foo Notifier.foo end end RUBY get "/rails/mailers" assert_match '

    Notifier

    ', last_response.body remove_file 'test/mailers/previews/notifier_preview.rb' sleep(1) get "/rails/mailers" assert_no_match '

    Notifier

    ', last_response.body end test "mailer preview actions are added and removed" do mailer 'notifier', <<-RUBY class Notifier < ActionMailer::Base default from: "from@example.com" def foo mail to: "to@example.org" end end RUBY text_template 'notifier/foo', <<-RUBY Hello, World! RUBY mailer_preview 'notifier', <<-RUBY class NotifierPreview < ActionMailer::Preview def foo Notifier.foo end end RUBY app('development') get "/rails/mailers" assert_match '

    Notifier

    ', last_response.body assert_match '
  • foo
  • ', last_response.body assert_no_match '
  • bar
  • ', last_response.body mailer 'notifier', <<-RUBY class Notifier < ActionMailer::Base default from: "from@example.com" def foo mail to: "to@example.org" end def bar mail to: "to@example.net" end end RUBY text_template 'notifier/foo', <<-RUBY Hello, World! RUBY text_template 'notifier/bar', <<-RUBY Goodbye, World! RUBY mailer_preview 'notifier', <<-RUBY class NotifierPreview < ActionMailer::Preview def foo Notifier.foo end def bar Notifier.bar end end RUBY sleep(1) get "/rails/mailers" assert_match '

    Notifier

    ', last_response.body assert_match '
  • foo
  • ', last_response.body assert_match '
  • bar
  • ', last_response.body mailer 'notifier', <<-RUBY class Notifier < ActionMailer::Base default from: "from@example.com" def foo mail to: "to@example.org" end end RUBY remove_file 'app/views/notifier/bar.text.erb' mailer_preview 'notifier', <<-RUBY class NotifierPreview < ActionMailer::Preview def foo Notifier.foo end end RUBY sleep(1) get "/rails/mailers" assert_match '

    Notifier

    ', last_response.body assert_match '
  • foo
  • ', last_response.body assert_no_match '
  • bar
  • ', last_response.body end test "mailer previews are reloaded from a custom preview_path" do add_to_config "config.action_mailer.preview_path = '#{app_path}/lib/mailer_previews'" app('development') get "/rails/mailers" assert_no_match '

    Notifier

    ', last_response.body mailer 'notifier', <<-RUBY class Notifier < ActionMailer::Base default from: "from@example.com" def foo mail to: "to@example.org" end end RUBY text_template 'notifier/foo', <<-RUBY Hello, World! RUBY app_file 'lib/mailer_previews/notifier_preview.rb', <<-RUBY class NotifierPreview < ActionMailer::Preview def foo Notifier.foo end end RUBY get "/rails/mailers" assert_match '

    Notifier

    ', last_response.body remove_file 'lib/mailer_previews/notifier_preview.rb' sleep(1) get "/rails/mailers" assert_no_match '

    Notifier

    ', last_response.body end test "mailer preview not found" do app('development') get "/rails/mailers/notifier" assert last_response.not_found? assert_match "Mailer preview 'notifier' not found", last_response.body end test "mailer preview email not found" do mailer 'notifier', <<-RUBY class Notifier < ActionMailer::Base default from: "from@example.com" def foo mail to: "to@example.org" end end RUBY text_template 'notifier/foo', <<-RUBY Hello, World! RUBY mailer_preview 'notifier', <<-RUBY class NotifierPreview < ActionMailer::Preview def foo Notifier.foo end end RUBY app('development') get "/rails/mailers/notifier/bar" assert last_response.not_found? assert_match "Email 'bar' not found in NotifierPreview", last_response.body end test "mailer preview NullMail" do mailer 'notifier', <<-RUBY class Notifier < ActionMailer::Base default from: "from@example.com" def foo # does not call +mail+ end end RUBY mailer_preview 'notifier', <<-RUBY class NotifierPreview < ActionMailer::Preview def foo Notifier.foo end end RUBY app('development') get "/rails/mailers/notifier/foo" assert_match "You are trying to preview an email that does not have any content.", last_response.body assert_match "notifier#foo", last_response.body end test "mailer preview email part not found" do mailer 'notifier', <<-RUBY class Notifier < ActionMailer::Base default from: "from@example.com" def foo mail to: "to@example.org" end end RUBY text_template 'notifier/foo', <<-RUBY Hello, World! RUBY mailer_preview 'notifier', <<-RUBY class NotifierPreview < ActionMailer::Preview def foo Notifier.foo end end RUBY app('development') get "/rails/mailers/notifier/foo?part=text%2Fhtml" assert last_response.not_found? assert_match "Email part 'text/html' not found in NotifierPreview#foo", last_response.body end test "message header uses full display names" do mailer 'notifier', <<-RUBY class Notifier < ActionMailer::Base default from: "Ruby on Rails " def foo mail to: "Andrew White ", cc: "David Heinemeier Hansson " end end RUBY text_template 'notifier/foo', <<-RUBY Hello, World! RUBY mailer_preview 'notifier', <<-RUBY class NotifierPreview < ActionMailer::Preview def foo Notifier.foo end end RUBY app('development') get "/rails/mailers/notifier/foo" assert_equal 200, last_response.status assert_match "Ruby on Rails <core@rubyonrails.org>", last_response.body assert_match "Andrew White <andyw@pixeltrix.co.uk>", last_response.body assert_match "David Heinemeier Hansson <david@heinemeierhansson.com>", last_response.body end test "part menu selects correct option" do mailer 'notifier', <<-RUBY class Notifier < ActionMailer::Base default from: "from@example.com" def foo mail to: "to@example.org" end end RUBY html_template 'notifier/foo', <<-RUBY

    Hello, World!

    RUBY text_template 'notifier/foo', <<-RUBY Hello, World! RUBY mailer_preview 'notifier', <<-RUBY class NotifierPreview < ActionMailer::Preview def foo Notifier.foo end end RUBY app('development') get "/rails/mailers/notifier/foo.html" assert_equal 200, last_response.status assert_match '', last_response.body get "/rails/mailers/notifier/foo.txt" assert_equal 200, last_response.status assert_match '', last_response.body end test "mailer previews create correct links when loaded on a subdirectory" do mailer 'notifier', <<-RUBY class Notifier < ActionMailer::Base default from: "from@example.com" def foo mail to: "to@example.org" end end RUBY text_template 'notifier/foo', <<-RUBY Hello, World! RUBY mailer_preview 'notifier', <<-RUBY class NotifierPreview < ActionMailer::Preview def foo Notifier.foo end end RUBY app('development') get "/rails/mailers", {}, 'SCRIPT_NAME' => '/my_app' assert_match '

    Notifier

    ', last_response.body assert_match '
  • foo
  • ', last_response.body end test "plain text mailer preview with attachment" do image_file "pixel.png", "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEWzIioca/JlAAAACklEQVQI12NgAAAAAgAB4iG8MwAAAABJRU5ErkJgggo=" mailer 'notifier', <<-RUBY class Notifier < ActionMailer::Base default from: "from@example.com" def foo attachments['pixel.png'] = File.read("#{app_path}/public/images/pixel.png", mode: 'rb') mail to: "to@example.org" end end RUBY text_template 'notifier/foo', <<-RUBY Hello, World! RUBY mailer_preview 'notifier', <<-RUBY class NotifierPreview < ActionMailer::Preview def foo Notifier.foo end end RUBY app('development') get "/rails/mailers/notifier/foo" assert_equal 200, last_response.status assert_match %r[