haml 5.0.1 → 5.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +7 -5
- data/CHANGELOG.md +14 -0
- data/Gemfile +1 -0
- data/README.md +0 -6
- data/REFERENCE.md +9 -8
- data/Rakefile +12 -6
- data/haml.gemspec +0 -1
- data/lib/haml/attribute_compiler.rb +19 -11
- data/lib/haml/buffer.rb +1 -1
- data/lib/haml/compiler.rb +3 -3
- data/lib/haml/exec.rb +6 -1
- data/lib/haml/filters.rb +1 -1
- data/lib/haml/generator.rb +1 -1
- data/lib/haml/helpers.rb +1 -1
- data/lib/haml/helpers/action_view_mods.rb +6 -2
- data/lib/haml/parser.rb +1 -1
- data/lib/haml/sass_rails_filter.rb +1 -1
- data/lib/haml/version.rb +1 -1
- metadata +4 -22
- data/test/attribute_parser_test.rb +0 -105
- data/test/engine_test.rb +0 -2131
- data/test/filters_test.rb +0 -262
- data/test/helper_test.rb +0 -695
- data/test/options_test.rb +0 -22
- data/test/parser_test.rb +0 -172
- data/test/template_test.rb +0 -332
- data/test/temple_line_counter_test.rb +0 -40
- data/test/util_test.rb +0 -22
data/test/options_test.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
module Haml
|
4
|
-
class OptionsTest < Haml::TestCase
|
5
|
-
def test_buffer_defaults_have_only_buffer_option_keys
|
6
|
-
assert_equal(
|
7
|
-
Haml::Options.buffer_option_keys.sort,
|
8
|
-
Haml::Options.buffer_defaults.keys.sort,
|
9
|
-
)
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_buffer_defaults_values_are_the_same_as_rails_defaults
|
13
|
-
rails_defaults = Haml::Options.defaults.merge(Haml::Template.options)
|
14
|
-
Haml::Options.buffer_option_keys.each do |key|
|
15
|
-
assert_equal(
|
16
|
-
rails_defaults[key],
|
17
|
-
Haml::Options.buffer_defaults[key], "key: #{key}"
|
18
|
-
)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
data/test/parser_test.rb
DELETED
@@ -1,172 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
module Haml
|
4
|
-
class ParserTest < Haml::TestCase
|
5
|
-
|
6
|
-
test "should raise error for 'else' at wrong indent level" do
|
7
|
-
begin
|
8
|
-
parse("- if true\n #first\n text\n - else\n #second")
|
9
|
-
flunk("Should have raised a Haml::SyntaxError")
|
10
|
-
rescue SyntaxError => e
|
11
|
-
assert_equal Error.message(:bad_script_indent, 'else', 0, 1), e.message
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
test "should raise error for 'elsif' at wrong indent level" do
|
16
|
-
begin
|
17
|
-
parse("- if true\n #first\n text\n - elsif false\n #second")
|
18
|
-
flunk("Should have raised a Haml::SyntaxError")
|
19
|
-
rescue SyntaxError => e
|
20
|
-
assert_equal Error.message(:bad_script_indent, 'elsif', 0, 1), e.message
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
test "should raise error for 'else' at wrong indent level after unless" do
|
25
|
-
begin
|
26
|
-
parse("- unless true\n #first\n text\n - else\n #second")
|
27
|
-
flunk("Should have raised a Haml::SyntaxError")
|
28
|
-
rescue SyntaxError => e
|
29
|
-
assert_equal Error.message(:bad_script_indent, 'else', 0, 1), e.message
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
test "should raise syntax error for else with no if" do
|
34
|
-
begin
|
35
|
-
parse("- else\n 'foo'")
|
36
|
-
flunk("Should have raised a Haml::SyntaxError")
|
37
|
-
rescue SyntaxError => e
|
38
|
-
assert_equal Error.message(:missing_if, 'else'), e.message
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
test "should raise syntax error for nested else with no" do
|
43
|
-
begin
|
44
|
-
parse("#foo\n - else\n 'foo'")
|
45
|
-
flunk("Should have raised a Haml::SyntaxError")
|
46
|
-
rescue SyntaxError => e
|
47
|
-
assert_equal Error.message(:missing_if, 'else'), e.message
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
test "else after if containing case is accepted" do
|
52
|
-
# see issue 572
|
53
|
-
begin
|
54
|
-
parse "- if true\n - case @foo\n - when 1\n bar\n- else\n bar"
|
55
|
-
assert true
|
56
|
-
rescue SyntaxError
|
57
|
-
flunk 'else clause after if containing case should be accepted'
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
test "else after if containing unless is accepted" do
|
62
|
-
begin
|
63
|
-
parse "- if true\n - unless @foo\n bar\n- else\n bar"
|
64
|
-
assert true
|
65
|
-
rescue SyntaxError
|
66
|
-
flunk 'else clause after if containing unless should be accepted'
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
test "loud script with else is accepted" do
|
71
|
-
begin
|
72
|
-
parse "= if true\n - 'A'\n-else\n - 'B'"
|
73
|
-
assert true
|
74
|
-
rescue SyntaxError
|
75
|
-
flunk 'loud script (=) should allow else'
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
test "else after nested loud script is accepted" do
|
80
|
-
begin
|
81
|
-
parse "-if true\n =if true\n - 'A'\n-else\n B"
|
82
|
-
assert true
|
83
|
-
rescue SyntaxError
|
84
|
-
flunk 'else after nested loud script should be accepted'
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
test "case with indented whens should allow else" do
|
89
|
-
begin
|
90
|
-
parse "- foo = 1\n-case foo\n -when 1\n A\n -else\n B"
|
91
|
-
assert true
|
92
|
-
rescue SyntaxError
|
93
|
-
flunk 'case with indented whens should allow else'
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
test "revealed conditional comments are detected" do
|
98
|
-
text = "some revealed text"
|
99
|
-
cond = "[cond]"
|
100
|
-
|
101
|
-
node = parse("/!#{cond} #{text}").children[0]
|
102
|
-
|
103
|
-
assert_equal text, node.value[:text]
|
104
|
-
assert_equal cond, node.value[:conditional]
|
105
|
-
assert node.value[:revealed]
|
106
|
-
end
|
107
|
-
|
108
|
-
test "hidden conditional comments are detected" do
|
109
|
-
text = "some revealed text"
|
110
|
-
cond = "[cond]"
|
111
|
-
|
112
|
-
node = parse("/#{cond} #{text}").children[0]
|
113
|
-
|
114
|
-
assert_equal text, node.value[:text]
|
115
|
-
assert_equal cond, node.value[:conditional]
|
116
|
-
refute node.value[:revealed]
|
117
|
-
end
|
118
|
-
|
119
|
-
test "only script lines are checked for continuation keywords" do
|
120
|
-
haml = "- if true\n setup\n- else\n else\n"
|
121
|
-
node = parse(haml).children[0]
|
122
|
-
assert_equal(3, node.children.size)
|
123
|
-
end
|
124
|
-
|
125
|
-
# see #830. Strictly speaking the pipe here is not necessary, but there
|
126
|
-
# shouldn't be an error if it is there.
|
127
|
-
test "multiline Ruby with extra trailing pipe doesn't raise error" do
|
128
|
-
haml = "%p= foo bar, |\n baz"
|
129
|
-
begin
|
130
|
-
parse haml
|
131
|
-
rescue Haml::SyntaxError
|
132
|
-
flunk "Should not have raised SyntaxError"
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
test "empty filter doesn't hide following lines" do
|
137
|
-
root = parse "%p\n :plain\n %p\n"
|
138
|
-
p_element = root.children[0]
|
139
|
-
assert_equal 2, p_element.children.size
|
140
|
-
assert_equal :filter, p_element.children[0].type
|
141
|
-
assert_equal :tag, p_element.children[1].type
|
142
|
-
end
|
143
|
-
|
144
|
-
# Previously blocks under a haml_comment would be rejected if any line was
|
145
|
-
# indented by a value that wasn't a multiple of the document indentation.
|
146
|
-
test "haml_comment accepts any indentation in content" do
|
147
|
-
begin
|
148
|
-
parse "-\#\n Indented two spaces\n Indented three spaces"
|
149
|
-
rescue Haml::SyntaxError
|
150
|
-
flunk "haml_comment should accept any combination of indentation"
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
test "block haml_comment includes text" do
|
155
|
-
root = parse "-#\n Hello\n Hello\n"
|
156
|
-
assert_equal "Hello\n Hello\n", root.children[0].value[:text]
|
157
|
-
end
|
158
|
-
|
159
|
-
test "block haml_comment includes first line if present" do
|
160
|
-
root = parse "-# First line\n Hello\n Hello\n"
|
161
|
-
assert_equal " First line\nHello\n Hello\n", root.children[0].value[:text]
|
162
|
-
end
|
163
|
-
|
164
|
-
private
|
165
|
-
|
166
|
-
def parse(haml, options = nil)
|
167
|
-
options ||= Options.new
|
168
|
-
parser = Parser.new(options)
|
169
|
-
parser.call(haml)
|
170
|
-
end
|
171
|
-
end
|
172
|
-
end
|
data/test/template_test.rb
DELETED
@@ -1,332 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
require 'mocks/article'
|
3
|
-
|
4
|
-
require 'action_pack/version'
|
5
|
-
require 'template_test_helper'
|
6
|
-
|
7
|
-
class TemplateTest < Haml::TestCase
|
8
|
-
TEMPLATES = %w{ very_basic standard helpers
|
9
|
-
whitespace_handling original_engine list helpful
|
10
|
-
silent_script tag_parsing just_stuff partials
|
11
|
-
nuke_outer_whitespace nuke_inner_whitespace bemit
|
12
|
-
render_layout partial_layout partial_layout_erb}
|
13
|
-
|
14
|
-
def setup
|
15
|
-
@base = create_base
|
16
|
-
|
17
|
-
# filters template uses :sass
|
18
|
-
# Sass::Plugin.options.update(:line_comments => true, :style => :compact)
|
19
|
-
end
|
20
|
-
|
21
|
-
def create_base
|
22
|
-
vars = { 'article' => Article.new, 'foo' => 'value one' }
|
23
|
-
|
24
|
-
base = ActionView::Base.new(TemplateTestHelper::TEMPLATE_PATH, vars)
|
25
|
-
|
26
|
-
# This is needed by RJS in (at least) Rails 3
|
27
|
-
base.instance_variable_set(:@template, base)
|
28
|
-
|
29
|
-
# This is used by form_for.
|
30
|
-
# It's usually provided by ActionController::Base.
|
31
|
-
def base.protect_against_forgery?; false; end
|
32
|
-
|
33
|
-
base
|
34
|
-
end
|
35
|
-
|
36
|
-
def render(text, options = {})
|
37
|
-
return @base.render(:inline => text, :type => :haml) if options == :action_view
|
38
|
-
options = options.merge(:format => :xhtml)
|
39
|
-
super(text, options, @base)
|
40
|
-
end
|
41
|
-
|
42
|
-
def load_result(name)
|
43
|
-
@result = ''
|
44
|
-
File.new(File.dirname(__FILE__) + "/results/#{name}.xhtml").each_line { |l| @result += l }
|
45
|
-
@result
|
46
|
-
end
|
47
|
-
|
48
|
-
def assert_renders_correctly(name, &render_method)
|
49
|
-
old_options = Haml::Template.options.dup
|
50
|
-
Haml::Template.options[:escape_html] = false
|
51
|
-
render_method ||= proc { |n| @base.render(:file => n) }
|
52
|
-
|
53
|
-
silence_warnings do
|
54
|
-
load_result(name).split("\n").zip(render_method[name].split("\n")).each_with_index do |pair, line|
|
55
|
-
message = "template: #{name}\nline: #{line}"
|
56
|
-
assert_equal(pair.first, pair.last, message)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
rescue ActionView::Template::Error => e
|
60
|
-
if e.message =~ /Can't run [\w:]+ filter; required (one of|file) ((?:'\w+'(?: or )?)+)(, but none were found| not found)/
|
61
|
-
puts "\nCouldn't require #{$2}; skipping a test."
|
62
|
-
else
|
63
|
-
raise e
|
64
|
-
end
|
65
|
-
ensure
|
66
|
-
Haml::Template.options = old_options
|
67
|
-
end
|
68
|
-
|
69
|
-
def test_empty_render_should_remain_empty
|
70
|
-
assert_equal('', render(''))
|
71
|
-
end
|
72
|
-
|
73
|
-
TEMPLATES.each do |template|
|
74
|
-
define_method "test_template_should_render_correctly [template: #{template}]" do
|
75
|
-
assert_renders_correctly template
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def test_render_method_returning_null
|
80
|
-
@base.instance_eval do
|
81
|
-
def empty
|
82
|
-
nil
|
83
|
-
end
|
84
|
-
def render_something(&block)
|
85
|
-
capture(self, &block)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
content_to_render = "%h1 This is part of the broken view.\n= render_something do |thing|\n = thing.empty do\n = 'test'"
|
90
|
-
result = render(content_to_render)
|
91
|
-
expected_result = "<h1>This is part of the broken view.</h1>\n"
|
92
|
-
assert_equal(expected_result, result)
|
93
|
-
end
|
94
|
-
|
95
|
-
def test_simple_rendering
|
96
|
-
content_to_render = "%p test\n= capture { 'foo' }"
|
97
|
-
result = render(content_to_render)
|
98
|
-
expected_result = "<p>test</p>\nfoo\n"
|
99
|
-
assert_equal(expected_result, result)
|
100
|
-
end
|
101
|
-
|
102
|
-
def test_templates_should_render_correctly_with_render_proc
|
103
|
-
assert_renders_correctly("standard") do |name|
|
104
|
-
engine = Haml::Engine.new(File.read(File.dirname(__FILE__) + "/templates/#{name}.haml"), format: :xhtml)
|
105
|
-
engine.render_proc(@base).call
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
def test_templates_should_render_correctly_with_def_method
|
110
|
-
assert_renders_correctly("standard") do |name|
|
111
|
-
engine = Haml::Engine.new(File.read(File.dirname(__FILE__) + "/templates/#{name}.haml"), format: :xhtml)
|
112
|
-
engine.def_method(@base, "render_standard")
|
113
|
-
@base.render_standard
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
def test_instance_variables_should_work_inside_templates
|
118
|
-
@base.instance_variable_set(:@content_for_layout, 'something')
|
119
|
-
assert_equal("<p>something</p>", render("%p= @content_for_layout").chomp)
|
120
|
-
|
121
|
-
@base.instance_eval("@author = 'Hampton Catlin'")
|
122
|
-
assert_equal("<div class='author'>Hampton Catlin</div>", render(".author= @author").chomp)
|
123
|
-
|
124
|
-
@base.instance_eval("@author = 'Hampton'")
|
125
|
-
assert_equal("Hampton", render("= @author").chomp)
|
126
|
-
|
127
|
-
@base.instance_eval("@author = 'Catlin'")
|
128
|
-
assert_equal("Catlin", render("= @author").chomp)
|
129
|
-
end
|
130
|
-
|
131
|
-
def test_instance_variables_should_work_inside_attributes
|
132
|
-
@base.instance_eval("@author = 'hcatlin'")
|
133
|
-
assert_equal("<p class='hcatlin'>foo</p>", render("%p{:class => @author} foo").chomp)
|
134
|
-
end
|
135
|
-
|
136
|
-
def test_template_renders_should_eval
|
137
|
-
assert_equal("2\n", render("= 1+1"))
|
138
|
-
end
|
139
|
-
|
140
|
-
def test_haml_options
|
141
|
-
old_options = Haml::Template.options.dup
|
142
|
-
Haml::Template.options[:suppress_eval] = true
|
143
|
-
old_base, @base = @base, create_base
|
144
|
-
assert_renders_correctly("eval_suppressed")
|
145
|
-
ensure
|
146
|
-
@base = old_base
|
147
|
-
Haml::Template.options = old_options
|
148
|
-
end
|
149
|
-
|
150
|
-
def test_with_output_buffer
|
151
|
-
assert_equal(<<HTML, render(<<HAML))
|
152
|
-
<p>
|
153
|
-
foo
|
154
|
-
baz
|
155
|
-
</p>
|
156
|
-
HTML
|
157
|
-
%p
|
158
|
-
foo
|
159
|
-
-# Parenthesis required due to Rails 3.0 deprecation of block helpers
|
160
|
-
-# that return strings.
|
161
|
-
- (with_output_buffer do
|
162
|
-
bar
|
163
|
-
= "foo".gsub(/./) do |s|
|
164
|
-
- "flup"
|
165
|
-
- end)
|
166
|
-
baz
|
167
|
-
HAML
|
168
|
-
end
|
169
|
-
|
170
|
-
def test_exceptions_should_work_correctly
|
171
|
-
begin
|
172
|
-
render("- raise 'oops!'")
|
173
|
-
rescue Exception => e
|
174
|
-
assert_equal("oops!", e.message)
|
175
|
-
assert_match(/^\(haml\):1/, e.backtrace[0])
|
176
|
-
else
|
177
|
-
assert false
|
178
|
-
end
|
179
|
-
|
180
|
-
template = <<END
|
181
|
-
%p
|
182
|
-
%h1 Hello!
|
183
|
-
= "lots of lines"
|
184
|
-
= "even more!"
|
185
|
-
- raise 'oh no!'
|
186
|
-
%p
|
187
|
-
this is after the exception
|
188
|
-
%strong yes it is!
|
189
|
-
ho ho ho.
|
190
|
-
END
|
191
|
-
|
192
|
-
begin
|
193
|
-
render(template.chomp)
|
194
|
-
rescue Exception => e
|
195
|
-
assert_match(/^\(haml\):5/, e.backtrace[0])
|
196
|
-
else
|
197
|
-
assert false
|
198
|
-
end
|
199
|
-
end
|
200
|
-
|
201
|
-
def test_form_builder_label_with_block
|
202
|
-
output = render(<<HAML, :action_view)
|
203
|
-
= form_for @article, :as => :article, :html => {:class => nil, :id => nil}, :url => '' do |f|
|
204
|
-
= f.label :title do
|
205
|
-
Block content
|
206
|
-
HAML
|
207
|
-
fragment = Nokogiri::HTML.fragment output
|
208
|
-
assert_equal "Block content", fragment.css('form label').first.content.strip
|
209
|
-
end
|
210
|
-
|
211
|
-
## XSS Protection Tests
|
212
|
-
|
213
|
-
def test_escape_html_option_set
|
214
|
-
assert Haml::Template.options[:escape_html]
|
215
|
-
end
|
216
|
-
|
217
|
-
def test_xss_protection
|
218
|
-
assert_equal("Foo & Bar\n", render('= "Foo & Bar"', :action_view))
|
219
|
-
end
|
220
|
-
|
221
|
-
def test_xss_protection_with_safe_strings
|
222
|
-
assert_equal("Foo & Bar\n", render('= Haml::Util.html_safe("Foo & Bar")', :action_view))
|
223
|
-
end
|
224
|
-
|
225
|
-
def test_xss_protection_with_bang
|
226
|
-
assert_equal("Foo & Bar\n", render('!= "Foo & Bar"', :action_view))
|
227
|
-
end
|
228
|
-
|
229
|
-
def test_xss_protection_in_interpolation
|
230
|
-
assert_equal("Foo & Bar\n", render('Foo #{"&"} Bar', :action_view))
|
231
|
-
end
|
232
|
-
|
233
|
-
def test_xss_protection_in_attributes
|
234
|
-
assert_equal("<div data-html='<foo>bar</foo>'></div>\n", render('%div{ "data-html" => "<foo>bar</foo>" }', :action_view))
|
235
|
-
end
|
236
|
-
|
237
|
-
def test_xss_protection_in_attributes_with_safe_strings
|
238
|
-
assert_equal("<div data-html='<foo>bar</foo>'></div>\n", render('%div{ "data-html" => "<foo>bar</foo>".html_safe }', :action_view))
|
239
|
-
end
|
240
|
-
|
241
|
-
def test_xss_protection_with_bang_in_interpolation
|
242
|
-
assert_equal("Foo & Bar\n", render('! Foo #{"&"} Bar', :action_view))
|
243
|
-
end
|
244
|
-
|
245
|
-
def test_xss_protection_with_safe_strings_in_interpolation
|
246
|
-
assert_equal("Foo & Bar\n", render('Foo #{Haml::Util.html_safe("&")} Bar', :action_view))
|
247
|
-
end
|
248
|
-
|
249
|
-
def test_xss_protection_with_mixed_strings_in_interpolation
|
250
|
-
assert_equal("Foo & Bar & Baz\n", render('Foo #{Haml::Util.html_safe("&")} Bar #{"&"} Baz', :action_view))
|
251
|
-
end
|
252
|
-
|
253
|
-
def test_xss_protection_with_erb_filter
|
254
|
-
if defined?(Haml::SafeErubiTemplate)
|
255
|
-
assert_equal("<img>\n\n", render(":erb\n <%= '<img>' %>", :action_view))
|
256
|
-
assert_equal("<img>\n\n", render(":erb\n <%= '<img>'.html_safe %>", :action_view))
|
257
|
-
else # For Haml::SafeErubisTemplate
|
258
|
-
assert_equal("<img>\n", render(":erb\n <%= '<img>' %>", :action_view))
|
259
|
-
assert_equal("<img>\n", render(":erb\n <%= '<img>'.html_safe %>", :action_view))
|
260
|
-
end
|
261
|
-
end
|
262
|
-
|
263
|
-
def test_rendered_string_is_html_safe
|
264
|
-
assert(render("Foo").html_safe?)
|
265
|
-
end
|
266
|
-
|
267
|
-
def test_rendered_string_is_html_safe_with_action_view
|
268
|
-
assert(render("Foo", :action_view).html_safe?)
|
269
|
-
end
|
270
|
-
|
271
|
-
def test_xss_html_escaping_with_non_strings
|
272
|
-
assert_equal("4\n", render("= html_escape(4)"))
|
273
|
-
end
|
274
|
-
|
275
|
-
def test_xss_protection_with_concat
|
276
|
-
assert_equal("Foo & Bar", render('- concat "Foo & Bar"', :action_view))
|
277
|
-
end
|
278
|
-
|
279
|
-
def test_xss_protection_with_concat_with_safe_string
|
280
|
-
assert_equal("Foo & Bar", render('- concat(Haml::Util.html_safe("Foo & Bar"))', :action_view))
|
281
|
-
end
|
282
|
-
|
283
|
-
def test_xss_protection_with_safe_concat
|
284
|
-
assert_equal("Foo & Bar", render('- safe_concat "Foo & Bar"', :action_view))
|
285
|
-
end
|
286
|
-
|
287
|
-
## Regression
|
288
|
-
|
289
|
-
def test_xss_protection_with_nested_haml_tag
|
290
|
-
assert_equal(<<HTML, render(<<HAML, :action_view))
|
291
|
-
<div>
|
292
|
-
<ul>
|
293
|
-
<li>Content!</li>
|
294
|
-
</ul>
|
295
|
-
</div>
|
296
|
-
HTML
|
297
|
-
- haml_tag :div do
|
298
|
-
- haml_tag :ul do
|
299
|
-
- haml_tag :li, "Content!"
|
300
|
-
HAML
|
301
|
-
end
|
302
|
-
|
303
|
-
if defined?(ActionView::Helpers::PrototypeHelper)
|
304
|
-
def test_rjs
|
305
|
-
assert_equal(<<HTML, render(<<HAML, :action_view))
|
306
|
-
window.location.reload();
|
307
|
-
HTML
|
308
|
-
= update_page do |p|
|
309
|
-
- p.reload
|
310
|
-
HAML
|
311
|
-
end
|
312
|
-
end
|
313
|
-
|
314
|
-
def test_cache
|
315
|
-
@base.controller = ActionController::Base.new
|
316
|
-
@base.controller.perform_caching = false
|
317
|
-
assert_equal(<<HTML, render(<<HAML, :action_view))
|
318
|
-
Test
|
319
|
-
HTML
|
320
|
-
- cache do
|
321
|
-
Test
|
322
|
-
HAML
|
323
|
-
end
|
324
|
-
|
325
|
-
class ::TosUnsafeObject; def to_s; '<hr>'; end; end
|
326
|
-
class ::TosSafeObject; def to_s; '<hr>'.html_safe; end; end
|
327
|
-
|
328
|
-
def test_object_that_returns_safe_buffer
|
329
|
-
assert_equal("<hr>\n", render('= ::TosSafeObject.new', escape_html: true))
|
330
|
-
assert_equal("<hr>\n", render('= ::TosUnsafeObject.new', escape_html: true))
|
331
|
-
end
|
332
|
-
end
|