require File.dirname(__FILE__) + '/../../../spec_helper'
def test_file_path
File.dirname(__FILE__) + "/../../../fixtures/foo.txt"
end
describe CurbFu::Request::Test do
before :each do
@a_server = mock(Object, :call => [200, { 'Content-Type' => 'spec/testcase' }, ["A is for Archer, an excellent typeface."]])
@b_server = mock(Object, :call => [200, {},["B is for Ballyhoo, like what happened when Twitter switched to Scala"]])
@c_server = mock(Object, :call => [200, {}, ["C is for Continuous, as in Integration"]])
CurbFu.stubs = {
'a.example.com' => @a_server,
'b.example.com' => @b_server,
'c.example.com' => @c_server
}
@mock_rack_response = mock(Rack::MockResponse, :status => 200, :headers => {}, :body => "C is for Continuous, as in Integration")
end
describe "module inclusion" do
it "should define a 'get' method" do
class Test
include CurbFu::Request::Test
end
Test.should respond_to(:get)
end
end
describe "parse_hostname" do
it "should return just the hostname from a full URL" do
CurbFu::Request.parse_hostname('http://a.example.com/foo/bar?transaxle=true').
should == 'a.example.com'
end
it 'should return the hostname if just a hostname is given' do
CurbFu::Request.parse_hostname('b.example.com').
should == 'b.example.com'
end
end
describe "process_headers" do
it "should convert http headers into their upcased, HTTP_ prepended form for the Rack environment" do
CurbFu::Request.process_headers({'X-Mirror-Request' => 'true'}).should == {"HTTP_X_MIRROR_REQUEST" => "true"}
end
it "should handle a whole hashful of headers" do
CurbFu::Request.process_headers({
'X-Mirror-Request' => 'true',
'Accept-Encoding' => '*/*',
'X-Forwarded-For' => 'greenviewdata.com'
}).should == {
"HTTP_X_MIRROR_REQUEST" => "true",
"HTTP_ACCEPT_ENCODING" => "*/*",
"HTTP_X_FORWARDED_FOR" => "greenviewdata.com"
}
end
end
describe "match_host" do
it "should return the appropriate Rack::Test instance to delegate the request to" do
CurbFu::Request.match_host("a.example.com").app.should == @a_server
end
it "should return nil if no match is made" do
CurbFu::Request.match_host("m.google.com").should be_nil
end
end
describe "build_request_options" do
it "should parse headers" do
CurbFu::Request.build_request_options({:host => 'd.example.com', :path => '/big/white/dog', :headers => { 'Accept' => 'beer/pilsner' }}).
should include(:headers => { 'Accept' => 'beer/pilsner' })
end
it "should parse url" do
CurbFu::Request.build_request_options({:host => 'd.example.com', :path => '/big/white/dog'}).
should include(:url => 'http://d.example.com/big/white/dog')
end
it "should parse username and password" do
CurbFu::Request.build_request_options({:host => 'd.example.com', :path => '/big/white/dog', :username => 'bill', :password => 's3cr3t' }).
should include(:username => 'bill', :password => 's3cr3t')
end
it "should get an interface" do
CurbFu::Request.build_request_options({:host => 'c.example.com', :path => '/big/white/dog'}).
should include(:interface => CurbFu.stubs['c.example.com'])
end
end
describe "get_interface" do
it "should parse a string" do
CurbFu::Request.get_interface('http://a.example.com').app.should == @a_server
end
it "should parse a hash" do
CurbFu::Request.get_interface({:host => 'a.example.com'}).app.should == @a_server
end
end
describe "respond" do
it "should convert headers to uppercase, underscorized" do
CurbFu::Response::Base.stub!(:from_rack_response)
mock_interface = mock(Object, :send => mock(Object, :status => 200), :hostname= => nil, :hostname => 'a.example.com')
mock_interface.should_receive(:header).with('HTTP_X_MONARCHY','false')
mock_interface.should_receive(:header).with('HTTP_X_ANARCHO_SYNDICALIST_COMMUNE','true')
CurbFu::Request.respond(mock_interface, :get, 'http://a.example.com/', {},
{'X-Anarcho-Syndicalist-Commune' => 'true', 'X-Monarchy' => 'false'}, nil, nil)
end
end
describe "hashify_params" do
it "should turn a URL-formatted query string into a hash of parameters" do
hash = CurbFu::Request.hashify_params("color=red&shape=round")
hash.should include('color' => 'red')
hash.should include('shape' => 'round')
end
it "should convert array-formatted params into a hash of arrays" do
hash = CurbFu::Request.hashify_params("make[]=Chevrolet&make[]=Pontiac&make[]=GMC")
hash.should == {'make' => ['Chevrolet','Pontiac','GMC']}
end
it "should convert hash parameters into a hash of hashes" do
hash = CurbFu::Request.hashify_params("car[make]=Chevrolet&car[color]=red&car[wheel_shape]=round")
hash.should == {'car' => {
'make' => 'Chevrolet',
'color' => 'red',
'wheel_shape' => 'round'
}}
end
it 'should remove any leading ?s' do
hash = CurbFu::Request.hashify_params("?q=134&dave=astronaut")
hash.keys.should_not include('?q')
end
end
describe "get" do
it 'should delegate the get request to the Rack::Test instance' do
CurbFu.stubs['a.example.com'].should_receive(:get).with('http://a.example.com/gimme/html', anything, anything).and_return(@mock_rack_response)
@a_server.should respond_to(:call)
CurbFu::Request.get('http://a.example.com/gimme/html')
end
it 'should raise Curl::Err::ConnectionFailedError if hostname is not defined in stub list' do
lambda { CurbFu::Request.get('http://m.google.com/gimme/html') }.should raise_error(Curl::Err::ConnectionFailedError)
end
it 'should return a CurbFu::Response object' do
response = CurbFu::Request.get('http://a.example.com/gimme/html')
response.should be_a_kind_of(CurbFu::Response::Base)
response.status.should == 200
response.headers.should == { 'Content-Type' => 'spec/testcase' }
response.body.should == "A is for Archer, an excellent typeface."
end
end
describe "post" do
it 'should delegate the post request to the Rack::Test instance' do
CurbFu.stubs['b.example.com'].should_receive(:post).
with('http://b.example.com/html/backatcha', {'html' => 'CSRF in da house! '}, anything).
and_return(@mock_rack_response)
CurbFu::Request.post('http://b.example.com/html/backatcha',
{'html' => 'CSRF in da house! '})
end
it 'should raise Curl::Err::ConnectionFailedError if hostname is not defined in stub list' do
lambda { CurbFu::Request.post('http://m.google.com/gimme/html') }.should raise_error(Curl::Err::ConnectionFailedError)
end
it 'should return a CurbFu::Response object' do
response = CurbFu::Request.post('http://a.example.com/gimme/html')
response.should be_a_kind_of(CurbFu::Response::Base)
response.status.should == 200
response.headers.should == { 'Content-Type' => 'spec/testcase' }
response.body.should == "A is for Archer, an excellent typeface."
end
end
describe "post_file" do
it 'should delegate the post request to the Rack::Test instance' do
CurbFu.stubs['b.example.com'].should_receive(:post).
with('http://b.example.com/html/backatcha', hash_including("foo.txt"=>anything, "filename"=>"asdf ftw"), anything).
and_return(@mock_rack_response)
CurbFu::Request.post_file('http://b.example.com/html/backatcha', {'filename' => 'asdf ftw'}, {'foo.txt' => test_file_path })
end
it 'should raise Curl::Err::ConnectionFailedError if hostname is not defined in stub list' do
lambda { CurbFu::Request.post_file('http://m.google.com/gimme/html') }.should raise_error(Curl::Err::ConnectionFailedError)
end
it 'should return a CurbFu::Response object' do
response = CurbFu::Request.post_file('http://a.example.com/gimme/html')
response.should be_a_kind_of(CurbFu::Response::Base)
response.status.should == 200
response.headers.should == { 'Content-Type' => 'spec/testcase' }
response.body.should == "A is for Archer, an excellent typeface."
end
end
describe "put" do
it 'should delegate the put request to the Rack::Test instance' do
CurbFu.stubs['a.example.com'].should_receive(:put).with('http://a.example.com/gimme/html', anything, anything).and_return(@mock_rack_response)
CurbFu::Request.put('http://a.example.com/gimme/html')
end
it 'should raise Curl::Err::ConnectionFailedError if hostname is not defined in stub list' do
lambda { CurbFu::Request.put('http://m.google.com/gimme/html') }.should raise_error(Curl::Err::ConnectionFailedError)
end
it 'should return a CurbFu::Response object' do
response = CurbFu::Request.put('http://a.example.com/gimme/html')
response.should be_a_kind_of(CurbFu::Response::Base)
response.status.should == 200
response.headers.should == { 'Content-Type' => 'spec/testcase' }
response.body.should == "A is for Archer, an excellent typeface."
end
end
describe "delete" do
it 'should delegate the delete request to the Rack::Test instance' do
CurbFu.stubs['a.example.com'].should_receive(:delete).with('http://a.example.com/gimme/html', anything, anything).and_return(@mock_rack_response)
@a_server.should respond_to(:call)
CurbFu::Request.delete('http://a.example.com/gimme/html')
end
it 'should raise Curl::Err::ConnectionFailedError if hostname is not defined in stub list' do
lambda { CurbFu::Request.delete('http://m.google.com/gimme/html') }.should raise_error(Curl::Err::ConnectionFailedError)
end
it 'should return a CurbFu::Response object' do
response = CurbFu::Request.delete('http://a.example.com/gimme/html')
response.should be_a_kind_of(CurbFu::Response::Base)
response.status.should == 200
response.headers.should == { 'Content-Type' => 'spec/testcase' }
response.body.should == "A is for Archer, an excellent typeface."
end
end
end