alexvollmer-httparty 0.2.6 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. data/History +34 -0
  2. data/Manifest +25 -2
  3. data/README +2 -2
  4. data/Rakefile +6 -2
  5. data/bin/httparty +39 -44
  6. data/cucumber.yml +1 -0
  7. data/examples/basic.rb +6 -1
  8. data/examples/delicious.rb +1 -0
  9. data/examples/rubyurl.rb +1 -1
  10. data/features/basic_authentication.feature +20 -0
  11. data/features/command_line.feature +7 -0
  12. data/features/deals_with_http_error_codes.feature +26 -0
  13. data/features/handles_multiple_formats.feature +34 -0
  14. data/features/steps/env.rb +15 -0
  15. data/features/steps/httparty_response_steps.rb +26 -0
  16. data/features/steps/httparty_steps.rb +15 -0
  17. data/features/steps/mongrel_helper.rb +55 -0
  18. data/features/steps/remote_service_steps.rb +47 -0
  19. data/features/supports_redirection.feature +22 -0
  20. data/httparty.gemspec +4 -7
  21. data/lib/core_extensions.rb +48 -222
  22. data/lib/httparty/cookie_hash.rb +9 -0
  23. data/lib/httparty/exceptions.rb +3 -0
  24. data/lib/httparty/module_inheritable_attributes.rb +25 -0
  25. data/lib/httparty/parsers/json.rb +74 -0
  26. data/lib/httparty/parsers/xml.rb +209 -0
  27. data/lib/httparty/parsers.rb +4 -0
  28. data/lib/httparty/request.rb +63 -76
  29. data/lib/httparty/response.rb +17 -0
  30. data/lib/httparty/version.rb +2 -2
  31. data/lib/httparty.rb +108 -19
  32. data/spec/fixtures/empty.xml +0 -0
  33. data/spec/fixtures/undefined_method_add_node_for_nil.xml +2 -0
  34. data/spec/hash_spec.rb +49 -0
  35. data/spec/httparty/cookie_hash_spec.rb +38 -0
  36. data/spec/httparty/parsers/json_spec.rb +42 -0
  37. data/spec/httparty/parsers/xml_spec.rb +445 -0
  38. data/spec/httparty/request_spec.rb +219 -80
  39. data/spec/httparty/response_spec.rb +53 -0
  40. data/spec/httparty_spec.rb +125 -64
  41. data/spec/spec_helper.rb +5 -8
  42. data/spec/string_spec.rb +27 -0
  43. metadata +34 -14
  44. data/lib/module_level_inheritable_attributes.rb +0 -25
  45. data/spec/as_buggery_spec.rb +0 -16
@@ -1,6 +1,20 @@
1
1
  require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
2
 
3
3
  describe HTTParty::Request do
4
+ def stub_response(body, code = 200)
5
+ unless @http
6
+ @http = Net::HTTP.new('localhost', 80)
7
+ @request.stub!(:http).and_return(@http)
8
+ @request.stub!(:uri).and_return(URI.parse("http://foo.com/foobar"))
9
+ end
10
+
11
+ response = Net::HTTPResponse::CODE_TO_OBJ[code.to_s].new("1.1", code, body)
12
+ response.stub!(:body).and_return(body)
13
+
14
+ @http.stub!(:request).and_return(response)
15
+ response
16
+ end
17
+
4
18
  before do
5
19
  @request = HTTParty::Request.new(Net::HTTP::Get, 'http://api.foo.com/v1', :format => :xml)
6
20
  end
@@ -13,14 +27,98 @@ describe HTTParty::Request do
13
27
 
14
28
  describe 'http' do
15
29
  it "should use ssl for port 443" do
16
- @request.send(:http, URI.parse('https://api.foo.com/v1:443')).use_ssl?.should == true
30
+ request = HTTParty::Request.new(Net::HTTP::Get, 'https://api.foo.com/v1:443')
31
+ request.send(:http).use_ssl?.should == true
17
32
  end
18
33
 
19
34
  it 'should not use ssl for port 80' do
