require "#{File.dirname(File.dirname(File.expand_path(__FILE__)))}/spec_helper"
describe "Sinatra" do
before(:each) do
@delete_cached_test_files = true #convenience toggle
end
describe "Cache" do
class MyDefaultsTestApp < MyTestApp
register(Sinatra::Cache)
end
class MyTestApp
register(Sinatra::Cache)
# need to set the root of the app for the default :cache_fragments_output_dir to work
set :root, ::APP_ROOT
set :cache_enabled, true
set :cache_environment, :test
set :cache_output_dir, "#{test_cache_path('system/cache')}"
set :cache_fragments_output_dir, "#{test_cache_path('system/cache')}_fragments"
set :cache_fragments_wrap_with_html_comments, false
# NB! Although without tests, the positioning of the custom method in relation to other
# Cache related declaration has no effect.
helpers do
def uncached_erb(template, options={})
erb(template, options.merge(:cache => false ))
end
end
get('/') { erb(:index) }
get('/erb/?') { erb(:index, :layout => false) }
# complex regex URL, matches
get %r{^/params/?([\s\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?} do
@captures = params[:captures].nil? ? [] : params[:captures].compact
erb(:params)
end
get('/file-extensions.*') do
@vars = { :framework => "Sinatra", :url => "www.sinatrarb.com" }
case params[:splat].first.to_sym
when :json
erb(@vars.to_json, :layout => false )
when :yaml
erb(@vars.to_yaml,:layout => false)
else
# direct output, should NOT be Cached
@vars.inspect
# @vars.inspect
end
end
## NO CACHING
get('/uncached/erb'){ erb(:index, :cache => false) }
get('/uncached/erb/no/layout'){ erb(:index, :cache => false, :layout => false ) }
get('/uncached/uncached_erb'){ uncached_erb(:index) }
get '/css/screen.css' do
content_type 'text/css'
sass(:css, :style => :compact)
end
get '/css/no/cache.css' do
content_type 'text/css'
sass(:css, :style => :compact, :cache => false)
end
# enable :method_override
post('/post/?') { erb("POST", :layout => false) }
put('/put/?') { erb('PUT', :layout => false) }
delete('/delete/?') { erb('DELETE', :layout => false) }
get %r{^/fragments/?([\s\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?} do
erb(:fragments, :layout => false, :cache => false)
end
get %r{^/sharedfragments/?([\s\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?} do
erb(:fragments_shared, :layout => false, :cache => false)
end
end
# convenience shared spec that sets up MyTestApp and tests it's OK,
# without it you will get "stack level too deep" errors
it_should_behave_like "MyTestApp"
# it_should_behave_like "debug => app.methods"
describe "VERSION" do
it "should return the VERSION string" do
Sinatra::Cache::VERSION.should be_a_kind_of(String)
Sinatra::Cache::VERSION.should match(/\d\.\d+\.\d+(\.\d)?/)
end
end #/ VERSION
describe "#self.version" do
it "should return a version of the Sinatra::Cache VERSION string" do
Sinatra::Cache.version.should be_a_kind_of(String)
Sinatra::Cache.version.should match(/Sinatra::Cache v\d\.\d+\.\d+(\.\d)?/)
end
end #/ #self.version
describe "Configuration" do
describe "with Default Settings" do
it "should set :cache_enabled to false" do
MyDefaultsTestApp.cache_enabled.should == false
end
it "should set :cache_environment to :production" do
MyDefaultsTestApp.cache_environment.should == :production
end
it "should set :cache_page_extension to '.html'" do
MyDefaultsTestApp.cache_page_extension.should == '.html'
end
it "should set :cache_output_dir to '../public'" do
MyDefaultsTestApp.cache_output_dir.should == "#{public_fixtures_path}"
end
it "should set :cache_fragments_output_dir to '../tmp/cache_fragments'" do
MyDefaultsTestApp.cache_fragments_output_dir.should == "#{fixtures_path}/tmp/cache_fragments"
end
it "should set :cache_logging to true" do
MyDefaultsTestApp.cache_logging.should == true
end
it "should set :cache_logging_level to :info" do
MyDefaultsTestApp.cache_logging_level.should == :info
end
it "should set :cache_fragments_wrap_with_html_comments to true" do
MyDefaultsTestApp.cache_fragments_wrap_with_html_comments.should == true
end
end #/ with Default Settings
describe "with Custom Settings" do
it "should set :cache_enabled to true" do
MyTestApp.cache_enabled.should == true
end
it "should set :cache_environment to :test" do
MyTestApp.cache_environment.should == :test
end
it "should set :cache_page_extension to '.html'" do
MyTestApp.cache_page_extension.should == '.html'
end
it "should set :cache_output_dir to '../public/system/cache'" do
MyTestApp.cache_output_dir.should == "#{test_cache_path('system/cache')}"
end
it "should set :cache_fragments_output_dir to '../public/system/cache_fragments'" do
MyTestApp.cache_fragments_output_dir.should == "#{test_cache_path('system/cache')}_fragments"
end
it "should set :cache_logging to true" do
MyTestApp.cache_logging.should == true
end
it "should set :cache_logging_level to :info" do
MyTestApp.cache_logging_level.should == :info
end
it "should set :cache_fragments_wrap_with_html_comments to false" do
MyTestApp.cache_fragments_wrap_with_html_comments.should == false
end
end #/ Custom
end #/ Configuration
describe "Helpers" do
describe "#cache_timestamp" do
it "should return an HTML comment with the current timestamp" do
erb_app "<%= cache_timestamp %>"
body.should match(/\<\!-- page cached\: #{Regexp.escape(Time.now.strftime("%Y-%m-%d %H:%M:%S"))} -->/)
end
end #/ #cache_timestamp
module Sinatra::Cache::Helpers
public :cache_file_path, :cache_write_file, :cache_file_name, :cache_page_path
end
describe "#cache_file_path" do
it "should have some tests"
end #/ #cache_file_path
describe "#cache_write_file" do
it "should have some tests"
end #/ #cache_write_file
describe "#cache_file_name" do
it "should have some tests"
end #/ #cache_file_name
describe "#cache_page_path" do
it "should have some tests"
end #/ #cache_page_path
end #/ Helpers
describe "with caching enabled" do
describe "basic Page caching" do
describe "GET requests for" do
describe "the Home page - ['/' => /index.html] (with layout)" do
before(:each) do
@cache_file = "#{test_cache_path('system/cache')}/index.html"
get('/')
end
after(:each) do
FileUtils.rm(@cache_file) if @delete_cached_test_files
end
it "should render the expected output" do
body.should have_tag('html > head > title', 'Sinatra::Cache')
body.should match(//)
body.should have_tag('html > body > h1', 'HOME')
end
it "should create a cached file in the cache output directory" do
test(?f, @cache_file).should == true
end
end #/ GET ['/' => /index.html]
describe "a basic URL without a trailing slash - ['/erb' => /erb.html] (ERB without layout)" do
before(:each) do
@cache_file = "#{test_cache_path('system/cache')}/erb.html"
get('/erb')
end
after(:each) do
FileUtils.rm(@cache_file) if @delete_cached_test_files
end
it "should render the expected output" do
body.should == "
HOME
"
end
it "should create a cached file in the cache output directory" do
test(?f, @cache_file).should == true
end
end #/ GET ['/erb' => /erb.html]
describe "a basic URL with a trailing slash - ['/erb/' => /erb/index.html]" do
before(:each) do
@cache_file = "#{test_cache_path('system/cache')}/erb/index.html"
get('/erb/')
end
after(:each) do
FileUtils.rm(@cache_file) if @delete_cached_test_files
end
it "should render the expected output" do
body.should == "HOME
"
end
it "should create a cached file at ../cache/< URL >/index.html" do
test(?f, @cache_file).should == true
end
end #/ GET ['/erb/' => /erb/index.html]
describe "a URL with file extension - ['/file-extensions.EXT' => /file-extensions.EXT]" do
before(:each) do
ext = '.yaml'
@cache_file = "#{test_cache_path('system/cache')}/file-extensions#{ext}"
get("/file-extensions#{ext}")
end
after(:each) do
FileUtils.rm(@cache_file) if @delete_cached_test_files
end
it "should render the expected output" do
body.should_not == ""
end
it "should create the cached file with the extension" do
test(?f, @cache_file).should == true
end
end #/ GET ['/file-extensions.EXT' => /file-extensions.EXT]
describe "URLs with multiple levels and/or with ?params attached" do
%w(
/params/? /params/1.xml?p=2 /params/page/?page=2 /params/page/?page=99
/params/a/ /params/a/b /params/a/b/c /params/a/b/c/d
).each do |url|
# does the URL contain a ? or not
params_free_url = url =~ /\?/ ? url.split('?').first.chomp('?') : url
file_url = (params_free_url[-1,1] =~ /\//) ? "#{params_free_url}index" : params_free_url
# create the string for the test output below
file_url_str = File.extname(file_url) == '' ? file_url << '.html' : file_url
describe "the URL ['#{url}' => #{file_url_str}]" do
before(:each) do
@file_url = file_url
@cache_file = "#{test_cache_path('system/cache')}#{file_url}"
@cache_file << ".html" if File.extname(@file_url) == ''
# puts "when the URL=[#{url}] the @cache_file=[#{@cache_file}] [#{__FILE__}:#{__LINE__}]"
get(url)
end
after(:each) do
FileUtils.remove_dir("#{test_cache_path('system/cache')}/params") if @delete_cached_test_files
end
it "should render the expected output" do
body.should have_tag('html > head > title', 'Sinatra::Cache')
body.should have_tag('html > body > h1', 'PARAMS')
body.should have_tag('html > body > p' )
end
it "should create a cached file at [../public/system/cache#{file_url_str}]" do
test(?f, @cache_file).should == true
end
end #/ GET 'url' -
end #/ end loop
end #/ URLs with multiple levels and/or with ?params attached
describe "with :cache => false, :layout => false " do
before(:each) do
@cache_file = "#{test_cache_path('system/cache')}/uncached/erb/no/layout.html"
get('/uncached/erb/no/layout')
end
it "should output the correct HTML as expected" do
body.should have_tag('h1', 'HOME')
end
it "should NOT cache the output" do
test(?d, File.dirname(@cache_file) ).should == false # testing for directory
test(?f, @cache_file).should == false
end
end #/ with :cache => false, :layout => false
describe "with :cache => false" do
before(:each) do
@cache_file = "#{test_cache_path('system/cache')}/uncached/erb.html"
get('/uncached/erb')
end
it "should output the correct HTML as expected" do
body.should have_tag('h1', 'HOME')
end
it "should NOT cache the output" do
test(?d, File.dirname(@cache_file) ).should == false # testing for directory
test(?f, @cache_file).should == false
end
end #/ with :cache => false
describe "URLs with custom erb helpers, like :admin_erb().." do
before(:each) do
@cache_file = "#{test_cache_path('system/cache')}/uncached/uncached_erb.html"
get('/uncached/uncached_erb')
end
it "should output the correct HTML as expected" do
body.should have_tag('html > body > h1', 'HOME')
end
it "should NOT cache the output" do
test(?d, File.dirname(@cache_file) ).should == false # testing for directory
test(?f, @cache_file).should == false
end
end #/ URLs with custom erb helpers, like :admin_erb()..
describe "CSS URLs with dynamic .sass files" do
describe "the URL ['/css/screen.css' => /css/screen.css]" do
before(:each) do
@cache_file = "#{test_cache_path('system/cache')}/css/screen.css"
FileUtils.remove_dir(File.dirname(@cache_file), :force => true )
get('/css/screen.css')
end
after(:each) do
FileUtils.rm(@cache_file) if @delete_cached_test_files
FileUtils.remove_dir(File.dirname(@cache_file), :force => true ) if @delete_cached_test_files
end
it "should output the correct CSS as expected" do
body.should == "body { color: red; }\n"
end
it "should automatically create the cache /css output directory" do
test(?d, File.dirname(@cache_file) ).should == true
end
it "should create a cached file at [../public/system/cache/css/screen.css]" do
test(?f, @cache_file).should == true
end
end #/ GET ['/css/screen.css' => /css/screen.css]
describe "URLs with ':cache => false' - ['/css/no/cache.css' => /css/no/cache.css]" do
before(:each) do
@cache_file = "#{test_cache_path('system/cache')}/css/no/cache.css"
get('/css/no/cache.css')
end
it "should output the correct CSS as expected" do
body.should == "body { color: red; }\n"
end
it "should NOT cache the output" do
test(?d, File.dirname(@cache_file) ).should == false # testing for directory
test(?f, @cache_file).should == false
end
end #/ GET ['/css/no/cache.css' => /css/no/cache.css]
end #/ CSS URLs with dynamic .sass files
end #/ GET requests
describe "POST, PUT, DELETE requests" do
describe "POST '/post'" do
before(:each) do
@cache_file = "#{test_cache_path('system/cache')}/post.html"
post('/post', :test => {:name => "test-#{Time.now.strftime("%Y-%d-%m %H:%M:%S")}", :content => "with content" })
end
it "should render any output as normal" do
body.should == 'POST'
end
it "should NOT cache the output" do
test(?f, @cache_file).should == false
end
end #/ POST '/post'
describe "PUT '/put'" do
before(:each) do
@cache_file = "#{test_cache_path('system/cache')}/put.html"
put('/put', { :test => { :name => "test" }, :_method => "put" })
end
it "should render any output as normal" do
body.should == 'PUT'
end
it "should NOT cache the output" do
test(?f, @cache_file).should == false
end
end #/ PUT '/put'
describe "DELETE '/delete'" do
before(:each) do
@cache_file = "#{test_cache_path('system/cache')}/delete.html"
delete('/delete') #, { :test => { :name => "test" }, :_method => "put" })
end
it "should render any output as normal" do
body.should == 'DELETE'
end
it "should NOT cache the output" do
test(?f, @cache_file).should == false
end
end #/ DELETE '/delete'
end #/ POST, PUT, DELETE requests
end #/ basic Page caching
describe "and Fragment caching" do
describe "with default settings" do
def app; ::MyTestApp.new ; end
describe "using NOT shared fragments" do
after(:all) do
FileUtils.rm_r("#{test_cache_path('system/cache')}_fragments/fragments") if @delete_cached_test_files
end
%w(
/fragments /fragments/a/b/ /fragments/with/param/?page=1
/fragments/dasherised-urls/works-as-well
).each do |url|
params_free_url = url =~ /\?/ ? url.split('?').first.chomp('?') : url
dir_structure = params_free_url.gsub(/^\//,'').gsub(/\/$/,'')
it "should cache the fragments from the URL [#{url}] as [#{dir_structure}/test_fragment.html]" do
get(url)
# body.should have_tag(:debug)
body.should have_tag('h1','FRAGMENTS', :count => 1)
body.should_not match(//)
body.should_not match(//)
# render the page a 2nd time from cache
get(url)
body.should have_tag('h1','FRAGMENTS', :count => 1)
body.should_not match(//)
body.should_not match(//)
# the cached fragment has already been found if we get this far,
# but just for good measure do we check for the existence of the fragment file.
test(?f, "#{test_cache_path('system/cache')}_fragments/#{dir_structure}/test_fragment.html").should == true
end
end
end #/ using NOT shared fragments
describe "using shared fragments" do
after(:all) do
FileUtils.rm_r("#{test_cache_path('system/cache')}_fragments/sharedfragments") if @delete_cached_test_files
end
describe "when requesting the first URL" do
# FIXME:: work out some clever way to split all of these tests into single items instead of in one big blob
it "should cache the fragment based on the URL and use it on subsequent requests by URLs sharing the same root URL" do
url = '/sharedfragments/2010/02/some-article-01'
params_free_url = url =~ /\?/ ? url.split('?').first.chomp('?') : url
dir_structure = params_free_url.gsub(/^\//,'').gsub(/\/$/,'')
dirs = dir_structure.split('/')
dir_structure = dirs.first(dirs.length-1).join('/')
get(url)
# body.should have_tag(:debug)
body.should have_tag('h1','FRAGMENTS - SHARED', :count => 1)
body.should_not match(//)
body.should_not match(//)
get(url)
body.should have_tag('h1','FRAGMENTS - SHARED', :count => 1)
body.should_not match(//)
body.should_not match(//)
# the cached fragment has already been found if we get this far,
# but just for good measure do we check for the existence of the fragment file.
test(?f, "#{test_cache_path('system/cache')}_fragments/#{dir_structure}/test_fragment.html").should == true
# should use the cached fragment rather than cache a new fragment
url = '/sharedfragments/2010/02/another-article-02'
get(url)
body.should have_tag('h1','FRAGMENTS - SHARED', :count => 1)
body.should_not match(//)
body.should_not match(//)
end
end #/ when requesting the first URL
end #/ using shared fragments
end #/ with default settings
describe "with :cache_fragments_wrap_with_html_comments enabled" do
class MyWrapTestApp < Sinatra::Base
set :app_dir, "#{APP_ROOT}/apps/base"
set :public, "#{fixtures_path}/public"
set :views, "#{app_dir}/views"
register(Sinatra::Tests)
enable :raise_errors
register(Sinatra::Cache)
# need to set the root of the app for the default :cache_fragments_output_dir to work
set :root, ::APP_ROOT
set :cache_enabled, true
set :cache_environment, :test
set :cache_output_dir, "#{test_cache_path('system/cache')}"
set :cache_fragments_output_dir, "#{test_cache_path('system/cache')}_wrap_fragments"
set :cache_fragments_wrap_with_html_comments, true
get('/') { erb(:index) }
get %r{^/fragments/?([\s\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?} do
erb(:fragments, :layout => false, :cache => false)
end
get %r{^/sharedfragments/?([\s\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?} do
erb(:fragments_shared, :layout => false, :cache => false)
end
end
def app; ::MyWrapTestApp.new ; end
describe "using NOT shared fragments" do
after(:all) do
FileUtils.rm_r("#{test_cache_path('system/cache')}_wrap_fragments/fragments") if @delete_cached_test_files
end
%w(
/fragments /fragments/a/b/ /fragments/with/param/?page=1
/fragments/dasherised-urls/works-as-well
).each do |url|
params_free_url = url =~ /\?/ ? url.split('?').first.chomp('?') : url
dir_structure = params_free_url.gsub(/^\//,'').gsub(/\/$/,'')
it "should cache the fragments from the URL [#{url}] as [#{dir_structure}/test_fragment.html]" do
get(url)
# body.should have_tag(:debug)
body.should have_tag('h1','FRAGMENTS', :count => 1)
body.should_not match(//)
body.should_not match(//)
# render the page a 2nd time from cache
get(url)
body.should have_tag('h1','FRAGMENTS', :count => 1)
body.should match(//)
body.should match(//)
# the cached fragment has already been found if we get this far,
# but just for good measure do we check for the existence of the fragment file.
test(?f, "#{test_cache_path('system/cache')}_wrap_fragments/#{dir_structure}/test_fragment.html").should == true
end
end
end #/ using NOT shared fragments
describe "using shared fragments" do
after(:all) do
FileUtils.rm_r("#{test_cache_path('system/cache')}_wrap_fragments/sharedfragments") if @delete_cached_test_files
end
describe "when requesting the first URL" do
# FIXME:: work out some clever way to split all of these tests into single items instead of in one big blob
it "should cache the fragment based on the URL and use it on subsequent requests by URLs sharing the same root URL" do
url = '/sharedfragments/2010/02/some-article-01'
params_free_url = url =~ /\?/ ? url.split('?').first.chomp('?') : url
dir_structure = params_free_url.gsub(/^\//,'').gsub(/\/$/,'')
dirs = dir_structure.split('/')
dir_structure = dirs.first(dirs.length-1).join('/')
get(url)
# body.should have_tag(:debug)
body.should have_tag('h1','FRAGMENTS - SHARED', :count => 1)
body.should_not match(//)
body.should_not match(//)
get(url)
body.should have_tag('h1','FRAGMENTS - SHARED', :count => 1)
body.should match(//)
body.should match(//)
# the cached fragment has already been found if we get this far,
# but just for good measure do we check for the existence of the fragment file.
test(?f, "#{test_cache_path('system/cache')}_wrap_fragments/#{dir_structure}/test_fragment.html").should == true
# should use the cached fragment rather than cache a new fragment
url = '/sharedfragments/2010/02/another-article-02'
get(url)
body.should have_tag('h1','FRAGMENTS - SHARED', :count => 1)
body.should match(//)
body.should match(//)
end
end #/ when requesting the first URL
end #/ using shared fragments
end #/ with customs settings
end #/ and Fragment caching
describe "basic Cache Expiring" do
describe "Pages" do
it "should expire the page ['/params/cache/expire/' => ../cache/params/cache/expire/index.html]" do
get('/params/cache/expire/')
test(?f,"#{test_cache_path('system/cache')}/params/cache/expire/index.html" ).should == true
lambda {
erb_app "<% cache_expire('/params/cache/expire/') %>"
}.should_not raise_error(Exception)
test(?f,"#{test_cache_path('system/cache')}/params/cache/expire/index.html" ).should == false
end
it "should expire the page ['/params/cache/expired' => ../cache/params/cache/expired.html]" do
get('/params/cache/expired')
test(?f,"#{test_cache_path('system/cache')}/params/cache/expired.html" ).should == true
lambda {
erb_app "<% cache_expire('/params/cache/expired') %>"
}.should_not raise_error(Exception)
test(?f,"#{test_cache_path('system/cache')}/params/cache/expired.html" ).should == false
end
end #/ Pages
describe "Fragments" do
it "should expire the fragment ['/fragments/cache/expire/' => ../cache_fragments/fragments/cache/expire/test_fragment.html]" do
get('/fragments/cache/expire/')
test(?f,"#{test_cache_path('system/cache')}_fragments/fragments/cache/expire/test_fragment.html" ).should == true
lambda {
erb_app "<% cache_expire('/fragments/cache/expire/',:fragment => :test_fragment) %>"
}.should_not raise_error(Exception)
test(?f,"#{test_cache_path('system/cache')}/params/cache_fragments/expire/test_fragment.html" ).should == false
end
it "should expire the fragment ['/fragments/cache/expired' => ../cache_fragments/fragments/cache/expired/test_fragment.html]" do
get('/fragments/cache/expired')
test(?f,"#{test_cache_path('system/cache')}_fragments/fragments/cache/expired/test_fragment.html" ).should == true
lambda {
erb_app "<% cache_expire('/fragments/cache/expired',:fragment => :test_fragment) %>"
}.should_not raise_error(Exception)
test(?f,"#{test_cache_path('system/cache')}/params/cache_fragments/expired/test_fragment.html" ).should == false
end
end #/ Pages
end #/ basic Cache Expiring
end #/ with caching enabled
describe "EDGE cases" do
describe "Using nested buffers" do
require 'sinatra/outputbuffer'
class MyPartialsTestApp < Sinatra::Base
register(Sinatra::Tests)
enable :raise_errors
register(Sinatra::OutputBuffer)
register(Sinatra::Cache)
# need to set the root of the app for the default :cache_fragments_output_dir to work
set :root, ::APP_ROOT
set :app_dir, "#{APP_ROOT}/apps/partials"
set :public, "#{fixtures_path}/public"
set :views, "#{APP_ROOT}/apps/partials/views"
set :cache_enabled, true
set :cache_environment, :test
set :cache_output_dir, "#{test_cache_path('system/cache')}"
set :cache_fragments_output_dir, "#{test_cache_path('system/cache')}_fragments"
# NB! Although without tests, the positioning of the custom method in relation to other
# Cache related declaration has no effect.
helpers do
def uncached_erb(template, options={})
erb(template, options.merge(:cache => false ))
end
##
# Renders ERB partials
#
# ==== Examples
#
# <%= partial('shared/header') %> => renders app/views/shared/_header.erb
#
# <%= partial('snippets/snippet') %> => renders app/views/snippets/_snippet.erb
#
#
# @api public
def partial(template, *args)
template_array = template.to_s.split('/')
template = template_array[0..-2].join('/') + "/_#{template_array[-1]}"
options = args.last.is_a?(Hash) ? args.pop : {}
options.merge!(:layout => false, :cache => false) # add support for Sinatra::Cache
# options[:outvar] = '@_out_buf'
if collection = options.delete(:collection) then
collection.inject([]) do |buffer, member|
buffer << erb(:"#{template}", options.merge(:layout => false, :locals => { template_array[-1].to_sym => member } ) )
end.join("\n")
else
erb(:"#{template}", options)
end
rescue Errno::ENOENT => e
out = "ERROR: The partial [views/#{template.to_s}] is missing."
out << " Please create it to remove this error. [ Exception: #{h e.inspect}]" if self.class.development? || self.class.test?
out
rescue Exception => e
if self.class.production?
# TODO:: must store the error in the log somehow.
""
else
throw e
end
end
end
get('/') { erb(:"home/index") }
# get('/erb/?') { erb(:index, :layout => false) }
# complex regex URL, matches
get %r{^/params/?([\s\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?} do
@captures = params[:captures].nil? ? [] : params[:captures].compact
erb(:params)
end
get('/file-extensions.*') do
@vars = { :framework => "Sinatra", :url => "www.sinatrarb.com" }
case params[:splat].first.to_sym
when :json
erb(@vars.to_json, :layout => false )
when :yaml
erb(@vars.to_yaml,:layout => false)
else
# direct output, should NOT be Cached
@vars.inspect
# @vars.inspect
end
end
## NO CACHING
get('/uncached/erb'){ erb(:index, :cache => false) }
get('/uncached/erb/no/layout'){ erb(:index, :cache => false, :layout => false ) }
get('/uncached/uncached_erb'){ uncached_erb(:index) }
get '/css/screen.css' do
content_type 'text/css'
sass(:css, :style => :compact)
end
get '/css/no/cache.css' do
content_type 'text/css'
sass(:css, :style => :compact, :cache => false)
end
# enable :method_override
post('/post/?') { erb("POST", :layout => false) }
put('/put/?') { erb('PUT', :layout => false) }
delete('/delete/?') { erb('DELETE', :layout => false) }
get %r{^/fragments/?([\s\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?} do
erb(:fragments, :layout => false, :cache => false)
end
get %r{^/sharedfragments/?([\s\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?/?([\w-]+)?} do
erb(:fragments_shared, :layout => false, :cache => false)
end
end
def app; ::MyPartialsTestApp.new ; end
describe "basic Page caching" do
describe "GET requests for" do
describe "the Home page - ['/' => /index.html] (with layout)" do
before(:each) do
@cache_file = "#{test_cache_path('system/cache')}/index.html"
get('/')
end
after(:each) do
FileUtils.rm(@cache_file) if @delete_cached_test_files
end
it "should render the expected output" do
#
#
# Sinatra::Cache
#
#
#
#
# HELLO FROM [FILE ../sinatra-cache/spec/fixtures/apps/partials/views/home/index.erb]
#
#
body.should have_tag('html > head > title', 'Sinatra::Cache')
body.should match(//)
body.should have_tag('html > body > div#header > h1', /HELLO from \[content_for\(:section_header\)\]/)
body.should have_tag('html > body > h2', /HELLO FROM \[/)
end
it "should create a cached file in the cache output directory" do
test(?f, @cache_file).should == true
end
end #/ GET ['/' => /index.html]
end #/ GET requests
end #/ basic Page caching
end #/ Using nested buffers
end #/ EDGE cases
end #/ Cache
end #/ Sinatra