test/test_hugs.rb in hugs-1.3.1 vs test/test_hugs.rb in hugs-2.0.0
- old
+ new
@@ -1,111 +1,172 @@
-require "support"
-require "base64"
-require "hugs"
+%w(support base64 hugs).each { |r| require r }
describe Hugs do
before do
- @user = "user",
- @password = "credentials"
@valid_options = {
- :user => @user,
- :password => @password,
:host => "example.com",
:port => 80,
:scheme => "https",
}
- @instance = ::Hugs.new @valid_options
+ WebMock.reset!
+ @instance = Hugs.new @valid_options
end
describe "#response_for" do
before do
- @http = mock(:request => mock(:body => :body))
- @request = ::Net::HTTP::Get
-
- ::Net::HTTP::Persistent.stubs :new => @http
+ @request = Net::HTTP::Get
end
it "generates a path" do
+ stub_request :get, "https://example.com:80/"
+
@instance.send :response_for, @request, "/", {}
- @instance.instance_variable_get(:@request).path.must_equal "/"
+ assert_requested :get, "https://example.com:80/"
end
it "generates a path when a valid :query exists" do
+ stub_request(:get, "https://example.com:80/").with:query => {"foo" => "bar"}
+
@instance.send :response_for, @request, "/", :query => "foo=bar"
- @instance.instance_variable_get(:@request).path.must_equal "/?foo=bar"
+ assert_requested :get, "https://example.com:80/", :query => {"foo" => "bar"}
end
it "generates a path when a nil :query exists" do
+ stub_request :get, "https://example.com:80/"
+
@instance.send :response_for, @request, "/", :query => nil
- @instance.instance_variable_get(:@request).path.must_equal "/"
+ assert_requested :get, "https://example.com:80/"
end
- it "sets the body as JSON when a valid :body exists" do
- @instance.send :response_for, @request, "/", :body => {:foo => :bar}
+ describe "body" do
+ before do
+ stub_request :get, "https://example.com:80/"
+ end
- @instance.instance_variable_get(:@request).body.must_equal '{"foo":"bar"}'
- end
+ it "doesn't set the body when an invalid :body exists" do
+ @instance.send :response_for, @request, "/", :body => nil
- it "doesn't set the body when an invalid :body exists" do
- @instance.send :response_for, @request, "/", :body => nil
+ assert_requested :get, "https://example.com:80/", :body => nil
+ end
- @instance.instance_variable_get(:@request).body.must_be_nil
+ describe "json" do
+ before do
+ @instance = Hugs.new @valid_options.merge(:type => :json)
+ end
+
+ it "sets the body when a valid :body exists" do
+ @instance.send :response_for, @request, "/", :body => {:foo => :bar}
+
+ assert_requested :get, "https://example.com:80/", :body => '{"foo":"bar"}'
+ end
+ end
+
+ describe "xml" do
+ before do
+ @instance = Hugs.new @valid_options.merge(:type => :xml)
+ end
+
+ it "sets the body when a valid :body exists" do
+ @instance.send :response_for, @request, "/", :body => "foo bar"
+
+ assert_requested :get, "https://example.com:80/", :body => "foo bar"
+ end
+ end
end
describe "headers" do
- it "has authentication" do
+ it "authenticates" do
+ stub_request :get, "https://user:credentials@example.com:80/"
+
+ @instance = Hugs.new @valid_options.merge(:user => "user", :password => "credentials")
+
@instance.send :response_for, @request, "/", {}
- @instance.instance_variable_get(:@request).get_fields("authorization").join.
- must_match %r{Basic #{::Base64.encode64("#{@user}:#{@password}").delete("\r\n")}}
+ assert_requested :get, "https://user:credentials@example.com:80/"
end
[:user, :password].each do |option|
it "doesn't authenticate when '#{option}' missing" do
+ stub_request :get, "https://example.com:80/"
+
invalid_options = @valid_options.reject { |k,v| k == option }
- @instance = ::Hugs.new invalid_options
+ @instance = Hugs.new invalid_options
@instance.send :response_for, @request, "/", {}
- @instance.instance_variable_get(:@request).get_fields("authorization").must_be_nil
+ assert_requested :get, "https://example.com:80/"
end
end
[
{ :json => "application/json" },
{ :xml => "application/xml" },
].each do |pair|
pair.each_pair do |type, subtype|
- [::Net::HTTP::Post, ::Net::HTTP::Put].each do |clazz|
- it "has '#{subtype}' content-type and accept for '#{clazz}'" do
- @instance = ::Hugs.new @valid_options.merge(:type => type)
+ [:post, :put].each do |verb|
+ clazz = eval "Net::HTTP::#{verb.capitalize}"
+ it "has '#{subtype}' Content-Type and Accept for '#{clazz}'" do
+ stub_request verb, "https://example.com:80/"
+
+ @instance = Hugs.new @valid_options.merge(:type => type)
+
@instance.send :response_for, clazz, "/", {}
- @instance.instance_variable_get(:@request).get_fields("content-type").join.
- must_match %r{#{subtype}}
- @instance.instance_variable_get(:@request).get_fields("accept").join.
- must_match %r{#{subtype}}
+ assert_requested verb, "https://example.com:80/", :headers => {
+ "Accept" => ["*/*", subtype], "Content-Type" => subtype }
end
end
- [::Net::HTTP::Get, ::Net::HTTP::Delete].each do |clazz|
- it "has '#{subtype}' accept for '#{clazz}'" do
- @instance = ::Hugs.new @valid_options.merge(:type => type)
+ [:get, :delete].each do |verb|
+ clazz = eval "Net::HTTP::#{verb.capitalize}"
+ it "has '#{subtype}' Accept for '#{clazz}'" do
+ stub_request verb, "https://example.com:80/"
+
+ @instance = Hugs.new @valid_options.merge(:type => type)
+
@instance.send :response_for, clazz, "/", {}
- @instance.instance_variable_get(:@request).get_fields("accept").join.
- must_match %r{#{subtype}}
- @instance.instance_variable_get(:@request).get_fields("content-type").
- must_be_nil
+ assert_requested verb, "https://example.com:80/", :headers => {
+ "Accept" => ["*/*", subtype] }
end
end
end
+ end
+ end
+ end
+
+ describe "HTTP methods" do
+ describe "json" do
+ before do
+ @instance = Hugs.new @valid_options.merge(:type => :json)
+ end
+
+ it "objectifies the json and returns a hash" do
+ stub_request(:get, "https://example.com:80/").to_return :body => '{"foo":"bar"}'
+
+ response = @instance.get "/", :body => { :foo => :bar }
+
+ response.body.must_be_kind_of Hash
+ end
+ end
+
+ describe "xml" do
+ before do
+ @instance = Hugs.new @valid_options.merge(:type => :xml)
+ end
+
+ it "parses xml and returns a Nokogiri object" do
+ stub_request(:get, "https://example.com:80/").to_return :body => "<STORAGE></STORAGE>"
+
+ response = @instance.get "/", :body => { :foo => :bar }
+
+ response.body.must_be_kind_of Nokogiri::XML::Document
end
end
end
end