20
- @request.send(:http, URI.parse('http://foobar.com')).use_ssl?.should == false
35
+ request = HTTParty::Request.new(Net::HTTP::Get, 'http://foobar.com')
36
+ @request.send(:http).use_ssl?.should == false
37
+ end
38
+
39
+ it "should use basic auth when configured" do
40
+ @request.options[:basic_auth] = {:username => 'foobar', :password => 'secret'}
41
+ @request.send(:setup_raw_request)
42
+ @request.instance_variable_get(:@raw_request)['authorization'].should_not be_nil
43
+ end
44
+ end
45
+
46
+ describe '#format_from_mimetype' do
47
+ it 'should handle text/xml' do
48
+ ["text/xml", "text/xml; charset=iso8859-1"].each do |ct|
49
+ @request.send(:format_from_mimetype, ct).should == :xml
50
+ end
51
+ end
52
+
53
+ it 'should handle application/xml' do
54
+ ["application/xml", "application/xml; charset=iso8859-1"].each do |ct|
55
+ @request.send(:format_from_mimetype, ct).should == :xml
56
+ end
57
+ end
58
+
59
+ it 'should handle text/json' do
60
+ ["text/json", "text/json; charset=iso8859-1"].each do |ct|
61
+ @request.send(:format_from_mimetype, ct).should == :json
62
+ end
63
+ end
64
+
65
+ it 'should handle application/json' do
66
+ ["application/json", "application/json; charset=iso8859-1"].each do |ct|
67
+ @request.send(:format_from_mimetype, ct).should == :json
68
+ end
69
+ end
70
+
71
+ it 'should handle text/javascript' do
72
+ ["text/javascript", "text/javascript; charset=iso8859-1"].each do |ct|
73
+ @request.send(:format_from_mimetype, ct).should == :json
74
+ end
75
+ end
76
+
77
+ it 'should handle application/javascript' do
78
+ ["application/javascript", "application/javascript; charset=iso8859-1"].each do |ct|
79
+ @request.send(:format_from_mimetype, ct).should == :json
80
+ end
21
81
  end
22
82
  end
23
83
 
84
+ describe '#format_from_mimetype' do
85
+ it 'should handle text/xml' do
86
+ ["text/xml", "text/xml; charset=iso8859-1"].each do |ct|
87
+ @request.send(:format_from_mimetype, ct).should == :xml
88
+ end
89
+ end
90
+
91
+ it 'should handle application/xml' do
92
+ ["application/xml", "application/xml; charset=iso8859-1"].each do |ct|
93
+ @request.send(:format_from_mimetype, ct).should == :xml
94
+ end
95
+ end
96
+
97
+ it 'should handle text/json' do
98
+ ["text/json", "text/json; charset=iso8859-1"].each do |ct|
99
+ @request.send(:format_from_mimetype, ct).should == :json
100
+ end
101
+ end
102
+
103
+ it 'should handle application/json' do
104
+ ["application/json", "application/json; charset=iso8859-1"].each do |ct|
105
+ @request.send(:format_from_mimetype, ct).should == :json
106
+ end
107
+ end
108
+
109
+ it 'should handle text/javascript' do
110
+ ["text/javascript", "text/javascript; charset=iso8859-1"].each do |ct|
111
+ @request.send(:format_from_mimetype, ct).should == :json
112
+ end
113
+ end
114
+
115
+ it 'should handle application/javascript' do
116
+ ["application/javascript", "application/javascript; charset=iso8859-1"].each do |ct|
117
+ @request.send(:format_from_mimetype, ct).should == :json
118
+ end
119
+ end
120
+ end
121
+
24
122
  describe 'parsing responses' do
25
123
  it 'should handle xml automatically' do
26
124
  xml = %q[<books><book><id>1234</id><name>Foo Bar!</name></book></books>]
@@ -33,112 +131,153 @@ describe HTTParty::Request do
33
131
  @request.options[:format] = :json
34
132
  @request.send(:parse_response, json).should == {'books' => {'book' => {'id' => '1234', 'name' => 'Foo Bar!'}}}
35
133
  end
