summary refs log tree commit
path: root/test/spec_rack_sendfile.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/spec_rack_sendfile.rb')
-rw-r--r--test/spec_rack_sendfile.rb86
1 files changed, 86 insertions, 0 deletions
diff --git a/test/spec_rack_sendfile.rb b/test/spec_rack_sendfile.rb
new file mode 100644
index 00000000..8cfe2017
--- /dev/null
+++ b/test/spec_rack_sendfile.rb
@@ -0,0 +1,86 @@
+require 'test/spec'
+require 'rack/mock'
+require 'rack/sendfile'
+
+context "Rack::File" do
+  specify "should respond to #to_path" do
+    Rack::File.new(Dir.pwd).should.respond_to :to_path
+  end
+end
+
+context "Rack::Sendfile" do
+  def sendfile_body
+    res = ['Hello World']
+    def res.to_path ; "/tmp/hello.txt" ; end
+    res
+  end
+
+  def simple_app(body=sendfile_body)
+    lambda { |env| [200, {'Content-Type' => 'text/plain'}, body] }
+  end
+
+  def sendfile_app(body=sendfile_body)
+    Rack::Sendfile.new(simple_app(body))
+  end
+
+  setup do
+    @request = Rack::MockRequest.new(sendfile_app)
+  end
+
+  def request(headers={})
+    yield @request.get('/', headers)
+  end
+
+  specify "does nothing when no X-Sendfile-Type header present" do
+    request do |response|
+      response.should.be.ok
+      response.body.should.equal 'Hello World'
+      response.headers.should.not.include 'X-Sendfile'
+    end
+  end
+
+  specify "sets X-Sendfile response header and discards body" do
+    request 'HTTP_X_SENDFILE_TYPE' => 'X-Sendfile' do |response|
+      response.should.be.ok
+      response.body.should.be.empty
+      response.headers['X-Sendfile'].should.equal '/tmp/hello.txt'
+    end
+  end
+
+  specify "sets X-Lighttpd-Send-File response header and discards body" do
+    request 'HTTP_X_SENDFILE_TYPE' => 'X-Lighttpd-Send-File' do |response|
+      response.should.be.ok
+      response.body.should.be.empty
+      response.headers['X-Lighttpd-Send-File'].should.equal '/tmp/hello.txt'
+    end
+  end
+
+  specify "sets X-Accel-Redirect response header and discards body" do
+    headers = {
+      'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect',
+      'HTTP_X_ACCEL_MAPPING' => '/tmp/=/foo/bar/'
+    }
+    request headers do |response|
+      response.should.be.ok
+      response.body.should.be.empty
+      response.headers['X-Accel-Redirect'].should.equal '/foo/bar/hello.txt'
+    end
+  end
+
+  specify 'writes to rack.error when no X-Accel-Mapping is specified' do
+    request 'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect' do |response|
+      response.should.be.ok
+      response.body.should.equal 'Hello World'
+      response.headers.should.not.include 'X-Accel-Redirect'
+      response.errors.should.include 'X-Accel-Mapping'
+    end
+  end
+
+  specify 'does nothing when body does not respond to #to_path' do
+    @request = Rack::MockRequest.new(sendfile_app(['Not a file...']))
+    request 'HTTP_X_SENDFILE_TYPE' => 'X-Sendfile' do |response|
+      response.body.should.equal 'Not a file...'
+      response.headers.should.not.include 'X-Sendfile'
+    end
+  end
+end