liquid 5.3.0 → 5.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +16 -1
  3. data/README.md +2 -2
  4. data/lib/liquid/block_body.rb +4 -4
  5. data/lib/liquid/context.rb +6 -2
  6. data/lib/liquid/forloop_drop.rb +44 -1
  7. data/lib/liquid/locales/en.yml +6 -5
  8. data/lib/liquid/partial_cache.rb +3 -3
  9. data/lib/liquid/{static_registers.rb → registers.rb} +13 -10
  10. data/lib/liquid/standardfilters.rb +406 -57
  11. data/lib/liquid/strainer_factory.rb +4 -0
  12. data/lib/liquid/strainer_template.rb +4 -0
  13. data/lib/liquid/tablerowloop_drop.rb +58 -1
  14. data/lib/liquid/tags/assign.rb +12 -8
  15. data/lib/liquid/tags/break.rb +8 -0
  16. data/lib/liquid/tags/capture.rb +13 -10
  17. data/lib/liquid/tags/case.rb +21 -0
  18. data/lib/liquid/tags/comment.rb +13 -0
  19. data/lib/liquid/tags/continue.rb +8 -9
  20. data/lib/liquid/tags/cycle.rb +12 -11
  21. data/lib/liquid/tags/decrement.rb +16 -17
  22. data/lib/liquid/tags/echo.rb +16 -9
  23. data/lib/liquid/tags/for.rb +22 -43
  24. data/lib/liquid/tags/if.rb +11 -9
  25. data/lib/liquid/tags/include.rb +15 -13
  26. data/lib/liquid/tags/increment.rb +16 -14
  27. data/lib/liquid/tags/inline_comment.rb +43 -0
  28. data/lib/liquid/tags/raw.rb +11 -0
  29. data/lib/liquid/tags/render.rb +29 -4
  30. data/lib/liquid/tags/table_row.rb +22 -0
  31. data/lib/liquid/tags/unless.rb +15 -4
  32. data/lib/liquid/template.rb +2 -3
  33. data/lib/liquid/variable.rb +4 -4
  34. data/lib/liquid/variable_lookup.rb +10 -7
  35. data/lib/liquid/version.rb +1 -1
  36. data/lib/liquid.rb +2 -2
  37. metadata +7 -123
  38. data/lib/liquid/register.rb +0 -6
  39. data/test/fixtures/en_locale.yml +0 -9
  40. data/test/integration/assign_test.rb +0 -117
  41. data/test/integration/blank_test.rb +0 -109
  42. data/test/integration/block_test.rb +0 -58
  43. data/test/integration/capture_test.rb +0 -58
  44. data/test/integration/context_test.rb +0 -634
  45. data/test/integration/document_test.rb +0 -21
  46. data/test/integration/drop_test.rb +0 -257
  47. data/test/integration/error_handling_test.rb +0 -272
  48. data/test/integration/expression_test.rb +0 -46
  49. data/test/integration/filter_kwarg_test.rb +0 -24
  50. data/test/integration/filter_test.rb +0 -189
  51. data/test/integration/hash_ordering_test.rb +0 -25
  52. data/test/integration/output_test.rb +0 -125
  53. data/test/integration/parsing_quirks_test.rb +0 -134
  54. data/test/integration/profiler_test.rb +0 -240
  55. data/test/integration/security_test.rb +0 -89
  56. data/test/integration/standard_filter_test.rb +0 -925
  57. data/test/integration/tag/disableable_test.rb +0 -59
  58. data/test/integration/tag_test.rb +0 -45
  59. data/test/integration/tags/break_tag_test.rb +0 -17
  60. data/test/integration/tags/continue_tag_test.rb +0 -17
  61. data/test/integration/tags/echo_test.rb +0 -13
  62. data/test/integration/tags/for_tag_test.rb +0 -466
  63. data/test/integration/tags/if_else_tag_test.rb +0 -190
  64. data/test/integration/tags/include_tag_test.rb +0 -269
  65. data/test/integration/tags/increment_tag_test.rb +0 -25
  66. data/test/integration/tags/liquid_tag_test.rb +0 -116
  67. data/test/integration/tags/raw_tag_test.rb +0 -34
  68. data/test/integration/tags/render_tag_test.rb +0 -213
  69. data/test/integration/tags/standard_tag_test.rb +0 -303
  70. data/test/integration/tags/statements_test.rb +0 -113
  71. data/test/integration/tags/table_row_test.rb +0 -66
  72. data/test/integration/tags/unless_else_tag_test.rb +0 -28
  73. data/test/integration/template_test.rb +0 -340
  74. data/test/integration/trim_mode_test.rb +0 -563
  75. data/test/integration/variable_test.rb +0 -138
  76. data/test/test_helper.rb +0 -207
  77. data/test/unit/block_unit_test.rb +0 -53
  78. data/test/unit/condition_unit_test.rb +0 -181
  79. data/test/unit/file_system_unit_test.rb +0 -37
  80. data/test/unit/i18n_unit_test.rb +0 -39
  81. data/test/unit/lexer_unit_test.rb +0 -53
  82. data/test/unit/parse_tree_visitor_test.rb +0 -261
  83. data/test/unit/parser_unit_test.rb +0 -84
  84. data/test/unit/partial_cache_unit_test.rb +0 -128
  85. data/test/unit/regexp_unit_test.rb +0 -46
  86. data/test/unit/static_registers_unit_test.rb +0 -156
  87. data/test/unit/strainer_factory_unit_test.rb +0 -101
  88. data/test/unit/strainer_template_unit_test.rb +0 -82
  89. data/test/unit/tag_unit_test.rb +0 -23
  90. data/test/unit/tags/case_tag_unit_test.rb +0 -12
  91. data/test/unit/tags/for_tag_unit_test.rb +0 -15
  92. data/test/unit/tags/if_tag_unit_test.rb +0 -10
  93. data/test/unit/template_factory_unit_test.rb +0 -12
  94. data/test/unit/template_unit_test.rb +0 -87
  95. data/test/unit/tokenizer_unit_test.rb +0 -62
  96. data/test/unit/variable_unit_test.rb +0 -164