134
+
135
+ it 'should handle yaml automatically' do
136
+ yaml = "books: \n book: \n name: Foo Bar!\n id: \"1234\"\n"
137
+ @request.options[:format] = :yaml
138
+ @request.send(:parse_response, yaml).should == {'books' => {'book' => {'id' => '1234', 'name' => 'Foo Bar!'}}}
139
+ end
140
+
141
+ it "should include any HTTP headers in the returned response" do
142
+ @request.options[:format] = :html
143
+ response = stub_response "Content"
144
+ response.initialize_http_header("key" => "value")
145
+
146
+ @request.perform.headers.should == { "key" => ["value"] }
147
+ end
148
+
149
+ describe 'with non-200 responses' do
150
+
151
+ it 'should return a valid object for 4xx response' do
152
+ stub_response '<foo><bar>yes</bar></foo>', 401
153
+ resp = @request.perform
154
+ resp.code.should == 401
155
+ resp.body.should == "<foo><bar>yes</bar></foo>"
156
+ resp['foo']['bar'].should == "yes"
157
+ end
158
+
159
+ it 'should return a valid object for 5xx response' do
160
+ stub_response '<foo><bar>error</bar></foo>', 500
161
+ resp = @request.perform
162
+ resp.code.should == 500
163
+ resp.body.should == "<foo><bar>error</bar></foo>"
164
+ resp['foo']['bar'].should == "error"
165
+ end
166
+
167
+ end
36
168
  end
37
169
 
38
170
  it "should not attempt to parse empty responses" do
39
- http = Net::HTTP.new('localhost', 80)
40
- @request.stub!(:http).and_return(http)
41
- response = Net::HTTPNoContent.new("1.1", 204, "No content for you")
42
- response.stub!(:body).and_return(nil)
43
- http.stub!(:request).and_return(response)
171
+ stub_response "", 204
44
172
 
45
173
  @request.options[:format] = :xml
46
174
  @request.perform.should be_nil
47
-
48
- response.stub!(:body).and_return("")
49
- @request.perform.should be_nil
50
175
  end
51
176
 
52
177
  it "should not fail for missing mime type" do
53
- http = Net::HTTP.new('localhost', 80)
54
- @request.stub!(:http).and_return(http)
55
-
56
- response = Net::HTTPOK.new("1.1", 200, "Content for you")
57
- response.stub!(:[]).with('content-type').and_return(nil)
58
- response.stub!(:body).and_return('Content for you')
59
-
60
- http.stub!(:request).and_return(response)
61
-
178
+ stub_response "Content for you"
62
179
  @request.options[:format] = :html
63
- @request.perform.should == 'Content for you'
180
+ @request.perform.body.should == 'Content for you'
64
181
  end
65
182
 
66
- describe 'when we ask for the original body' do
67
- it 'should add _body attribute in XML' do
68
- xml = %q[<books><book><id>1234</id><name>Foo Bar!</name></book></books>]
69
- @request.options[:keep_body] = true
70
- @request.options[:format] = :xml
71
- @request.send(:parse_response, xml).should == {'books' => {'book' => {'id' => '1234', 'name' => 'Foo Bar!'}}, '_body' => xml}
72
- end
183
+ it "should drop query parameters when following redirects" do
184
+ request = HTTParty::Request.new(Net::HTTP::Post,
185
+ 'http://api.foo.com/foo',
186
+ :query => { :bar => 1 },
187
+ :format => :xml)
73
188
 
74
- it 'should add _body attribute in JSON' do
75
- json = %q[{"books": {"book": {"name": "Foo Bar!", "id": "1234"}}}]
76
- @request.options[:keep_body] = true
77
- @request.options[:format] = :json
78
- @request.send(:parse_response, json).should == {'books' => {'book' => {'id' => '1234', 'name' => 'Foo Bar!'}}, '_body' => json}
189
+ http = Net::HTTP.new('localhost', 80)
190
+ request.stub!(:http).and_return(http)
191
+ req1 = Net::HTTP::Post.new('/foo')
192
+ req1.should_receive(:set_form_data).once.with({ :bar => 1 })
193
+ req1.should_receive(:initialize_http_header).once.with(nil)
194
+ Net::HTTP::Post.should_receive(:new).once.with("/foo").and_return(req1)
195
+ redirect = stub_response('', 302)
196
+ redirect['location'] = 'http://api.foo.com/foo/1'
197
+ http.should_receive(:request).
198
+ once.
199
+ with(an_instance_of(Net::HTTP::Post)).
200
+ and_return(redirect)
79
201
 
80
- end
202
+ req2 = Net::HTTP::Get.new('/foo/1')
203
+ Net::HTTP::Get.should_receive(:new).once.with("/foo/1").and_return(req2)
204
+ ok = stub_response('<hash><foo>bar</foo></hash>', 200)
205
+ http.should_receive(:request).
206
+ once.
207
+ with(an_instance_of(Net::HTTP::Get)).
208
+ and_return(ok)
209
+
210
+ request.perform.should == { "hash" => { "foo" => "bar" }}
81
211
  end
