rest-client 1.8.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +2 -0
  3. data/.mailmap +10 -0
  4. data/.rspec +2 -1
  5. data/.rubocop +2 -0
  6. data/.rubocop-disables.yml +386 -0
  7. data/.rubocop.yml +8 -0
  8. data/.travis.yml +56 -8
  9. data/AUTHORS +26 -1
  10. data/README.md +901 -0
  11. data/Rakefile +27 -3
  12. data/bin/restclient +3 -5
  13. data/history.md +181 -0
  14. data/lib/restclient/abstract_response.rb +172 -55
  15. data/lib/restclient/exceptions.rb +96 -55
  16. data/lib/restclient/params_array.rb +72 -0
  17. data/lib/restclient/payload.rb +70 -74
  18. data/lib/restclient/platform.rb +19 -0
  19. data/lib/restclient/raw_response.rb +21 -7
  20. data/lib/restclient/request.rb +540 -281
  21. data/lib/restclient/resource.rb +19 -9
  22. data/lib/restclient/response.rb +75 -6
  23. data/lib/restclient/utils.rb +274 -0
  24. data/lib/restclient/version.rb +2 -1
  25. data/lib/restclient.rb +21 -3
  26. data/rest-client.gemspec +12 -10
  27. data/spec/ISS.jpg +0 -0
  28. data/spec/helpers.rb +54 -0
  29. data/spec/integration/_lib.rb +1 -0
  30. data/spec/integration/capath_digicert/3513523f.0 +22 -0
  31. data/spec/integration/capath_digicert/399e7759.0 +22 -0
  32. data/spec/integration/capath_digicert/digicert.crt +20 -17
  33. data/spec/integration/certs/digicert.crt +20 -17
  34. data/spec/integration/httpbin_spec.rb +128 -0
  35. data/spec/integration/integration_spec.rb +97 -14
  36. data/spec/integration/request_spec.rb +25 -2
  37. data/spec/spec_helper.rb +28 -1
  38. data/spec/unit/_lib.rb +1 -0
  39. data/spec/unit/abstract_response_spec.rb +95 -38
  40. data/spec/unit/exceptions_spec.rb +41 -28
  41. data/spec/unit/params_array_spec.rb +36 -0
  42. data/spec/unit/payload_spec.rb +118 -68
  43. data/spec/unit/raw_response_spec.rb +10 -6
  44. data/spec/unit/request2_spec.rb +34 -12
  45. data/spec/unit/request_spec.rb +745 -424
  46. data/spec/unit/resource_spec.rb +31 -27
  47. data/spec/unit/response_spec.rb +134 -57
  48. data/spec/unit/restclient_spec.rb +16 -15
  49. data/spec/unit/utils_spec.rb +147 -0
  50. data/spec/unit/windows/root_certs_spec.rb +3 -3
  51. metadata +79 -29
  52. data/README.rdoc +0 -324
  53. data/spec/integration/capath_digicert/244b5494.0 +0 -19
  54. data/spec/integration/capath_digicert/81b9768f.0 +0 -19
  55. data/spec/unit/master_shake.jpg +0 -0
@@ -1,32 +1,32 @@
1
- require 'spec_helper'
1
+ require_relative '_lib'
2
2
 
3
3
  describe RestClient::Exception do
4
4
  it "returns a 'message' equal to the class name if the message is not set, because 'message' should not be nil" do
5
5
  e = RestClient::Exception.new
6
- e.message.should eq "RestClient::Exception"
6
+ expect(e.message).to eq "RestClient::Exception"
7
7
  end
8
8
 
9
9
  it "returns the 'message' that was set" do
10
10
  e = RestClient::Exception.new
11
11
  message = "An explicitly set message"
12
12
  e.message = message
13
- e.message.should eq message
13
+ expect(e.message).to eq message
14
14
  end
15
15
 
16
16
  it "sets the exception message to ErrorMessage" do
17
- RestClient::ResourceNotFound.new.message.should eq 'Resource Not Found'
17
+ expect(RestClient::ResourceNotFound.new.message).to eq 'Not Found'
18
18
  end
19
19
 
20
20
  it "contains exceptions in RestClient" do
21
- RestClient::Unauthorized.new.should be_a_kind_of(RestClient::Exception)
22
- RestClient::ServerBrokeConnection.new.should be_a_kind_of(RestClient::Exception)
21
+ expect(RestClient::Unauthorized.new).to be_a_kind_of(RestClient::Exception)
22
+ expect(RestClient::ServerBrokeConnection.new).to be_a_kind_of(RestClient::Exception)
23
23
  end
