render_test.rb 11.9 KB
Newer Older
1
# encoding: utf-8
2 3 4
require 'abstract_unit'
require 'controller/fake_models'

Y
Yehuda Katz 已提交
5 6 7
class TestController < ActionController::Base
end

8 9
module RenderTestCases
  def setup_view(paths)
10
    @assigns = { :secret => 'in the sauce' }
11
    @view = ActionView::Base.new(paths, @assigns)
12
    @controller_view = TestController.new.view_context
J
Joshua Peek 已提交
13 14 15 16

    # Reload and register danish language for testing
    I18n.reload!
    I18n.backend.store_translations 'da', {}
17
    I18n.backend.store_translations 'pt-BR', {}
J
Joshua Peek 已提交
18 19

    # Ensure original are still the same since we are reindexing view paths
20
    assert_equal ORIGINAL_LOCALES, I18n.available_locales.map {|l| l.to_s }.sort
21 22 23
  end

  def test_render_file
24
    assert_equal "Hello world!", @view.render(:file => "test/hello_world.erb")
25 26 27
  end

  def test_render_file_not_using_full_path
28
    assert_equal "Hello world!", @view.render(:file => "test/hello_world.erb")
29 30 31
  end

  def test_render_file_without_specific_extension
32
    assert_equal "Hello world!", @view.render(:file => "test/hello_world")
33 34
  end

J
Joshua Peek 已提交
35
  def test_render_file_with_localization
36
    old_locale, @view.locale = @view.locale, :da
37 38
    assert_equal "Hey verden", @view.render(:file => "test/hello_world")
  ensure
39
    @view.locale = old_locale
J
Joshua Peek 已提交
40 41
  end

42
  def test_render_file_with_dashed_locale
43
    old_locale, @view.locale = @view.locale, :"pt-BR"
44
    assert_equal "Ola mundo", @view.render(:file => "test/hello_world")
45
  ensure
46
    @view.locale = old_locale
47 48
  end

49
  def test_render_file_at_top_level
50
    assert_equal 'Elastica', @view.render(:file => '/shared')
51 52
  end

53 54
  def test_render_file_with_full_path
    template_path = File.join(File.dirname(__FILE__), '../fixtures/test/hello_world.erb')
55
    assert_equal "Hello world!", @view.render(:file => template_path)
56 57 58
  end

  def test_render_file_with_instance_variables
59
    assert_equal "The secret is in the sauce\n", @view.render(:file => "test/render_file_with_ivar.erb")
60 61 62 63
  end

  def test_render_file_with_locals
    locals = { :secret => 'in the sauce' }
64
    assert_equal "The secret is in the sauce\n", @view.render(:file => "test/render_file_with_locals.erb", :locals => locals)
65 66 67
  end

  def test_render_file_not_using_full_path_with_dot_in_path
68
    assert_equal "The secret is in the sauce\n", @view.render(:file => "test/dot.directory/render_file_with_ivar")
69 70 71 72 73 74 75 76
  end

  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

77 78 79 80
  def test_render_partial_from_default
    assert_equal "only partial", @view.render("test/partial_only")
  end

81 82 83 84
  def test_render_partial
    assert_equal "only partial", @view.render(:partial => "test/partial_only")
  end

85 86 87 88 89 90 91 92 93 94 95 96 97 98
  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

99 100 101 102
  def test_render_partial_with_locals
    assert_equal "5", @view.render(:partial => "test/counter", :locals => { :counter_counter => 5 })
  end

103 104 105 106
  def test_render_partial_with_locals_from_default
    assert_equal "only partial", @view.render("test/partial_only", :counter_counter => 5)
  end

107
  def test_render_partial_with_errors
108
    @view.render(:partial => "test/raise")
C
Carlhuda 已提交
109 110
    flunk "Render did not raise Template::Error"
  rescue ActionView::Template::Error => e
111
    assert_match %r!method.*doesnt_exist!, e.message
112 113 114 115 116 117 118
    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")