82
212
 
83
- describe "that respond with redirects" do
84
- def setup_redirect
85
- @http = Net::HTTP.new('localhost', 80)
86
- @request.stub!(:http).and_return(@http)
87
- @request.stub!(:uri).and_return(URI.parse("http://foo.com/foobar"))
88
- @redirect = Net::HTTPFound.new("1.1", 302, "")
89
- @redirect['location'] = '/foo'
90
- end
213
+ it "should not follow redirects after POST if no_follow is set" do
214
+ request = HTTParty::Request.new(Net::HTTP::Post,
215
+ 'http://api.foo.com/foo',
216
+ :query => { :bar => 1 },
217
+ :no_follow => true,
218
+ :format => :xml)
91
219
 
92
- def setup_ok_response
93
- @ok = Net::HTTPOK.new("1.1", 200, "Content for you")
94
- @ok.stub!(:body).and_return('<hash><foo>bar</foo></hash>')
95
- @http.should_receive(:request).and_return(@redirect, @ok)
96
- @request.options[:format] = :xml
97
- end
220
+ http = Net::HTTP.new('localhost', 80)
221
+ request.stub!(:http).and_return(http)
222
+ req1 = Net::HTTP::Post.new('/foo')
223
+ req1.should_receive(:set_form_data).once.with({ :bar => 1 })
224
+ req1.should_receive(:initialize_http_header).once.with(nil)
225
+ Net::HTTP::Post.should_receive(:new).once.with("/foo").and_return(req1)
226
+ redirect = stub_response('', 302)
227
+ redirect['location'] = 'http://api.foo.com/foo/1'
228
+ http.should_receive(:request).
229
+ once.
230
+ with(an_instance_of(Net::HTTP::Post)).
231
+ and_return(redirect)
98
232
 
99
- def setup_redirect_response
100
- @http.stub!(:request).and_return(@redirect)
101
- end
233
+ Net::HTTP::Get.should_not_receive(:new).with("/foo/1")
102
234
 
103
- def setup_successful_redirect
104
- setup_redirect
105
- setup_ok_response
106
- end
235
+ lambda {
236
+ request.perform.should be_empty
237
+ }.should raise_error(HTTParty::RedirectionTooDeep)
238
+ end
107
239
 
108
- def setup_infinite_redirect
109
- setup_redirect
110
- setup_redirect_response
111
- end
240
+ describe "a request that redirects" do
241
+ before(:each) do
242
+ @redirect = stub_response("", 302)
243
+ @redirect['location'] = '/foo'
112
244
 
113
- it "should handle redirects for GET transparently" do
114
- setup_successful_redirect
115
- @request.perform.should == {"hash" => {"foo" => "bar"}}
245
+ @ok = stub_response('<hash><foo>bar</foo></hash>', 200)
116
246
  end
117
247
 
118
- it "should handle redirects for POST transparently" do
119
- setup_successful_redirect
120
- @request.http_method = Net::HTTP::Post
121
- @request.perform.should == {"hash" => {"foo" => "bar"}}
122
- end
248
+ describe "once" do
249
+ before(:each) do
250
+ @http.stub!(:request).and_return(@redirect, @ok)
251
+ end
123
252
 
124
- it "should handle redirects for DELETE transparently" do
125
- setup_successful_redirect
126
- @request.http_method = Net::HTTP::Delete
127
- @request.perform.should == {"hash" => {"foo" => "bar"}}
128
- end
253
+ it "should be handled by GET transparently" do
254
+ @request.perform.should == {"hash" => {"foo" => "bar"}}
255
+ end
256
+
257
+ it "should be handled by POST transparently" do
258
+ @request.http_method = Net::HTTP::Post
259
+ @request.perform.should == {"hash" => {"foo" => "bar"}}
260
+ end
261
+
262
+ it "should be handled by DELETE transparently" do
263
+ @request.http_method = Net::HTTP::Delete
264
+ @request.perform.should == {"hash" => {"foo" => "bar"}}
265
+ end
129
266
 
130
- it "should handle redirects for PUT transparently" do
131
- setup_successful_redirect
132
- @request.http_method = Net::HTTP::Put
133
- @request.perform.should == {"hash" => {"foo" => "bar"}}
267
+ it "should be handled by PUT transparently" do
268
+ @request.http_method = Net::HTTP::Put
269
+ @request.perform.should == {"hash" => {"foo" => "bar"}}
270
+ end
134
271
  end
