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