24
24
  end
25
25
 
26
26
  describe RestClient::ServerBrokeConnection do
27
27
  it "should have a default message of 'Server broke connection'" do
28
28
  e = RestClient::ServerBrokeConnection.new
29
- e.message.should eq 'Server broke connection'
29
+ expect(e.message).to eq 'Server broke connection'
30
30
  end
31
31
  end
32
32
 
@@ -40,21 +40,21 @@ describe RestClient::RequestFailed do
40
40
  begin
41
41
  raise RestClient::RequestFailed, response
42
42
  rescue RestClient::RequestFailed => e
43
- e.response.should eq response
43
+ expect(e.response).to eq response
44
44
  end
45
45
  end
46
46
 
47
47
  it "http_code convenience method for fetching the code as an integer" do
48
- RestClient::RequestFailed.new(@response).http_code.should eq 502
48
+ expect(RestClient::RequestFailed.new(@response).http_code).to eq 502
49
49
  end
50
50
 
51
51
  it "http_body convenience method for fetching the body (decoding when necessary)" do
52
- RestClient::RequestFailed.new(@response).http_code.should eq 502
53
- RestClient::RequestFailed.new(@response).message.should eq 'HTTP status code 502'
52
+ expect(RestClient::RequestFailed.new(@response).http_code).to eq 502
53
+ expect(RestClient::RequestFailed.new(@response).message).to eq 'HTTP status code 502'
54
54
  end
55
55
 
56
56
  it "shows the status code in the message" do
57
- RestClient::RequestFailed.new(@response).to_s.should match(/502/)
57
+ expect(RestClient::RequestFailed.new(@response).to_s).to match(/502/)
58
58
  end
59
59
  end
60
60
 
@@ -64,32 +64,45 @@ describe RestClient::ResourceNotFound do
64
64
  begin
65
65
  raise RestClient::ResourceNotFound, response
66
66
  rescue RestClient::ResourceNotFound => e
67
- e.response.should eq response
67
+ expect(e.response).to eq response
68
+ end
69
+ end
70
+
71
+ it 'stores the body on the response of the exception' do
72
+ body = "body"
73
+ stub_request(:get, "www.example.com").to_return(:body => body, :status => 404)
74
+ begin
75
+ RestClient.get "www.example.com"
76
+ raise
77
+ rescue RestClient::ResourceNotFound => e
78
+ expect(e.response.body).to eq body
68
79
  end
69
80
  end
70
81
  end
71
82
 
72
83
  describe "backwards compatibility" do
73
- it "alias RestClient::Request::Redirect to RestClient::Redirect" do
74
- RestClient::Request::Redirect.should eq RestClient::Redirect
84
+ it 'aliases RestClient::NotFound as ResourceNotFound' do
85
+ expect(RestClient::ResourceNotFound).to eq RestClient::NotFound
75
86
  end
76
87
 
77
- it "alias RestClient::Request::Unauthorized to RestClient::Unauthorized" do
78
- RestClient::Request::Unauthorized.should eq RestClient::Unauthorized
88
+ it 'aliases old names for HTTP 413, 414, 416' do
89
+ expect(RestClient::RequestEntityTooLarge).to eq RestClient::PayloadTooLarge
90
+ expect(RestClient::RequestURITooLong).to eq RestClient::URITooLong
91
+ expect(RestClient::RequestedRangeNotSatisfiable).to eq RestClient::RangeNotSatisfiable
79
92
  end
80
93
 
81
- it "alias RestClient::Request::RequestFailed to RestClient::RequestFailed" do
82
- RestClient::Request::RequestFailed.should eq RestClient::RequestFailed
94
+ it 'subclasses NotFound from RequestFailed, ExceptionWithResponse' do
95
+ expect(RestClient::NotFound).to be < RestClient::RequestFailed
96
+ expect(RestClient::NotFound).to be < RestClient::ExceptionWithResponse
83
97
  end
84
98
 
