larsburgess-rest-client 1.6.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.
@@ -0,0 +1,17 @@
1
+ require File.join( File.dirname(File.expand_path(__FILE__)), 'base')
2
+
3
+ describe RestClient::RawResponse do
4
+ before do
5
+ @tf = mock("Tempfile", :read => "the answer is 42", :open => true)
6
+ @net_http_res = mock('net http response')
7
+ @response = RestClient::RawResponse.new(@tf, @net_http_res, {})
8
+ end
9
+
10
+ it "behaves like string" do
11
+ @response.to_s.should == 'the answer is 42'
12
+ end
13
+
14
+ it "exposes a Tempfile" do
15
+ @response.file.should == @tf
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ require File.join( File.dirname(File.expand_path(__FILE__)), 'base')
2
+
3
+ require 'webmock/rspec'
4
+ include WebMock
5
+
6
+ describe RestClient::Request do
7
+
8
+ it "manage params for get requests" do
9
+ 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)
10
+ RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => {:a => :b, 'c' => 'd'}}).body.should == 'foo'
11
+
12
+ 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)
13
+ RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => :a}).body.should == 'foo'
14
+ end
15
+
16
+ end
17
+
@@ -0,0 +1,535 @@
1
+ require File.join( File.dirname(File.expand_path(__FILE__)), 'base')
2
+
3
+ require 'webmock/rspec'
4
+ include WebMock
5
+
6
+ describe RestClient::Request do
7
+ before do
8
+ @request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload')
9
+
10
+ @uri = mock("uri")
11
+ @uri.stub!(:request_uri).and_return('/resource')
12
+ @uri.stub!(:host).and_return('some')
13
+ @uri.stub!(:port).and_return(80)
14
+
15
+ @net = mock("net::http base")
16
+ @http = mock("net::http connection")
17
+ Net::HTTP.stub!(:new).and_return(@net)
18
+ @net.stub!(:start).and_yield(@http)
19
+ @net.stub!(:use_ssl=)
20
+ @net.stub!(:verify_mode=)
21
+ RestClient.log = nil
22
+ end
23
+
24
+ it "accept */* mimetype, preferring xml" do
25
+ @request.default_headers[:accept].should == '*/*; q=0.5, application/xml'
26
+ end
27
+
28
+ describe "compression" do
29
+
30
+ it "decodes an uncompressed result body by passing it straight through" do
31
+ RestClient::Request.decode(nil, 'xyz').should == 'xyz'
32
+ end
33
+
34
+ it "doesn't fail for nil bodies" do
35
+ RestClient::Request.decode('gzip', nil).should be_nil
36
+ end
37
+
38
+
39
+ it "decodes a gzip body" do
40
+ RestClient::Request.decode('gzip', "\037\213\b\b\006'\252H\000\003t\000\313T\317UH\257\312,HM\341\002\000G\242(\r\v\000\000\000").should == "i'm gziped\n"
41
+ end
42
+
43
+ it "ingores gzip for empty bodies" do
44
+ RestClient::Request.decode('gzip', '').should be_empty
45
+ end
46
+
47
+ it "decodes a deflated body" do
48
+ RestClient::Request.decode('deflate', "x\234+\316\317MUHIM\313I,IMQ(I\255(\001\000A\223\006\363").should == "some deflated text"
49
+ end
50
+ end
51
+
52
+ it "processes a successful result" do
53
+ res = mock("result")
54
+ res.stub!(:code).and_return("200")
55
+ res.stub!(:body).and_return('body')
56
+ res.stub!(:[]).with('content-encoding').and_return(nil)
57
+ @request.process_result(res).body.should == 'body'
58
+ @request.process_result(res).to_s.should == 'body'
59
+ end
60
+
61
+ it "doesn't classify successful requests as failed" do
62
+ 203.upto(207) do |code|
63
+ res = mock("result")
64
+ res.stub!(:code).and_return(code.to_s)
65
+ res.stub!(:body).and_return("")
66
+ res.stub!(:[]).with('content-encoding').and_return(nil)
67
+ @request.process_result(res).should be_empty
68
+ end
69
+ end
70
+
71
+ it "parses a url into a URI object" do
72
+ URI.should_receive(:parse).with('http://example.com/resource')
73
+ @request.parse_url('http://example.com/resource')
74
+ end
75
+
76
+ it "adds http:// to the front of resources specified in the syntax example.com/resource" do
77
+ URI.should_receive(:parse).with('http://example.com/resource')
78
+ @request.parse_url('example.com/resource')
79
+ end
80
+
81
+ describe "user - password" do
82
+ it "extracts the username and password when parsing http://user:password@example.com/" do
83
+ URI.stub!(:parse).and_return(mock('uri', :user => 'joe', :password => 'pass1'))
84
+ @request.parse_url_with_auth('http://joe:pass1@example.com/resource')
85
+ @request.user.should == 'joe'
86
+ @request.password.should == 'pass1'
87
+ end
88
+
89
+ it "extracts with escaping the username and password when parsing http://user:password@example.com/" do
90
+ URI.stub!(:parse).and_return(mock('uri', :user => 'joe%20', :password => 'pass1'))
91
+ @request.parse_url_with_auth('http://joe%20:pass1@example.com/resource')
92
+ @request.user.should == 'joe '
93
+ @request.password.should == 'pass1'
94
+ end
95
+
96
+ it "doesn't overwrite user and password (which may have already been set by the Resource constructor) if there is no user/password in the url" do
97
+ URI.stub!(:parse).and_return(mock('uri', :user => nil, :password => nil))
98
+ @request = RestClient::Request.new(:method => 'get', :url => 'example.com', :user => 'beth', :password => 'pass2')
99
+ @request.parse_url_with_auth('http://example.com/resource')
100
+ @request.user.should == 'beth'
101
+ @request.password.should == 'pass2'
102
+ end
103
+ end
104
+
105
+ it "correctly formats cookies provided to the constructor" do
106
+ URI.stub!(:parse).and_return(mock('uri', :user => nil, :password => nil))
107
+ @request = RestClient::Request.new(:method => 'get', :url => 'example.com', :cookies => {:session_id => '1', :user_id => "someone" })
108
+ @request.should_receive(:default_headers).and_return({'Foo' => 'bar'})
109
+ @request.make_headers({}).should == { 'Foo' => 'bar', 'Cookie' => 'session_id=1;user_id=someone'}
110
+ end
111
+
112
+ it "correctly escapes cookies" do
113
+ @request = RestClient::Request.new(:method => 'get', :url => 'example.com', :cookies => {:session_id => 'BAh7BzoKbG9naW4iDXJob2FkbWluOg1hcHBfbmFtZSIQYXBwbGljYXRpb24%3D%0A--03793957abf47f143eb6075703cf5649d58edfb3' })
114
+ @request.should_receive(:default_headers).and_return({'Foo' => 'bar'})
115
+ @request.make_headers({}).should == { 'Foo' => 'bar', 'Cookie' => 'session_id=BAh7BzoKbG9naW4iDXJob2FkbWluOg1hcHBfbmFtZSIQYXBwbGljYXRpb24%253D%250A--03793957abf47f143eb6075703cf5649d58edfb3'}
116
+ end
117
+
118
+ it "determines the Net::HTTP class to instantiate by the method name" do
119
+ @request.net_http_request_class(:put).should == Net::HTTP::Put
120
+ end
121
+
122
+ describe "user headers" do
123
+ it "merges user headers with the default headers" do
124
+ @request.should_receive(:default_headers).and_return({ :accept => '*/*; q=0.5, application/xml', :accept_encoding => 'gzip, deflate' })
125
+ headers = @request.make_headers("Accept" => "application/json", :accept_encoding => 'gzip')
126
+ headers.should have_key "Accept-Encoding"
127
+ headers["Accept-Encoding"].should == "gzip"
128
+ headers.should have_key "Accept"
129
+ headers["Accept"].should == "application/json"
130
+ end
131
+
132
+ it "prefers the user header when the same header exists in the defaults" do
133
+ @request.should_receive(:default_headers).and_return({ '1' => '2' })
134
+ headers = @request.make_headers('1' => '3')
135
+ headers.should have_key('1')
136
+ headers['1'].should == '3'
137
+ end
138
+ end
139
+
140
+ describe "header symbols" do
141
+
142
+ it "converts header symbols from :content_type to 'Content-Type'" do
143
+ @request.should_receive(:default_headers).and_return({})
144
+ headers = @request.make_headers(:content_type => 'abc')
145
+ headers.should have_key('Content-Type')
146
+ headers['Content-Type'].should == 'abc'
147
+ end
148
+
149
+ it "converts content-type from extension to real content-type" do
150
+ @request.should_receive(:default_headers).and_return({})
151
+ headers = @request.make_headers(:content_type => 'json')
152
+ headers.should have_key('Content-Type')
153
+ headers['Content-Type'].should == 'application/json'
154
+ end
155
+
156
+ it "converts accept from extension(s) to real content-type(s)" do
157
+ @request.should_receive(:default_headers).and_return({})
158
+ headers = @request.make_headers(:accept => 'json, mp3')
159
+ headers.should have_key('Accept')
160
+ headers['Accept'].should == 'application/json, audio/mpeg'
161
+
162
+ @request.should_receive(:default_headers).and_return({})
163
+ headers = @request.make_headers(:accept => :json)
164
+ headers.should have_key('Accept')
165
+ headers['Accept'].should == 'application/json'
166
+ end
167
+
168
+ it "only convert symbols in header" do
169
+ @request.should_receive(:default_headers).and_return({})
170
+ headers = @request.make_headers({:foo_bar => 'value', "bar_bar" => 'value'})
171
+ headers['Foo-Bar'].should == 'value'
172
+ headers['bar_bar'].should == 'value'
173
+ end
174
+
175
+ it "converts header values to strings" do
176
+ @request.make_headers('A' => 1)['A'].should == '1'
177
+ end
178
+ end
179
+
180
+ it "executes by constructing the Net::HTTP object, headers, and payload and calling transmit" do
181
+ @request.should_receive(:parse_url_with_auth).with('http://some/resource').and_return(@uri)
182
+ klass = mock("net:http class")
183
+ @request.should_receive(:net_http_request_class).with(:put).and_return(klass)
184
+ klass.should_receive(:new).and_return('result')
185
+ @request.should_receive(:transmit).with(@uri, 'result', kind_of(RestClient::Payload::Base))
186
+ @request.execute
187
+ end
188
+
189
+ it "transmits the request with Net::HTTP" do
190
+ @http.should_receive(:request).with('req', 'payload')
191
+ @request.should_receive(:process_result)
192
+ @request.transmit(@uri, 'req', 'payload')
193
+ end
194
+
195
+ describe "payload" do
196
+ it "sends nil payloads" do
197
+ @http.should_receive(:request).with('req', nil)
198
+ @request.should_receive(:process_result)
199
+ @request.stub!(:response_log)
200
+ @request.transmit(@uri, 'req', nil)
201
+ end
202
+
203
+ it "passes non-hash payloads straight through" do
204
+ @request.process_payload("x").should == "x"
205
+ end
206
+
207
+ it "converts a hash payload to urlencoded data" do
208
+ @request.process_payload(:a => 'b c+d').should == "a=b%20c%2Bd"
209
+ end
210
+
211
+ it "accepts nested hashes in payload" do
212
+ payload = @request.process_payload(:user => { :name => 'joe', :location => { :country => 'USA', :state => 'CA' }})
213
+ payload.should include('user[name]=joe')
214
+ payload.should include('user[location][country]=USA')
215
+ payload.should include('user[location][state]=CA')
216
+ end
217
+ end
218
+
219
+ it "set urlencoded content_type header on hash payloads" do
220
+ @request.process_payload(:a => 1)
221
+ @request.headers[:content_type].should == 'application/x-www-form-urlencoded'
222
+ end
223
+
224
+ describe "credentials" do
225
+ it "sets up the credentials prior to the request" do
226
+ @http.stub!(:request)
227
+ @request.stub!(:process_result)
228
+ @request.stub!(:response_log)
229
+
230
+ @request.stub!(:user).and_return('joe')
231
+ @request.stub!(:password).and_return('mypass')
232
+ @request.should_receive(:setup_credentials).with('req')
233
+
234
+ @request.transmit(@uri, 'req', nil)
235
+ end
236
+
237
+ it "does not attempt to send any credentials if user is nil" do
238
+ @request.stub!(:user).and_return(nil)
239
+ req = mock("request")
240
+ req.should_not_receive(:basic_auth)
241
+ @request.setup_credentials(req)
242
+ end
243
+
244
+ it "setup credentials when there's a user" do
245
+ @request.stub!(:user).and_return('joe')
246
+ @request.stub!(:password).and_return('mypass')
247
+ req = mock("request")
248
+ req.should_receive(:basic_auth).with('joe', 'mypass')
249
+ @request.setup_credentials(req)
250
+ end
251
+ end
252
+
253
+ it "catches EOFError and shows the more informative ServerBrokeConnection" do
254
+ @http.stub!(:request).and_raise(EOFError)
255
+ lambda { @request.transmit(@uri, 'req', nil) }.should raise_error(RestClient::ServerBrokeConnection)
256
+ end
257
+
258
+ it "class method execute wraps constructor" do
259
+ req = mock("rest request")
260
+ RestClient::Request.should_receive(:new).with(1 => 2).and_return(req)
261
+ req.should_receive(:execute)
262
+ RestClient::Request.execute(1 => 2)
263
+ end
264
+
265
+ describe "exception" do
266
+ it "raises Unauthorized when the response is 401" do
267
+ res = mock('response', :code => '401', :[] => ['content-encoding' => ''], :body => '' )
268
+ lambda { @request.process_result(res) }.should raise_error(RestClient::Unauthorized)
269
+ end
270
+
271
+ it "raises ResourceNotFound when the response is 404" do
272
+ res = mock('response', :code => '404', :[] => ['content-encoding' => ''], :body => '' )
273
+ lambda { @request.process_result(res) }.should raise_error(RestClient::ResourceNotFound)
274
+ end
275
+
276
+ it "raises RequestFailed otherwise" do
277
+ res = mock('response', :code => '500', :[] => ['content-encoding' => ''], :body => '' )
278
+ lambda { @request.process_result(res) }.should raise_error(RestClient::InternalServerError)
279
+ end
280
+ end
281
+
282
+ describe "block usage" do
283
+ it "returns what asked to" do
284
+ res = mock('response', :code => '401', :[] => ['content-encoding' => ''], :body => '' )
285
+ @request.process_result(res){|response, request| "foo"}.should == "foo"
286
+ end
287
+ end
288
+
289
+ describe "proxy" do
290
+ it "creates a proxy class if a proxy url is given" do
291
+ RestClient.stub!(:proxy).and_return("http://example.com/")
292
+ @request.net_http_class.should include(Net::HTTP::ProxyDelta)
293
+ end
294
+
295
+ it "creates a non-proxy class if a proxy url is not given" do
296
+ @request.net_http_class.should_not include(Net::HTTP::ProxyDelta)
297
+ end
298
+ end
299
+
300
+
301
+ describe "logging" do
302
+ it "logs a get request" do
303
+ log = RestClient.log = []
304
+ RestClient::Request.new(:method => :get, :url => 'http://url').log_request
305
+ log[0].should == %Q{RestClient.get "http://url", "Accept"=>"*/*; q=0.5, application/xml", "Accept-Encoding"=>"gzip, deflate"\n}
306
+ end
307
+
308
+ it "logs a post request with a small payload" do
309
+ log = RestClient.log = []
310
+ RestClient::Request.new(:method => :post, :url => 'http://url', :payload => 'foo').log_request
311
+ log[0].should == %Q{RestClient.post "http://url", "foo", "Accept"=>"*/*; q=0.5, application/xml", "Accept-Encoding"=>"gzip, deflate", "Content-Length"=>"3"\n}
312
+ end
313
+
314
+ it "logs a post request with a large payload" do
315
+ log = RestClient.log = []
316
+ RestClient::Request.new(:method => :post, :url => 'http://url', :payload => ('x' * 1000)).log_request
317
+ log[0].should == %Q{RestClient.post "http://url", 1000 byte(s) length, "Accept"=>"*/*; q=0.5, application/xml", "Accept-Encoding"=>"gzip, deflate", "Content-Length"=>"1000"\n}
318
+ end
319
+
320
+ it "logs input headers as a hash" do
321
+ log = RestClient.log = []
322
+ RestClient::Request.new(:method => :get, :url => 'http://url', :headers => { :accept => 'text/plain' }).log_request
323
+ log[0].should == %Q{RestClient.get "http://url", "Accept"=>"text/plain", "Accept-Encoding"=>"gzip, deflate"\n}
324
+ end
325
+
326
+ it "logs a response including the status code, content type, and result body size in bytes" do
327
+ log = RestClient.log = []
328
+ res = mock('result', :code => '200', :class => Net::HTTPOK, :body => 'abcd')
329
+ res.stub!(:[]).with('Content-type').and_return('text/html')
330
+ @request.log_response res
331
+ log[0].should == "# => 200 OK | text/html 4 bytes\n"
332
+ end
333
+
334
+ it "logs a response with a nil Content-type" do
335
+ log = RestClient.log = []
336
+ res = mock('result', :code => '200', :class => Net::HTTPOK, :body => 'abcd')
337
+ res.stub!(:[]).with('Content-type').and_return(nil)
338
+ @request.log_response res
339
+ log[0].should == "# => 200 OK | 4 bytes\n"
340
+ end
341
+
342
+ it "logs a response with a nil body" do
343
+ log = RestClient.log = []
344
+ res = mock('result', :code => '200', :class => Net::HTTPOK, :body => nil)
345
+ res.stub!(:[]).with('Content-type').and_return('text/html; charset=utf-8')
346
+ @request.log_response res
347
+ log[0].should == "# => 200 OK | text/html 0 bytes\n"
348
+ end
349
+ end
350
+
351
+ it "strips the charset from the response content type" do
352
+ log = RestClient.log = []
353
+ res = mock('result', :code => '200', :class => Net::HTTPOK, :body => 'abcd')
354
+ res.stub!(:[]).with('Content-type').and_return('text/html; charset=utf-8')
355
+ @request.log_response res
356
+ log[0].should == "# => 200 OK | text/html 4 bytes\n"
357
+ end
358
+
359
+ describe "timeout" do
360
+ it "set read_timeout" do
361
+ @request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :timeout => 123)
362
+ @http.stub!(:request)
363
+ @request.stub!(:process_result)
364
+ @request.stub!(:response_log)
365
+
366
+ @net.should_receive(:read_timeout=).with(123)
367
+
368
+ @request.transmit(@uri, 'req', nil)
369
+ end
370
+
371
+ it "set open_timeout" do
372
+ @request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :open_timeout => 123)
373
+ @http.stub!(:request)
374
+ @request.stub!(:process_result)
375
+ @request.stub!(:response_log)
376
+
377
+ @net.should_receive(:open_timeout=).with(123)
378
+
379
+ @request.transmit(@uri, 'req', nil)
380
+ end
381
+ end
382
+
383
+ describe "ssl" do
384
+ it "uses SSL when the URI refers to a https address" do
385
+ @uri.stub!(:is_a?).with(URI::HTTPS).and_return(true)
386
+ @net.should_receive(:use_ssl=).with(true)
387
+ @http.stub!(:request)
388
+ @request.stub!(:process_result)
389
+ @request.stub!(:response_log)
390
+ @request.transmit(@uri, 'req', 'payload')
391
+ end
392
+
393
+ it "should default to not verifying ssl certificates" do
394
+ @request.verify_ssl.should == false
395
+ end
396
+
397
+ it "should set net.verify_mode to OpenSSL::SSL::VERIFY_NONE if verify_ssl is false" do
398
+ @net.should_receive(:verify_mode=).with(OpenSSL::SSL::VERIFY_NONE)
399
+ @http.stub!(:request)
400
+ @request.stub!(:process_result)
401
+ @request.stub!(:response_log)
402
+ @request.transmit(@uri, 'req', 'payload')
403
+ end
404
+
405
+ it "should not set net.verify_mode to OpenSSL::SSL::VERIFY_NONE if verify_ssl is true" do
406
+ @request = RestClient::Request.new(:method => :put, :url => 'https://some/resource', :payload => 'payload', :verify_ssl => true)
407
+ @net.should_not_receive(:verify_mode=).with(OpenSSL::SSL::VERIFY_NONE)
408
+ @http.stub!(:request)
409
+ @request.stub!(:process_result)
410
+ @request.stub!(:response_log)
411
+ @request.transmit(@uri, 'req', 'payload')
412
+ end
413
+
414
+ it "should set net.verify_mode to the passed value if verify_ssl is an OpenSSL constant" do
415
+ mode = OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
416
+ @request = RestClient::Request.new( :method => :put,
417
+ :url => 'https://some/resource',
418
+ :payload => 'payload',
419
+ :verify_ssl => mode )
420
+ @net.should_receive(:verify_mode=).with(mode)
421
+ @net.should_receive(:verify_callback=)
422
+ @http.stub!(:request)
423
+ @request.stub!(:process_result)
424
+ @request.stub!(:response_log)
425
+ @request.transmit(@uri, 'req', 'payload')
426
+ end
427
+
428
+ it "should default to not having an ssl_client_cert" do
429
+ @request.ssl_client_cert.should be(nil)
430
+ end
431
+
432
+ it "should set the ssl_client_cert if provided" do
433
+ @request = RestClient::Request.new(
434
+ :method => :put,
435
+ :url => 'https://some/resource',
436
+ :payload => 'payload',
437
+ :ssl_client_cert => "whatsupdoc!"
438
+ )
439
+ @net.should_receive(:cert=).with("whatsupdoc!")
440
+ @http.stub!(:request)
441
+ @request.stub!(:process_result)
442
+ @request.stub!(:response_log)
443
+ @request.transmit(@uri, 'req', 'payload')
444
+ end
445
+
446
+ it "should not set the ssl_client_cert if it is not provided" do
447
+ @request = RestClient::Request.new(
448
+ :method => :put,
449
+ :url => 'https://some/resource',
450
+ :payload => 'payload'
451
+ )
452
+ @net.should_not_receive(:cert=).with("whatsupdoc!")
453
+ @http.stub!(:request)
454
+ @request.stub!(:process_result)
455
+ @request.stub!(:response_log)
456
+ @request.transmit(@uri, 'req', 'payload')
457
+ end
458
+
459
+ it "should default to not having an ssl_client_key" do
460
+ @request.ssl_client_key.should be(nil)
461
+ end
462
+
463
+ it "should set the ssl_client_key if provided" do
464
+ @request = RestClient::Request.new(
465
+ :method => :put,
466
+ :url => 'https://some/resource',
467
+ :payload => 'payload',
468
+ :ssl_client_key => "whatsupdoc!"
469
+ )
470
+ @net.should_receive(:key=).with("whatsupdoc!")
471
+ @http.stub!(:request)
472
+ @request.stub!(:process_result)
473
+ @request.stub!(:response_log)
474
+ @request.transmit(@uri, 'req', 'payload')
475
+ end
476
+
477
+ it "should not set the ssl_client_key if it is not provided" do
478
+ @request = RestClient::Request.new(
479
+ :method => :put,
480
+ :url => 'https://some/resource',
481
+ :payload => 'payload'
482
+ )
483
+ @net.should_not_receive(:key=).with("whatsupdoc!")
484
+ @http.stub!(:request)
485
+ @request.stub!(:process_result)
486
+ @request.stub!(:response_log)
487
+ @request.transmit(@uri, 'req', 'payload')
488
+ end
489
+
490
+ it "should default to not having an ssl_ca_file" do
491
+ @request.ssl_ca_file.should be(nil)
492
+ end
493
+
494
+ it "should set the ssl_ca_file if provided" do
495
+ @request = RestClient::Request.new(
496
+ :method => :put,
497
+ :url => 'https://some/resource',
498
+ :payload => 'payload',
499
+ :ssl_ca_file => "Certificate Authority File"
500
+ )
501
+ @net.should_receive(:ca_file=).with("Certificate Authority File")
502
+ @http.stub!(:request)
503
+ @request.stub!(:process_result)
504
+ @request.stub!(:response_log)
505
+ @request.transmit(@uri, 'req', 'payload')
506
+ end
507
+
508
+ it "should not set the ssl_ca_file if it is not provided" do
509
+ @request = RestClient::Request.new(
510
+ :method => :put,
511
+ :url => 'https://some/resource',
512
+ :payload => 'payload'
513
+ )
514
+ @net.should_not_receive(:ca_file=).with("Certificate Authority File")
515
+ @http.stub!(:request)
516
+ @request.stub!(:process_result)
517
+ @request.stub!(:response_log)
518
+ @request.transmit(@uri, 'req', 'payload')
519
+ end
520
+ end
521
+
522
+ it "should still return a response object for 204 No Content responses" do
523
+ @request = RestClient::Request.new(
524
+ :method => :put,
525
+ :url => 'https://some/resource',
526
+ :payload => 'payload'
527
+ )
528
+ net_http_res = Net::HTTPNoContent.new("", "204", "No Content")
529
+ net_http_res.stub!(:read_body).and_return(nil)
530
+ @http.should_receive(:request).and_return(@request.fetch_body(net_http_res))
531
+ response = @request.transmit(@uri, 'req', 'payload')
532
+ response.should_not be_nil
533
+ response.code.should == 204
534
+ end
535
+ end