Expect an incompatible encoding exception when a template doesn't have a magic comment and its source encoding doesn't match the default external encoding

This commit is contained in:
Jeremy Kemper 2010-04-08 19:27:22 -07:00
parent fd7202a756
commit bd2bf5390d
3 changed files with 38 additions and 27 deletions

View File

@ -1,4 +1,4 @@
Русский текст
Русский <%= "текст" %>
<%= "日".encoding %>
<%= @output_buffer.encoding %>
<%= __ENCODING__ %>

View File

@ -1,5 +1,5 @@
<%# encoding: utf-8 -%>
Русский текст
Русский <%= "текст" %>
<%= "日".encoding %>
<%= @output_buffer.encoding %>
<%= __ENCODING__ %>

View File

@ -245,31 +245,6 @@ module RenderTestCases
assert_equal %(\n<title>title</title>\n\n),
@view.render(:file => "test/layout_render_file.erb")
end
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 "Русский текст\nUTF-8\nUTF-8\nUTF-8\n", result
assert_equal Encoding::UTF_8, result.encoding
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 "Русский текст\nUTF-8\nUTF-8\nUTF-8\n", result
assert_equal Encoding::UTF_8, result.encoding
end
end
def with_external_encoding(encoding)
old, Encoding.default_external = Encoding.default_external, encoding
yield
ensure
Encoding.default_external = old
end
end
end
class CachedViewRenderTest < ActiveSupport::TestCase
@ -302,4 +277,40 @@ class LazyViewRenderTest < ActiveSupport::TestCase
def teardown
GC.start
end
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
assert_equal "Русский текст\nUTF-8\nUTF-8\nUTF-8\n", result
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
assert_equal "Русский текст\nUTF-8\nUTF-8\nUTF-8\n", result
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
def with_external_encoding(encoding)
old, Encoding.default_external = Encoding.default_external, encoding
yield
ensure
Encoding.default_external = old
end
end
end