rails/actionpack/test/controller/renderer_test.rb
Aaron Patterson 2db7304c2c create a new renderer instance on calls to for
This changes the renderer class to store the controller and defaults as
an instance variable rather than allocating a new class.  You can create
a new renderer with an new env by calling `Renderer#new` or use new
defaults by calling `Renderer#with_defaults` and saving the return value
somewhere.

Also I want to keep the `env` private since I would like to change the
keys in the future.  This commit only translates particular keys that
the user requested.
2015-09-14 15:58:12 -07:00

95 lines
2.8 KiB
Ruby

require 'abstract_unit'
class RendererTest < ActiveSupport::TestCase
test 'action controller base has a renderer' do
assert ActionController::Base.renderer
end
test 'creating with a controller' do
controller = CommentsController
renderer = ActionController::Renderer.for controller
assert_equal controller, renderer.controller
end
test 'creating from a controller' do
controller = AccountsController
renderer = controller.renderer
assert_equal controller, renderer.controller
end
test 'rendering with a class renderer' do
renderer = ApplicationController.renderer
content = renderer.render template: 'ruby_template'
assert_equal 'Hello from Ruby code', content
end
test 'rendering with an instance renderer' do
renderer = ApplicationController.renderer.new
content = renderer.render file: 'test/hello_world'
assert_equal 'Hello world!', content
end
test 'rendering with a controller class' do
assert_equal 'Hello world!', ApplicationController.render('test/hello_world')
end
test 'rendering with locals' do
renderer = ApplicationController.renderer
content = renderer.render template: 'test/render_file_with_locals',
locals: { secret: 'bar' }
assert_equal "The secret is bar\n", content
end
test 'rendering with assigns' do
renderer = ApplicationController.renderer
content = renderer.render template: 'test/render_file_with_ivar',
assigns: { secret: 'foo' }
assert_equal "The secret is foo\n", content
end
test 'rendering with custom env' do
renderer = ApplicationController.renderer.new method: 'post'
content = renderer.render inline: '<%= request.post? %>'
assert_equal 'true', content
end
test 'rendering with defaults' do
renderer = ApplicationController.renderer.new https: true
content = renderer.render inline: '<%= request.ssl? %>'
assert_equal 'true', content
end
test 'same defaults from the same controller' do
renderer_defaults = ->(controller) { controller.renderer.defaults }
assert_equal renderer_defaults[AccountsController], renderer_defaults[AccountsController]
assert_equal renderer_defaults[AccountsController], renderer_defaults[CommentsController]
end
test 'rendering with different formats' do
html = 'Hello world!'
xml = "<p>Hello world!</p>\n"
assert_equal html, render['respond_to/using_defaults']
assert_equal xml, render['respond_to/using_defaults.xml.builder']
assert_equal xml, render['respond_to/using_defaults', formats: :xml]
end
test 'rendering with helpers' do
assert_equal "<p>1\n<br />2</p>", render[inline: '<%= simple_format "1\n2" %>']
end
private
def render
@render ||= ApplicationController.renderer.method(:render)
end
end