mirror of
https://github.com/Shopify/liquid.git
synced 2026-09-12 23:40:45 -07:00
Merge remote-tracking branch 'upstream/master' into correct-if-nodelists
Conflicts: test/liquid/tags/for_tag_test.rb test/liquid/tags/if_else_tag_test.rb
This commit is contained in:
@@ -1,5 +1,13 @@
|
||||
require 'test_helper'
|
||||
|
||||
class FoobarTag < Liquid::Tag
|
||||
def render(*args)
|
||||
" "
|
||||
end
|
||||
|
||||
Liquid::Template.register_tag('foobar', FoobarTag)
|
||||
end
|
||||
|
||||
class BlankTestFileSystem
|
||||
def read_template_file(template_path, context)
|
||||
template_path
|
||||
@@ -22,6 +30,10 @@ class BlankTest < Test::Unit::TestCase
|
||||
wrap_in_for(body) + wrap_in_if(body)
|
||||
end
|
||||
|
||||
def test_new_tags_are_not_blank_by_default
|
||||
assert_template_result(" "*N, wrap_in_for("{% foobar %}"))
|
||||
end
|
||||
|
||||
def test_loops_are_blank
|
||||
assert_template_result("", wrap_in_for(" "))
|
||||
end
|
||||
|
||||
@@ -26,4 +26,10 @@ class FileSystemTest < Test::Unit::TestCase
|
||||
file_system.full_path("/etc/passwd")
|
||||
end
|
||||
end
|
||||
|
||||
def test_custom_template_filename_patterns
|
||||
file_system = Liquid::LocalFileSystem.new("/some/path", "%s.html")
|
||||
assert_equal "/some/path/mypartial.html" , file_system.full_path("mypartial")
|
||||
assert_equal "/some/path/dir/mypartial.html", file_system.full_path("dir/mypartial")
|
||||
end
|
||||
end # FileSystemTest
|
||||
|
||||
@@ -86,7 +86,7 @@ class OutputTest < Test::Unit::TestCase
|
||||
assert_equal expected, Template.parse(text).render(@assigns, :filters => [FunnyFilter])
|
||||
end
|
||||
|
||||
def test_variable_piping_with_args
|
||||
def test_variable_piping_with_multiple_args
|
||||
text = %! {{ car.gm | add_tag : 'span', 'bar'}} !
|
||||
expected = %| <span id="bar">bad</span> |
|
||||
|
||||
|
||||
@@ -56,6 +56,14 @@ class ParserTest < Test::Unit::TestCase
|
||||
assert_equal '"wut"', p.expression
|
||||
end
|
||||
|
||||
def test_ranges
|
||||
p = Parser.new("(5..7) (1.5..9.6) (young..old) (hi[5].wat..old)")
|
||||
assert_equal '(5..7)', p.expression
|
||||
assert_equal '(1.5..9.6)', p.expression
|
||||
assert_equal '(young..old)', p.expression
|
||||
assert_equal '(hi[5].wat..old)', p.expression
|
||||
end
|
||||
|
||||
def test_arguments
|
||||
p = Parser.new("filter: hi.there[5], keyarg: 7")
|
||||
assert_equal 'filter', p.consume(:id)
|
||||
|
||||
@@ -21,11 +21,11 @@ class RegexpTest < Test::Unit::TestCase
|
||||
assert_equal ['<style', 'class="hello">', '</style>'], %|<style class="hello">' </style>|.scan(QuotedFragment)
|
||||
end
|
||||
|
||||
def test_quoted_words
|
||||
def test_double_quoted_words
|
||||
assert_equal ['arg1', 'arg2', '"arg 3"'], 'arg1 arg2 "arg 3"'.scan(QuotedFragment)
|
||||
end
|
||||
|
||||
def test_quoted_words
|
||||
def test_single_quoted_words
|
||||
assert_equal ['arg1', 'arg2', "'arg 3'"], 'arg1 arg2 \'arg 3\''.scan(QuotedFragment)
|
||||
end
|
||||
|
||||
|
||||
@@ -62,11 +62,6 @@ class StandardFiltersTest < Test::Unit::TestCase
|
||||
assert_equal '', @filters.upcase(nil)
|
||||
end
|
||||
|
||||
def test_upcase
|
||||
assert_equal 'TESTING', @filters.upcase("Testing")
|
||||
assert_equal '', @filters.upcase(nil)
|
||||
end
|
||||
|
||||
def test_truncate
|
||||
assert_equal '1234...', @filters.truncate('1234567890', 7)
|
||||
assert_equal '1234567890', @filters.truncate('1234567890', 20)
|
||||
@@ -89,7 +84,7 @@ class StandardFiltersTest < Test::Unit::TestCase
|
||||
end
|
||||
|
||||
def test_escape_once
|
||||
assert_equal '<strong>', @filters.escape_once(@filters.escape('<strong>'))
|
||||
assert_equal '<strong>Hulk</strong>', @filters.escape_once('<strong>Hulk</strong>')
|
||||
end
|
||||
|
||||
def test_truncatewords
|
||||
@@ -140,6 +135,10 @@ class StandardFiltersTest < Test::Unit::TestCase
|
||||
assert_equal "woot: 1", Liquid::Template.parse('{{ foo | map: "whatever" }}').render("foo" => [t])
|
||||
end
|
||||
|
||||
def test_map_on_hashes
|
||||
assert_equal "4217", Liquid::Template.parse('{{ thing | map: "foo" | map: "bar" }}').render("thing" => { "foo" => [ { "bar" => 42 }, { "bar" => 17 } ] })
|
||||
end
|
||||
|
||||
def test_sort_calls_to_liquid
|
||||
t = TestThing.new
|
||||
assert_equal "woot: 1", Liquid::Template.parse('{{ foo | sort: "whatever" }}').render("foo" => [t])
|
||||
@@ -233,9 +232,6 @@ class StandardFiltersTest < Test::Unit::TestCase
|
||||
assert_template_result "12", "{{ 3 | times:4 }}"
|
||||
assert_template_result "0", "{{ 'foo' | times:4 }}"
|
||||
|
||||
# Ruby v1.9.2-rc1, or higher, backwards compatible Float test
|
||||
assert_match(/(6\.3)|(6\.(0{13})1)/, Template.parse("{{ '2.1' | times:3 }}").render)
|
||||
|
||||
assert_template_result "6", "{{ '2.1' | times:3 | replace: '.','-' | plus:0}}"
|
||||
|
||||
assert_template_result "7.25", "{{ 0.0725 | times:100 }}"
|
||||
@@ -245,9 +241,6 @@ class StandardFiltersTest < Test::Unit::TestCase
|
||||
assert_template_result "4", "{{ 12 | divided_by:3 }}"
|
||||
assert_template_result "4", "{{ 14 | divided_by:3 }}"
|
||||
|
||||
# Ruby v1.9.2-rc1, or higher, backwards compatible Float test
|
||||
assert_match(/4\.(6{13,14})7/, Template.parse("{{ 14 | divided_by:'3.0' }}").render)
|
||||
|
||||
assert_template_result "5", "{{ 15 | divided_by:3 }}"
|
||||
assert_template_result "Liquid error: divided by 0", "{{ 5 | divided_by:0 }}"
|
||||
|
||||
@@ -270,6 +263,15 @@ class StandardFiltersTest < Test::Unit::TestCase
|
||||
assert_template_result('abc',"{{ a | prepend: b}}",assigns)
|
||||
end
|
||||
|
||||
def test_default
|
||||
assert_equal "foo", @filters.default("foo", "bar")
|
||||
assert_equal "bar", @filters.default(nil, "bar")
|
||||
assert_equal "bar", @filters.default("", "bar")
|
||||
assert_equal "bar", @filters.default(false, "bar")
|
||||
assert_equal "bar", @filters.default([], "bar")
|
||||
assert_equal "bar", @filters.default({}, "bar")
|
||||
end
|
||||
|
||||
def test_cannot_access_private_methods
|
||||
assert_template_result('a',"{{ 'a' | to_number }}")
|
||||
end
|
||||
|
||||
@@ -49,4 +49,15 @@ class StrainerTest < Test::Unit::TestCase
|
||||
assert_equal "has_method?", strainer.invoke("invoke", "has_method?", "invoke")
|
||||
end
|
||||
|
||||
def test_strainer_uses_a_class_cache_to_avoid_method_cache_invalidation
|
||||
a, b = Module.new, Module.new
|
||||
strainer = Strainer.create(nil, [a,b])
|
||||
assert_kind_of Strainer, strainer
|
||||
assert_kind_of a, strainer
|
||||
assert_kind_of b, strainer
|
||||
Strainer.class_variable_get(:@@filters).each do |m|
|
||||
assert_kind_of m, strainer
|
||||
end
|
||||
end
|
||||
|
||||
end # StrainerTest
|
||||
|
||||
@@ -304,4 +304,62 @@ HERE
|
||||
template = Liquid::Template.parse('{% for item in items %}FOR{% else %}ELSE{% endfor %}')
|
||||
assert_equal ['FOR', 'ELSE'], template.root.nodelist[0].nodelist
|
||||
end
|
||||
|
||||
class LoaderDrop < Liquid::Drop
|
||||
attr_accessor :each_called, :load_slice_called
|
||||
|
||||
def initialize(data)
|
||||
@data = data
|
||||
end
|
||||
|
||||
def each
|
||||
@each_called = true
|
||||
@data.each { |el| yield el }
|
||||
end
|
||||
|
||||
def load_slice(from, to)
|
||||
@load_slice_called = true
|
||||
@data[(from..to-1)]
|
||||
end
|
||||
end
|
||||
|
||||
def test_iterate_with_each_when_no_limit_applied
|
||||
loader = LoaderDrop.new([1,2,3,4,5])
|
||||
assigns = {'items' => loader}
|
||||
expected = '12345'
|
||||
template = '{% for item in items %}{{item}}{% endfor %}'
|
||||
assert_template_result(expected, template, assigns)
|
||||
assert loader.each_called
|
||||
assert !loader.load_slice_called
|
||||
end
|
||||
|
||||
def test_iterate_with_load_slice_when_limit_applied
|
||||
loader = LoaderDrop.new([1,2,3,4,5])
|
||||
assigns = {'items' => loader}
|
||||
expected = '1'
|
||||
template = '{% for item in items limit:1 %}{{item}}{% endfor %}'
|
||||
assert_template_result(expected, template, assigns)
|
||||
assert !loader.each_called
|
||||
assert loader.load_slice_called
|
||||
end
|
||||
|
||||
def test_iterate_with_load_slice_when_limit_and_offset_applied
|
||||
loader = LoaderDrop.new([1,2,3,4,5])
|
||||
assigns = {'items' => loader}
|
||||
expected = '34'
|
||||
template = '{% for item in items offset:2 limit:2 %}{{item}}{% endfor %}'
|
||||
assert_template_result(expected, template, assigns)
|
||||
assert !loader.each_called
|
||||
assert loader.load_slice_called
|
||||
end
|
||||
|
||||
def test_iterate_with_load_slice_returns_same_results_as_without
|
||||
loader = LoaderDrop.new([1,2,3,4,5])
|
||||
loader_assigns = {'items' => loader}
|
||||
array_assigns = {'items' => [1,2,3,4,5]}
|
||||
expected = '34'
|
||||
template = '{% for item in items offset:2 limit:2 %}{{item}}{% endfor %}'
|
||||
assert_template_result(expected, template, loader_assigns)
|
||||
assert_template_result(expected, template, array_assigns)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -162,4 +162,10 @@ class IfElseTagTest < Test::Unit::TestCase
|
||||
template = Liquid::Template.parse('{% if true %}IF{% else %}ELSE{% endif %}')
|
||||
assert_equal ['IF', 'ELSE'], template.root.nodelist[0].nodelist
|
||||
end
|
||||
|
||||
def test_operators_are_whitelisted
|
||||
assert_raise(SyntaxError) do
|
||||
assert_template_result('', %({% if 1 or throw or or 1 %}yes{% endif %}))
|
||||
end
|
||||
end
|
||||
end # IfElseTest
|
||||
|
||||
@@ -48,6 +48,27 @@ class CountingFileSystem
|
||||
end
|
||||
end
|
||||
|
||||
class CustomInclude < Liquid::Tag
|
||||
Syntax = /(#{Liquid::QuotedFragment}+)(\s+(?:with|for)\s+(#{Liquid::QuotedFragment}+))?/o
|
||||
|
||||
def initialize(tag_name, markup, tokens)
|
||||
markup =~ Syntax
|
||||
@template_name = $1
|
||||
super
|
||||
end
|
||||
|
||||
def parse(tokens)
|
||||
end
|
||||
|
||||
def blank?
|
||||
false
|
||||
end
|
||||
|
||||
def render(context)
|
||||
@template_name[1..-2]
|
||||
end
|
||||
end
|
||||
|
||||
class IncludeTagTest < Test::Unit::TestCase
|
||||
include Liquid
|
||||
|
||||
@@ -163,4 +184,31 @@ class IncludeTagTest < Test::Unit::TestCase
|
||||
Template.parse("{% include 'pick_a_source' %}").render({}, :registers => {:file_system => file_system})
|
||||
assert_equal 2, file_system.count
|
||||
end
|
||||
|
||||
def test_include_tag_within_if_statement
|
||||
assert_equal "foo_if_true",
|
||||
Template.parse("{% if true %}{% include 'foo_if_true' %}{% endif %}").render
|
||||
end
|
||||
|
||||
def test_custom_include_tag
|
||||
original_tag = Liquid::Template.tags['include']
|
||||
Liquid::Template.tags['include'] = CustomInclude
|
||||
begin
|
||||
assert_equal "custom_foo",
|
||||
Template.parse("{% include 'custom_foo' %}").render
|
||||
ensure
|
||||
Liquid::Template.tags['include'] = original_tag
|
||||
end
|
||||
end
|
||||
|
||||
def test_custom_include_tag_within_if_statement
|
||||
original_tag = Liquid::Template.tags['include']
|
||||
Liquid::Template.tags['include'] = CustomInclude
|
||||
begin
|
||||
assert_equal "custom_foo_if_true",
|
||||
Template.parse("{% if true %}{% include 'custom_foo_if_true' %}{% endif %}").render
|
||||
ensure
|
||||
Liquid::Template.tags['include'] = original_tag
|
||||
end
|
||||
end
|
||||
end # IncludeTagTest
|
||||
|
||||
@@ -33,6 +33,13 @@ class StandardTagTest < Test::Unit::TestCase
|
||||
assert_template_result('','{% comment %}{% endcomment %}')
|
||||
assert_template_result('','{%comment%}comment{%endcomment%}')
|
||||
assert_template_result('','{% comment %}comment{% endcomment %}')
|
||||
assert_template_result('','{% comment %} 1 {% comment %} 2 {% endcomment %} 3 {% endcomment %}')
|
||||
|
||||
assert_template_result('','{%comment%}{%blabla%}{%endcomment%}')
|
||||
assert_template_result('','{% comment %}{% blabla %}{% endcomment %}')
|
||||
assert_template_result('','{%comment%}{% endif %}{%endcomment%}')
|
||||
assert_template_result('','{% comment %}{% endwhatever %}{% endcomment %}')
|
||||
assert_template_result('','{% comment %}{% raw %} {{%%%%}} }} { {% endcomment %} {% comment {% endraw %} {% endcomment %}')
|
||||
|
||||
assert_template_result('foobar','foo{%comment%}comment{%endcomment%}bar')
|
||||
assert_template_result('foobar','foo{% comment %}comment{% endcomment %}bar')
|
||||
@@ -47,16 +54,9 @@ class StandardTagTest < Test::Unit::TestCase
|
||||
{%endcomment%}bar')
|
||||
end
|
||||
|
||||
def test_assign
|
||||
assigns = {'var' => 'content' }
|
||||
assert_template_result('var2: var2:content', 'var2:{{var2}} {%assign var2 = var%} var2:{{var2}}', assigns)
|
||||
|
||||
end
|
||||
|
||||
def test_hyphenated_assign
|
||||
assigns = {'a-b' => '1' }
|
||||
assert_template_result('a-b:1 a-b:2', 'a-b:{{a-b}} {%assign a-b = 2 %}a-b:{{a-b}}', assigns)
|
||||
|
||||
end
|
||||
|
||||
def test_assign_with_colon_and_spaces
|
||||
@@ -218,7 +218,12 @@ class StandardTagTest < Test::Unit::TestCase
|
||||
end
|
||||
|
||||
def test_assign
|
||||
assert_equal 'variable', Liquid::Template.parse( '{% assign a = "variable"%}{{a}}' ).render
|
||||
assert_equal 'variable', Liquid::Template.parse( '{% assign a = "variable"%}{{a}}').render
|
||||
end
|
||||
|
||||
def test_assign_unassigned
|
||||
assigns = { 'var' => 'content' }
|
||||
assert_template_result('var2: var2:content', 'var2:{{var2}} {%assign var2 = var%} var2:{{var2}}', assigns)
|
||||
end
|
||||
|
||||
def test_assign_an_empty_string
|
||||
|
||||
@@ -14,6 +14,14 @@ class TemplateContextDrop < Liquid::Drop
|
||||
end
|
||||
end
|
||||
|
||||
class SomethingWithLength
|
||||
def length
|
||||
nil
|
||||
end
|
||||
|
||||
liquid_methods :length
|
||||
end
|
||||
|
||||
class TemplateTest < Test::Unit::TestCase
|
||||
include Liquid
|
||||
|
||||
@@ -86,6 +94,12 @@ class TemplateTest < Test::Unit::TestCase
|
||||
@global = nil
|
||||
end
|
||||
|
||||
def test_resource_limits_works_with_custom_length_method
|
||||
t = Template.parse("{% assign foo = bar %}")
|
||||
t.resource_limits = { :render_length_limit => 42 }
|
||||
assert_equal "", t.render("bar" => SomethingWithLength.new)
|
||||
end
|
||||
|
||||
def test_resource_limits_render_length
|
||||
t = Template.parse("0123456789")
|
||||
t.resource_limits = { :render_length_limit => 5 }
|
||||
|
||||
@@ -2,11 +2,6 @@
|
||||
|
||||
require 'test/unit'
|
||||
require 'test/unit/assertions'
|
||||
begin
|
||||
require 'ruby-debug'
|
||||
rescue LoadError
|
||||
puts "Couldn't load ruby-debug. gem install ruby-debug if you need it."
|
||||
end
|
||||
|
||||
$:.unshift(File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib'))
|
||||
require 'liquid.rb'
|
||||
|
||||
Reference in New Issue
Block a user