85
- it "make the exception's response act like an Net::HTTPResponse" do
86
- body = "body"
87
- stub_request(:get, "www.example.com").to_return(:body => body, :status => 404)
88
- begin
89
- RestClient.get "www.example.com"
90
- raise
91
- rescue RestClient::ResourceNotFound => e
92
- e.response.body.should eq body
93
- end
99
+ it 'subclasses timeout from RestClient::RequestTimeout, RequestFailed, EWR' do
100
+ expect(RestClient::Exceptions::OpenTimeout).to be < RestClient::Exceptions::Timeout
101
+ expect(RestClient::Exceptions::ReadTimeout).to be < RestClient::Exceptions::Timeout
102
+
103
+ expect(RestClient::Exceptions::Timeout).to be < RestClient::RequestTimeout
104
+ expect(RestClient::Exceptions::Timeout).to be < RestClient::RequestFailed
105
+ expect(RestClient::Exceptions::Timeout).to be < RestClient::ExceptionWithResponse
94
106
  end
107
+
95
108
  end
@@ -0,0 +1,36 @@
1
+ require_relative '_lib'
2
+
3
+ describe RestClient::ParamsArray do
4
+
5
+ describe '.new' do
6
+ it 'accepts various types of containers' do
7
+ as_array = [[:foo, 123], [:foo, 456], [:bar, 789], [:empty, nil]]
8
+ [
9
+ [[:foo, 123], [:foo, 456], [:bar, 789], [:empty, nil]],
10
+ [{foo: 123}, {foo: 456}, {bar: 789}, {empty: nil}],
11
+ [{foo: 123}, {foo: 456}, {bar: 789}, {empty: nil}],
12
+ [{foo: 123}, [:foo, 456], {bar: 789}, {empty: nil}],
13
+ [{foo: 123}, [:foo, 456], {bar: 789}, [:empty]],
14
+ ].each do |input|
15
+ expect(RestClient::ParamsArray.new(input).to_a).to eq as_array
16
+ end
17
+
18
+ expect(RestClient::ParamsArray.new([]).to_a).to eq []
19
+ expect(RestClient::ParamsArray.new([]).empty?).to eq true
20
+ end
21
+
22
+ it 'rejects various invalid input' do
23
+ expect {
24
+ RestClient::ParamsArray.new([[]])
25
+ }.to raise_error(IndexError)
26
+
27
+ expect {
28
+ RestClient::ParamsArray.new([[1,2,3]])
29
+ }.to raise_error(ArgumentError)
30
+
31
+ expect {
32
+ RestClient::ParamsArray.new([1,2,3])
33
+ }.to raise_error(NoMethodError)
34
+ end
35
+ end
36
+ end
@@ -1,60 +1,68 @@
1
1
  # encoding: binary
2
2
 
3
- require 'spec_helper'
3
+ require_relative '_lib'
4
+
5
+ describe RestClient::Payload, :include_helpers do
6
+ context "Base Payload" do
7
+ it "should reset stream after to_s" do
8
+ payload = RestClient::Payload::Base.new('foobar')
9
+ expect(payload.to_s).to eq 'foobar'
10
+ expect(payload.to_s).to eq 'foobar'
11
+ end
12
+ end
4
13
 
5
- describe RestClient::Payload do
6
14
  context "A regular Payload" do
7
15
  it "should use standard enctype as default content-type" do
8
- RestClient::Payload::UrlEncoded.new({}).headers['Content-Type'].
9
- should eq 'application/x-www-form-urlencoded'
16
+ expect(RestClient::Payload::UrlEncoded.new({}).headers['Content-Type']).
17
+ to eq 'application/x-www-form-urlencoded'
10
18
  end
11
19
 
12
20
  it "should form properly encoded params" do