@@ -1,190 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- class IfElseTagTest < Minitest::Test
6
- include Liquid
7
-
8
- def test_if
9
- assert_template_result(' ', ' {% if false %} this text should not go into the output {% endif %} ')
10
- assert_template_result(' this text should go into the output ',
11
- ' {% if true %} this text should go into the output {% endif %} ')
12
- assert_template_result(' you rock ?', '{% if false %} you suck {% endif %} {% if true %} you rock {% endif %}?')
13
- end
14
-
15
- def test_literal_comparisons
16
- assert_template_result(' NO ', '{% assign v = false %}{% if v %} YES {% else %} NO {% endif %}')
17
- assert_template_result(' YES ', '{% assign v = nil %}{% if v == nil %} YES {% else %} NO {% endif %}')
18
- end
19
-
20
- def test_if_else
21
- assert_template_result(' YES ', '{% if false %} NO {% else %} YES {% endif %}')
22
- assert_template_result(' YES ', '{% if true %} YES {% else %} NO {% endif %}')
23
- assert_template_result(' YES ', '{% if "foo" %} YES {% else %} NO {% endif %}')
24
- end
25
-
26
- def test_if_boolean
27
- assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => true)
28
- end
29
-
30
- def test_if_or
31
- assert_template_result(' YES ', '{% if a or b %} YES {% endif %}', 'a' => true, 'b' => true)
32
- assert_template_result(' YES ', '{% if a or b %} YES {% endif %}', 'a' => true, 'b' => false)
33
- assert_template_result(' YES ', '{% if a or b %} YES {% endif %}', 'a' => false, 'b' => true)
34
- assert_template_result('', '{% if a or b %} YES {% endif %}', 'a' => false, 'b' => false)
35
-
36
- assert_template_result(' YES ', '{% if a or b or c %} YES {% endif %}', 'a' => false, 'b' => false, 'c' => true)
37
- assert_template_result('', '{% if a or b or c %} YES {% endif %}', 'a' => false, 'b' => false, 'c' => false)
38
- end
39
-
40
- def test_if_or_with_operators
41
- assert_template_result(' YES ', '{% if a == true or b == true %} YES {% endif %}', 'a' => true, 'b' => true)
42
- assert_template_result(' YES ', '{% if a == true or b == false %} YES {% endif %}', 'a' => true, 'b' => true)
43
- assert_template_result('', '{% if a == false or b == false %} YES {% endif %}', 'a' => true, 'b' => true)
44
- end
45
-
46
- def test_comparison_of_strings_containing_and_or_or
47
- awful_markup = "a == 'and' and b == 'or' and c == 'foo and bar' and d == 'bar or baz' and e == 'foo' and foo and bar"
48
- assigns = { 'a' => 'and', 'b' => 'or', 'c' => 'foo and bar', 'd' => 'bar or baz', 'e' => 'foo', 'foo' => true, 'bar' => true }
49
- assert_template_result(' YES ', "{% if #{awful_markup} %} YES {% endif %}", assigns)
50
- end
51
-
52
- def test_comparison_of_expressions_starting_with_and_or_or
53
- assigns = { 'order' => { 'items_count' => 0 }, 'android' => { 'name' => 'Roy' } }
54
- assert_template_result("YES",
55
- "{% if android.name == 'Roy' %}YES{% endif %}",
56
- assigns)
57
- assert_template_result("YES",
58
- "{% if order.items_count == 0 %}YES{% endif %}",
59
- assigns)
60
- end
61
-
62
- def test_if_and
63
- assert_template_result(' YES ', '{% if true and true %} YES {% endif %}')
64
- assert_template_result('', '{% if false and true %} YES {% endif %}')
65
- assert_template_result('', '{% if false and true %} YES {% endif %}')
66
- end
67
-
68
- def test_hash_miss_generates_false
69
- assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => {})
70
- end
71
-
72
- def test_if_from_variable
73
- assert_template_result('', '{% if var %} NO {% endif %}', 'var' => false)
74
- assert_template_result('', '{% if var %} NO {% endif %}', 'var' => nil)
75
- assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => { 'bar' => false })
76
- assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => {})
77
- assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => nil)
78
- assert_template_result('', '{% if foo.bar %} NO {% endif %}', 'foo' => true)
79
-
80
- assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => "text")
81
- assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => true)
82
- assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => 1)
83
- assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => {})
84
- assert_template_result(' YES ', '{% if var %} YES {% endif %}', 'var' => [])
85
- assert_template_result(' YES ', '{% if "foo" %} YES {% endif %}')
86
- assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => true })
87
- assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => "text" })
88
- assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => 1 })
89
- assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => {} })
90
- assert_template_result(' YES ', '{% if foo.bar %} YES {% endif %}', 'foo' => { 'bar' => [] })
91
-
92
- assert_template_result(' YES ', '{% if var %} NO {% else %} YES {% endif %}', 'var' => false)
93
- assert_template_result(' YES ', '{% if var %} NO {% else %} YES {% endif %}', 'var' => nil)
94
- assert_template_result(' YES ', '{% if var %} YES {% else %} NO {% endif %}', 'var' => true)
95
- assert_template_result(' YES ', '{% if "foo" %} YES {% else %} NO {% endif %}', 'var' => "text")
96
-
97
- assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'foo' => { 'bar' => false })
98
- assert_template_result(' YES ', '{% if foo.bar %} YES {% else %} NO {% endif %}', 'foo' => { 'bar' => true })
99
- assert_template_result(' YES ', '{% if foo.bar %} YES {% else %} NO {% endif %}', 'foo' => { 'bar' => "text" })
100
- assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'foo' => { 'notbar' => true })
101
- assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'foo' => {})
102
- assert_template_result(' YES ', '{% if foo.bar %} NO {% else %} YES {% endif %}', 'notfoo' => { 'bar' => true })
103
- end
104
-
105
- def test_nested_if
106
- assert_template_result('', '{% if false %}{% if false %} NO {% endif %}{% endif %}')
107
- assert_template_result('', '{% if false %}{% if true %} NO {% endif %}{% endif %}')
108
- assert_template_result('', '{% if true %}{% if false %} NO {% endif %}{% endif %}')
109
- assert_template_result(' YES ', '{% if true %}{% if true %} YES {% endif %}{% endif %}')
110
-
111
- assert_template_result(' YES ', '{% if true %}{% if true %} YES {% else %} NO {% endif %}{% else %} NO {% endif %}')
112
- assert_template_result(' YES ', '{% if true %}{% if false %} NO {% else %} YES {% endif %}{% else %} NO {% endif %}')
113
- assert_template_result(' YES ', '{% if false %}{% if true %} NO {% else %} NONO {% endif %}{% else %} YES {% endif %}')
114
- end
115
-
116
- def test_comparisons_on_null
117
- assert_template_result('', '{% if null < 10 %} NO {% endif %}')
118
- assert_template_result('', '{% if null <= 10 %} NO {% endif %}')
119
- assert_template_result('', '{% if null >= 10 %} NO {% endif %}')
120
- assert_template_result('', '{% if null > 10 %} NO {% endif %}')
121
-
122
- assert_template_result('', '{% if 10 < null %} NO {% endif %}')
123
- assert_template_result('', '{% if 10 <= null %} NO {% endif %}')
124
- assert_template_result('', '{% if 10 >= null %} NO {% endif %}')
125
- assert_template_result('', '{% if 10 > null %} NO {% endif %}')
126
- end
127
-
128
- def test_else_if
129
- assert_template_result('0', '{% if 0 == 0 %}0{% elsif 1 == 1%}1{% else %}2{% endif %}')
130
- assert_template_result('1', '{% if 0 != 0 %}0{% elsif 1 == 1%}1{% else %}2{% endif %}')
131
- assert_template_result('2', '{% if 0 != 0 %}0{% elsif 1 != 1%}1{% else %}2{% endif %}')
132
-
133
- assert_template_result('elsif', '{% if false %}if{% elsif true %}elsif{% endif %}')
134
- end
135
-
136
- def test_syntax_error_no_variable
137
- assert_raises(SyntaxError) { assert_template_result('', '{% if jerry == 1 %}') }
138
- end
139
-
140
- def test_syntax_error_no_expression
141
- assert_raises(SyntaxError) { assert_template_result('', '{% if %}') }
142
- end
143
-
144
- def test_if_with_custom_condition
145
- original_op = Condition.operators['contains']
146
- Condition.operators['contains'] = :[]
147
-
148
- assert_template_result('yes', %({% if 'bob' contains 'o' %}yes{% endif %}))
149
- assert_template_result('no', %({% if 'bob' contains 'f' %}yes{% else %}no{% endif %}))
150
- ensure
151
- Condition.operators['contains'] = original_op
152
- end
153
-
154
- def test_operators_are_ignored_unless_isolated
155
- original_op = Condition.operators['contains']
156
- Condition.operators['contains'] = :[]
157
-
158
- assert_template_result('yes',
159
- %({% if 'gnomeslab-and-or-liquid' contains 'gnomeslab-and-or-liquid' %}yes{% endif %}))
160
- ensure
161
- Condition.operators['contains'] = original_op
162
- end
163
-
164
- def test_operators_are_whitelisted
165
- assert_raises(SyntaxError) do
166
- assert_template_result('', %({% if 1 or throw or or 1 %}yes{% endif %}))
167
- end
168
- end
169
-
170
- def test_multiple_conditions
171
- tpl = "{% if a or b and c %}true{% else %}false{% endif %}"
172
-
173
- tests = {
174
- [true, true, true] => true,
175
- [true, true, false] => true,
176
- [true, false, true] => true,
177
- [true, false, false] => true,
178
- [false, true, true] => true,
179
- [false, true, false] => false,
180
- [false, false, true] => false,
181
- [false, false, false] => false,
182
- }
183
-
184
- tests.each do |vals, expected|
185
- a, b, c = vals
186
- assigns = { 'a' => a, 'b' => b, 'c' => c }
187
- assert_template_result(expected.to_s, tpl, assigns, assigns.to_s)
188
- end
189
- end
190
- end
@@ -1,269 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- class TestFileSystem
6
- def read_template_file(template_path)
7
- case template_path
8
- when "product"
9
- "Product: {{ product.title }} "
10
-
11
- when "product_alias"
12
- "Product: {{ product.title }} "
13
-
14
- when "locale_variables"
15
- "Locale: {{echo1}} {{echo2}}"
16
-
17
- when "variant"
18
- "Variant: {{ variant.title }}"
19
-
20
- when "nested_template"
21
- "{% include 'header' %} {% include 'body' %} {% include 'footer' %}"
22
-
23
- when "body"
24
- "body {% include 'body_detail' %}"
25
-
26
- when "nested_product_template"
27
- "Product: {{ nested_product_template.title }} {%include 'details'%} "
28
-
29
- when "recursively_nested_template"
30
- "-{% include 'recursively_nested_template' %}"
31
-
32
- when "pick_a_source"
33
- "from TestFileSystem"
34
-
35
- when 'assignments'
36
- "{% assign foo = 'bar' %}"
37
-
38
- when 'break'
39
- "{% break %}"
40
-
41
- else
42
- template_path
43
- end
44
- end
45
- end
46
-
47
- class OtherFileSystem
48
- def read_template_file(_template_path)
49
- 'from OtherFileSystem'
50
- end
51
- end
52
-
53
- class CountingFileSystem
54
- attr_reader :count
55
- def read_template_file(_template_path)
56
- @count ||= 0
57
- @count += 1
58
- 'from CountingFileSystem'
59
- end
60
- end
61
-
62
- class CustomInclude < Liquid::Tag
63
- Syntax = /(#{Liquid::QuotedFragment}+)(\s+(?:with|for)\s+(#{Liquid::QuotedFragment}+))?/o
64
-
65
- def initialize(tag_name, markup, tokens)
66
- markup =~ Syntax
67
- @template_name = Regexp.last_match(1)
68
- super
69
- end
70
-
71
- def parse(tokens)
72
- end
73
-
74
- def render_to_output_buffer(_context, output)
75
- output << @template_name[1..-2]
76
- output
77
- end
78
- end
79
-
80
- class IncludeTagTest < Minitest::Test
81
- include Liquid
82
-
83
- def setup
84
- Liquid::Template.file_system = TestFileSystem.new
85
- end
86
-
87
- def test_include_tag_looks_for_file_system_in_registers_first
88
- assert_equal('from OtherFileSystem',
89
- Template.parse("{% include 'pick_a_source' %}").render!({}, registers: { file_system: OtherFileSystem.new }))
90
- end
91
-
92
- def test_include_tag_with
93
- assert_template_result("Product: Draft 151cm ",
94
- "{% include 'product' with products[0] %}", "products" => [{ 'title' => 'Draft 151cm' }, { 'title' => 'Element 155cm' }])
95
- end
96
-
97
- def test_include_tag_with_alias
98
- assert_template_result("Product: Draft 151cm ",
99
- "{% include 'product_alias' with products[0] as product %}", "products" => [{ 'title' => 'Draft 151cm' }, { 'title' => 'Element 155cm' }])
100
- end
101
-
102
- def test_include_tag_for_alias
103
- assert_template_result("Product: Draft 151cm Product: Element 155cm ",
104
- "{% include 'product_alias' for products as product %}", "products" => [{ 'title' => 'Draft 151cm' }, { 'title' => 'Element 155cm' }])
105
- end
106
-
107
- def test_include_tag_with_default_name
108
- assert_template_result("Product: Draft 151cm ",
109
- "{% include 'product' %}", "product" => { 'title' => 'Draft 151cm' })
110
- end
111
-
112
- def test_include_tag_for
113
- assert_template_result("Product: Draft 151cm Product: Element 155cm ",
114
- "{% include 'product' for products %}", "products" => [{ 'title' => 'Draft 151cm' }, { 'title' => 'Element 155cm' }])
115
- end
116
-
117
- def test_include_tag_with_local_variables
118
- assert_template_result("Locale: test123 ", "{% include 'locale_variables' echo1: 'test123' %}")
119
- end
120
-
121
- def test_include_tag_with_multiple_local_variables
122
- assert_template_result("Locale: test123 test321",
123
- "{% include 'locale_variables' echo1: 'test123', echo2: 'test321' %}")
124
- end
125
-
126
- def test_include_tag_with_multiple_local_variables_from_context
127
- assert_template_result("Locale: test123 test321",
128
- "{% include 'locale_variables' echo1: echo1, echo2: more_echos.echo2 %}",
129
- 'echo1' => 'test123', 'more_echos' => { "echo2" => 'test321' })
130
- end
131
-
132
- def test_included_templates_assigns_variables
133
- assert_template_result("bar", "{% include 'assignments' %}{{ foo }}")
134
- end
135
-
136
- def test_nested_include_tag
137
- assert_template_result("body body_detail", "{% include 'body' %}")
138
-
139
- assert_template_result("header body body_detail footer", "{% include 'nested_template' %}")
140
- end
141
-
142
- def test_nested_include_with_variable
143
- assert_template_result("Product: Draft 151cm details ",
144
- "{% include 'nested_product_template' with product %}", "product" => { "title" => 'Draft 151cm' })
145
-
146
- assert_template_result("Product: Draft 151cm details Product: Element 155cm details ",
147
- "{% include 'nested_product_template' for products %}", "products" => [{ "title" => 'Draft 151cm' }, { "title" => 'Element 155cm' }])
148
- end
149
-
150
- def test_recursively_included_template_does_not_produce_endless_loop
151
- infinite_file_system = Class.new do
152
- def read_template_file(_template_path)
153
- "-{% include 'loop' %}"
154
- end
155
- end
156
-
157
- Liquid::Template.file_system = infinite_file_system.new
158
-
159
- assert_raises(Liquid::StackLevelError) do
160
- Template.parse("{% include 'loop' %}").render!
161
- end
162
- end
163
-
164
- def test_dynamically_choosen_template
165
- assert_template_result("Test123", "{% include template %}", "template" => 'Test123')
166
- assert_template_result("Test321", "{% include template %}", "template" => 'Test321')
167
-
168
- assert_template_result("Product: Draft 151cm ", "{% include template for product %}",
169
- "template" => 'product', 'product' => { 'title' => 'Draft 151cm' })
170
- end
171
-
172
- def test_include_tag_caches_second_read_of_same_partial
173
- file_system = CountingFileSystem.new
174
- assert_equal('from CountingFileSystemfrom CountingFileSystem',
175
- Template.parse("{% include 'pick_a_source' %}{% include 'pick_a_source' %}").render!({}, registers: { file_system: file_system }))
176
- assert_equal(1, file_system.count)
177
- end
178
-
179
- def test_include_tag_doesnt_cache_partials_across_renders
180
- file_system = CountingFileSystem.new
181
- assert_equal('from CountingFileSystem',
182
- Template.parse("{% include 'pick_a_source' %}").render!({}, registers: { file_system: file_system }))
183
- assert_equal(1, file_system.count)
184
-
185
- assert_equal('from CountingFileSystem',
186
- Template.parse("{% include 'pick_a_source' %}").render!({}, registers: { file_system: file_system }))
187
- assert_equal(2, file_system.count)
188
- end
189
-
190
- def test_include_tag_within_if_statement
191
- assert_template_result("foo_if_true", "{% if true %}{% include 'foo_if_true' %}{% endif %}")
192
- end
193
-
194
- def test_custom_include_tag
195
- original_tag = Liquid::Template.tags['include']
196
- Liquid::Template.tags['include'] = CustomInclude
197
- begin
198
- assert_equal("custom_foo",
199
- Template.parse("{% include 'custom_foo' %}").render!)
200
- ensure
201
- Liquid::Template.tags['include'] = original_tag
202
- end
203
- end
204
-
205
- def test_custom_include_tag_within_if_statement
206
- original_tag = Liquid::Template.tags['include']
207
- Liquid::Template.tags['include'] = CustomInclude
208
- begin
209
- assert_equal("custom_foo_if_true",
210
- Template.parse("{% if true %}{% include 'custom_foo_if_true' %}{% endif %}").render!)
211
- ensure
212
- Liquid::Template.tags['include'] = original_tag
213
- end
214
- end
215
-
216
- def test_does_not_add_error_in_strict_mode_for_missing_variable
217
- Liquid::Template.file_system = TestFileSystem.new
218
-
219
- a = Liquid::Template.parse(' {% include "nested_template" %}')
220
- a.render!
221
- assert_empty(a.errors)
222
- end
223
-
224
- def test_passing_options_to_included_templates
225
- assert_raises(Liquid::SyntaxError) do
226
- Template.parse("{% include template %}", error_mode: :strict).render!("template" => '{{ "X" || downcase }}')
227
- end
228
- with_error_mode(:lax) do
229
- assert_equal('x', Template.parse("{% include template %}", error_mode: :strict, include_options_blacklist: true).render!("template" => '{{ "X" || downcase }}'))
230
- end
231
- assert_raises(Liquid::SyntaxError) do
232
- Template.parse("{% include template %}", error_mode: :strict, include_options_blacklist: [:locale]).render!("template" => '{{ "X" || downcase }}')
233
- end
234
- with_error_mode(:lax) do
235
- assert_equal('x', Template.parse("{% include template %}", error_mode: :strict, include_options_blacklist: [:error_mode]).render!("template" => '{{ "X" || downcase }}'))
236
- end
237
- end
238
-
239
- def test_render_raise_argument_error_when_template_is_undefined
240
- assert_raises(Liquid::ArgumentError) do
241
- template = Liquid::Template.parse('{% include undefined_variable %}')
242
- template.render!
243
- end
244
- assert_raises(Liquid::ArgumentError) do
245
- template = Liquid::Template.parse('{% include nil %}')
246
- template.render!
247
- end
248
- end
249
-
250
- def test_including_via_variable_value
251
- assert_template_result("from TestFileSystem", "{% assign page = 'pick_a_source' %}{% include page %}")
252
-
253
- assert_template_result("Product: Draft 151cm ", "{% assign page = 'product' %}{% include page %}", "product" => { 'title' => 'Draft 151cm' })
254
-
255
- assert_template_result("Product: Draft 151cm ", "{% assign page = 'product' %}{% include page for foo %}", "foo" => { 'title' => 'Draft 151cm' })
256
- end
257
-
258
- def test_including_with_strict_variables
259
- template = Liquid::Template.parse("{% include 'simple' %}", error_mode: :warn)
260
- template.render(nil, strict_variables: true)
261
-
262
- assert_equal([], template.errors)
263
- end
264
-
265
- def test_break_through_include
266
- assert_template_result("1", "{% for i in (1..3) %}{{ i }}{% break %}{{ i }}{% endfor %}")
267
- assert_template_result("1", "{% for i in (1..3) %}{{ i }}{% include 'break' %}{{ i }}{% endfor %}")
268
- end
269
- end # IncludeTagTest
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- class IncrementTagTest < Minitest::Test
6
- include Liquid
7
-
8
- def test_inc
9
- assert_template_result('0', '{%increment port %}', {})
10
- assert_template_result('0 1', '{%increment port %} {%increment port%}', {})
11
- assert_template_result('0 0 1 2 1',
12
- '{%increment port %} {%increment starboard%} ' \
13
- '{%increment port %} {%increment port%} ' \
14
- '{%increment starboard %}', {})
15
- end
16
-
17
- def test_dec
18
- assert_template_result('9', '{%decrement port %}', 'port' => 10)
19
- assert_template_result('-1 -2', '{%decrement port %} {%decrement port%}', {})
20
- assert_template_result('1 5 2 2 5',
21
- '{%increment port %} {%increment starboard%} ' \
22
- '{%increment port %} {%decrement port%} ' \
23
- '{%decrement starboard %}', 'port' => 1, 'starboard' => 5)
24
- end
25
- end
@@ -1,116 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- class LiquidTagTest < Minitest::Test
6
- include Liquid
7
-
8
- def test_liquid_tag
9
- assert_template_result('1 2 3', <<~LIQUID, 'array' => [1, 2, 3])
10
- {%- liquid
11
- echo array | join: " "
12
- -%}
13
- LIQUID
14
-
15
- assert_template_result('1 2 3', <<~LIQUID, 'array' => [1, 2, 3])
16
- {%- liquid
17
- for value in array
18
- echo value
19
- unless forloop.last
20
- echo " "
21
- endunless
22
- endfor
23
- -%}
24
- LIQUID
25
-
26
- assert_template_result('4 8 12 6', <<~LIQUID, 'array' => [1, 2, 3])
27
- {%- liquid
28
- for value in array
29
- assign double_value = value | times: 2
30
- echo double_value | times: 2
31
- unless forloop.last
32
- echo " "
33
- endunless
34
- endfor
35
-
36
- echo " "
37
- echo double_value
38
- -%}
39
- LIQUID
40
-
41
- assert_template_result('abc', <<~LIQUID)
42
- {%- liquid echo "a" -%}
43
- b
44
- {%- liquid echo "c" -%}
45
- LIQUID
46
- end
47
-
48
- def test_liquid_tag_errors
49
- assert_match_syntax_error("syntax error (line 1): Unknown tag 'error'", <<~LIQUID)
50
- {%- liquid error no such tag -%}
51
- LIQUID
52
-
53
- assert_match_syntax_error("syntax error (line 7): Unknown tag 'error'", <<~LIQUID)
54
- {{ test }}
55
-
56
- {%-
57
- liquid
58
- for value in array
59
-
60
- error no such tag
61
- endfor
62
- -%}
63
- LIQUID
64
-
65
- assert_match_syntax_error("syntax error (line 2): Unknown tag '!!! the guards are vigilant'", <<~LIQUID)
66
- {%- liquid
67
- !!! the guards are vigilant
68
- -%}
69
- LIQUID
70
-
71
- assert_match_syntax_error("syntax error (line 4): 'for' tag was never closed", <<~LIQUID)
72
- {%- liquid
73
- for value in array
74
- echo 'forgot to close the for tag'
75
- -%}
76
- LIQUID
77
- end
78
-
79
- def test_line_number_is_correct_after_a_blank_token
80
- assert_match_syntax_error("syntax error (line 3): Unknown tag 'error'", "{% liquid echo ''\n\n error %}")
81
- assert_match_syntax_error("syntax error (line 3): Unknown tag 'error'", "{% liquid echo ''\n \n error %}")
82
- end
83
-
84
- def test_nested_liquid_tag
85
- assert_template_result('good', <<~LIQUID)
86
- {%- if true %}
87
- {%- liquid
88
- echo "good"
89
- %}
90
- {%- endif -%}
91
- LIQUID
92
- end
93
-
94
- def test_cannot_open_blocks_living_past_a_liquid_tag
95
- assert_match_syntax_error("syntax error (line 3): 'if' tag was never closed", <<~LIQUID)
96
- {%- liquid
97
- if true
98
- -%}
99
- {%- endif -%}
100
- LIQUID
101
- end
102
-
103
- def test_cannot_close_blocks_created_before_a_liquid_tag
104
- assert_match_syntax_error("syntax error (line 3): 'endif' is not a valid delimiter for liquid tags. use %}", <<~LIQUID)
105
- {%- if true -%}
106
- 42
107
- {%- liquid endif -%}
108
- LIQUID
109
- end
110
-
111
- def test_liquid_tag_in_raw
112
- assert_template_result("{% liquid echo 'test' %}\n", <<~LIQUID)
113
- {% raw %}{% liquid echo 'test' %}{% endraw %}
114
- LIQUID
115
- end
116
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- class RawTagTest < Minitest::Test
6
- include Liquid
7
-
8
- def test_tag_in_raw
9
- assert_template_result('{% comment %} test {% endcomment %}',
10
- '{% raw %}{% comment %} test {% endcomment %}{% endraw %}')
11
- end
12
-
13
- def test_output_in_raw
14
- assert_template_result('{{ test }}', '{% raw %}{{ test }}{% endraw %}')
15
- end
16
-
17
- def test_open_tag_in_raw
18
- assert_template_result(' Foobar {% invalid ', '{% raw %} Foobar {% invalid {% endraw %}')
19
- assert_template_result(' Foobar invalid %} ', '{% raw %} Foobar invalid %} {% endraw %}')
20
- assert_template_result(' Foobar {{ invalid ', '{% raw %} Foobar {{ invalid {% endraw %}')
21
- assert_template_result(' Foobar invalid }} ', '{% raw %} Foobar invalid }} {% endraw %}')
22
- assert_template_result(' Foobar {% invalid {% {% endraw ', '{% raw %} Foobar {% invalid {% {% endraw {% endraw %}')
23
- assert_template_result(' Foobar {% {% {% ', '{% raw %} Foobar {% {% {% {% endraw %}')
24
- assert_template_result(' test {% raw %} {% endraw %}', '{% raw %} test {% raw %} {% {% endraw %}endraw %}')
25
- assert_template_result(' Foobar {{ invalid 1', '{% raw %} Foobar {{ invalid {% endraw %}{{ 1 }}')
26
- assert_template_result(' Foobar {% foo {% bar %}', '{% raw %} Foobar {% foo {% bar %}{% endraw %}')
27
- end
28
-
29
- def test_invalid_raw
30
- assert_match_syntax_error(/tag was never closed/, '{% raw %} foo')
31
- assert_match_syntax_error(/Valid syntax/, '{% raw } foo {% endraw %}')
32
- assert_match_syntax_error(/Valid syntax/, '{% raw } foo %}{% endraw %}')
33
- end
34
- end