135
272
 
136
- it "should prevent infinite loops" do
137
- setup_infinite_redirect
273
+ describe "infinitely" do
274
+ before(:each) do
275
+ @http.stub!(:request).and_return(@redirect)
276
+ end
138
277
 
139
- lambda do
140
- @request.perform
141
- end.should raise_error(HTTParty::RedirectionTooDeep)
278
+ it "should raise an exception" do
279
+ lambda { @request.perform }.should raise_error(HTTParty::RedirectionTooDeep)
280
+ end
142
281
  end
143
282
  end
144
283
  end
@@ -0,0 +1,53 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe HTTParty::Response do
4
+ describe "initialization" do
5
+ before do
6
+ @response_object = {'foo' => 'bar'}
7
+ @body = "{foo:'bar'}"
8
+ @code = 200
9
+ @response = HTTParty::Response.new(@response_object, @body, @code)
10
+ end
11
+
12
+ it "should set delegate" do
13
+ @response.delegate.should == @response_object
14
+ end
15
+
16
+ it "should set body" do
17
+ @response.body.should == @body
18
+ end
19
+
20
+ it "should set code" do
21
+ @response.code.should == @code
22
+ end
23
+ end
24
+
25
+ it "should be able to set headers during initialization" do
26
+ response = HTTParty::Response.new({'foo' => 'bar'}, "{foo:'bar'}", 200, {'foo' => 'bar'})
27
+ response.headers.should == {'foo' => 'bar'}
28
+ end
29
+
30
+ it "should send missing methods to delegate" do
31
+ response = HTTParty::Response.new({'foo' => 'bar'}, "{foo:'bar'}", 200)
32
+ response['foo'].should == 'bar'
33
+ end
34
+
35
+ it "should be able to iterate delegate if it is array" do
36
+ response = HTTParty::Response.new([{'foo' => 'bar'}, {'foo' => 'baz'}], "[{foo:'bar'}, {foo:'baz'}]", 200)
37
+ response.size.should == 2
38
+ lambda {
39
+ response.each { |item| }
40
+ }.should_not raise_error
41
+ end
42
+
43
+ xit "should allow hashes to be accessed with dot notation" do
44
+ response = HTTParty::Response.new({'foo' => 'bar'}, "{foo:'bar'}", 200)
45
+ response.foo.should == 'bar'
46
+ end
47
+
48
+ xit "should allow nested hashes to be accessed with dot notation" do
49
+ response = HTTParty::Response.new({'foo' => {'bar' => 'baz'}}, "{foo: {bar:'baz'}}", 200)
50
+ response.foo.should == {'bar' => 'baz'}
51
+ response.foo.bar.should == 'baz'
52
+ end
53
+ end
@@ -1,36 +1,25 @@
1
1
  require File.join(File.dirname(__FILE__), 'spec_helper')
2
2
 
3
- class Foo
4
- include HTTParty
5
- base_uri 'api.foo.com/v1'
6
- end
7
-
8
- class GRest
9
- include HTTParty
10
- base_uri "grest.com"
11
- default_params :one => 'two'
12
- end
13
-
14
- class HRest
15
- include HTTParty
16
- base_uri "hrest.com"
17
- default_params :two => 'three'
18
- end
19
-
20
3
  describe HTTParty do
21
-
4
+ before(:each) do
5
+ @klass = Class.new do
6
+ include HTTParty
7
+ base_uri "http://api.foo.com"
8
+ end
9
+ end
10
+
22
11
  describe "base uri" do
23
- before do
24
- Foo.base_uri('api.foo.com/v1')
12
+ before(:each) do
13
+ @klass.base_uri('api.foo.com/v1')
25
14
  end
26
15
 
27
16
  it "should have reader" do
28
- Foo.base_uri.should == 'http://api.foo.com/v1'
17
+ @klass.base_uri.should == 'http://api.foo.com/v1'
29
18
  end
30
19
 
31
20
  it 'should have writer' do
32
- Foo.base_uri('http://api.foobar.com')
33
- Foo.base_uri.should == 'http://api.foobar.com'
21
+ @klass.base_uri('http://api.foobar.com')
22
+ @klass.base_uri.should == 'http://api.foobar.com'
34
23
  end
