require "spec_helper"
require "integration/support/server"
describe HTTPI::Adapter::NetHTTP do
subject(:adapter) { :net_http }
context "http requests" do
before :all do
@server = IntegrationServer.run
end
after :all do
@server.stop
end
it "sends and receives HTTP headers" do
request = HTTPI::Request.new(@server.url + "x-header")
request.headers["X-Header"] = "HTTPI"
response = HTTPI.get(request, adapter)
response.body.should include("HTTPI")
end
it "executes GET requests" do
response = HTTPI.get(@server.url, adapter)
response.body.should eq("get")
response.headers["Content-Type"].should eq("text/plain")
end
it "executes POST requests" do
response = HTTPI.post(@server.url, "xml", adapter)
response.body.should eq("post")
response.headers["Content-Type"].should eq("text/plain")
end
it "executes HEAD requests" do
response = HTTPI.head(@server.url, adapter)
response.code.should == 200
response.headers["Content-Type"].should eq("text/plain")
end
it "executes PUT requests" do
response = HTTPI.put(@server.url, "xml", adapter)
response.body.should eq("put")
response.headers["Content-Type"].should eq("text/plain")
end
it "executes DELETE requests" do
response = HTTPI.delete(@server.url, adapter)
response.body.should eq("delete")
response.headers["Content-Type"].should eq("text/plain")
end
it "supports basic authentication" do
request = HTTPI::Request.new(@server.url + "basic-auth")
request.auth.basic("admin", "secret")
response = HTTPI.get(request, adapter)
response.body.should eq("basic-auth")
end
end
# it does not support digest auth
context "https requests" do
before :all do
@server = IntegrationServer.run(:ssl => true)
end
after :all do
@server.stop
end
# it does not raise when no certificate was set up
it "works when set up properly" do
request = HTTPI::Request.new(@server.url)
request.auth.ssl.ca_cert_file = IntegrationServer.ssl_ca_file
response = HTTPI.get(request, adapter)
expect(response.body).to eq("get")
end
end
end
__END__
describe "#request(:get)" do
it "should return a valid HTTPI::Response" do
stub_request(:get, request.url.to_s).to_return(basic_response)
adapter.request(:get).should match_response(:body => Fixture.xml)
end
end
describe "#request(:post)" do
it "should return a valid HTTPI::Response" do
request.body = Fixture.xml
stub_request(:post, request.url.to_s).with(:body => request.body).to_return(basic_response)
adapter.request(:post).should match_response(:body => Fixture.xml)
end
end
describe "#request(:head)" do
it "should return a valid HTTPI::Response" do
stub_request(:head, request.url.to_s).to_return(basic_response)
adapter.request(:head).should match_response(:body => Fixture.xml)
end
end
describe "#request(:put)" do
it "should return a valid HTTPI::Response" do
request.url = "http://example.com"
request.headers = { "Accept-encoding" => "utf-8" }
request.body = Fixture.xml
stub_request(:put, request.url.to_s).with(:body => request.body).to_return(basic_response)
adapter.request(:put).should match_response(:body => Fixture.xml)
end
end
describe "#request(:delete)" do
it "should return a valid HTTPI::Response" do
stub_request(:delete, request.url.to_s).to_return(basic_response)
adapter.request(:delete).should match_response(:body => Fixture.xml)
end
end
describe "#request(:custom)" do
it "raises a NotSupportedError" do
expect { adapter.request(:custom) }.
to raise_error(HTTPI::NotSupportedError, "Net::HTTP does not support custom HTTP methods")
end
end
describe "settings:" do
before { stub_request(:get, request.url.to_s) }
describe "use_ssl" do
it "should be set to false for non-SSL requests" do
net_http.expects(:use_ssl=).with(false)
adapter.request(:get)
end
it "should be set to true for SSL requests" do
request.ssl = true
net_http.expects(:use_ssl=).with(true)
adapter.request(:get)
end
end
describe "open_timeout" do
it "should not be set if not specified" do
net_http.expects(:open_timeout=).never
adapter.request(:get)
end
it "should be set if specified" do
request.open_timeout = 30
net_http.expects(:open_timeout=).with(30)
adapter.request(:get)
end
end
describe "read_timeout" do
it "should not be set if not specified" do
net_http.expects(:read_timeout=).never
adapter.request(:get)
end
it "should be set if specified" do
request.read_timeout = 30
net_http.expects(:read_timeout=).with(30)
adapter.request(:get)
end
end
describe "basic_auth" do
it "should be set for HTTP basic auth" do
request.auth.basic "username", "password"
stub_request(:get, "http://username:password@example.com")
Net::HTTP::Get.any_instance.expects(:basic_auth).with(*request.auth.credentials)
adapter.request(:get)
end
end
context "(for SSL client auth)" do
before do
request.auth.ssl.cert_key_file = "spec/fixtures/client_key.pem"
request.auth.ssl.cert_file = "spec/fixtures/client_cert.pem"
end
it "key, cert and verify_mode should be set" do
net_http.expects(:cert=).with(request.auth.ssl.cert)
net_http.expects(:key=).with(request.auth.ssl.cert_key)
net_http.expects(:verify_mode=).with(request.auth.ssl.openssl_verify_mode)
adapter.request(:get)
end
it "should set the client_ca if specified" do
request.auth.ssl.ca_cert_file = "spec/fixtures/client_cert.pem"
net_http.expects(:ca_file=).with(request.auth.ssl.ca_cert_file)
adapter.request(:get)
end
it 'should set the ssl_version if specified' do
request.auth.ssl.ssl_version = :SSLv3
net_http.expects(:ssl_version=).with(request.auth.ssl.ssl_version)
adapter.request(:get)
end
end
end
def basic_request
request = HTTPI::Request.new "http://example.com"
yield request if block_given?
request
end
end