typhoeus 0.1.3 → 0.1.4

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.
@@ -75,6 +75,11 @@ static void multi_read_info(VALUE self, CURLM *multi_handle) {
75
75
  // this next bit is a horrible hack. For some reason my tests against a local server on my laptop
76
76
  // fail intermittently and return this result number. However, it will succeed if you try it a few
77
77
  // more times. Also noteworthy is that this doens't happen when hitting an external server. WTF?!
78
+
79
+ // Sandofsky says:
80
+ // This is caused by OS X first attempting to resolve using IPV6.
81
+ // Hack solution: connect to yourself with 127.0.0.1, not localhost
82
+ // http://curl.haxx.se/mail/tracker-2009-09/0018.html
78
83
  if (result == 7) {
79
84
  VALUE max_retries = rb_funcall(easy, rb_intern("max_retries?"), 0);
80
85
  if (max_retries != Qtrue) {
@@ -146,7 +151,7 @@ static VALUE multi_perform(VALUE self) {
146
151
  rb_curl_multi_run( self, curl_multi->multi, &(curl_multi->running) );
147
152
  continue;
148
153
  }
149
- else if (timeout == -1) {
154
+ else if (timeout < 0) {
150
155
  timeout = 1;
151
156
  }
152
157
 
@@ -159,7 +164,7 @@ static VALUE multi_perform(VALUE self) {
159
164
  rb_raise((VALUE)mcode, "an error occured getting the fdset");
160
165
  }
161
166
 
162
- rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &tv);
167
+ rc = rb_thread_select(maxfd+1, &fdread, &fdwrite, &fdexcep, &tv);
163
168
  if (rc < 0) {
164
169
  rb_raise(rb_eRuntimeError, "error on thread select");
165
170
  }
@@ -14,7 +14,7 @@ require 'typhoeus/request'
14
14
  require 'typhoeus/hydra'
15
15
 
16
16
  module Typhoeus
17
- VERSION = "0.1.3"
17
+ VERSION = "0.1.4"
18
18
 
19
19
  def self.easy_object_pool
20
20
  @easy_objects ||= []
@@ -185,6 +185,7 @@ module Typhoeus
185
185
  end
186
186
 
187
187
  def reset
188
+ @retries = 0
188
189
  @response_code = 0
189
190
  @response_header = ""
190
191
  @response_body = ""
@@ -1,8 +1,9 @@
1
1
  module Typhoeus
2
2
  class Hydra
3
- def initialize
3
+ def initialize(initial_pool_size = 10)
4
4
  @multi = Multi.new
5
5
  @easy_pool = []
6
+ initial_pool_size.times { @easy_pool << Easy.new }
6
7
  @stubs = []
7
8
  @memoized_requests = {}
8
9
  @retrieved_from_cache = {}
@@ -0,0 +1,37 @@
1
+ require 'rubygems'
2
+ require 'sinatra'
3
+ require 'json'
4
+
5
+ @@fail_count = 0
6
+ get '/fail/:number' do
7
+ if @@fail_count >= params[:number].to_i
8
+ "ok"
9
+ else
10
+ @@fail_count += 1
11
+ error 500, "oh noes!"
12
+ end
13
+ end
14
+
15
+ get '/fail_forever' do
16
+ error 500, "oh noes!"
17
+ end
18
+
19
+ get '/**' do
20
+ sleep params["delay"].to_i if params.has_key?("delay")
21
+ request.env.merge!(:body => request.body.read).to_json
22
+ end
23
+
24
+ put '/**' do
25
+ puts request.inspect
26
+ request.env.merge!(:body => request.body.read).to_json
27
+ end
28
+
29
+ post '/**' do
30
+ puts request.inspect
31
+ request.env.merge!(:body => request.body.read).to_json
32
+ end
33
+
34
+ delete '/**' do
35
+ puts request.inspect
36
+ request.env.merge!(:body => request.body.read).to_json
37
+ end
@@ -1,4 +1,5 @@
1
1
  require "rubygems"
2
+ require 'json'
2
3
  require "spec"
3
4
 
4
5
  # gem install redgreen for colored test output
@@ -8,22 +9,3 @@ path = File.expand_path(File.dirname(__FILE__) + "/../lib/")
8
9
  $LOAD_PATH.unshift(path) unless $LOAD_PATH.include?(path)
9
10
 
10
11
  require "lib/typhoeus"
11
-
12
- # local servers for running tests
13
- require File.dirname(__FILE__) + "/servers/method_server.rb"
14
-
15
- def start_method_server(port, sleep = 0)
16
- MethodServer.sleep_time = sleep
17
- pid = Process.fork do
18
- EventMachine::run {
19
- EventMachine.epoll
20
- EventMachine::start_server("0.0.0.0", port, MethodServer)
21
- }
22
- end
23
- sleep 0.2
24
- pid
25
- end
26
-
27
- def stop_method_server(pid)
28
- Process.kill("HUP", pid)
29
- end
@@ -1,28 +1,17 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
- describe Typhoeus::Easy do
4
- before(:all) do
5
- @pid = start_method_server(3002)
6
- end
7
-
8
- after(:all) do
9
- stop_method_server(@pid)
10
- end
11
-
3
+ describe Typhoeus::Easy do
12
4
  describe "options" do
13
5
  it "should allow for following redirects"
14
6
  it "should allow you to set the user agent"
15
7
  it "should provide a timeout in milliseconds" do
16
- pid = start_method_server(3001, 5)
17
8
  e = Typhoeus::Easy.new
18
9
  e.url = "http://localhost:3001"
19
10
  e.method = :get
20
11
  e.timeout = 50
21
12
  e.perform
22
- puts e.response_code
23
- puts e.total_time_taken
13
+ # this doesn't work on a mac for some reason
24
14
  # e.timed_out?.should == true
25
- stop_method_server(pid)
26
15
  end
27
16
  end
28
17
 
@@ -33,17 +22,7 @@ describe Typhoeus::Easy do
33
22
  easy.method = :get
34
23
  easy.perform
35
24
  easy.response_code.should == 200
36
- easy.response_body.should include("REQUEST_METHOD=GET")
37
- end
38
-
39
- it "should send a request body" do
40
- easy = Typhoeus::Easy.new
41
- easy.url = "http://localhost:3002"
42
- easy.method = :get
43
- easy.request_body = "this is a body!"
44
- easy.perform
45
- easy.response_code.should == 200
46
- easy.response_body.should include("this is a body!")
25
+ JSON.parse(easy.response_body)["REQUEST_METHOD"].should == "GET"
47
26
  end
48
27
  end
49
28
 
@@ -80,7 +59,7 @@ describe Typhoeus::Easy do
80
59
  easy.method = :put
81
60
  easy.perform
82
61
  easy.response_code.should == 200
83
- easy.response_body.should include("REQUEST_METHOD=PUT")
62
+ JSON.parse(easy.response_body)["REQUEST_METHOD"].should == "PUT"
84
63
  end
85
64
 
86
65
  it "should send a request body" do
@@ -101,7 +80,7 @@ describe Typhoeus::Easy do
101
80
  easy.method = :post
102
81
  easy.perform
103
82
  easy.response_code.should == 200
104
- easy.response_body.should include("REQUEST_METHOD=POST")
83
+ JSON.parse(easy.response_body)["REQUEST_METHOD"].should == "POST"
105
84
  end
106
85
 
107
86
  it "should send a request body" do
@@ -132,7 +111,7 @@ describe Typhoeus::Easy do
132
111
  easy.method = :delete
133
112
  easy.perform
134
113
  easy.response_code.should == 200
135
- easy.response_body.should include("REQUEST_METHOD=DELETE")
114
+ JSON.parse(easy.response_body)["REQUEST_METHOD"].should == "DELETE"
136
115
  end
137
116
 
138
117
  it "should send a request body" do
@@ -1,14 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
3
  describe Typhoeus::Easy do
4
- before(:all) do
5
- @pid = start_method_server(3002)
6
- end
7
-
8
- after(:all) do
9
- stop_method_server(@pid)
10
- end
11
-
12
4
  it "should save easy handles that get added" do
13
5
  multi = Typhoeus::Multi.new
14
6
  easy = Typhoeus::Easy.new
@@ -30,7 +22,7 @@ describe Typhoeus::Easy do
30
22
  multi.add(easy)
31
23
  multi.perform
32
24
  easy.response_code.should == 200
33
- easy.response_body.should include("METHOD=GET")
25
+ JSON.parse(easy.response_body)["REQUEST_METHOD"].should == "GET"
34
26
 
35
27
  e2 = Typhoeus::Easy.new
36
28
  e2.url = "http://localhost:3002"
@@ -39,7 +31,7 @@ describe Typhoeus::Easy do
39
31
  multi.perform
40
32
 
41
33
  e2.response_code.should == 200
42
- e2.response_body.should include("METHOD=POST")
34
+ JSON.parse(e2.response_body)["REQUEST_METHOD"].should == "POST"
43
35
  end
44
36
 
45
37
  it "should perform easy handles added after the first one runs" do
@@ -58,9 +50,9 @@ describe Typhoeus::Easy do
58
50
 
59
51
  multi.perform
60
52
  easy.response_code.should == 200
61
- easy.response_body.should include("METHOD=GET")
53
+ JSON.parse(easy.response_body)["REQUEST_METHOD"].should == "GET"
62
54
  e2.response_code.should == 200
63
- e2.response_body.should include("METHOD=POST")
55
+ JSON.parse(e2.response_body)["REQUEST_METHOD"].should == "POST"
64
56
  end
65
57
 
66
58
  # it "should do multiple gets" do
@@ -6,14 +6,6 @@ describe Typhoeus::RemoteProxyObject do
6
6
  @easy.method = :get
7
7
  @easy.url = "http://localhost:3001"
8
8
  end
9
-
10
- before(:all) do
11
- @pid = start_method_server(3001)
12
- end
13
-
14
- after(:all) do
15
- stop_method_server(@pid)
16
- end
17
9
 
18
10
  it "should take a caller and call the clear_memoized_proxy_objects" do
19
11
  clear_proxy = lambda {}
@@ -66,7 +58,7 @@ describe Typhoeus::RemoteProxyObject do
66
58
  @response.code
67
59
  end
68
60
  end
69
- @easy.url = "http://localhost:3002" #bad port
61
+ @easy.url = "http://localhost:3005" #bad port
70
62
  k = Typhoeus::RemoteProxyObject.new(lambda {}, @easy, :on_failure => lambda {|e| klass.new(e)})
71
63
  k.blah.should == 0
72
64
  end
@@ -1,699 +1,695 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
2
 
3
3
  describe Typhoeus do
4
- before(:each) do
5
- @klass = Class.new do
6
- include Typhoeus
7
- end
4
+ it "should be deprecated" do
5
+ fail "This entire interface is deprecated!"
8
6
  end
9
7
 
10
- before(:all) do
11
- @pid = start_method_server(3001)
12
- end
13
-
14
- after(:all) do
15
- stop_method_server(@pid)
16
- end
17
-
18
- describe "entirely disallowing HTTP connections in specs" do
19
- describe "allow_net_connect" do
20
- it "should default to true" do
21
- @klass.allow_net_connect.should be_true
22
- end
23
-
24
- it "should be settable" do
25
- @klass.allow_net_connect.should be_true
26
- @klass.allow_net_connect = false
27
- @klass.allow_net_connect.should be_false
28
- end
29
- end
30
-
31
- describe "and hitting a URL that hasn't been mocked" do
32
- it "should raise an error for any HTTP verbs" do
33
- @klass.allow_net_connect = false
34
-
35
- [:get, :put, :post, :delete].each do |method|
36
- lambda {
37
- @klass.send(method, "http://crazy_url_that_isnt_mocked.com")
38
- }.should raise_error(Typhoeus::MockExpectedError)
39
- end
40
- end
41
- end
42
-
43
- describe "hitting a mocked URL that returns false" do
44
- it "should not raise a MockExpectedError" do
45
- @klass.allow_net_connect = false
46
- @klass.mock(:delete,
47
- :url => "http://test.com",
48
- :code => 500,
49
- :body => 'ok')
50
-
51
- lambda {
52
- @klass.delete("http://test.com",
53
- :on_failure => lambda { |response| false })
54
- }.should_not raise_error
55
- end
56
- end
57
-
58
- describe "handlers" do
59
- it "should be able to return nil as part of their block" do
60
- @klass.allow_net_connect = false
61
- url = 'http://api.mysite.com/v1/stuff.json'
62
- @klass.mock(:get,
63
- :url => url,
64
- :body => '',
65
- :code => 500)
66
- result = @klass.get(url,
67
- :on_failure => lambda { |response| nil })
68
- result.should be_nil
69
- end
70
- end
71
- end
72
-
73
- describe "mocking" do
74
- it "should mock out GET" do
75
- @klass.mock(:get)
76
- response = @klass.get("http://mock_url")
77
- response.code.should == 200
78
- response.body.should == ""
79
- response.headers.should == ""
80
- response.time.should == 0
81
- end
82
-
83
- it "should mock out PUT" do
84
- @klass.mock(:put)
85
- response = @klass.put("http://mock_url")
86
- response.code.should == 200
87
- response.body.should == ""
88
- response.headers.should == ""
89
- response.time.should == 0
90
- end
91
-
92
- it "should mock out POST" do
93
- @klass.mock(:post)
94
- response = @klass.post("http://mock_url")
95
- response.code.should == 200
96
- response.body.should == ""
97
- response.headers.should == ""
98
- response.time.should == 0
99
- end
100
-
101
- it "should mock out DELETE" do
102
- @klass.mock(:delete)
103
- response = @klass.delete("http://mock_url")
104
- response.code.should == 200
105
- response.body.should == ""
106
- response.headers.should == ""
107
- response.time.should == 0
108
- end
109
-
110
- it "should take an optional url" do
111
- @klass.mock(:get, :url => "http://stuff")
112
- response = @klass.get("http://stuff")
113
- response.code.should == 200
114
- response.body.should == ""
115
- response.headers.should == ""
116
- response.time.should == 0
117
-
118
- @klass.get("http://localhost:234234234").code.should == 0
119
- end
120
-
121
- it "should be able to mock using specific params as well" do
122
- @klass.allow_net_connect = false
123
- @klass.mock(:get, :url => "http://stuff")
124
-
125
- lambda {
126
- @klass.get("http://stuff", :params => { :a => 'test' })
127
- }.should raise_error(Typhoeus::MockExpectedError)
128
-
129
- @klass.mock(:get,
130
- :url => "http://stuff",
131
- :params => { :a => 'test' })
132
- lambda {
133
- @klass.get("http://stuff", :params => { :a => 'test' })
134
- }.should_not raise_error(Typhoeus::MockExpectedError)
135
- end
136
-
137
- describe "request body expectations" do
138
- before(:all) do
139
- @body_klass = Class.new do
140
- include Typhoeus
141
- end
142
- @body_klass.mock(:put, :url => "http://whatev", :expected_body => "hi")
143
- end
144
-
145
- it "should take an expected request body" do
146
- @body_klass.put("http://whatev", :body => "hi").code.should == 200
147
- end
148
-
149
- it "should raise if the expected request body doesn't match" do
150
- lambda {
151
- @body_klass.put("http://whatev", :body => "not what we expect")
152
- }.should raise_error
153
- end
154
- end
155
-
156
- describe "check_expected_headers!" do
157
- before(:each) do
158
- @header_klass = Class.new do
159
- include Typhoeus
160
- end
161
- end
162
-
163
- it "should match a header with :anything" do
164
- lambda {
165
- @header_klass.check_expected_headers!(
166
- { :expected_headers => { 'Content-Type' => :anything } },
167
- { :headers => { 'Content-Type' => 'text/xml' } }
168
- )
169
- }.should_not raise_error
170
- end
171
-
172
- it "should enforce exact matching" do
173
- lambda {
174
- @header_klass.check_expected_headers!(
175
- { :expected_headers => { 'Content-Type' => 'text/html' } },
176
- { :headers => { 'Content-Type' => 'text/xml' } }
177
- )
178
- }.should raise_error
179
- end
180
- end
181
-
182
- describe "check_unexpected_headers!" do
183
- before(:each) do
184
- @header_klass = Class.new do
185
- include Typhoeus
186
- end
187
- end
188
-
189
- it "should match a header with :anything" do
190
- lambda {
191
- @header_klass.check_unexpected_headers!(
192
- { :unexpected_headers => { 'Content-Type' => :anything } },
193
- { :headers => { "Content-Type" => "text/xml" } }
194
- )
195
- }.should raise_error
196
- end
197
-
198
- it "should not match if a header is different from the expected value" do
199
- lambda {
200
- @header_klass.check_unexpected_headers!(
201
- { :unexpected_headers => { 'Content-Type' => 'text/html' } },
202
- { :headers => { "Content-Type" => "text/xml" } }
203
- )
204
- }.should_not raise_error
205
- end
206
- end
207
-
208
- describe "request header expectations" do
209
- before(:all) do
210
- @header_klass = Class.new do
211
- include Typhoeus
212
- end
213
- @header_klass.mock(:get,
214
- :url => "http://asdf",
215
- :expected_headers => {"If-None-Match" => "\"lkjsd90823\""},
216
- :unexpected_headers => { 'Content-Type' => "text/xml" })
217
- end
218
-
219
- it "should take expected request headers" do
220
- @header_klass.get("http://asdf", :headers => {"If-None-Match" => "\"lkjsd90823\""})
221
- end
222
-
223
- it "should raise if the expected request headers don't match" do
224
- lambda {
225
- @header_klass.get("http://asdf")
226
- }.should raise_error
227
- end
228
-
229
- it "should raise if an unexpected header shows up" do
230
- lambda {
231
- @header_klass.get("http://asdf",
232
- :headers => { "Content-Type" => "text/xml" })
233
- }.should raise_error
234
- end
235
- end
236
-
237
- describe "remote methods" do
238
- it "should work for defined remote methods" do
239
- @klass.instance_eval do
240
- define_remote_method :do_stuff, :base_uri => "http://localhost:3001", :on_success => lambda {|r| r.body.should == "hi"; :great_success}
241
- end
242
- @klass.mock(:get, :url => "http://localhost:3001", :body => "hi")
243
- @klass.do_stuff.should == :great_success
244
- end
245
-
246
- it "should call the on failure handler for remote methods" do
247
- @klass.instance_eval do
248
- define_remote_method :do_stuff, :base_uri => "http://localhost:3001", :on_failure => lambda {|r| r.body.should == "hi"; :fail}
249
- end
250
- @klass.mock(:get, :url => "http://localhost:3001", :body => "hi", :code => 500)
251
- @klass.do_stuff.should == :fail
252
- end
253
-
254
- it "should allow for subclassing a class that includes Typhoeus, and merging defaults" do
255
- class TestA
256
- include Typhoeus
257
- remote_defaults :on_failure => lambda { |response|
258
- :fail
259
- }
260
- end
261
-
262
- class TestB < TestA
263
- remote_defaults :base_uri => "http://localhost"
264
- define_remote_method :do_stuff
265
- end
266
-
267
- TestB.mock(:get, :url => "http://localhost", :body => "hi", :code => 500)
268
- TestB.do_stuff.should == :fail
269
- end
270
- end
271
-
272
- describe "response hash" do
273
- it "should use provided code" do
274
- @klass.mock(:get, :url => "http://localhost/whatever", :code => 301)
275
- response = @klass.get("http://localhost/whatever")
276
- response.code.should == 301
277
- response.body.should == ""
278
- response.headers.should == ""
279
- response.time.should == 0
280
- end
281
-
282
- it "should use provided body" do
283
- @klass.mock(:get, :url => "http://localhost/whatever", :body => "hey paul")
284
- response = @klass.get("http://localhost/whatever")
285
- response.code.should == 200
286
- response.body.should == "hey paul"
287
- response.headers.should == ""
288
- response.time.should == 0
289
- end
290
-
291
- it "should use provided headers" do
292
- @klass.mock(:get, :url => "http://localhost/whatever", :headers => "whooo, headers!")
293
- response = @klass.get("http://localhost/whatever")
294
- response.code.should == 200
295
- response.body.should == ""
296
- response.headers.should == "whooo, headers!"
297
- response.time.should == 0
298
- end
299
-
300
- it "should use provided time" do
301
- @klass.mock(:get, :url => "http://localhost/whatever", :time => 123)
302
- response = @klass.get("http://localhost/whatever")
303
- response.code.should == 200
304
- response.body.should == ""
305
- response.headers.should == ""
306
- response.time.should == 123
307
- end
308
- end
309
- end
310
-
311
- describe "get" do
312
- it "should add a get method" do
313
- easy = @klass.get("http://localhost:3001/posts.xml")
314
- easy.code.should == 200
315
- easy.body.should include("REQUEST_METHOD=GET")
316
- easy.body.should include("REQUEST_URI=/posts.xml")
317
- end
318
-
319
- it "should take passed in params and add them to the query string" do
320
- easy = @klass.get("http://localhost:3001", {:params => {:foo => :bar}})
321
- easy.body.should include("QUERY_STRING=foo=bar")
322
- end
323
- end # get
324
-
325
- describe "post" do
326
- it "should add a post method" do
327
- easy = @klass.post("http://localhost:3001/posts.xml", {:params => {:post => {:author => "paul", :title => "a title", :body => "a body"}}})
328
- easy.code.should == 200
329
- easy.body.should include("post%5Bbody%5D=a+body")
330
- easy.body.should include("post%5Bauthor%5D=paul")
331
- easy.body.should include("post%5Btitle%5D=a+title")
332
- easy.body.should include("REQUEST_METHOD=POST")
333
- end
334
-
335
- it "should add a body" do
336
- easy = @klass.post("http://localhost:3001/posts.xml", {:body => "this is a request body"})
337
- easy.code.should == 200
338
- easy.body.should include("this is a request body")
339
- easy.body.should include("REQUEST_METHOD=POST")
340
- end
341
- end # post
342
-
343
- it "should add a put method" do
344
- easy = @klass.put("http://localhost:3001/posts/3.xml")
345
- easy.code.should == 200
346
- easy.body.should include("REQUEST_METHOD=PUT")
347
- end
348
-
349
- it "should add a delete method" do
350
- easy = @klass.delete("http://localhost:3001/posts/3.xml")
351
- easy.code.should == 200
352
- easy.body.should include("REQUEST_METHOD=DELETE")
353
- end
354
-
355
- describe "#define_remote_method" do
356
- before(:each) do
357
- @klass = Class.new do
358
- include Typhoeus
359
- end
360
- end
361
-
362
- describe "defined methods" do
363
- before(:each) do
364
- @klass.instance_eval do
365
- define_remote_method :do_stuff
366
- end
367
- end
368
-
369
- it "should take a method name as the first argument and define that as a class method" do
370
- @klass.should respond_to(:do_stuff)
371
- end
372
-
373
- it "should optionally take arguments" do
374
- @klass.should_receive(:get)
375
- @klass.do_stuff
376
- end
377
-
378
- it "should take arguments" do
379
- @klass.should_receive(:get).with("", {:params=>{:foo=>"bar"}, :body=>"whatever"})
380
- @klass.do_stuff(:params => {:foo => "bar"}, :body => "whatever")
381
- end
382
- end
383
-
384
- describe "base_uri" do
385
- it "should take a :uri as an argument" do
386
- @klass.instance_eval do
387
- define_remote_method :do_stuff, :base_uri => "http://pauldix.net"
388
- end
389
-
390
- @klass.should_receive(:get).with("http://pauldix.net", {})
391
- @klass.do_stuff
392
- end
393
-
394
- it "should use default_base_uri if no base_uri provided" do
395
- @klass.instance_eval do
396
- remote_defaults :base_uri => "http://kgb.com"
397
- define_remote_method :do_stuff
398
- end
399
-
400
- @klass.should_receive(:get).with("http://kgb.com", {})
401
- @klass.do_stuff
402
- end
403
-
404
- it "should override default_base_uri if uri argument is provided" do
405
- @klass.instance_eval do
406
- remote_defaults :base_uri => "http://kgb.com"
407
- define_remote_method :do_stuff, :base_uri => "http://pauldix.net"
408
- end
409
-
410
- @klass.should_receive(:get).with("http://pauldix.net", {})
411
- @klass.do_stuff
412
- end
413
- end
414
-
415
- describe "path" do
416
- it "should take :path as an argument" do
417
- @klass.instance_eval do
418
- define_remote_method :do_stuff, :base_uri => "http://kgb.com", :path => "/default.html"
419
- end
420
-
421
- @klass.should_receive(:get).with("http://kgb.com/default.html", {})
422
- @klass.do_stuff
423
- end
424
-
425
- it "should use deafult_path if no path provided" do
426
- @klass.instance_eval do
427
- remote_defaults :path => "/index.html"
428
- define_remote_method :do_stuff, :base_uri => "http://pauldix.net"
429
- end
430
-
431
- @klass.should_receive(:get).with("http://pauldix.net/index.html", {})
432
- @klass.do_stuff
433
- end
434
-
435
- it "should orverride default_path if path argument is provided" do
436
- @klass.instance_eval do
437
- remote_defaults :path => "/index.html"
438
- define_remote_method :do_stuff, :base_uri => "http://pauldix.net", :path => "/foo.html"
439
- end
440
-
441
- @klass.should_receive(:get).with("http://pauldix.net/foo.html", {})
442
- @klass.do_stuff
443
- end
444
-
445
- it "should map symbols in path to arguments for the remote method" do
446
- @klass.instance_eval do
447
- define_remote_method :do_stuff, :base_uri => "http://pauldix.net", :path => "/posts/:post_id/comments/:comment_id"
448
- end
449
-
450
- @klass.should_receive(:get).with("http://pauldix.net/posts/foo/comments/bar", {})
451
- @klass.do_stuff(:post_id => "foo", :comment_id => "bar")
452
- end
453
-
454
- it "should use a path passed into the remote method call" do
455
- @klass.instance_eval do
456
- define_remote_method :do_stuff, :base_uri => "http://pauldix.net"
457
- end
458
-
459
- @klass.should_receive(:get).with("http://pauldix.net/whatev?asdf=foo", {})
460
- @klass.do_stuff(:path => "/whatev?asdf=foo")
461
- end
462
- end
463
-
464
- describe "method" do
465
- it "should take :method as an argument" do
466
- @klass.instance_eval do
467
- define_remote_method :do_stuff, :base_uri => "http://pauldix.net", :method => :put
468
- end
469
-
470
- @klass.should_receive(:put).with("http://pauldix.net", {})
471
- @klass.do_stuff
472
- end
473
-
474
- it "should use :get if no method or default_method exists" do
475
- @klass.instance_eval do
476
- define_remote_method :do_stuff, :base_uri => "http://pauldix.net"
477
- end
478
-
479
- @klass.should_receive(:get).with("http://pauldix.net", {})
480
- @klass.do_stuff
481
- end
482
-
483
- it "should use default_method if no method provided" do
484
- @klass.instance_eval do
485
- remote_defaults :method => :delete
486
- define_remote_method :do_stuff, :base_uri => "http://kgb.com"
487
- end
488
-
489
- @klass.should_receive(:delete).with("http://kgb.com", {})
490
- @klass.do_stuff
491
- end
492
-
493
- it "should override deafult_method if method argument is provided" do
494
- @klass.instance_eval do
495
- remote_defaults :method => :put
496
- define_remote_method :do_stuff, :base_uri => "http://pauldix.net", :method => :post
497
- end
498
-
499
- @klass.should_receive(:post).with("http://pauldix.net", {})
500
- @klass.do_stuff
501
- end
502
- end
503
-
504
- describe "on_success" do
505
- it "should take :on_success as an argument" do
506
- @klass.instance_eval do
507
- define_remote_method :do_stuff, :base_uri => "http://localhost:3001", :on_success => lambda {|e| e.code.should == 200; :foo}
508
- end
509
-
510
- @klass.do_stuff.should == :foo
511
- end
512
-
513
- it "should use default_on_success if no on_success provided" do
514
- @klass.instance_eval do
515
- remote_defaults :on_success => lambda {|e| e.code.should == 200; :foo}
516
- define_remote_method :do_stuff, :base_uri => "http://localhost:3001"
517
- end
518
-
519
- @klass.do_stuff.should == :foo
520
- end
521
-
522
- it "should override default_on_success if on_success is provided" do
523
- @klass.instance_eval do
524
- remote_defaults :on_success => lambda {|e| :foo}
525
- define_remote_method :do_stuff, :base_uri => "http://localhost:3001", :on_success => lambda {|e| e.code.should == 200; :bar}
526
- end
527
-
528
- @klass.do_stuff.should == :bar
529
- end
530
- end
531
-
532
- describe "on_failure" do
533
- it "should take :on_failure as an argument" do
534
- @klass.instance_eval do
535
- define_remote_method :do_stuff, :base_uri => "http://localhost:9999", :on_failure => lambda {|e| e.code.should == 0; :foo}
536
- end
537
-
538
- @klass.do_stuff.should == :foo
539
- end
540
-
541
- it "should use default_on_failure if no on_success provided" do
542
- @klass.instance_eval do
543
- remote_defaults :on_failure => lambda {|e| e.code.should == 0; :bar}
544
- define_remote_method :do_stuff, :base_uri => "http://localhost:9999"
545
- end
546
-
547
- @klass.do_stuff.should == :bar
548
- end
549
-
550
- it "should override default_on_failure if no method is provided" do
551
- @klass.instance_eval do
552
- remote_defaults :on_failure => lambda {|e| :foo}
553
- define_remote_method :do_stuff, :base_uri => "http://localhost:9999", :on_failure => lambda {|e| e.code.should == 0; :bar}
554
- end
555
-
556
- @klass.do_stuff.should == :bar
557
- end
558
- end
559
-
560
- describe "params" do
561
- it "should take :params as an argument" do
562
- @klass.instance_eval do
563
- define_remote_method :do_stuff, :base_uri => "http://localhost:3001", :params => {:foo => :bar}
564
- end
565
-
566
- @klass.do_stuff.body.should include("QUERY_STRING=foo=bar")
567
- end
568
-
569
- it "should add :params from remote method definition with params passed in when called" do
570
- @klass.instance_eval do
571
- define_remote_method :do_stuff, :base_uri => "http://localhost:3001", :params => {:foo => :bar}
572
- end
573
-
574
- result = @klass.do_stuff(:params => {:asdf => :jkl})
575
-
576
- # Make this test more robust to hash ordering.
577
- query_string = result.body.match(/QUERY_STRING=([^\n]+)/)
578
- params = query_string[1].split("&")
579
- ["asdf=jkl", "foo=bar"].each do |param|
580
- params.should include(param)
581
- end
582
- end
583
- end
584
-
585
- describe "memoize_responses" do
586
- it "should only make one call to the http method and the on_success handler if :memoize_responses => true" do
587
- success_mock = mock("success")
588
- success_mock.should_receive(:call).exactly(2).times
589
-
590
- @klass.instance_eval do
591
- define_remote_method :do_stuff, :base_uri => "http://localhost:3001", :path => "/:file", :on_success => lambda {|e| success_mock.call; :foo}
592
- end
593
-
594
- first_return_val = @klass.do_stuff(:file => "user.html")
595
- second_return_val = @klass.do_stuff(:file => "post.html")
596
- third_return_val = @klass.do_stuff(:file => "user.html")
597
-
598
- first_return_val.should == :foo
599
- second_return_val.should == :foo
600
- third_return_val.should == :foo
601
- end
602
-
603
- it "should clear memoized responses after a full run" do
604
- success_mock = mock("success")
605
- success_mock.should_receive(:call).exactly(2).times
606
-
607
- @klass.instance_eval do
608
- define_remote_method :do_stuff, :base_uri => "http://localhost:3001", :path => "/:file", :on_success => lambda {|e| success_mock.call; :foo}
609
- end
610
-
611
- @klass.do_stuff(:file => "user.html").should == :foo
612
- @klass.do_stuff(:file => "user.html").should == :foo
613
- end
614
- end
615
-
616
- describe "cache_response" do
617
- before(:each) do
618
- @cache = Class.new do
619
- def self.get(key)
620
- @cache ||= {}
621
- @cache[key]
622
- end
623
-
624
- def self.set(key, value, timeout = 0)
625
- @cache ||= {}
626
- @cache[key] = value
627
- end
628
- end
629
-
630
- @klass.instance_eval do
631
- define_remote_method :do_stuff, :base_uri => "http://localhost:3001", :path => "/:file", :cache_responses => true, :on_success => lambda {|e| :foo}
632
- end
633
- end
634
-
635
- it "should pull from the cache if :cache_response => true" do
636
- @cache.should_receive(:get).and_return(:foo)
637
- @klass.cache = @cache
638
- Typhoeus.should_receive(:perform_easy_requests).exactly(0).times
639
- @klass.do_stuff.should == :foo
640
- end
641
-
642
- it "should only hit the cache once for the same value" do
643
- @cache.should_receive(:get).exactly(1).times.and_return(:foo)
644
- @klass.cache = @cache
645
- Typhoeus.should_receive(:perform_easy_requests).exactly(0).times
646
-
647
-
648
- first = @klass.do_stuff
649
- second = @klass.do_stuff
650
-
651
- first.should == :foo
652
- second.should == :foo
653
- end
654
-
655
- it "should only hit the cache once if there is a cache miss (don't check again and again inside the same block)." do
656
- @cache.should_receive(:get).exactly(1).times.and_return(nil)
657
- @cache.should_receive(:set).exactly(1).times
658
- @klass.cache = @cache
659
-
660
- first = @klass.do_stuff
661
- second = @klass.do_stuff
662
-
663
- first.should == :foo
664
- second.should == :foo
665
- end
666
-
667
- it "should store an object in the cache with a set ttl"
668
- it "should take a hash with get and set method pointers to enable custom caching behavior"
669
- end
670
- end # define_remote_method
671
-
672
- describe "cache_server" do
673
- it "should store a cache_server" do
674
- @klass.cache = :foo
675
- end
676
- end
677
-
678
- describe "get_memcache_resposne_key" do
679
- it "should return a key that is an and of the method name, args, and options" do
680
- @klass.get_memcache_response_key(:do_stuff, ["foo"]).should == "20630a9d4864c41cbbcb8bd8ac91ab4767e72107b93329aa2e6f5629037392f3"
681
- end
682
- end
683
-
684
- # describe "multiple with post" do
685
- # require 'rubygems'
686
- # require 'json'
687
- # it "shoudl do stuff" do
688
- # @klass.instance_eval do
689
- # define_remote_method :post_stuff, :path => "/entries/metas/:meta_id/ids", :base_uri => "http://localhost:4567", :method => :post
690
- # define_remote_method :get_stuff, :base_uri => "http://localhost:4567"
8
+ # before(:each) do
9
+ # @klass = Class.new do
10
+ # include Typhoeus
11
+ # end
12
+ # end
13
+ #
14
+ # describe "entirely disallowing HTTP connections in specs" do
15
+ # describe "allow_net_connect" do
16
+ # it "should default to true" do
17
+ # @klass.allow_net_connect.should be_true
18
+ # end
19
+ #
20
+ # it "should be settable" do
21
+ # @klass.allow_net_connect.should be_true
22
+ # @klass.allow_net_connect = false
23
+ # @klass.allow_net_connect.should be_false
24
+ # end
25
+ # end
26
+ #
27
+ # describe "and hitting a URL that hasn't been mocked" do
28
+ # it "should raise an error for any HTTP verbs" do
29
+ # @klass.allow_net_connect = false
30
+ #
31
+ # [:get, :put, :post, :delete].each do |method|
32
+ # lambda {
33
+ # @klass.send(method, "http://crazy_url_that_isnt_mocked.com")
34
+ # }.should raise_error(Typhoeus::MockExpectedError)
35
+ # end
36
+ # end
37
+ # end
38
+ #
39
+ # describe "hitting a mocked URL that returns false" do
40
+ # it "should not raise a MockExpectedError" do
41
+ # @klass.allow_net_connect = false
42
+ # @klass.mock(:delete,
43
+ # :url => "http://test.com",
44
+ # :code => 500,
45
+ # :body => 'ok')
46
+ #
47
+ # lambda {
48
+ # @klass.delete("http://test.com",
49
+ # :on_failure => lambda { |response| false })
50
+ # }.should_not raise_error
51
+ # end
52
+ # end
53
+ #
54
+ # describe "handlers" do
55
+ # it "should be able to return nil as part of their block" do
56
+ # @klass.allow_net_connect = false
57
+ # url = 'http://api.mysite.com/v1/stuff.json'
58
+ # @klass.mock(:get,
59
+ # :url => url,
60
+ # :body => '',
61
+ # :code => 500)
62
+ # result = @klass.get(url,
63
+ # :on_failure => lambda { |response| nil })
64
+ # result.should be_nil
65
+ # end
66
+ # end
67
+ # end
68
+ #
69
+ # describe "mocking" do
70
+ # it "should mock out GET" do
71
+ # @klass.mock(:get)
72
+ # response = @klass.get("http://mock_url")
73
+ # response.code.should == 200
74
+ # response.body.should == ""
75
+ # response.headers.should == ""
76
+ # response.time.should == 0
77
+ # end
78
+ #
79
+ # it "should mock out PUT" do
80
+ # @klass.mock(:put)
81
+ # response = @klass.put("http://mock_url")
82
+ # response.code.should == 200
83
+ # response.body.should == ""
84
+ # response.headers.should == ""
85
+ # response.time.should == 0
86
+ # end
87
+ #
88
+ # it "should mock out POST" do
89
+ # @klass.mock(:post)
90
+ # response = @klass.post("http://mock_url")
91
+ # response.code.should == 200
92
+ # response.body.should == ""
93
+ # response.headers.should == ""
94
+ # response.time.should == 0
95
+ # end
96
+ #
97
+ # it "should mock out DELETE" do
98
+ # @klass.mock(:delete)
99
+ # response = @klass.delete("http://mock_url")
100
+ # response.code.should == 200
101
+ # response.body.should == ""
102
+ # response.headers.should == ""
103
+ # response.time.should == 0
104
+ # end
105
+ #
106
+ # it "should take an optional url" do
107
+ # @klass.mock(:get, :url => "http://stuff")
108
+ # response = @klass.get("http://stuff")
109
+ # response.code.should == 200
110
+ # response.body.should == ""
111
+ # response.headers.should == ""
112
+ # response.time.should == 0
113
+ #
114
+ # @klass.get("http://localhost:234234234").code.should == 0
115
+ # end
116
+ #
117
+ # it "should be able to mock using specific params as well" do
118
+ # @klass.allow_net_connect = false
119
+ # @klass.mock(:get, :url => "http://stuff")
120
+ #
121
+ # lambda {
122
+ # @klass.get("http://stuff", :params => { :a => 'test' })
123
+ # }.should raise_error(Typhoeus::MockExpectedError)
124
+ #
125
+ # @klass.mock(:get,
126
+ # :url => "http://stuff",
127
+ # :params => { :a => 'test' })
128
+ # lambda {
129
+ # @klass.get("http://stuff", :params => { :a => 'test' })
130
+ # }.should_not raise_error(Typhoeus::MockExpectedError)
131
+ # end
132
+ #
133
+ # describe "request body expectations" do
134
+ # before(:all) do
135
+ # @body_klass = Class.new do
136
+ # include Typhoeus
137
+ # end
138
+ # @body_klass.mock(:put, :url => "http://whatev", :expected_body => "hi")
139
+ # end
140
+ #
141
+ # it "should take an expected request body" do
142
+ # @body_klass.put("http://whatev", :body => "hi").code.should == 200
143
+ # end
144
+ #
145
+ # it "should raise if the expected request body doesn't match" do
146
+ # lambda {
147
+ # @body_klass.put("http://whatev", :body => "not what we expect")
148
+ # }.should raise_error
149
+ # end
150
+ # end
151
+ #
152
+ # describe "check_expected_headers!" do
153
+ # before(:each) do
154
+ # @header_klass = Class.new do
155
+ # include Typhoeus
156
+ # end
157
+ # end
158
+ #
159
+ # it "should match a header with :anything" do
160
+ # lambda {
161
+ # @header_klass.check_expected_headers!(
162
+ # { :expected_headers => { 'Content-Type' => :anything } },
163
+ # { :headers => { 'Content-Type' => 'text/xml' } }
164
+ # )
165
+ # }.should_not raise_error
166
+ # end
167
+ #
168
+ # it "should enforce exact matching" do
169
+ # lambda {
170
+ # @header_klass.check_expected_headers!(
171
+ # { :expected_headers => { 'Content-Type' => 'text/html' } },
172
+ # { :headers => { 'Content-Type' => 'text/xml' } }
173
+ # )
174
+ # }.should raise_error
175
+ # end
176
+ # end
177
+ #
178
+ # describe "check_unexpected_headers!" do
179
+ # before(:each) do
180
+ # @header_klass = Class.new do
181
+ # include Typhoeus
182
+ # end
183
+ # end
184
+ #
185
+ # it "should match a header with :anything" do
186
+ # lambda {
187
+ # @header_klass.check_unexpected_headers!(
188
+ # { :unexpected_headers => { 'Content-Type' => :anything } },
189
+ # { :headers => { "Content-Type" => "text/xml" } }
190
+ # )
191
+ # }.should raise_error
192
+ # end
193
+ #
194
+ # it "should not match if a header is different from the expected value" do
195
+ # lambda {
196
+ # @header_klass.check_unexpected_headers!(
197
+ # { :unexpected_headers => { 'Content-Type' => 'text/html' } },
198
+ # { :headers => { "Content-Type" => "text/xml" } }
199
+ # )
200
+ # }.should_not raise_error
201
+ # end
202
+ # end
203
+ #
204
+ # describe "request header expectations" do
205
+ # before(:all) do
206
+ # @header_klass = Class.new do
207
+ # include Typhoeus
208
+ # end
209
+ # @header_klass.mock(:get,
210
+ # :url => "http://asdf",
211
+ # :expected_headers => {"If-None-Match" => "\"lkjsd90823\""},
212
+ # :unexpected_headers => { 'Content-Type' => "text/xml" })
213
+ # end
214
+ #
215
+ # it "should take expected request headers" do
216
+ # @header_klass.get("http://asdf", :headers => {"If-None-Match" => "\"lkjsd90823\""})
691
217
  # end
692
218
  #
693
- # Typhoeus.service_access do
694
- # @klass.post_stuff("paul-tv", :body => ["foo", "bar"].to_json) {|e| }
695
- # @klass.get_stuff {|e| }
219
+ # it "should raise if the expected request headers don't match" do
220
+ # lambda {
221
+ # @header_klass.get("http://asdf")
222
+ # }.should raise_error
696
223
  # end
224
+ #
225
+ # it "should raise if an unexpected header shows up" do
226
+ # lambda {
227
+ # @header_klass.get("http://asdf",
228
+ # :headers => { "Content-Type" => "text/xml" })
229
+ # }.should raise_error
230
+ # end
231
+ # end
232
+ #
233
+ # describe "remote methods" do
234
+ # it "should work for defined remote methods" do
235
+ # @klass.instance_eval do
236
+ # define_remote_method :do_stuff, :base_uri => "http://localhost:3001", :on_success => lambda {|r| r.body.should == "hi"; :great_success}
237
+ # end
238
+ # @klass.mock(:get, :url => "http://localhost:3001", :body => "hi")
239
+ # @klass.do_stuff.should == :great_success
240
+ # end
241
+ #
242
+ # it "should call the on failure handler for remote methods" do
243
+ # @klass.instance_eval do
244
+ # define_remote_method :do_stuff, :base_uri => "http://localhost:3001", :on_failure => lambda {|r| r.body.should == "hi"; :fail}
245
+ # end
246
+ # @klass.mock(:get, :url => "http://localhost:3001", :body => "hi", :code => 500)
247
+ # @klass.do_stuff.should == :fail
248
+ # end
249
+ #
250
+ # it "should allow for subclassing a class that includes Typhoeus, and merging defaults" do
251
+ # class TestA
252
+ # include Typhoeus
253
+ # remote_defaults :on_failure => lambda { |response|
254
+ # :fail
255
+ # }
256
+ # end
257
+ #
258
+ # class TestB < TestA
259
+ # remote_defaults :base_uri => "http://localhost"
260
+ # define_remote_method :do_stuff
261
+ # end
262
+ #
263
+ # TestB.mock(:get, :url => "http://localhost", :body => "hi", :code => 500)
264
+ # TestB.do_stuff.should == :fail
265
+ # end
266
+ # end
267
+ #
268
+ # describe "response hash" do
269
+ # it "should use provided code" do
270
+ # @klass.mock(:get, :url => "http://localhost/whatever", :code => 301)
271
+ # response = @klass.get("http://localhost/whatever")
272
+ # response.code.should == 301
273
+ # response.body.should == ""
274
+ # response.headers.should == ""
275
+ # response.time.should == 0
276
+ # end
277
+ #
278
+ # it "should use provided body" do
279
+ # @klass.mock(:get, :url => "http://localhost/whatever", :body => "hey paul")
280
+ # response = @klass.get("http://localhost/whatever")
281
+ # response.code.should == 200
282
+ # response.body.should == "hey paul"
283
+ # response.headers.should == ""
284
+ # response.time.should == 0
285
+ # end
286
+ #
287
+ # it "should use provided headers" do
288
+ # @klass.mock(:get, :url => "http://localhost/whatever", :headers => "whooo, headers!")
289
+ # response = @klass.get("http://localhost/whatever")
290
+ # response.code.should == 200
291
+ # response.body.should == ""
292
+ # response.headers.should == "whooo, headers!"
293
+ # response.time.should == 0
294
+ # end
295
+ #
296
+ # it "should use provided time" do
297
+ # @klass.mock(:get, :url => "http://localhost/whatever", :time => 123)
298
+ # response = @klass.get("http://localhost/whatever")
299
+ # response.code.should == 200
300
+ # response.body.should == ""
301
+ # response.headers.should == ""
302
+ # response.time.should == 123
303
+ # end
304
+ # end
305
+ # end
306
+ #
307
+ # describe "get" do
308
+ # it "should add a get method" do
309
+ # easy = @klass.get("http://localhost:3001/posts.xml")
310
+ # easy.code.should == 200
311
+ # easy.body.should include("REQUEST_METHOD=GET")
312
+ # easy.body.should include("REQUEST_URI=/posts.xml")
313
+ # end
314
+ #
315
+ # it "should take passed in params and add them to the query string" do
316
+ # easy = @klass.get("http://localhost:3001", {:params => {:foo => :bar}})
317
+ # easy.body.should include("QUERY_STRING=foo=bar")
318
+ # end
319
+ # end # get
320
+ #
321
+ # describe "post" do
322
+ # it "should add a post method" do
323
+ # easy = @klass.post("http://localhost:3001/posts.xml", {:params => {:post => {:author => "paul", :title => "a title", :body => "a body"}}})
324
+ # easy.code.should == 200
325
+ # easy.body.should include("post%5Bbody%5D=a+body")
326
+ # easy.body.should include("post%5Bauthor%5D=paul")
327
+ # easy.body.should include("post%5Btitle%5D=a+title")
328
+ # easy.body.should include("REQUEST_METHOD=POST")
329
+ # end
330
+ #
331
+ # it "should add a body" do
332
+ # easy = @klass.post("http://localhost:3001/posts.xml", {:body => "this is a request body"})
333
+ # easy.code.should == 200
334
+ # easy.body.should include("this is a request body")
335
+ # easy.body.should include("REQUEST_METHOD=POST")
336
+ # end
337
+ # end # post
338
+ #
339
+ # it "should add a put method" do
340
+ # easy = @klass.put("http://localhost:3001/posts/3.xml")
341
+ # easy.code.should == 200
342
+ # easy.body.should include("REQUEST_METHOD=PUT")
343
+ # end
344
+ #
345
+ # it "should add a delete method" do
346
+ # easy = @klass.delete("http://localhost:3001/posts/3.xml")
347
+ # easy.code.should == 200
348
+ # easy.body.should include("REQUEST_METHOD=DELETE")
349
+ # end
350
+ #
351
+ # describe "#define_remote_method" do
352
+ # before(:each) do
353
+ # @klass = Class.new do
354
+ # include Typhoeus
355
+ # end
356
+ # end
357
+ #
358
+ # describe "defined methods" do
359
+ # before(:each) do
360
+ # @klass.instance_eval do
361
+ # define_remote_method :do_stuff
362
+ # end
363
+ # end
364
+ #
365
+ # it "should take a method name as the first argument and define that as a class method" do
366
+ # @klass.should respond_to(:do_stuff)
367
+ # end
368
+ #
369
+ # it "should optionally take arguments" do
370
+ # @klass.should_receive(:get)
371
+ # @klass.do_stuff
372
+ # end
373
+ #
374
+ # it "should take arguments" do
375
+ # @klass.should_receive(:get).with("", {:params=>{:foo=>"bar"}, :body=>"whatever"})
376
+ # @klass.do_stuff(:params => {:foo => "bar"}, :body => "whatever")
377
+ # end
378
+ # end
379
+ #
380
+ # describe "base_uri" do
381
+ # it "should take a :uri as an argument" do
382
+ # @klass.instance_eval do
383
+ # define_remote_method :do_stuff, :base_uri => "http://pauldix.net"
384
+ # end
385
+ #
386
+ # @klass.should_receive(:get).with("http://pauldix.net", {})
387
+ # @klass.do_stuff
388
+ # end
389
+ #
390
+ # it "should use default_base_uri if no base_uri provided" do
391
+ # @klass.instance_eval do
392
+ # remote_defaults :base_uri => "http://kgb.com"
393
+ # define_remote_method :do_stuff
394
+ # end
395
+ #
396
+ # @klass.should_receive(:get).with("http://kgb.com", {})
397
+ # @klass.do_stuff
398
+ # end
399
+ #
400
+ # it "should override default_base_uri if uri argument is provided" do
401
+ # @klass.instance_eval do
402
+ # remote_defaults :base_uri => "http://kgb.com"
403
+ # define_remote_method :do_stuff, :base_uri => "http://pauldix.net"
404
+ # end
405
+ #
406
+ # @klass.should_receive(:get).with("http://pauldix.net", {})
407
+ # @klass.do_stuff
408
+ # end
409
+ # end
410
+ #
411
+ # describe "path" do
412
+ # it "should take :path as an argument" do
413
+ # @klass.instance_eval do
414
+ # define_remote_method :do_stuff, :base_uri => "http://kgb.com", :path => "/default.html"
415
+ # end
416
+ #
417
+ # @klass.should_receive(:get).with("http://kgb.com/default.html", {})
418
+ # @klass.do_stuff
419
+ # end
420
+ #
421
+ # it "should use deafult_path if no path provided" do
422
+ # @klass.instance_eval do
423
+ # remote_defaults :path => "/index.html"
424
+ # define_remote_method :do_stuff, :base_uri => "http://pauldix.net"
425
+ # end
426
+ #
427
+ # @klass.should_receive(:get).with("http://pauldix.net/index.html", {})
428
+ # @klass.do_stuff
429
+ # end
430
+ #
431
+ # it "should orverride default_path if path argument is provided" do
432
+ # @klass.instance_eval do
433
+ # remote_defaults :path => "/index.html"
434
+ # define_remote_method :do_stuff, :base_uri => "http://pauldix.net", :path => "/foo.html"
435
+ # end
436
+ #
437
+ # @klass.should_receive(:get).with("http://pauldix.net/foo.html", {})
438
+ # @klass.do_stuff
439
+ # end
440
+ #
441
+ # it "should map symbols in path to arguments for the remote method" do
442
+ # @klass.instance_eval do
443
+ # define_remote_method :do_stuff, :base_uri => "http://pauldix.net", :path => "/posts/:post_id/comments/:comment_id"
444
+ # end
445
+ #
446
+ # @klass.should_receive(:get).with("http://pauldix.net/posts/foo/comments/bar", {})
447
+ # @klass.do_stuff(:post_id => "foo", :comment_id => "bar")
448
+ # end
449
+ #
450
+ # it "should use a path passed into the remote method call" do
451
+ # @klass.instance_eval do
452
+ # define_remote_method :do_stuff, :base_uri => "http://pauldix.net"
453
+ # end
454
+ #
455
+ # @klass.should_receive(:get).with("http://pauldix.net/whatev?asdf=foo", {})
456
+ # @klass.do_stuff(:path => "/whatev?asdf=foo")
457
+ # end
458
+ # end
459
+ #
460
+ # describe "method" do
461
+ # it "should take :method as an argument" do
462
+ # @klass.instance_eval do
463
+ # define_remote_method :do_stuff, :base_uri => "http://pauldix.net", :method => :put
464
+ # end
465
+ #
466
+ # @klass.should_receive(:put).with("http://pauldix.net", {})
467
+ # @klass.do_stuff
468
+ # end
469
+ #
470
+ # it "should use :get if no method or default_method exists" do
471
+ # @klass.instance_eval do
472
+ # define_remote_method :do_stuff, :base_uri => "http://pauldix.net"
473
+ # end
474
+ #
475
+ # @klass.should_receive(:get).with("http://pauldix.net", {})
476
+ # @klass.do_stuff
477
+ # end
478
+ #
479
+ # it "should use default_method if no method provided" do
480
+ # @klass.instance_eval do
481
+ # remote_defaults :method => :delete
482
+ # define_remote_method :do_stuff, :base_uri => "http://kgb.com"
483
+ # end
484
+ #
485
+ # @klass.should_receive(:delete).with("http://kgb.com", {})
486
+ # @klass.do_stuff
487
+ # end
488
+ #
489
+ # it "should override deafult_method if method argument is provided" do
490
+ # @klass.instance_eval do
491
+ # remote_defaults :method => :put
492
+ # define_remote_method :do_stuff, :base_uri => "http://pauldix.net", :method => :post
493
+ # end
494
+ #
495
+ # @klass.should_receive(:post).with("http://pauldix.net", {})
496
+ # @klass.do_stuff
497
+ # end
498
+ # end
499
+ #
500
+ # describe "on_success" do
501
+ # it "should take :on_success as an argument" do
502
+ # @klass.instance_eval do
503
+ # define_remote_method :do_stuff, :base_uri => "http://localhost:3001", :on_success => lambda {|e| e.code.should == 200; :foo}
504
+ # end
505
+ #
506
+ # @klass.do_stuff.should == :foo
507
+ # end
508
+ #
509
+ # it "should use default_on_success if no on_success provided" do
510
+ # @klass.instance_eval do
511
+ # remote_defaults :on_success => lambda {|e| e.code.should == 200; :foo}
512
+ # define_remote_method :do_stuff, :base_uri => "http://localhost:3001"
513
+ # end
514
+ #
515
+ # @klass.do_stuff.should == :foo
516
+ # end
517
+ #
518
+ # it "should override default_on_success if on_success is provided" do
519
+ # @klass.instance_eval do
520
+ # remote_defaults :on_success => lambda {|e| :foo}
521
+ # define_remote_method :do_stuff, :base_uri => "http://localhost:3001", :on_success => lambda {|e| e.code.should == 200; :bar}
522
+ # end
523
+ #
524
+ # @klass.do_stuff.should == :bar
525
+ # end
526
+ # end
527
+ #
528
+ # describe "on_failure" do
529
+ # it "should take :on_failure as an argument" do
530
+ # @klass.instance_eval do
531
+ # define_remote_method :do_stuff, :base_uri => "http://localhost:9999", :on_failure => lambda {|e| e.code.should == 0; :foo}
532
+ # end
533
+ #
534
+ # @klass.do_stuff.should == :foo
535
+ # end
536
+ #
537
+ # it "should use default_on_failure if no on_success provided" do
538
+ # @klass.instance_eval do
539
+ # remote_defaults :on_failure => lambda {|e| e.code.should == 0; :bar}
540
+ # define_remote_method :do_stuff, :base_uri => "http://localhost:9999"
541
+ # end
542
+ #
543
+ # @klass.do_stuff.should == :bar
544
+ # end
545
+ #
546
+ # it "should override default_on_failure if no method is provided" do
547
+ # @klass.instance_eval do
548
+ # remote_defaults :on_failure => lambda {|e| :foo}
549
+ # define_remote_method :do_stuff, :base_uri => "http://localhost:9999", :on_failure => lambda {|e| e.code.should == 0; :bar}
550
+ # end
551
+ #
552
+ # @klass.do_stuff.should == :bar
553
+ # end
554
+ # end
555
+ #
556
+ # describe "params" do
557
+ # it "should take :params as an argument" do
558
+ # @klass.instance_eval do
559
+ # define_remote_method :do_stuff, :base_uri => "http://localhost:3001", :params => {:foo => :bar}
560
+ # end
561
+ #
562
+ # @klass.do_stuff.body.should include("QUERY_STRING=foo=bar")
563
+ # end
564
+ #
565
+ # it "should add :params from remote method definition with params passed in when called" do
566
+ # @klass.instance_eval do
567
+ # define_remote_method :do_stuff, :base_uri => "http://localhost:3001", :params => {:foo => :bar}
568
+ # end
569
+ #
570
+ # result = @klass.do_stuff(:params => {:asdf => :jkl})
571
+ #
572
+ # # Make this test more robust to hash ordering.
573
+ # query_string = result.body.match(/QUERY_STRING=([^\n]+)/)
574
+ # params = query_string[1].split("&")
575
+ # ["asdf=jkl", "foo=bar"].each do |param|
576
+ # params.should include(param)
577
+ # end
578
+ # end
579
+ # end
580
+ #
581
+ # describe "memoize_responses" do
582
+ # it "should only make one call to the http method and the on_success handler if :memoize_responses => true" do
583
+ # success_mock = mock("success")
584
+ # success_mock.should_receive(:call).exactly(2).times
585
+ #
586
+ # @klass.instance_eval do
587
+ # define_remote_method :do_stuff, :base_uri => "http://localhost:3001", :path => "/:file", :on_success => lambda {|e| success_mock.call; :foo}
588
+ # end
589
+ #
590
+ # first_return_val = @klass.do_stuff(:file => "user.html")
591
+ # second_return_val = @klass.do_stuff(:file => "post.html")
592
+ # third_return_val = @klass.do_stuff(:file => "user.html")
593
+ #
594
+ # first_return_val.should == :foo
595
+ # second_return_val.should == :foo
596
+ # third_return_val.should == :foo
597
+ # end
598
+ #
599
+ # it "should clear memoized responses after a full run" do
600
+ # success_mock = mock("success")
601
+ # success_mock.should_receive(:call).exactly(2).times
602
+ #
603
+ # @klass.instance_eval do
604
+ # define_remote_method :do_stuff, :base_uri => "http://localhost:3001", :path => "/:file", :on_success => lambda {|e| success_mock.call; :foo}
605
+ # end
606
+ #
607
+ # @klass.do_stuff(:file => "user.html").should == :foo
608
+ # @klass.do_stuff(:file => "user.html").should == :foo
609
+ # end
610
+ # end
611
+ #
612
+ # describe "cache_response" do
613
+ # before(:each) do
614
+ # @cache = Class.new do
615
+ # def self.get(key)
616
+ # @cache ||= {}
617
+ # @cache[key]
618
+ # end
619
+ #
620
+ # def self.set(key, value, timeout = 0)
621
+ # @cache ||= {}
622
+ # @cache[key] = value
623
+ # end
624
+ # end
625
+ #
626
+ # @klass.instance_eval do
627
+ # define_remote_method :do_stuff, :base_uri => "http://localhost:3001", :path => "/:file", :cache_responses => true, :on_success => lambda {|e| :foo}
628
+ # end
629
+ # end
630
+ #
631
+ # it "should pull from the cache if :cache_response => true" do
632
+ # @cache.should_receive(:get).and_return(:foo)
633
+ # @klass.cache = @cache
634
+ # Typhoeus.should_receive(:perform_easy_requests).exactly(0).times
635
+ # @klass.do_stuff.should == :foo
636
+ # end
637
+ #
638
+ # it "should only hit the cache once for the same value" do
639
+ # @cache.should_receive(:get).exactly(1).times.and_return(:foo)
640
+ # @klass.cache = @cache
641
+ # Typhoeus.should_receive(:perform_easy_requests).exactly(0).times
642
+ #
643
+ #
644
+ # first = @klass.do_stuff
645
+ # second = @klass.do_stuff
646
+ #
647
+ # first.should == :foo
648
+ # second.should == :foo
649
+ # end
650
+ #
651
+ # it "should only hit the cache once if there is a cache miss (don't check again and again inside the same block)." do
652
+ # @cache.should_receive(:get).exactly(1).times.and_return(nil)
653
+ # @cache.should_receive(:set).exactly(1).times
654
+ # @klass.cache = @cache
655
+ #
656
+ # first = @klass.do_stuff
657
+ # second = @klass.do_stuff
658
+ #
659
+ # first.should == :foo
660
+ # second.should == :foo
661
+ # end
662
+ #
663
+ # it "should store an object in the cache with a set ttl"
664
+ # it "should take a hash with get and set method pointers to enable custom caching behavior"
665
+ # end
666
+ # end # define_remote_method
667
+ #
668
+ # describe "cache_server" do
669
+ # it "should store a cache_server" do
670
+ # @klass.cache = :foo
671
+ # end
672
+ # end
673
+ #
674
+ # describe "get_memcache_resposne_key" do
675
+ # it "should return a key that is an and of the method name, args, and options" do
676
+ # @klass.get_memcache_response_key(:do_stuff, ["foo"]).should == "20630a9d4864c41cbbcb8bd8ac91ab4767e72107b93329aa2e6f5629037392f3"
697
677
  # end
698
678
  # end
679
+ #
680
+ # # describe "multiple with post" do
681
+ # # require 'rubygems'
682
+ # # require 'json'
683
+ # # it "shoudl do stuff" do
684
+ # # @klass.instance_eval do
685
+ # # define_remote_method :post_stuff, :path => "/entries/metas/:meta_id/ids", :base_uri => "http://localhost:4567", :method => :post
686
+ # # define_remote_method :get_stuff, :base_uri => "http://localhost:4567"
687
+ # # end
688
+ # #
689
+ # # Typhoeus.service_access do
690
+ # # @klass.post_stuff("paul-tv", :body => ["foo", "bar"].to_json) {|e| }
691
+ # # @klass.get_stuff {|e| }
692
+ # # end
693
+ # # end
694
+ # # end
699
695
  end