13
- RestClient::Payload::UrlEncoded.new({:foo => 'bar'}).to_s.
14
- should eq "foo=bar"
15
- ["foo=bar&baz=qux", "baz=qux&foo=bar"].should include(
21
+ expect(RestClient::Payload::UrlEncoded.new({:foo => 'bar'}).to_s).
22
+ to eq "foo=bar"
23
+ expect(["foo=bar&baz=qux", "baz=qux&foo=bar"]).to include(
16
24
  RestClient::Payload::UrlEncoded.new({:foo => 'bar', :baz => 'qux'}).to_s)
17
25
  end
18
26
 
19
27
  it "should escape parameters" do
20
- RestClient::Payload::UrlEncoded.new({'foo ' => 'bar'}).to_s.
21
- should eq "foo%20=bar"
28
+ expect(RestClient::Payload::UrlEncoded.new({'foo + bar' => 'baz'}).to_s).
29
+ to eq "foo+%2B+bar=baz"
22
30
  end
23
31
 
24
32
  it "should properly handle hashes as parameter" do
25
- RestClient::Payload::UrlEncoded.new({:foo => {:bar => 'baz'}}).to_s.
26
- should eq "foo[bar]=baz"
27
- RestClient::Payload::UrlEncoded.new({:foo => {:bar => {:baz => 'qux'}}}).to_s.
28
- should eq "foo[bar][baz]=qux"
33
+ expect(RestClient::Payload::UrlEncoded.new({:foo => {:bar => 'baz'}}).to_s).
34
+ to eq "foo[bar]=baz"
35
+ expect(RestClient::Payload::UrlEncoded.new({:foo => {:bar => {:baz => 'qux'}}}).to_s).
36
+ to eq "foo[bar][baz]=qux"
29
37
  end
30
38
 
31
39
  it "should handle many attributes inside a hash" do
32
40
  parameters = RestClient::Payload::UrlEncoded.new({:foo => {:bar => 'baz', :baz => 'qux'}}).to_s
33
- parameters.should include("foo[bar]=baz", "foo[baz]=qux")
41
+ expect(parameters).to eq 'foo[bar]=baz&foo[baz]=qux'
34
42
  end
35
43
 
36
- it "should handle attributes inside a an array inside an hash" do
44
+ it "should handle attributes inside an array inside an hash" do
37
45
  parameters = RestClient::Payload::UrlEncoded.new({"foo" => [{"bar" => 'baz'}, {"bar" => 'qux'}]}).to_s
38
- parameters.should include("foo[bar]=baz", "foo[bar]=qux")
46
+ expect(parameters).to eq 'foo[][bar]=baz&foo[][bar]=qux'
39
47
  end
40
48
 
41
- it "should handle attributes inside a an array inside an array inside an hash" do
42
- parameters = RestClient::Payload::UrlEncoded.new({"foo" => [[{"bar" => 'baz'}, {"bar" => 'qux'}]]}).to_s
43
- parameters.should include("foo[bar]=baz", "foo[bar]=qux")
49
+ it "should handle arrays inside a hash inside a hash" do
50
+ parameters = RestClient::Payload::UrlEncoded.new({"foo" => {'even' => [0, 2], 'odd' => [1, 3]}}).to_s
51
+ expect(parameters).to eq 'foo[even][]=0&foo[even][]=2&foo[odd][]=1&foo[odd][]=3'
44
52
  end
45
53
 
46
54
  it "should form properly use symbols as parameters" do
47
- RestClient::Payload::UrlEncoded.new({:foo => :bar}).to_s.
48
- should eq "foo=bar"
49
- RestClient::Payload::UrlEncoded.new({:foo => {:bar => :baz}}).to_s.
50
- should eq "foo[bar]=baz"
55
+ expect(RestClient::Payload::UrlEncoded.new({:foo => :bar}).to_s).
56
+ to eq "foo=bar"
57
+ expect(RestClient::Payload::UrlEncoded.new({:foo => {:bar => :baz}}).to_s).
58
+ to eq "foo[bar]=baz"
51
59
  end
52
60
 
53
61
  it "should properly handle arrays as repeated parameters" do
54
- RestClient::Payload::UrlEncoded.new({:foo => ['bar']}).to_s.
55
- should eq "foo[]=bar"
56
- RestClient::Payload::UrlEncoded.new({:foo => ['bar', 'baz']}).to_s.
57
- should eq "foo[]=bar&foo[]=baz"
62
+ expect(RestClient::Payload::UrlEncoded.new({:foo => ['bar']}).to_s).
63
+ to eq "foo[]=bar"
64
+ expect(RestClient::Payload::UrlEncoded.new({:foo => ['bar', 'baz']}).to_s).
65
+ to eq "foo[]=bar&foo[]=baz"
58
66
  end
59
67
 
60
68
  it 'should not close if stream already closed' do
@@ -67,18 +75,18 @@ describe RestClient::Payload do
67
75
  context "A multipart Payload" do
68
76
  it "should use standard enctype as default content-type" do
69
77
  m = RestClient::Payload::Multipart.new({})
70
- m.stub(:boundary).and_return(123)
71
- m.headers['Content-Type'].should eq 'multipart/form-data; boundary=123'
78
+ allow(m).to receive(:boundary).and_return(123)
79
+ expect(m.headers['Content-Type']).to eq 'multipart/form-data; boundary=123'
72
80
  end
73
81
 
74
82
  it 'should not error on close if stream already closed' do
75
- m = RestClient::Payload::Multipart.new(:file => File.new(File.join(File.dirname(File.expand_path(__FILE__)), 'master_shake.jpg')))
83
+ m = RestClient::Payload::Multipart.new(:file => File.new(test_image_path))
76
84
  3.times {m.close}
77
85
  end
78
86
 
79
87
  it "should form properly separated multipart data" do
80
88
  m = RestClient::Payload::Multipart.new([[:bar, "baz"], [:foo, "bar"]])
81
- m.to_s.should eq <<-EOS
89
+ expect(m.to_s).to eq <<-EOS
82
90
  --#{m.boundary}\r
83
91
  Content-Disposition: form-data; name="bar"\r
84
92
  \r
@@ -93,7 +101,7 @@ bar\r
93
101
 
94
102
  it "should not escape parameters names" do
95
103
  m = RestClient::Payload::Multipart.new([["bar ", "baz"]])
96
- m.to_s.should eq <<-EOS
104
+ expect(m.to_s).to eq <<-EOS
97
105
  --#{m.boundary}\r
98
106
  Content-Disposition: form-data; name="bar "\r
99
107
  \r
@@ -103,11 +111,11 @@ baz\r
103
111
  end
104
112
 
105
113
  it "should form properly separated multipart data" do
106
- f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
114
+ f = File.new(test_image_path)
107
115
  m = RestClient::Payload::Multipart.new({:foo => f})
108
- m.to_s.should eq <<-EOS
116
+ expect(m.to_s).to eq <<-EOS
109
117
  --#{m.boundary}\r
110
- Content-Disposition: form-data; name="foo"; filename="master_shake.jpg"\r
118
+ Content-Disposition: form-data; name="foo"; filename="ISS.jpg"\r
111
119
  Content-Type: image/jpeg\r
112
120
  \r
113
121
  #{File.open(f.path, 'rb'){|bin| bin.read}}\r
@@ -116,11 +124,11 @@ Content-Type: image/jpeg\r
116
124
  end
117
125
 
118
126
  it "should ignore the name attribute when it's not set" do
119
- f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
127
+ f = File.new(test_image_path)
120
128
  m = RestClient::Payload::Multipart.new({nil => f})
121
- m.to_s.should eq <<-EOS
129
+ expect(m.to_s).to eq <<-EOS
122
130
  --#{m.boundary}\r
123
- Content-Disposition: form-data; filename="master_shake.jpg"\r
131
+ Content-Disposition: form-data; filename="ISS.jpg"\r
124
132
  Content-Type: image/jpeg\r
125
133
  \r
126
134
  #{File.open(f.path, 'rb'){|bin| bin.read}}\r
@@ -129,11 +137,11 @@ Content-Type: image/jpeg\r
129
137
  end
130
138
 
131
139
  it "should detect optional (original) content type and filename" do
132
- f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
133
- f.instance_eval "def content_type; 'text/plain'; end"
134
- f.instance_eval "def original_filename; 'foo.txt'; end"
140
+ f = File.new(test_image_path)
141
+ expect(f).to receive(:content_type).and_return('text/plain')
142
+ expect(f).to receive(:original_filename).and_return('foo.txt')
135
143
  m = RestClient::Payload::Multipart.new({:foo => f})
136
- m.to_s.should eq <<-EOS
144
+ expect(m.to_s).to eq <<-EOS
137
145
  --#{m.boundary}\r
138
146
  Content-Disposition: form-data; name="foo"; filename="foo.txt"\r
139
147
  Content-Type: text/plain\r
@@ -145,7 +153,7 @@ Content-Type: text/plain\r
145
153
 
146
154
  it "should handle hash in hash parameters" do
147
155
  m = RestClient::Payload::Multipart.new({:bar => {:baz => "foo"}})
148
- m.to_s.should eq <<-EOS
156
+ expect(m.to_s).to eq <<-EOS
149
157
  --#{m.boundary}\r
150
158
  Content-Disposition: form-data; name="bar[baz]"\r
151
159
  \r
@@ -153,11 +161,11 @@ foo\r
153
161
  --#{m.boundary}--\r
154
162
  EOS
155
163
 
156
- f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
164
+ f = File.new(test_image_path)
157
165
  f.instance_eval "def content_type; 'text/plain'; end"
158
166
  f.instance_eval "def original_filename; 'foo.txt'; end"
159
167
  m = RestClient::Payload::Multipart.new({:foo => {:bar => f}})
160
- m.to_s.should eq <<-EOS
168
+ expect(m.to_s).to eq <<-EOS
161
169
  --#{m.boundary}\r
162
170
  Content-Disposition: form-data; name="foo[bar]"; filename="foo.txt"\r
163
171
  Content-Type: text/plain\r
@@ -167,79 +175,121 @@ Content-Type: text/plain\r
167
175
  EOS
168
176
  end
169
177
 
178
+ it 'should correctly format hex boundary' do
179
+ allow(SecureRandom).to receive(:base64).with(12).and_return('TGs89+ttw/xna6TV')
180
+ f = File.new(test_image_path)
181
+ m = RestClient::Payload::Multipart.new({:foo => f})
182
+ expect(m.boundary).to eq('-' * 4 + 'RubyFormBoundary' + 'TGs89AttwBxna6TV')
183
+ end
184
+
170
185
  end
171
186
 
172
187
  context "streamed payloads" do
173
188
  it "should properly determine the size of file payloads" do
174
- f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
189
+ f = File.new(test_image_path)
175
190
  payload = RestClient::Payload.generate(f)
176
- payload.size.should eq 76_988
177
- payload.length.should eq 76_988
191
+ expect(payload.size).to eq 72_463
192
+ expect(payload.length).to eq 72_463
178
193
  end
179
194
 
180
195
  it "should properly determine the size of other kinds of streaming payloads" do
181
196
  s = StringIO.new 'foo'
182
197
  payload = RestClient::Payload.generate(s)
183
- payload.size.should eq 3
184
- payload.length.should eq 3
198
+ expect(payload.size).to eq 3
199
+ expect(payload.length).to eq 3
185
200
 
186
201
  begin
187
202
  f = Tempfile.new "rest-client"
188
203
  f.write 'foo bar'
189
204
 
190
205
  payload = RestClient::Payload.generate(f)
191
- payload.size.should eq 7
192
- payload.length.should eq 7
206
+ expect(payload.size).to eq 7
207
+ expect(payload.length).to eq 7
193
208
  ensure
194
209
  f.close
195
210
  end
196
211
  end
212
+
213
+ it "should have a closed? method" do
214
+ f = File.new(test_image_path)
215
+ payload = RestClient::Payload.generate(f)
216
+ expect(payload.closed?).to be_falsey
217
+ payload.close
218
+ expect(payload.closed?).to be_truthy
219
+ end
197
220
  end
198
221
 
199
222
  context "Payload generation" do
200
223
  it "should recognize standard urlencoded params" do
201
- RestClient::Payload.generate({"foo" => 'bar'}).should be_kind_of(RestClient::Payload::UrlEncoded)
224
+ expect(RestClient::Payload.generate({"foo" => 'bar'})).to be_kind_of(RestClient::Payload::UrlEncoded)
202
225
  end
203
226
 
204
227
  it "should recognize multipart params" do
205
- f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
206
- RestClient::Payload.generate({"foo" => f}).should be_kind_of(RestClient::Payload::Multipart)
228
+ f = File.new(test_image_path)
229
+ expect(RestClient::Payload.generate({"foo" => f})).to be_kind_of(RestClient::Payload::Multipart)
207
230
  end
208
231
 
209
232
  it "should be multipart if forced" do
210
- RestClient::Payload.generate({"foo" => "bar", :multipart => true}).should be_kind_of(RestClient::Payload::Multipart)
233
+ expect(RestClient::Payload.generate({"foo" => "bar", :multipart => true})).to be_kind_of(RestClient::Payload::Multipart)
211
234
  end
212
235
 
236
+ it "should handle deeply nested multipart" do
237
+ f = File.new(test_image_path)
238
+ params = {foo: RestClient::ParamsArray.new({nested: f})}
239
+ expect(RestClient::Payload.generate(params)).to be_kind_of(RestClient::Payload::Multipart)
240
+ end
241
+
242
+
213
243
  it "should return data if no of the above" do
214
- RestClient::Payload.generate("data").should be_kind_of(RestClient::Payload::Base)
244
+ expect(RestClient::Payload.generate("data")).to be_kind_of(RestClient::Payload::Base)
215
245
  end
216
246
 
217
247
  it "should recognize nested multipart payloads in hashes" do
218
- f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
219
- RestClient::Payload.generate({"foo" => {"file" => f}}).should be_kind_of(RestClient::Payload::Multipart)
248
+ f = File.new(test_image_path)
249
+ expect(RestClient::Payload.generate({"foo" => {"file" => f}})).to be_kind_of(RestClient::Payload::Multipart)
220
250
  end
221
251
 
222
252
  it "should recognize nested multipart payloads in arrays" do
223
- f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
224
- RestClient::Payload.generate({"foo" => [f]}).should be_kind_of(RestClient::Payload::Multipart)
253
+ f = File.new(test_image_path)
254
+ expect(RestClient::Payload.generate({"foo" => [f]})).to be_kind_of(RestClient::Payload::Multipart)
225
255
  end
226
256
 
227
257
  it "should recognize file payloads that can be streamed" do
228
- f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
229
- RestClient::Payload.generate(f).should be_kind_of(RestClient::Payload::Streamed)
258
+ f = File.new(test_image_path)
259
+ expect(RestClient::Payload.generate(f)).to be_kind_of(RestClient::Payload::Streamed)
230
260
  end
231
261
 
232
262
  it "should recognize other payloads that can be streamed" do
233
- RestClient::Payload.generate(StringIO.new('foo')).should be_kind_of(RestClient::Payload::Streamed)
263
+ expect(RestClient::Payload.generate(StringIO.new('foo'))).to be_kind_of(RestClient::Payload::Streamed)
234
264
  end
235
265
 
236
266
  # hashery gem introduces Hash#read convenience method. Existence of #read method used to determine of content is streameable :/
237
267
  it "shouldn't treat hashes as streameable" do
238
- RestClient::Payload.generate({"foo" => 'bar'}).should be_kind_of(RestClient::Payload::UrlEncoded)
268
+ expect(RestClient::Payload.generate({"foo" => 'bar'})).to be_kind_of(RestClient::Payload::UrlEncoded)
269
+ end
270
+
271
+ it "should recognize multipart payload wrapped in ParamsArray" do
272
+ f = File.new(test_image_path)
273
+ params = RestClient::ParamsArray.new([[:image, f]])
274
+ expect(RestClient::Payload.generate(params)).to be_kind_of(RestClient::Payload::Multipart)
239
275
  end
240
- end
241
276
 
242
- class HashMapForTesting < Hash
243
- alias :read :[]
277
+ it "should handle non-multipart payload wrapped in ParamsArray" do
278
+ params = RestClient::ParamsArray.new([[:arg, 'value1'], [:arg, 'value2']])
279
+ expect(RestClient::Payload.generate(params)).to be_kind_of(RestClient::Payload::UrlEncoded)
280
+ end
281
+
282
+ it "should pass through Payload::Base and subclasses unchanged" do
283
+ payloads = [
284
+ RestClient::Payload::Base.new('foobar'),
285
+ RestClient::Payload::UrlEncoded.new({:foo => 'bar'}),
286
+ RestClient::Payload::Streamed.new(File.new(test_image_path)),
287
+ RestClient::Payload::Multipart.new({myfile: File.new(test_image_path)}),
288
+ ]
289
+
290
+ payloads.each do |payload|
291
+ expect(RestClient::Payload.generate(payload)).to equal(payload)
292
+ end
293
+ end
244
294
  end
245
295
  end
@@ -1,18 +1,22 @@
1
- require 'spec_helper'
1
+ require_relative '_lib'
2
2
 
3
3
  describe RestClient::RawResponse do
4
4
  before do
5
- @tf = double("Tempfile", :read => "the answer is 42", :open => true)
5
+ @tf = double("Tempfile", :read => "the answer is 42", :open => true, :rewind => true)
6
6
  @net_http_res = double('net http response')
7
- @request = double('http request')
8
- @response = RestClient::RawResponse.new(@tf, @net_http_res, {}, @request)
7
+ @request = double('restclient request', :redirection_history => nil)
8
+ @response = RestClient::RawResponse.new(@tf, @net_http_res, @request)
9
9
  end
10
10
 
11
11
  it "behaves like string" do
12
- @response.to_s.should eq 'the answer is 42'
12
+ expect(@response.to_s).to eq 'the answer is 42'
13
13
  end
14
14
 
15
15
  it "exposes a Tempfile" do
16
- @response.file.should eq @tf
16
+ expect(@response.file).to eq @tf
17
+ end
18
+
19
+ it "includes AbstractResponse" do
20
+ expect(RestClient::RawResponse.ancestors).to include(RestClient::AbstractResponse)
17
21
  end
18
22
  end
@@ -1,13 +1,35 @@
1
- require 'spec_helper'
1
+ require_relative '_lib'
2
2
 
3
- describe RestClient::Request do
3
+ describe RestClient::Request, :include_helpers do
4
4
 
5
- it "manage params for get requests" do
6
- stub_request(:get, 'http://some/resource?a=b&c=d').with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'Foo'=>'bar'}).to_return(:body => 'foo', :status => 200)
7
- RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => {:a => :b, 'c' => 'd'}}).body.should eq 'foo'
5
+ context 'params for GET requests' do
6
+ it "manage params for get requests" do
7
+ stub_request(:get, 'http://some/resource?a=b&c=d').with(:headers => {'Accept'=>'*/*', 'Foo'=>'bar'}).to_return(:body => 'foo', :status => 200)
8
+ expect(RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => {:a => :b, 'c' => 'd'}}).body).to eq 'foo'
9
+
10
+ stub_request(:get, 'http://some/resource').with(:headers => {'Accept'=>'*/*', 'Foo'=>'bar'}).to_return(:body => 'foo', :status => 200)
11
+ expect(RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => :a}).body).to eq 'foo'
12
+ end
13
+
14
+ it 'adds GET params when params are present in URL' do
15
+ stub_request(:get, 'http://some/resource?a=b&c=d').with(:headers => {'Accept'=>'*/*', 'Foo'=>'bar'}).to_return(:body => 'foo', :status => 200)
16
+ expect(RestClient::Request.execute(:url => 'http://some/resource?a=b', :method => :get, :headers => {:foo => :bar, :params => {:c => 'd'}}).body).to eq 'foo'
17
+ end
18
+
19
+ it 'encodes nested GET params' do
20
+ stub_request(:get, 'http://some/resource?a[foo][]=1&a[foo][]=2&a[bar]&b=foo+bar&math=2+%2B+2+%3D%3D+4').with(:headers => {'Accept'=>'*/*',}).to_return(:body => 'foo', :status => 200)
21
+ expect(RestClient::Request.execute(url: 'http://some/resource', method: :get, headers: {
22
+ params: {
23
+ a: {
24
+ foo: [1,2],
25
+ bar: nil,
26
+ },
27
+ b: 'foo bar',
28
+ math: '2 + 2 == 4',
29
+ }
30
+ }).body).to eq 'foo'
31
+ end
8
32
 
