# frozen_string_literal: true
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
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 configuration" 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 '
', 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 '
', 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 '
', 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 '
', 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 '
', 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 '
', 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 '
', 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 '
', 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 '
', last_response.body
end
test "mailer preview receives query params" do
mailer "notifier", <<-RUBY
class Notifier < ActionMailer::Base
default from: "from@example.com"
def foo(name)
@name = name
mail to: "to@example.org"
end
end
RUBY
html_template "notifier/foo", <<-RUBY
Hello, <%= @name %>!
RUBY
text_template "notifier/foo", <<-RUBY
Hello, <%= @name %>!
RUBY
mailer_preview "notifier", <<-RUBY
class NotifierPreview < ActionMailer::Preview
def foo
Notifier.foo(params[:name] || "World")
end
end
RUBY
app("development")
get "/rails/mailers/notifier/foo.txt"
assert_equal 200, last_response.status
assert_match '