diff options
author | Dov Murik <dov.murik@gmail.com> | 2015-06-01 21:56:31 -0400 |
---|---|---|
committer | Dov Murik <dov.murik@gmail.com> | 2015-06-22 14:17:08 -0400 |
commit | d51e2eefd5c50cef366ddc96a3b93af0395755f1 (patch) | |
tree | 61d6475f706b28f7b25551a04ae6718ac5d5863c /actionview/test | |
parent | ccdefa0e230dac72ae35e41791ec5fa53117e91e (diff) | |
download | rails-d51e2eefd5c50cef366ddc96a3b93af0395755f1.tar.gz rails-d51e2eefd5c50cef366ddc96a3b93af0395755f1.tar.bz2 rails-d51e2eefd5c50cef366ddc96a3b93af0395755f1.zip |
Improve detection of partial templates eligible for collection caching.
The regular expression which was used to detect partial templates that
begin with a `<% cache ... do %>` call missed some cases. This commits
attempts to improve the detection for some cases such as multi-line
comments at the beginning of the template. The different templates are
listed in two new unit test methods.
Note that specially crafted Ruby code can still evade such `cache`-call
detection: for example, a user might have its own method which itself
calls the Rails `cache` helper. In such a case, the template's code
doesn't start with a literal `cache` string and therefore will not be
eligible for collection caching.
Diffstat (limited to 'actionview/test')
-rw-r--r-- | actionview/test/template/template_test.rb | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/actionview/test/template/template_test.rb b/actionview/test/template/template_test.rb index aae6a9aa09..d17034e88f 100644 --- a/actionview/test/template/template_test.rb +++ b/actionview/test/template/template_test.rb @@ -190,6 +190,36 @@ class TestERBTemplate < ActiveSupport::TestCase assert_match(/\xFC/, e.message) end + def test_not_eligible_for_collection_caching_without_cache_call + [ + "<%= 'Hello' %>", + "<% cache_customer = 42 %>", + "<% cache customer.name do %><% end %>" + ].each do |body| + template = new_template(body, virtual_path: "test/foo/_customer") + assert_not template.eligible_for_collection_caching?, "Template #{body.inspect} should not be eligible for collection caching" + end + end + + def test_eligible_for_collection_caching_with_cache_call + [ + "<% cache customer do %><% end %>", + "<% cache(customer) do %><% end %>", + "<% cache( customer) do %><% end %>", + "<% cache( customer ) do %><% end %>", + "<%cache customer do %><% end %>", + "<% cache customer do %><% end %>", + " <% cache customer do %>\n<% end %>\n", + "<%# comment %><% cache customer do %><% end %>", + "<%# comment %>\n<% cache customer do %><% end %>", + "<%# comment\n line 2\n line 3 %>\n<% cache customer do %><% end %>", + "<%# comment 1 %>\n<%# comment 2 %>\n<% cache customer do %><% end %>" + ].each do |body| + template = new_template(body, virtual_path: "test/foo/_customer") + assert template.eligible_for_collection_caching?, "Template #{body.inspect} should be eligible for collection caching" + end + end + def with_external_encoding(encoding) old = Encoding.default_external Encoding::Converter.new old, encoding if old != encoding |