C
Carlhuda 已提交
119 120
    flunk "Render did not raise Template::Error"
  rescue ActionView::Template::Error => e
121
    assert_match %r!method.*doesnt_exist!, e.message
122 123 124
    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
125 126
  end

127 128 129 130
  def test_render_object
    assert_equal "Hello: david", @view.render(:partial => "test/customer", :object => Customer.new("david"))
  end

131 132 133
  def test_render_partial_collection
    assert_equal "Hello: davidHello: mary", @view.render(:partial => "test/customer", :collection => [ Customer.new("david"), Customer.new("mary") ])
  end
134

135
  def test_render_partial_collection_as
136
    assert_equal "david david davidmary mary mary",
137 138
      @view.render(:partial => "test/customer_with_var", :collection => [ Customer.new("david"), Customer.new("mary") ], :as => :customer)
  end
139

140
  def test_render_partial_collection_without_as
141
    assert_equal "local_inspector,local_inspector_counter",
142 143
      @view.render(:partial => "test/local_inspector", :collection => [ Customer.new("mary") ])
  end
144

145 146 147 148 149 150 151 152
  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

153 154 155 156
  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

157 158 159 160
  def test_render_partial_with_empty_array_should_return_nil
    assert_nil @view.render(:partial => [])
  end

Y
Yehuda Katz 已提交
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
  def test_render_partial_using_string
    assert_equal "Hello: Anonymous", @controller_view.render('customer')
  end

  def test_render_partial_with_locals_using_string
    assert_equal "Hola: david", @controller_view.render('customer_greeting', :greeting => 'Hola', :customer_greeting => Customer.new("david"))
  end

  def test_render_partial_using_object
    assert_equal "Hello: lifo",
      @controller_view.render(Customer.new("lifo"), :greeting => "Hello")
  end

  def test_render_partial_using_collection
    customers = [ Customer.new("Amazon"), Customer.new("Yahoo") ]
    assert_equal "Hello: AmazonHello: Yahoo",
      @controller_view.render(customers, :greeting => "Hello")
  end

180 181 182 183 184 185 186
  # 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
187
    @view.formats = [:xml]
188
    assert_raise(ActionView::MissingTemplate) { @view.render(:partial => "test/layout_for_partial") }
189 190
  ensure
    @view.formats = nil
191 192 193 194 195 196 197 198 199 200 201
  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
202
    assert_equal "Hello, World!", @view.render(:inline => "Hello, World!", :type => :bar)
203 204
  end

205 206 207
  CustomHandler = lambda do |template|
    "@output_buffer = ''\n" +
      "@output_buffer << 'source: #{template.source.inspect}'\n"
208 209 210
  end

  def test_render_inline_with_compilable_custom_type
211
    ActionView::Template.register_template_handler :foo, CustomHandler
212
    assert_equal 'source: "Hello, World!"', @view.render(:inline => "Hello, World!", :type => :foo)
213 214 215
  end

  def test_render_inline_with_locals_and_compilable_custom_type
216
    ActionView::Template.register_template_handler :foo, CustomHandler
217
    assert_equal 'source: "Hello, <%= name %>!"', @view.render(:inline => "Hello, <%= name %>!", :locals => { :name => "Josh" }, :type => :foo)
218
  end
219

220 221 222 223 224 225
  def test_render_ignores_templates_with_malformed_template_handlers
    %w(malformed malformed.erb malformed.html.erb malformed.en.html.erb).each do |name|
      assert_raise(ActionView::MissingTemplate) { @view.render(:file => "test/malformed/#{name}") }
    end
  end

226 227 228 229 230
  def test_render_with_layout
    assert_equal %(<title></title>\nHello world!\n),
      @view.render(:file => "test/hello_world.erb", :layout => "layouts/yield")
  end

