From 98a6740a7da0646e479d50af862429be9d006a03 Mon Sep 17 00:00:00 2001 From: Andrea Campi Date: Sat, 3 Mar 2012 19:52:57 +0100 Subject: [PATCH] Make sure the ETag changes when either the page model or the actual rendered content changes. Fixes #313 --- lib/locomotive/render.rb | 2 +- spec/lib/locomotive/render_spec.rb | 44 ++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/lib/locomotive/render.rb b/lib/locomotive/render.rb index 4bf0ef8c..5090210a 100644 --- a/lib/locomotive/render.rb +++ b/lib/locomotive/render.rb @@ -98,7 +98,7 @@ module Locomotive response.headers['Content-Type'] = 'text/html; charset=utf-8' if @page.with_cache? - fresh_when :etag => @page, :last_modified => @page.updated_at.utc, :public => true + fresh_when :etag => [@page, output], :last_modified => @page.updated_at.utc, :public => true if @page.cache_strategy != 'simple' # varnish response.cache_control[:max_age] = @page.cache_strategy diff --git a/spec/lib/locomotive/render_spec.rb b/spec/lib/locomotive/render_spec.rb index 49f9363e..93cc8ea4 100644 --- a/spec/lib/locomotive/render_spec.rb +++ b/spec/lib/locomotive/render_spec.rb @@ -71,6 +71,50 @@ describe 'Locomotive rendering system' do @controller.status.should == :not_found end + context 'templatized page' do + + before(:each) do + @content_type = FactoryGirl.build(:content_type, :site => nil) + @content = @content_type.contents.build(:_visible => true, :tile => 'one') + @page.templatized = true + @page.content_type = @content_type + end + + it 'sets the etag' do + @page.cache_strategy = 'simple' + @page.stubs(:updated_at).returns(Time.now) + @controller.send(:prepare_and_set_response, 'Hello world !') + @controller.response.to_a # force to build headers + @controller.response.headers['ETag'].should == "\"d232eefab45e58af59c2d00409261365\"" + end + + it 'changes the etag if the page changes' do + @page.cache_strategy = 'simple' + @page.stubs(:updated_at).returns(Time.now) + @page.stubs(:to_param).returns("1") + @controller.send(:prepare_and_set_response, 'Hello world !') + @controller.response.to_a # force to build headers + old_etag = @controller.response.headers['ETag'] + + @page.stubs(:to_param).returns("2") + @controller.send(:prepare_and_set_response, 'Hello world !') + @controller.response.to_a # force to build headers + @controller.response.headers['ETag'].should_not == old_etag + end + + it 'changes the etag if the output changes' do + @page.cache_strategy = 'simple' + @page.stubs(:updated_at).returns(Time.now) + @controller.send(:prepare_and_set_response, 'Hello world !') + @controller.response.to_a # force to build headers + old_etag = @controller.response.headers['ETag'] + + @controller.send(:prepare_and_set_response, 'Hello world !!') + @controller.response.to_a # force to build headers + @controller.response.headers['ETag'].should_not == old_etag + end + + end end context 'when retrieving page' do