2008-06-25 06:47:01 -04:00
|
|
|
require 'abstract_unit'
|
|
|
|
require 'controller/fake_models'
|
|
|
|
|
2008-11-28 15:31:54 -05:00
|
|
|
module RenderTestCases
|
|
|
|
def setup_view(paths)
|
2008-06-25 06:47:01 -04:00
|
|
|
@assigns = { :secret => 'in the sauce' }
|
2008-11-28 15:31:54 -05:00
|
|
|
@view = ActionView::Base.new(paths, @assigns)
|
2008-06-25 06:47:01 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_render_file
|
2008-11-19 08:00:16 -05:00
|
|
|
assert_equal "Hello world!", @view.render(:file => "test/hello_world.erb")
|
2008-06-25 06:47:01 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_render_file_not_using_full_path
|
2008-07-02 22:38:58 -04:00
|
|
|
assert_equal "Hello world!", @view.render(:file => "test/hello_world.erb")
|
2008-06-25 06:47:01 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_render_file_without_specific_extension
|
2008-11-19 08:00:16 -05:00
|
|
|
assert_equal "Hello world!", @view.render(:file => "test/hello_world")
|
2008-06-25 06:47:01 -04:00
|
|
|
end
|
|
|
|
|
2008-08-13 20:15:35 -04:00
|
|
|
def test_render_file_at_top_level
|
2008-11-19 08:00:16 -05:00
|
|
|
assert_equal 'Elastica', @view.render(:file => '/shared')
|
2008-08-13 20:15:35 -04:00
|
|
|
end
|
|
|
|
|
2008-06-25 06:47:01 -04:00
|
|
|
def test_render_file_with_full_path
|
|
|
|
template_path = File.join(File.dirname(__FILE__), '../fixtures/test/hello_world.erb')
|
2008-07-02 22:38:58 -04:00
|
|
|
assert_equal "Hello world!", @view.render(:file => template_path)
|
2008-06-25 06:47:01 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_render_file_with_instance_variables
|
2008-11-19 08:00:16 -05:00
|
|
|
assert_equal "The secret is in the sauce\n", @view.render(:file => "test/render_file_with_ivar.erb")
|
2008-06-25 06:47:01 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_render_file_with_locals
|
|
|
|
locals = { :secret => 'in the sauce' }
|
2008-11-19 08:00:16 -05:00
|
|
|
assert_equal "The secret is in the sauce\n", @view.render(:file => "test/render_file_with_locals.erb", :locals => locals)
|
2008-06-25 06:47:01 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_render_file_not_using_full_path_with_dot_in_path
|
2008-11-19 08:00:16 -05:00
|
|
|
assert_equal "The secret is in the sauce\n", @view.render(:file => "test/dot.directory/render_file_with_ivar")
|
2008-06-25 06:47:01 -04:00
|
|
|
end
|
|
|
|
|
2008-10-28 12:06:08 -04:00
|
|
|
def test_render_has_access_current_template
|
2008-11-19 08:00:16 -05:00
|
|
|
assert_equal "test/template.erb", @view.render(:file => "test/template.erb")
|
2008-10-28 12:06:08 -04:00
|
|
|
end
|
|
|
|
|
2008-06-25 06:47:01 -04:00
|
|
|
def test_render_update
|
|
|
|
# TODO: You should not have to stub out template because template is self!
|
|
|
|
@view.instance_variable_set(:@template, @view)
|
|
|
|
assert_equal 'alert("Hello, World!");', @view.render(:update) { |page| page.alert('Hello, World!') }
|
|
|
|
end
|
|
|
|
|
2008-11-19 08:00:16 -05:00
|
|
|
def test_render_partial_from_default
|
|
|
|
assert_equal "only partial", @view.render("test/partial_only")
|
|
|
|
end
|
|
|
|
|
2008-06-25 06:47:01 -04:00
|
|
|
def test_render_partial
|
|
|
|
assert_equal "only partial", @view.render(:partial => "test/partial_only")
|
|
|
|
end
|
|
|
|
|
2008-08-13 20:15:35 -04:00
|
|
|
def test_render_partial_with_format
|
|
|
|
assert_equal 'partial html', @view.render(:partial => 'test/partial')
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_render_partial_at_top_level
|
|
|
|
# file fixtures/_top_level_partial_only.erb (not fixtures/test)
|
|
|
|
assert_equal 'top level partial', @view.render(:partial => '/top_level_partial_only')
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_render_partial_with_format_at_top_level
|
|
|
|
# file fixtures/_top_level_partial.html.erb (not fixtures/test, with format extension)
|
|
|
|
assert_equal 'top level partial html', @view.render(:partial => '/top_level_partial')
|
|
|
|
end
|
|
|
|
|
2008-08-09 11:34:19 -04:00
|
|
|
def test_render_partial_with_locals
|
|
|
|
assert_equal "5", @view.render(:partial => "test/counter", :locals => { :counter_counter => 5 })
|
|
|
|
end
|
|
|
|
|
2008-11-19 08:00:16 -05:00
|
|
|
def test_render_partial_with_locals_from_default
|
|
|
|
assert_equal "only partial", @view.render("test/partial_only", :counter_counter => 5)
|
|
|
|
end
|
|
|
|
|
2008-06-25 06:47:01 -04:00
|
|
|
def test_render_partial_with_errors
|
2008-09-20 23:57:45 -04:00
|
|
|
@view.render(:partial => "test/raise")
|
|
|
|
flunk "Render did not raise TemplateError"
|
|
|
|
rescue ActionView::TemplateError => e
|
|
|
|
assert_match "undefined local variable or method `doesnt_exist'", e.message
|
|
|
|
assert_equal "", e.sub_template_message
|
|
|
|
assert_equal "1", e.line_number
|
|
|
|
assert_equal File.expand_path("#{FIXTURE_LOAD_PATH}/test/_raise.html.erb"), e.file_name
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_render_sub_template_with_errors
|
|
|
|
@view.render(:file => "test/sub_template_raise")
|
|
|
|
flunk "Render did not raise TemplateError"
|
|
|
|
rescue ActionView::TemplateError => e
|
|
|
|
assert_match "undefined local variable or method `doesnt_exist'", e.message
|
|
|
|
assert_equal "Trace of template inclusion: #{File.expand_path("#{FIXTURE_LOAD_PATH}/test/sub_template_raise.html.erb")}", e.sub_template_message
|
|
|
|
assert_equal "1", e.line_number
|
|
|
|
assert_equal File.expand_path("#{FIXTURE_LOAD_PATH}/test/_raise.html.erb"), e.file_name
|
2008-06-25 06:47:01 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_render_partial_collection
|
|
|
|
assert_equal "Hello: davidHello: mary", @view.render(:partial => "test/customer", :collection => [ Customer.new("david"), Customer.new("mary") ])
|
|
|
|
end
|
2008-08-09 11:34:19 -04:00
|
|
|
|
2008-07-02 11:38:50 -04:00
|
|
|
def test_render_partial_collection_as
|
2008-08-09 11:34:19 -04:00
|
|
|
assert_equal "david david davidmary mary mary",
|
2008-07-02 11:38:50 -04:00
|
|
|
@view.render(:partial => "test/customer_with_var", :collection => [ Customer.new("david"), Customer.new("mary") ], :as => :customer)
|
|
|
|
end
|
2008-08-09 11:34:19 -04:00
|
|
|
|
2008-07-02 12:19:41 -04:00
|
|
|
def test_render_partial_collection_without_as
|
2008-08-09 11:34:19 -04:00
|
|
|
assert_equal "local_inspector,local_inspector_counter,object",
|
2008-07-02 12:19:41 -04:00
|
|
|
@view.render(:partial => "test/local_inspector", :collection => [ Customer.new("mary") ])
|
|
|
|
end
|
2008-06-25 06:47:01 -04:00
|
|
|
|
2008-08-19 20:09:04 -04:00
|
|
|
def test_render_partial_with_empty_collection_should_return_nil
|
|
|
|
assert_nil @view.render(:partial => "test/customer", :collection => [])
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_render_partial_with_nil_collection_should_return_nil
|
|
|
|
assert_nil @view.render(:partial => "test/customer", :collection => nil)
|
|
|
|
end
|
|
|
|
|
2008-10-30 16:07:47 -04:00
|
|
|
def test_render_partial_with_nil_values_in_collection
|
|
|
|
assert_equal "Hello: davidHello: Anonymous", @view.render(:partial => "test/customer", :collection => [ Customer.new("david"), nil ])
|
|
|
|
end
|
|
|
|
|
2008-08-22 11:04:27 -04:00
|
|
|
def test_render_partial_with_empty_array_should_return_nil
|
|
|
|
assert_nil @view.render(:partial => [])
|
|
|
|
end
|
|
|
|
|
2008-06-25 06:47:01 -04:00
|
|
|
# TODO: The reason for this test is unclear, improve documentation
|
|
|
|
def test_render_partial_and_fallback_to_layout
|
|
|
|
assert_equal "Before (Josh)\n\nAfter", @view.render(:partial => "test/layout_for_partial", :locals => { :name => "Josh" })
|
|
|
|
end
|
|
|
|
|
|
|
|
# TODO: The reason for this test is unclear, improve documentation
|
|
|
|
def test_render_missing_xml_partial_and_raise_missing_template
|
|
|
|
@view.template_format = :xml
|
|
|
|
assert_raise(ActionView::MissingTemplate) { @view.render(:partial => "test/layout_for_partial") }
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_render_inline
|
|
|
|
assert_equal "Hello, World!", @view.render(:inline => "Hello, World!")
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_render_inline_with_locals
|
|
|
|
assert_equal "Hello, Josh!", @view.render(:inline => "Hello, <%= name %>!", :locals => { :name => "Josh" })
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_render_fallbacks_to_erb_for_unknown_types
|
2008-11-28 12:18:28 -05:00
|
|
|
assert_equal "Hello, World!", @view.render(:inline => "Hello, World!", :type => :bar)
|
2008-06-25 06:47:01 -04:00
|
|
|
end
|
|
|
|
|
2008-07-18 17:00:20 -04:00
|
|
|
CustomHandler = lambda do |template|
|
|
|
|
"@output_buffer = ''\n" +
|
|
|
|
"@output_buffer << 'source: #{template.source.inspect}'\n"
|
2008-06-25 06:47:01 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_render_inline_with_compilable_custom_type
|
2008-07-18 17:00:20 -04:00
|
|
|
ActionView::Template.register_template_handler :foo, CustomHandler
|
2008-07-11 16:39:22 -04:00
|
|
|
assert_equal 'source: "Hello, World!"', @view.render(:inline => "Hello, World!", :type => :foo)
|
2008-06-25 06:47:01 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
def test_render_inline_with_locals_and_compilable_custom_type
|
2008-07-18 17:00:20 -04:00
|
|
|
ActionView::Template.register_template_handler :foo, CustomHandler
|
2008-07-11 16:39:22 -04:00
|
|
|
assert_equal 'source: "Hello, <%= name %>!"', @view.render(:inline => "Hello, <%= name %>!", :locals => { :name => "Josh" }, :type => :foo)
|
2008-06-25 06:47:01 -04:00
|
|
|
end
|
2008-10-28 18:31:33 -04:00
|
|
|
|
2008-11-23 14:57:01 -05:00
|
|
|
class LegacyHandler < ActionView::TemplateHandler
|
|
|
|
def render(template, local_assigns)
|
|
|
|
"source: #{template.source}; locals: #{local_assigns.inspect}"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_render_legacy_handler_with_custom_type
|
|
|
|
ActionView::Template.register_template_handler :foo, LegacyHandler
|
|
|
|
assert_equal 'source: Hello, <%= name %>!; locals: {:name=>"Josh"}', @view.render(:inline => "Hello, <%= name %>!", :locals => { :name => "Josh" }, :type => :foo)
|
|
|
|
end
|
|
|
|
|
2008-10-28 18:31:33 -04:00
|
|
|
def test_render_with_layout
|
|
|
|
assert_equal %(<title></title>\nHello world!\n),
|
|
|
|
@view.render(:file => "test/hello_world.erb", :layout => "layouts/yield")
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_render_with_nested_layout
|
|
|
|
assert_equal %(<title>title</title>\n<div id="column">column</div>\n<div id="content">content</div>\n),
|
|
|
|
@view.render(:file => "test/nested_layout.erb", :layout => "layouts/yield")
|
|
|
|
end
|
2008-06-25 06:47:01 -04:00
|
|
|
end
|
2008-11-28 12:18:28 -05:00
|
|
|
|
2008-11-28 15:31:54 -05:00
|
|
|
class CachedViewRenderTest < Test::Unit::TestCase
|
|
|
|
include RenderTestCases
|
|
|
|
|
|
|
|
# Ensure view path cache is primed
|
|
|
|
def setup
|
|
|
|
view_paths = ActionController::Base.view_paths
|
|
|
|
assert view_paths.first.loaded?
|
|
|
|
setup_view(view_paths)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class LazyViewRenderTest < Test::Unit::TestCase
|
|
|
|
include RenderTestCases
|
|
|
|
|
2008-11-28 12:18:28 -05:00
|
|
|
# Test the same thing as above, but make sure the view path
|
|
|
|
# is not eager loaded
|
|
|
|
def setup
|
|
|
|
view_paths = ActionView::Base.process_view_paths(FIXTURE_LOAD_PATH)
|
|
|
|
assert !view_paths.first.loaded?
|
2008-11-28 15:31:54 -05:00
|
|
|
setup_view(view_paths)
|
2008-11-28 12:18:28 -05:00
|
|
|
end
|
|
|
|
end
|