C
Carlhuda 已提交
231 232 233 234 235 236 237 238
  # TODO: Move to deprecated_tests.rb
  def test_render_with_nested_layout_deprecated
    assert_deprecated do
      assert_equal %(<title>title</title>\n\n\n<div id="column">column</div>\n<div id="content">content</div>\n),
        @view.render(:file => "test/deprecated_nested_layout.erb", :layout => "layouts/yield")
    end
  end

239
  def test_render_with_nested_layout
240
    assert_equal %(<title>title</title>\n\n\n<div id="column">column</div>\n<div id="content">content</div>\n),
241 242
      @view.render(:file => "test/nested_layout.erb", :layout => "layouts/yield")
  end
243

244 245 246 247
  def test_render_with_file_in_layout
    assert_equal %(\n<title>title</title>\n\n),
      @view.render(:file => "test/layout_render_file.erb")
  end
248
end
249

Y
Yehuda Katz 已提交
250
class CachedViewRenderTest < ActiveSupport::TestCase
251 252 253 254 255
  include RenderTestCases

  # Ensure view path cache is primed
  def setup
    view_paths = ActionController::Base.view_paths
256
    assert_equal ActionView::FileSystemResolver, view_paths.first.class
257 258
    setup_view(view_paths)
  end
W
wycats 已提交
259 260 261 262

  def teardown
    GC.start
  end
263 264
end

Y
Yehuda Katz 已提交
265
class LazyViewRenderTest < ActiveSupport::TestCase
266 267
  include RenderTestCases

268 269 270
  # Test the same thing as above, but make sure the view path
  # is not eager loaded
  def setup
271
    path = ActionView::FileSystemResolver.new(FIXTURE_LOAD_PATH)
272
    view_paths = ActionView::Base.process_view_paths(path)
273
    assert_equal ActionView::FileSystemResolver.new(FIXTURE_LOAD_PATH), view_paths.first
274
    setup_view(view_paths)
275
  end
W
wycats 已提交
276 277 278 279

  def teardown
    GC.start
  end
280 281 282 283 284 285

  if '1.9'.respond_to?(:force_encoding)
    def test_render_utf8_template_with_magic_comment
      with_external_encoding Encoding::ASCII_8BIT do
        result = @view.render(:file => "test/utf8_magic.html.erb", :layouts => "layouts/yield")
        assert_equal Encoding::UTF_8, result.encoding
286
        assert_equal "Русский текст\n\nUTF-8\nUTF-8\nUTF-8\n", result
287 288 289 290 291 292 293
      end
    end

    def test_render_utf8_template_with_default_external_encoding
      with_external_encoding Encoding::UTF_8 do
        result = @view.render(:file => "test/utf8.html.erb", :layouts => "layouts/yield")
        assert_equal Encoding::UTF_8, result.encoding
294
        assert_equal "Русский текст\n\nUTF-8\nUTF-8\nUTF-8\n", result
295 296 297 298 299 300 301 302 303 304 305 306 307 308
      end
    end

    def test_render_utf8_template_with_incompatible_external_encoding
      with_external_encoding Encoding::SJIS do
        begin
          result = @view.render(:file => "test/utf8.html.erb", :layouts => "layouts/yield")
          flunk 'Should have raised incompatible encoding error'
        rescue ActionView::Template::Error => error
          assert_match 'invalid byte sequence in Shift_JIS', error.original_exception.message
        end
      end
    end

309 310 311 312 313 314 315 316 317 318 319
    def test_render_utf8_template_with_partial_with_incompatible_encoding
      with_external_encoding Encoding::SJIS do
        begin
          result = @view.render(:file => "test/utf8_magic_with_bare_partial.html.erb", :layouts => "layouts/yield")
          flunk 'Should have raised incompatible encoding error'
        rescue ActionView::Template::Error => error
          assert_match 'invalid byte sequence in Shift_JIS', error.original_exception.message
        end
      end
    end

320 321 322 323 324 325 326
    def with_external_encoding(encoding)
      old, Encoding.default_external = Encoding.default_external, encoding
      yield
    ensure
      Encoding.default_external = old
    end
  end
327
end