better_html 0.0.8 → 0.0.9
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/lib/better_html/node_iterator/html_erb.rb +6 -3
- data/lib/better_html/node_iterator/html_lodash.rb +1 -1
- data/lib/better_html/node_iterator/javascript_erb.rb +8 -7
- data/lib/better_html/node_iterator/location.rb +38 -2
- data/lib/better_html/test_helper/ruby_expr.rb +89 -64
- data/lib/better_html/test_helper/safe_erb_tester.rb +134 -31
- data/lib/better_html/test_helper/safe_lodash_tester.rb +25 -12
- data/lib/better_html/test_helper/safety_error.rb +12 -0
- data/lib/better_html/version.rb +1 -1
- data/test/better_html/node_iterator/location_test.rb +36 -0
- data/test/better_html/test_helper/ruby_expr_test.rb +163 -86
- data/test/better_html/test_helper/safe_erb_tester_test.rb +63 -22
- data/test/better_html/test_helper/safe_lodash_tester_test.rb +5 -5
- metadata +19 -3
- data/lib/better_html/test_helper/safety_tester_base.rb +0 -34
@@ -1,10 +1,8 @@
|
|
1
|
-
|
1
|
+
require 'better_html/test_helper/safety_error'
|
2
2
|
|
3
3
|
module BetterHtml
|
4
4
|
module TestHelper
|
5
5
|
module SafeLodashTester
|
6
|
-
include SafetyTesterBase
|
7
|
-
|
8
6
|
SAFETY_TIPS = <<-EOF
|
9
7
|
-----------
|
10
8
|
|
@@ -32,7 +30,11 @@ EOF
|
|
32
30
|
|
33
31
|
message = ""
|
34
32
|
tester.errors.each do |error|
|
35
|
-
message <<
|
33
|
+
message << <<~EOL
|
34
|
+
On line #{error.location.line}
|
35
|
+
#{error.message}
|
36
|
+
#{error.location.line_source_with_underline}\n
|
37
|
+
EOL
|
36
38
|
end
|
37
39
|
|
38
40
|
message << SAFETY_TIPS
|
@@ -52,8 +54,8 @@ EOF
|
|
52
54
|
validate!
|
53
55
|
end
|
54
56
|
|
55
|
-
def add_error(
|
56
|
-
@errors.add(
|
57
|
+
def add_error(message, location:)
|
58
|
+
@errors.add(SafetyError.new(message, location: location))
|
57
59
|
end
|
58
60
|
|
59
61
|
def validate!
|
@@ -63,8 +65,10 @@ EOF
|
|
63
65
|
validate_element(node)
|
64
66
|
|
65
67
|
if node.name == 'script' && !node.closing?
|
66
|
-
add_error(
|
67
|
-
"No script tags allowed nested in lodash templates"
|
68
|
+
add_error(
|
69
|
+
"No script tags allowed nested in lodash templates",
|
70
|
+
location: node.name_parts.first.location
|
71
|
+
)
|
68
72
|
end
|
69
73
|
when BetterHtml::NodeIterator::CData, BetterHtml::NodeIterator::Comment
|
70
74
|
validate_no_statements(node)
|
@@ -85,7 +89,10 @@ EOF
|
|
85
89
|
when :expr_literal
|
86
90
|
validate_tag_expression(element, attribute.name, token)
|
87
91
|
when :expr_escaped
|
88
|
-
add_error(
|
92
|
+
add_error(
|
93
|
+
"lodash interpolation with '[%!' inside html attribute is never safe",
|
94
|
+
location: token.location
|
95
|
+
)
|
89
96
|
end
|
90
97
|
end
|
91
98
|
end
|
@@ -93,8 +100,11 @@ EOF
|
|
93
100
|
|
94
101
|
def validate_tag_expression(node, attr_name, value_token)
|
95
102
|
if javascript_attribute_name?(attr_name) && !lodash_safe_javascript_expression?(value_token.code.strip)
|
96
|
-
add_error(
|
97
|
-
"
|
103
|
+
add_error(
|
104
|
+
"lodash interpolation in javascript attribute "\
|
105
|
+
"`#{attr_name}` must call `JSON.stringify(#{value_token.code.strip})`",
|
106
|
+
location: value_token.location
|
107
|
+
)
|
98
108
|
end
|
99
109
|
end
|
100
110
|
|
@@ -113,7 +123,10 @@ EOF
|
|
113
123
|
end
|
114
124
|
|
115
125
|
def add_no_statement_error(node, token)
|
116
|
-
add_error(
|
126
|
+
add_error(
|
127
|
+
"javascript statement not allowed here; did you mean '[%=' ?",
|
128
|
+
location: token.location
|
129
|
+
)
|
117
130
|
end
|
118
131
|
end
|
119
132
|
end
|
data/lib/better_html/version.rb
CHANGED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'better_html/test_helper/safe_erb_tester'
|
3
|
+
|
4
|
+
module BetterHtml
|
5
|
+
class NodeIterator
|
6
|
+
class LocationTest < ActiveSupport::TestCase
|
7
|
+
test "location without line and column" do
|
8
|
+
loc = Location.new("foo\nbar\nbaz", 9, 10)
|
9
|
+
|
10
|
+
assert_equal "a", loc.source
|
11
|
+
assert_equal 3, loc.line
|
12
|
+
assert_equal 1, loc.column
|
13
|
+
end
|
14
|
+
|
15
|
+
test "line_source_with_underline" do
|
16
|
+
loc = Location.new("ui_helper(foo)", 10, 13)
|
17
|
+
|
18
|
+
assert_equal "foo", loc.source
|
19
|
+
assert_equal <<~EOL.strip, loc.line_source_with_underline
|
20
|
+
ui_helper(foo)
|
21
|
+
^^^
|
22
|
+
EOL
|
23
|
+
end
|
24
|
+
|
25
|
+
test "line_source_with_underline removes empty spaces" do
|
26
|
+
loc = Location.new(" \t ui_helper(foo)", 17, 20)
|
27
|
+
|
28
|
+
assert_equal "foo", loc.source
|
29
|
+
assert_equal <<~EOL.strip, loc.line_source_with_underline
|
30
|
+
ui_helper(foo)
|
31
|
+
^^^
|
32
|
+
EOL
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -5,201 +5,278 @@ module BetterHtml
|
|
5
5
|
module TestHelper
|
6
6
|
class RubyExprTest < ActiveSupport::TestCase
|
7
7
|
test "simple call" do
|
8
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
8
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse("foo")
|
9
9
|
assert_equal 1, expr.calls.size
|
10
10
|
assert_nil expr.calls.first.instance
|
11
|
-
assert_equal
|
12
|
-
|
11
|
+
assert_equal :foo, expr.calls.first.method
|
12
|
+
assert_equal [], expr.calls.first.arguments
|
13
|
+
refute_predicate expr, :static_value?
|
13
14
|
end
|
14
15
|
|
15
16
|
test "instance call" do
|
16
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
17
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse("foo.bar")
|
17
18
|
assert_equal 1, expr.calls.size
|
18
|
-
assert_equal
|
19
|
-
assert_equal
|
20
|
-
|
19
|
+
assert_equal 's(:send, nil, :foo)', expr.calls.first.instance.inspect
|
20
|
+
assert_equal :bar, expr.calls.first.method
|
21
|
+
assert_equal [], expr.calls.first.arguments
|
22
|
+
refute_predicate expr, :static_value?
|
21
23
|
end
|
22
24
|
|
23
25
|
test "instance call with arguments" do
|
24
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
26
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse("foo(x).bar")
|
25
27
|
assert_equal 1, expr.calls.size
|
26
|
-
assert_equal
|
27
|
-
assert_equal
|
28
|
-
|
28
|
+
assert_equal "s(:send, nil, :foo,\n s(:send, nil, :x))", expr.calls.first.instance.inspect
|
29
|
+
assert_equal :bar, expr.calls.first.method
|
30
|
+
assert_equal [], expr.calls.first.arguments
|
31
|
+
refute_predicate expr, :static_value?
|
29
32
|
end
|
30
33
|
|
31
34
|
test "instance call with parenthesis" do
|
32
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
35
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse("(foo).bar")
|
33
36
|
assert_equal 1, expr.calls.size
|
34
|
-
assert_equal
|
35
|
-
assert_equal
|
36
|
-
|
37
|
+
assert_equal "s(:begin,\n s(:send, nil, :foo))", expr.calls.first.instance.inspect
|
38
|
+
assert_equal :bar, expr.calls.first.method
|
39
|
+
assert_equal [], expr.calls.first.arguments
|
40
|
+
refute_predicate expr, :static_value?
|
37
41
|
end
|
38
42
|
|
39
43
|
test "instance call with parenthesis 2" do
|
40
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
44
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse("(foo)")
|
41
45
|
assert_equal 1, expr.calls.size
|
42
46
|
assert_nil expr.calls.first.instance
|
43
|
-
assert_equal
|
44
|
-
|
47
|
+
assert_equal :foo, expr.calls.first.method
|
48
|
+
assert_equal [], expr.calls.first.arguments
|
49
|
+
refute_predicate expr, :static_value?
|
45
50
|
end
|
46
51
|
|
47
52
|
test "command call" do
|
48
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
53
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse("foo bar")
|
49
54
|
assert_equal 1, expr.calls.size
|
50
55
|
assert_nil expr.calls.first.instance
|
51
|
-
assert_equal
|
52
|
-
assert_equal [
|
56
|
+
assert_equal :foo, expr.calls.first.method
|
57
|
+
assert_equal '[s(:send, nil, :bar)]', expr.calls.first.arguments.inspect
|
58
|
+
refute_predicate expr, :static_value?
|
53
59
|
end
|
54
60
|
|
55
61
|
test "command call with block" do
|
56
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
62
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse("foo bar do")
|
57
63
|
assert_equal 1, expr.calls.size
|
58
64
|
assert_nil expr.calls.first.instance
|
59
|
-
assert_equal
|
60
|
-
assert_equal [
|
65
|
+
assert_equal :foo, expr.calls.first.method
|
66
|
+
assert_equal '[s(:send, nil, :bar)]', expr.calls.first.arguments.inspect
|
67
|
+
refute_predicate expr, :static_value?
|
61
68
|
end
|
62
69
|
|
63
70
|
test "call with parameters" do
|
64
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
71
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse("foo(bar)")
|
65
72
|
assert_equal 1, expr.calls.size
|
66
73
|
assert_nil expr.calls.first.instance
|
67
|
-
assert_equal
|
68
|
-
assert_equal [
|
74
|
+
assert_equal :foo, expr.calls.first.method
|
75
|
+
assert_equal '[s(:send, nil, :bar)]', expr.calls.first.arguments.inspect
|
76
|
+
refute_predicate expr, :static_value?
|
69
77
|
end
|
70
78
|
|
71
79
|
test "instance call with parameters" do
|
72
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
80
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse("foo.bar(baz, x)")
|
73
81
|
assert_equal 1, expr.calls.size
|
74
|
-
assert_equal
|
75
|
-
assert_equal
|
76
|
-
assert_equal [
|
82
|
+
assert_equal 's(:send, nil, :foo)', expr.calls.first.instance.inspect
|
83
|
+
assert_equal :bar, expr.calls.first.method
|
84
|
+
assert_equal '[s(:send, nil, :baz), s(:send, nil, :x)]', expr.calls.first.arguments.inspect
|
85
|
+
refute_predicate expr, :static_value?
|
77
86
|
end
|
78
87
|
|
79
88
|
test "call with parameters with if conditional modifier" do
|
80
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
89
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse("foo(bar) if something?")
|
81
90
|
assert_equal 1, expr.calls.size
|
82
91
|
assert_nil expr.calls.first.instance
|
83
|
-
assert_equal
|
84
|
-
assert_equal [
|
92
|
+
assert_equal :foo, expr.calls.first.method
|
93
|
+
assert_equal '[s(:send, nil, :bar)]', expr.calls.first.arguments.inspect
|
94
|
+
refute_predicate expr, :static_value?
|
85
95
|
end
|
86
96
|
|
87
97
|
test "call with parameters with unless conditional modifier" do
|
88
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
98
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse("foo(bar) unless something?")
|
89
99
|
assert_equal 1, expr.calls.size
|
90
100
|
assert_nil expr.calls.first.instance
|
91
|
-
assert_equal
|
92
|
-
assert_equal [
|
101
|
+
assert_equal :foo, expr.calls.first.method
|
102
|
+
assert_equal '[s(:send, nil, :bar)]', expr.calls.first.arguments.inspect
|
103
|
+
refute_predicate expr, :static_value?
|
93
104
|
end
|
94
105
|
|
95
106
|
test "expression call in ternary" do
|
96
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
107
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse("something? ? foo : bar")
|
97
108
|
assert_equal 2, expr.calls.size
|
109
|
+
refute_predicate expr, :static_value?
|
98
110
|
|
99
|
-
assert_nil expr.calls.
|
100
|
-
assert_equal
|
101
|
-
|
111
|
+
assert_nil expr.calls[0].instance
|
112
|
+
assert_equal :foo, expr.calls[0].method
|
113
|
+
assert_equal [], expr.calls[0].arguments
|
102
114
|
|
103
|
-
assert_nil expr.calls.
|
104
|
-
assert_equal
|
105
|
-
|
115
|
+
assert_nil expr.calls[1].instance
|
116
|
+
assert_equal :bar, expr.calls[1].method
|
117
|
+
assert_equal [], expr.calls[1].arguments
|
106
118
|
end
|
107
119
|
|
108
120
|
test "expression call with args in ternary" do
|
109
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
121
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse("something? ? foo(x) : bar(x)")
|
110
122
|
assert_equal 2, expr.calls.size
|
111
123
|
|
112
|
-
assert_nil expr.calls.
|
113
|
-
assert_equal
|
114
|
-
assert_equal [
|
124
|
+
assert_nil expr.calls[0].instance
|
125
|
+
assert_equal :foo, expr.calls[0].method
|
126
|
+
assert_equal '[s(:send, nil, :x)]', expr.calls[0].arguments.inspect
|
115
127
|
|
116
|
-
assert_nil expr.calls.
|
117
|
-
assert_equal
|
118
|
-
assert_equal [
|
128
|
+
assert_nil expr.calls[1].instance
|
129
|
+
assert_equal :bar, expr.calls[1].method
|
130
|
+
assert_equal '[s(:send, nil, :x)]', expr.calls[1].arguments.inspect
|
131
|
+
refute_predicate expr, :static_value?
|
119
132
|
end
|
120
133
|
|
121
134
|
test "string without interpolation" do
|
122
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
135
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse('"foo"')
|
123
136
|
assert_equal 0, expr.calls.size
|
137
|
+
assert_predicate expr, :static_value?
|
124
138
|
end
|
125
139
|
|
126
140
|
test "string with interpolation" do
|
127
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
141
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse('"foo #{bar}"')
|
128
142
|
assert_equal 1, expr.calls.size
|
129
143
|
assert_nil expr.calls.first.instance
|
130
|
-
assert_equal
|
131
|
-
|
144
|
+
assert_equal :bar, expr.calls.first.method
|
145
|
+
assert_equal [], expr.calls.first.arguments
|
146
|
+
refute_predicate expr, :static_value?
|
132
147
|
end
|
133
148
|
|
134
149
|
test "ternary in string with interpolation" do
|
135
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
150
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse('"foo #{foo? ? bar : baz}"')
|
136
151
|
assert_equal 2, expr.calls.size
|
137
152
|
|
138
153
|
assert_nil expr.calls.first.instance
|
139
|
-
assert_equal
|
140
|
-
|
154
|
+
assert_equal :bar, expr.calls.first.method
|
155
|
+
assert_equal [], expr.calls.first.arguments
|
141
156
|
|
142
157
|
assert_nil expr.calls.last.instance
|
143
|
-
assert_equal
|
144
|
-
|
158
|
+
assert_equal :baz, expr.calls.last.method
|
159
|
+
assert_equal [], expr.calls.first.arguments
|
160
|
+
refute_predicate expr, :static_value?
|
145
161
|
end
|
146
162
|
|
147
163
|
test "assignment to variable" do
|
148
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
164
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse('x = foo.bar')
|
149
165
|
assert_equal 1, expr.calls.size
|
150
|
-
assert_equal
|
151
|
-
assert_equal
|
152
|
-
|
166
|
+
assert_equal 's(:send, nil, :foo)', expr.calls.first.instance.inspect
|
167
|
+
assert_equal :bar, expr.calls.first.method
|
168
|
+
assert_equal [], expr.calls.first.arguments
|
169
|
+
refute_predicate expr, :static_value?
|
153
170
|
end
|
154
171
|
|
155
172
|
test "assignment to variable with command call" do
|
156
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
173
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse('raw x = foo.bar')
|
157
174
|
assert_equal 1, expr.calls.size
|
158
175
|
assert_nil expr.calls.first.instance
|
159
|
-
assert_equal
|
160
|
-
assert_equal [
|
176
|
+
assert_equal :raw, expr.calls.first.method
|
177
|
+
assert_equal "[s(:lvasgn, :x,\n s(:send,\n s(:send, nil, :foo), :bar))]", expr.calls.first.arguments.inspect
|
178
|
+
refute_predicate expr, :static_value?
|
161
179
|
end
|
162
180
|
|
163
181
|
test "assignment with instance call" do
|
164
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
182
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse('(x = foo).bar')
|
165
183
|
assert_equal 1, expr.calls.size
|
166
|
-
assert_equal
|
167
|
-
assert_equal
|
168
|
-
|
184
|
+
assert_equal "s(:begin,\n s(:lvasgn, :x,\n s(:send, nil, :foo)))", expr.calls.first.instance.inspect
|
185
|
+
assert_equal :bar, expr.calls.first.method
|
186
|
+
assert_equal [], expr.calls.first.arguments
|
187
|
+
refute_predicate expr, :static_value?
|
169
188
|
end
|
170
189
|
|
171
190
|
test "assignment to multiple variables" do
|
172
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
191
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse('x, y = foo.bar')
|
173
192
|
assert_equal 1, expr.calls.size
|
174
|
-
assert_equal
|
175
|
-
assert_equal
|
176
|
-
|
193
|
+
assert_equal 's(:send, nil, :foo)', expr.calls.first.instance.inspect
|
194
|
+
assert_equal :bar, expr.calls.first.method
|
195
|
+
assert_equal [], expr.calls.first.arguments
|
196
|
+
refute_predicate expr, :static_value?
|
177
197
|
end
|
178
198
|
|
179
199
|
test "safe navigation operator" do
|
180
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
200
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse('foo&.bar')
|
181
201
|
assert_equal 1, expr.calls.size
|
182
|
-
assert_equal
|
183
|
-
assert_equal
|
184
|
-
|
202
|
+
assert_equal 's(:send, nil, :foo)', expr.calls[0].instance.inspect
|
203
|
+
assert_equal :bar, expr.calls[0].method
|
204
|
+
assert_equal [], expr.calls[0].arguments
|
205
|
+
refute_predicate expr, :static_value?
|
185
206
|
end
|
186
207
|
|
187
208
|
test "instance variable" do
|
188
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
209
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse('@foo')
|
189
210
|
assert_equal 0, expr.calls.size
|
211
|
+
refute_predicate expr, :static_value?
|
190
212
|
end
|
191
213
|
|
192
214
|
test "instance method on variable" do
|
193
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
215
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse('@foo.bar')
|
194
216
|
assert_equal 1, expr.calls.size
|
195
|
-
assert_equal
|
196
|
-
assert_equal
|
197
|
-
|
217
|
+
assert_equal 's(:ivar, :@foo)', expr.calls.first.instance.inspect
|
218
|
+
assert_equal :bar, expr.calls.first.method
|
219
|
+
assert_equal [], expr.calls.first.arguments
|
220
|
+
refute_predicate expr, :static_value?
|
198
221
|
end
|
199
222
|
|
200
223
|
test "index into array" do
|
201
|
-
expr = BetterHtml::TestHelper::RubyExpr.
|
202
|
-
assert_equal
|
224
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse('local_assigns[:text_class] if local_assigns[:text_class]')
|
225
|
+
assert_equal 1, expr.calls.size
|
226
|
+
assert_equal 's(:send, nil, :local_assigns)', expr.calls.first.instance.inspect
|
227
|
+
assert_equal :[], expr.calls.first.method
|
228
|
+
assert_equal '[s(:sym, :text_class)]', expr.calls.first.arguments.inspect
|
229
|
+
refute_predicate expr, :static_value?
|
230
|
+
end
|
231
|
+
|
232
|
+
test "static_value? for ivar" do
|
233
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse('@foo')
|
234
|
+
refute_predicate expr, :static_value?
|
235
|
+
end
|
236
|
+
|
237
|
+
test "static_value? for str" do
|
238
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse("'str'")
|
239
|
+
assert_predicate expr, :static_value?
|
240
|
+
end
|
241
|
+
|
242
|
+
test "static_value? for int" do
|
243
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse("1")
|
244
|
+
assert_predicate expr, :static_value?
|
245
|
+
end
|
246
|
+
|
247
|
+
test "static_value? for bool" do
|
248
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse("true")
|
249
|
+
assert_predicate expr, :static_value?
|
250
|
+
end
|
251
|
+
|
252
|
+
test "static_value? for nil" do
|
253
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse("nil")
|
254
|
+
assert_predicate expr, :static_value?
|
255
|
+
end
|
256
|
+
|
257
|
+
test "static_value? for dstr without interpolate" do
|
258
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse('"str"')
|
259
|
+
assert_predicate expr, :static_value?
|
260
|
+
end
|
261
|
+
|
262
|
+
test "static_value? for dstr with interpolate" do
|
263
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse('"str #{foo}"')
|
264
|
+
refute_predicate expr, :static_value?
|
265
|
+
end
|
266
|
+
|
267
|
+
test "static_value? with safe ternary" do
|
268
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse('foo ? \'a\' : \'b\'')
|
269
|
+
assert_predicate expr, :static_value?
|
270
|
+
end
|
271
|
+
|
272
|
+
test "static_value? with safe conditional" do
|
273
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse('\'foo\' if bar?')
|
274
|
+
assert_predicate expr, :static_value?
|
275
|
+
end
|
276
|
+
|
277
|
+
test "static_value? with safe assignment" do
|
278
|
+
expr = BetterHtml::TestHelper::RubyExpr.parse('x = \'foo\'')
|
279
|
+
assert_predicate expr, :static_value?
|
203
280
|
end
|
204
281
|
end
|
205
282
|
end
|