haml 5.0.1 → 5.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|