35
24
  end
36
25
 
@@ -53,91 +42,149 @@ describe HTTParty do
53
42
 
54
43
  describe "headers" do
55
44
  it "should default to empty hash" do
56
- Foo.headers.should == {}
45
+ @klass.headers.should == {}
57
46
  end
58
47
 
59
48
  it "should be able to be updated" do
60
49
  init_headers = {:foo => 'bar', :baz => 'spax'}
61
- Foo.headers init_headers
62
- Foo.headers.should == init_headers
50
+ @klass.headers init_headers
51
+ @klass.headers.should == init_headers
52
+ end
53
+ end
54
+
55
+ describe "cookies" do
56
+ def expect_cookie_header(s)
57
+ HTTParty::Request.should_receive(:new) \
58
+ .with(anything, anything, hash_including({ :headers => { "cookie" => s } })) \
59
+ .and_return(mock("mock response", :perform => nil))
60
+ end
61
+
62
+ it "should not be in the headers by default" do
63
+ HTTParty::Request.stub!(:new).and_return(stub(nil, :perform => nil))
64
+ @klass.get("")
65
+ @klass.headers.keys.should_not include("cookie")
66
+ end
67
+
68
+ it "should raise an ArgumentError if passed a non-Hash" do
69
+ lambda do
70
+ @klass.cookies("nonsense")
71
+ end.should raise_error(ArgumentError)
72
+ end
73
+
74
+ it "should allow a cookie to be specified with a one-off request" do
75
+ expect_cookie_header "type=snickerdoodle"
76
+ @klass.get("", :cookies => { :type => "snickerdoodle" })
77
+ end
78
+
79
+ describe "when a cookie is set at the class level" do
80
+ before(:each) do
81
+ @klass.cookies({ :type => "snickerdoodle" })
82
+ end
83
+
84
+ it "should include that cookie in the request" do
85
+ expect_cookie_header "type=snickerdoodle"
86
+ @klass.get("")
87
+ end
88
+
89
+ it "should allow the class defaults to be overridden" do
90
+ expect_cookie_header "type=chocolate_chip"
91
+
92
+ @klass.get("", :cookies => { :type => "chocolate_chip" })
93
+ end
94
+ end
95
+
96
+ describe "in a class with multiple methods that use different cookies" do
97
+ before(:each) do
98
+ @klass.instance_eval do
99
+ def first_method
100
+ get("first_method", :cookies => { :first_method_cookie => "foo" })
101
+ end
102
+
103
+ def second_method
104
+ get("second_method", :cookies => { :second_method_cookie => "foo" })
105
+ end
106
+ end
107
+ end
108
+
109
+ it "should not allow cookies used in one method to carry over into other methods" do
110
+ expect_cookie_header "first_method_cookie=foo"
111
+ @klass.first_method
112
+
113
+ expect_cookie_header "second_method_cookie=foo"
114
+ @klass.second_method
115
+ end
63
116
  end
64
117
  end
65
118
 
66
119
  describe "default params" do
67
120
  it "should default to empty hash" do
68
- Foo.default_params.should == {}
121
+ @klass.default_params.should == {}
69
122
  end
70
123
 
71
124
  it "should be able to be updated" do
72
125
  new_defaults = {:foo => 'bar', :baz => 'spax'}
73
- Foo.default_params new_defaults
74
- Foo.default_params.should == new_defaults
126
+ @klass.default_params new_defaults
127
+ @klass.default_params.should == new_defaults
75
128
  end
76
129
  end
77
130
 
78
131
  describe "basic http authentication" do
79
132
  it "should work" do
80
- Foo.basic_auth 'foobar', 'secret'
81
- Foo.default_options[:basic_auth].should == {:username => 'foobar', :password => 'secret'}
133
+ @klass.basic_auth 'foobar', 'secret'
134
+ @klass.default_options[:basic_auth].should == {:username => 'foobar', :password => 'secret'}
82
135
  end
83
136
  end
84
137
 
85
138
  describe "format" do
86
139
  it "should allow xml" do
87
- Foo.format :xml
88
- Foo.default_options[:format].should == :xml
140
+ @klass.format :xml
141
+ @klass.default_options[:format].should == :xml
89
142
  end
90
143
 
91
144
  it "should allow json" do
