1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
require 'rack/static'
require 'rack/lint'
require 'rack/mock'
class DummyApp
def call(env)
[200, {"Content-Type" => "text/plain"}, ["Hello World"]]
end
end
describe Rack::Static do
def static(app, *args)
Rack::Lint.new Rack::Static.new(app, *args)
end
root = File.expand_path(File.dirname(__FILE__))
OPTIONS = {:urls => ["/cgi"], :root => root}
STATIC_OPTIONS = {:urls => [""], :root => "#{root}/static", :index => 'index.html'}
HASH_OPTIONS = {:urls => {"/cgi/sekret" => 'cgi/test'}, :root => root}
@request = Rack::MockRequest.new(static(DummyApp.new, OPTIONS))
@static_request = Rack::MockRequest.new(static(DummyApp.new, STATIC_OPTIONS))
@hash_request = Rack::MockRequest.new(static(DummyApp.new, HASH_OPTIONS))
it "serves files" do
res = @request.get("/cgi/test")
res.should.be.ok
res.body.should =~ /ruby/
end
it "404s if url root is known but it can't find the file" do
res = @request.get("/cgi/foo")
res.should.be.not_found
end
it "calls down the chain if url root is not known" do
res = @request.get("/something/else")
res.should.be.ok
res.body.should == "Hello World"
end
it "calls index file when requesting root in the given folder" do
res = @static_request.get("/")
res.should.be.ok
res.body.should =~ /index!/
res = @static_request.get("/other/")
res.should.be.not_found
res = @static_request.get("/another/")
res.should.be.ok
res.body.should =~ /another index!/
end
it "doesn't call index file if :index option was omitted" do
res = @request.get("/")
res.body.should == "Hello World"
end
it "serves hidden files" do
res = @hash_request.get("/cgi/sekret")
res.should.be.ok
res.body.should =~ /ruby/
end
it "calls down the chain if the URI is not specified" do
res = @hash_request.get("/something/else")
res.should.be.ok
res.body.should == "Hello World"
end
it "supports serving fixed cache-control (legacy option)" do
opts = OPTIONS.merge(:cache_control => 'public')
request = Rack::MockRequest.new(static(DummyApp.new, opts))
res = request.get("/cgi/test")
res.should.be.ok
res.headers['Cache-Control'].should == 'public'
end
HEADER_OPTIONS = {:urls => ["/cgi"], :root => root, :header_rules => [
[:all, {'Cache-Control' => 'public, max-age=100'}],
[:fonts, {'Cache-Control' => 'public, max-age=200'}],
[%w(png jpg), {'Cache-Control' => 'public, max-age=300'}],
['/cgi/assets/folder/', {'Cache-Control' => 'public, max-age=400'}],
['cgi/assets/javascripts', {'Cache-Control' => 'public, max-age=500'}],
[/\.(css|erb)\z/, {'Cache-Control' => 'public, max-age=600'}]
]}
@header_request = Rack::MockRequest.new(static(DummyApp.new, HEADER_OPTIONS))
it "supports header rule :all" do
# Headers for all files via :all shortcut
res = @header_request.get('/cgi/assets/index.html')
res.should.be.ok
res.headers['Cache-Control'].should == 'public, max-age=100'
end
it "supports header rule :fonts" do
# Headers for web fonts via :fonts shortcut
res = @header_request.get('/cgi/assets/fonts/font.eot')
res.should.be.ok
res.headers['Cache-Control'].should == 'public, max-age=200'
end
it "supports file extension header rules provided as an Array" do
# Headers for file extensions via array
res = @header_request.get('/cgi/assets/images/image.png')
res.should.be.ok
res.headers['Cache-Control'].should == 'public, max-age=300'
end
it "supports folder rules provided as a String" do
# Headers for files in folder via string
res = @header_request.get('/cgi/assets/folder/test.js')
res.should.be.ok
res.headers['Cache-Control'].should == 'public, max-age=400'
end
it "supports folder header rules provided as a String not starting with a slash" do
res = @header_request.get('/cgi/assets/javascripts/app.js')
res.should.be.ok
res.headers['Cache-Control'].should == 'public, max-age=500'
end
it "supports flexible header rules provided as Regexp" do
# Flexible Headers via Regexp
res = @header_request.get('/cgi/assets/stylesheets/app.css')
res.should.be.ok
res.headers['Cache-Control'].should == 'public, max-age=600'
end
it "prioritizes header rules over fixed cache-control setting (legacy option)" do
opts = OPTIONS.merge(
:cache_control => 'public, max-age=24',
:header_rules => [
[:all, {'Cache-Control' => 'public, max-age=42'}]
])
request = Rack::MockRequest.new(static(DummyApp.new, opts))
res = request.get("/cgi/test")
res.should.be.ok
res.headers['Cache-Control'].should == 'public, max-age=42'
end
end
|