Files
prism/test/test_mailer_preview_app.rb
T

101 lines
3.0 KiB
Ruby

require 'minitest/autorun'
require 'prism'
require 'support'
require 'tmpdir'
require 'fileutils'
class MailerPreviewAppTest < Minitest::Test
include TestSupport
def setup
@dir = Dir.mktmpdir('prism-mailer-preview-app')
FileUtils.mkdir_p(File.join(@dir, 'preview_widget'))
File.write(File.join(@dir, 'preview_widget/welcome.text.erb'), "Hi <%= name %>\n")
File.write(File.join(@dir, 'preview_widget/welcome.html.erb'), "<p>Hi <%= name %></p>\n")
mailer_dir = @dir
@mailer_class = Class.new(Prism::Mailer::Base) do
self.template_roots = [mailer_dir]
def welcome(name)
@name = name
mail(to: 'someone@example.com', from: 'app@example.com', subject: 'Welcome!')
end
end
Object.const_set(:PreviewWidgetMailer, @mailer_class)
mailer_class = @mailer_class
@preview_class = Class.new(Prism::Mailer::Preview) do
define_method(:welcome) { mailer_class.welcome('Fixture Fred') }
end
Object.const_set(:WidgetMailerPreview, @preview_class)
@app = Prism::Mailer::PreviewApp.new
end
def teardown
Prism::Mailer::Preview.registry.delete(@preview_class)
%i[WidgetMailerPreview PreviewWidgetMailer].each do |name|
Object.send(:remove_const, name) if Object.const_defined?(name)
end
FileUtils.remove_entry(@dir)
end
def call(path, script_name: '')
env = env_for('GET', path)
env['SCRIPT_NAME'] = script_name
@app.call(env)
end
def test_index_lists_registered_previews
status, _, body = call('/')
assert_equal 200, status
assert_includes body.join, 'widget_mailer'
end
def test_preview_page_lists_its_email_actions
status, _, body = call('/widget_mailer')
assert_equal 200, status
assert_includes body.join, 'welcome'
end
def test_email_page_renders_the_actual_rendered_html_body
status, headers, body = call('/widget_mailer/welcome')
assert_equal 200, status
assert_equal 'text/html; charset=UTF-8', headers['Content-Type']
assert_includes body.join, '<p>Hi Fixture Fred</p>'
assert_includes body.join, 'Welcome!'
end
def test_email_page_never_delivers_the_message
Prism::Mailer.deliveries.clear
call('/widget_mailer/welcome')
assert_empty Prism::Mailer.deliveries
end
def test_unknown_preview_is_a_404
status, = call('/does_not_exist')
assert_equal 404, status
end
def test_unknown_email_action_is_a_404
status, = call('/widget_mailer/does_not_exist')
assert_equal 404, status
end
def test_links_are_built_from_script_name_so_mounting_anywhere_works
_, _, body = call('/', script_name: '/rails/mailers')
assert_includes body.join, 'href="/rails/mailers/widget_mailer"'
end
def test_mounted_end_to_end_through_an_application
host_app = Class.new(Prism::Application) do
mount '/rails/mailers', Prism::Mailer::PreviewApp.new
end
status, _, body = host_app.call(env_for('GET', '/rails/mailers/widget_mailer/welcome'))
assert_equal 200, status
assert_includes body.join, '<p>Hi Fixture Fred</p>'
end
end