92
- Foo.format :json
93
- Foo.default_options[:format].should == :json
145
+ @klass.format :json
146
+ @klass.default_options[:format].should == :json
147
+ end
148
+
149
+ it "should allow yaml" do
150
+ @klass.format :yaml
151
+ @klass.default_options[:format].should == :yaml
94
152
  end
95
153
 
96
154
  it 'should not allow funky format' do
97
155
  lambda do
98
- Foo.format :foobar
156
+ @klass.format :foobar
99
157
  end.should raise_error(HTTParty::UnsupportedFormat)
100
158
  end
101
159
  end
102
160
 
103
- describe "with explicit override of automatic redirect handling" do
104
-
105
- it "should fail with redirected GET" do
106
- lambda do
107
- Foo.get('/foo', :no_follow => true)
108
- end.should raise_error(HTTParty::RedirectionTooDeep)
109
- end
110
-
111
- it "should fail with redirected POST" do
112
- lambda do
113
- Foo.post('/foo', :no_follow => true)
114
- end.should raise_error(HTTParty::RedirectionTooDeep)
115
- end
161
+ describe "with multiple class definitions" do
162
+ before(:each) do
163
+ @klass.instance_eval do
164
+ base_uri "http://first.com"
165
+ default_params :one => 1
166
+ end
116
167
 
117
- it "should fail with redirected DELETE" do
118
- lambda do
119
- Foo.delete('/foo', :no_follow => true)
120
- end.should raise_error(HTTParty::RedirectionTooDeep)
168
+ @additional_klass = Class.new
169
+ @additional_klass.instance_eval do
170
+ include HTTParty
171
+ base_uri "http://second.com"
172
+ default_params :two => 2
173
+ end
121
174
  end
122
175
 
123
- it "should fail with redirected PUT" do
124
- lambda do
125
- Foo.put('/foo', :no_follow => true)
126
- end.should raise_error(HTTParty::RedirectionTooDeep)
127
- end
128
- end
129
-
130
- describe "with multiple class definitions" do
131
176
  it "should not run over each others options" do
132
- HRest.default_options.should == {:base_uri => 'http://hrest.com', :default_params => {:two => 'three'}}
133
- GRest.default_options.should == {:base_uri => 'http://grest.com', :default_params => {:one => 'two'}}
177
+ @klass.default_options.should == { :base_uri => 'http://first.com', :default_params => { :one => 1 } }
178
+ @additional_klass.default_options.should == { :base_uri => 'http://second.com', :default_params => { :two => 2 } }
134
179
  end
135
180
  end
136
181
 
137
182
  describe "#get" do
138
183
  it "should be able to get html" do
139
184
  stub_http_response_with('google.html')
140
- HTTParty.get('http://www.google.com').should == file_fixture('google.html')
185
+ resp = HTTParty.get('http://www.google.com')
186
+ resp.should == file_fixture('google.html')
187
+ resp.body.should == file_fixture('google.html')
141
188
  end
142
189
 
143
190
  it "should be able parse response type json automatically" do
@@ -155,6 +202,7 @@ describe HTTParty do
155
202
  "location" => "Opera Plaza, California",
156
203
  "profile_image_url" => "http://static.twitter.com/images/default_profile_normal.png"
157
204
  }
205
+ tweets.body.should == file_fixture('twitter.json')
158
206
  end
159
207
 
160
208
  it "should be able parse response type xml automatically" do
@@ -172,6 +220,19 @@ describe HTTParty do
172
220
  "profile_image_url" => "http://s3.amazonaws.com/twitter_production/profile_images/65565851/8ball_large_normal.jpg",
173
221
  "location" => nil
174
222
  }
223
+ tweets.body.should == file_fixture('twitter.xml')
224
+ end
225
+
226
+ it "should not get undefined method add_node for nil class for the following xml" do
227
+ stub_http_response_with('undefined_method_add_node_for_nil.xml')
228
+ result = HTTParty.get('http://foobar.com')
229
+ result.should == {"Entities"=>{"href"=>"https://s3-sandbox.parature.com/api/v1/5578/5633/Account", "results"=>"0", "total"=>"0", "page_size"=>"25", "page"=>"1"}}
230
+ end
231
+
232
+ it "should parse empty response fine" do
233
+ stub_http_response_with('empty.xml')
234
+ result = HTTParty.get('http://foobar.com')
235
+ result.should == nil
175
236
  end
176
237
  end
177
238
  end