diff --git a/lib/liquid/tags/case.rb b/lib/liquid/tags/case.rb index b32ea1ae..e87e402e 100644 --- a/lib/liquid/tags/case.rb +++ b/lib/liquid/tags/case.rb @@ -118,7 +118,7 @@ module Liquid parser = @parse_context.new_parser(markup) loop do - expr = safe_parse_expression(parser) + expr = Condition.parse_expression(parse_context, parser.expression, safe: true) block = Condition.new(@left, '==', expr) block.attach(body) @blocks << block diff --git a/test/unit/tags/case_tag_unit_test.rb b/test/unit/tags/case_tag_unit_test.rb index 9d7d34a3..11458db8 100644 --- a/test/unit/tags/case_tag_unit_test.rb +++ b/test/unit/tags/case_tag_unit_test.rb @@ -82,6 +82,26 @@ class CaseTagUnitTest < Minitest::Test end end + def test_case_when_empty + template = <<~LIQUID + {%- case x -%} + {%- when 2 or empty -%} + 2 or empty + {%- else -%} + not 2 or empty + {%- endcase -%} + LIQUID + + with_error_modes(:lax, :strict, :strict2) do + assert_template_result("2 or empty", template, { 'x' => 2 }) + assert_template_result("2 or empty", template, { 'x' => {} }) + assert_template_result("2 or empty", template, { 'x' => [] }) + assert_template_result("not 2 or empty", template, { 'x' => { 'a' => 'b' } }) + assert_template_result("not 2 or empty", template, { 'x' => ['a'] }) + assert_template_result("not 2 or empty", template, { 'x' => 4 }) + end + end + def test_case_with_invalid_expression template = <<~LIQUID {%- case foo=>bar -%}