9
- stub_request(:get, 'http://some/resource').with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'Foo'=>'bar', 'params' => 'a'}).to_return(:body => 'foo', :status => 200)
10
- RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => :a}).body.should eq 'foo'
11
33
  end
12
34
 
13
35
  it "can use a block to process response" do
@@ -15,18 +37,18 @@ describe RestClient::Request do
15
37
  block = proc do |http_response|
16
38
  response_value = http_response.body
17
39
  end
18
- stub_request(:get, 'http://some/resource?a=b&c=d').with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'Foo'=>'bar'}).to_return(:body => 'foo', :status => 200)
40
+ stub_request(:get, 'http://some/resource?a=b&c=d').with(:headers => {'Accept'=>'*/*', 'Foo'=>'bar'}).to_return(:body => 'foo', :status => 200)
19
41
  RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => {:a => :b, 'c' => 'd'}}, :block_response => block)
20
- response_value.should eq "foo"
42
+ expect(response_value).to eq "foo"
21
43
  end
22
44
 
23
45
  it 'closes payload if not nil' do
24
- test_file = File.new(File.join( File.dirname(File.expand_path(__FILE__)), 'master_shake.jpg'))
46
+ test_file = File.new(test_image_path)
25
47
 
26
- stub_request(:post, 'http://some/resource').with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate'}).to_return(:body => 'foo', :status => 200)
48
+ stub_request(:post, 'http://some/resource').with(:headers => {'Accept'=>'*/*'}).to_return(:body => 'foo', :status => 200)
27
49
  RestClient::Request.execute(:url => 'http://some/resource', :method => :post, :payload => {:file => test_file})
28
50
 
29
- test_file.closed?.should be_true
51
+ expect(test_file.closed?).to be true
30
52
  end
31
53
 
32
54
  end