typhoeus 0.4.2 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +8 -0
  3. data/.rspec +4 -0
  4. data/.travis.yml +26 -0
  5. data/CHANGELOG.md +341 -28
  6. data/CONTRIBUTING.md +20 -0
  7. data/Gemfile +31 -2
  8. data/Guardfile +9 -0
  9. data/LICENSE +1 -1
  10. data/README.md +486 -357
  11. data/Rakefile +21 -12
  12. data/UPGRADE.md +55 -0
  13. data/lib/rack/typhoeus/middleware/params_decoder/helper.rb +76 -0
  14. data/lib/rack/typhoeus/middleware/params_decoder.rb +57 -0
  15. data/lib/rack/typhoeus.rb +1 -0
  16. data/lib/typhoeus/adapters/faraday.rb +180 -0
  17. data/lib/typhoeus/cache/dalli.rb +28 -0
  18. data/lib/typhoeus/cache/rails.rb +28 -0
  19. data/lib/typhoeus/cache/redis.rb +35 -0
  20. data/lib/typhoeus/config.rb +69 -0
  21. data/lib/typhoeus/easy_factory.rb +180 -0
  22. data/lib/typhoeus/errors/no_stub.rb +12 -0
  23. data/lib/typhoeus/errors/typhoeus_error.rb +8 -0
  24. data/lib/typhoeus/errors.rb +9 -0
  25. data/lib/typhoeus/expectation.rb +217 -0
  26. data/lib/typhoeus/hydra/addable.rb +23 -0
  27. data/lib/typhoeus/hydra/before.rb +31 -0
  28. data/lib/typhoeus/hydra/block_connection.rb +35 -0
  29. data/lib/typhoeus/hydra/cacheable.rb +15 -0
  30. data/lib/typhoeus/hydra/memoizable.rb +56 -0
  31. data/lib/typhoeus/hydra/queueable.rb +83 -0
  32. data/lib/typhoeus/hydra/runnable.rb +19 -0
  33. data/lib/typhoeus/hydra/stubbable.rb +28 -0
  34. data/lib/typhoeus/hydra.rb +84 -236
  35. data/lib/typhoeus/pool.rb +70 -0
  36. data/lib/typhoeus/railtie.rb +12 -0
  37. data/lib/typhoeus/request/actions.rb +125 -0
  38. data/lib/typhoeus/request/before.rb +30 -0
  39. data/lib/typhoeus/request/block_connection.rb +52 -0
  40. data/lib/typhoeus/request/cacheable.rb +38 -0
  41. data/lib/typhoeus/request/callbacks.rb +151 -0
  42. data/lib/typhoeus/request/marshal.rb +22 -0
  43. data/lib/typhoeus/request/memoizable.rb +38 -0
  44. data/lib/typhoeus/request/operations.rb +40 -0
  45. data/lib/typhoeus/request/responseable.rb +29 -0
  46. data/lib/typhoeus/request/streamable.rb +34 -0
  47. data/lib/typhoeus/request/stubbable.rb +30 -0
  48. data/lib/typhoeus/request.rb +186 -231
  49. data/lib/typhoeus/response/cacheable.rb +14 -0
  50. data/lib/typhoeus/response/header.rb +105 -0
  51. data/lib/typhoeus/response/informations.rb +248 -0
  52. data/lib/typhoeus/response/status.rb +106 -0
  53. data/lib/typhoeus/response.rb +60 -115
  54. data/lib/typhoeus/version.rb +3 -1
  55. data/lib/typhoeus.rb +126 -39
  56. data/perf/profile.rb +14 -0
  57. data/perf/vs_nethttp.rb +64 -0
  58. data/spec/rack/typhoeus/middleware/params_decoder/helper_spec.rb +156 -0
  59. data/spec/rack/typhoeus/middleware/params_decoder_spec.rb +31 -0
  60. data/spec/spec_helper.rb +29 -0
  61. data/spec/support/localhost_server.rb +94 -0
  62. data/spec/support/memory_cache.rb +15 -0
  63. data/spec/support/server.rb +116 -0
  64. data/spec/typhoeus/adapters/faraday_spec.rb +339 -0
  65. data/spec/typhoeus/cache/dalli_spec.rb +41 -0
  66. data/spec/typhoeus/cache/redis_spec.rb +41 -0
  67. data/spec/typhoeus/config_spec.rb +15 -0
  68. data/spec/typhoeus/easy_factory_spec.rb +143 -0
  69. data/spec/typhoeus/errors/no_stub_spec.rb +13 -0
  70. data/spec/typhoeus/expectation_spec.rb +280 -0
  71. data/spec/typhoeus/hydra/addable_spec.rb +22 -0
  72. data/spec/typhoeus/hydra/before_spec.rb +98 -0
  73. data/spec/typhoeus/hydra/block_connection_spec.rb +18 -0
  74. data/spec/typhoeus/hydra/cacheable_spec.rb +88 -0
  75. data/spec/typhoeus/hydra/memoizable_spec.rb +53 -0
  76. data/spec/typhoeus/hydra/queueable_spec.rb +98 -0
  77. data/spec/typhoeus/hydra/runnable_spec.rb +137 -0
  78. data/spec/typhoeus/hydra/stubbable_spec.rb +48 -0
  79. data/spec/typhoeus/hydra_spec.rb +22 -0
  80. data/spec/typhoeus/pool_spec.rb +137 -0
  81. data/spec/typhoeus/request/actions_spec.rb +19 -0
  82. data/spec/typhoeus/request/before_spec.rb +93 -0
  83. data/spec/typhoeus/request/block_connection_spec.rb +75 -0
  84. data/spec/typhoeus/request/cacheable_spec.rb +94 -0
  85. data/spec/typhoeus/request/callbacks_spec.rb +91 -0
  86. data/spec/typhoeus/request/marshal_spec.rb +60 -0
  87. data/spec/typhoeus/request/memoizable_spec.rb +34 -0
  88. data/spec/typhoeus/request/operations_spec.rb +101 -0
  89. data/spec/typhoeus/request/responseable_spec.rb +13 -0
  90. data/spec/typhoeus/request/stubbable_spec.rb +45 -0
  91. data/spec/typhoeus/request_spec.rb +232 -0
  92. data/spec/typhoeus/response/header_spec.rb +147 -0
  93. data/spec/typhoeus/response/informations_spec.rb +283 -0
  94. data/spec/typhoeus/response/status_spec.rb +256 -0
  95. data/spec/typhoeus/response_spec.rb +100 -0
  96. data/spec/typhoeus_spec.rb +105 -0
  97. data/typhoeus.gemspec +25 -0
  98. metadata +146 -158
  99. data/lib/typhoeus/curl.rb +0 -453
  100. data/lib/typhoeus/easy/auth.rb +0 -14
  101. data/lib/typhoeus/easy/callbacks.rb +0 -33
  102. data/lib/typhoeus/easy/ffi_helper.rb +0 -61
  103. data/lib/typhoeus/easy/infos.rb +0 -90
  104. data/lib/typhoeus/easy/options.rb +0 -115
  105. data/lib/typhoeus/easy/proxy.rb +0 -20
  106. data/lib/typhoeus/easy/ssl.rb +0 -82
  107. data/lib/typhoeus/easy.rb +0 -115
  108. data/lib/typhoeus/filter.rb +0 -28
  109. data/lib/typhoeus/form.rb +0 -61
  110. data/lib/typhoeus/header.rb +0 -54
  111. data/lib/typhoeus/hydra/callbacks.rb +0 -24
  112. data/lib/typhoeus/hydra/connect_options.rb +0 -61
  113. data/lib/typhoeus/hydra/stubbing.rb +0 -68
  114. data/lib/typhoeus/hydra_mock.rb +0 -131
  115. data/lib/typhoeus/multi.rb +0 -146
  116. data/lib/typhoeus/param_processor.rb +0 -43
  117. data/lib/typhoeus/remote.rb +0 -306
  118. data/lib/typhoeus/remote_method.rb +0 -108
  119. data/lib/typhoeus/remote_proxy_object.rb +0 -50
  120. data/lib/typhoeus/utils.rb +0 -50
@@ -0,0 +1,339 @@
1
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("1.9.0")
2
+ require 'spec_helper'
3
+ require 'typhoeus/adapters/faraday'
4
+
5
+ describe Faraday::Adapter::Typhoeus do
6
+ let(:base_url) { "http://localhost:3001" }
7
+ let(:adapter) { described_class.new(nil) }
8
+ let(:request) { Typhoeus::Request.new(base_url) }
9
+ let(:conn) do
10
+ Faraday.new(:url => base_url) do |faraday|
11
+ faraday.adapter :typhoeus
12
+ end
13
+ end
14
+ let(:response) { conn.get("/") }
15
+
16
+ context "when parallel" do
17
+ it "returns a faraday response" do
18
+ response = nil
19
+ conn.in_parallel { response = conn.get("/") }
20
+ expect(response).to be_a(Faraday::Response)
21
+ end
22
+
23
+ it "succeeds" do
24
+ response = nil
25
+ conn.in_parallel { response = conn.get("/") }
26
+ expect(response.status).to be(200)
27
+ end
28
+ end
29
+
30
+ context "when not parallel" do
31
+ it "returns a faraday response" do
32
+ expect(response).to be_a(Faraday::Response)
33
+ end
34
+
35
+ it "succeeds" do
36
+ expect(response.status).to be(200)
37
+ end
38
+ end
39
+
40
+ context "when a response is stubbed" do
41
+ before do
42
+ stub = Typhoeus::Response.new \
43
+ :code => 200,
44
+ :headers => { "Foo" => "2", "Bar" => "3" },
45
+ :body => "Hello",
46
+ :mock => true
47
+
48
+ Typhoeus.stub(base_url + '/').and_return(stub)
49
+ end
50
+
51
+ it 'stubs the status code' do
52
+ expect(response.status).to eq(200)
53
+ end
54
+
55
+ it 'stubs the response body' do
56
+ expect(response.body).to eq("Hello")
57
+ end
58
+
59
+ it 'stubs the headers' do
60
+ expect(response.headers).to eq("Foo" => "2", "Bar" => "3")
61
+ end
62
+ end
63
+
64
+ describe "#initialize" do
65
+ let(:request) { adapter.method(:typhoeus_request).call({}) }
66
+
67
+ context "when typhoeus request options specified" do
68
+ let(:adapter) { described_class.new(nil, { :forbid_reuse => true, :maxredirs => 1 }) }
69
+
70
+ it "should set option for request" do
71
+ expect(request.options[:forbid_reuse]).to be_truthy
72
+ expect(request.options[:maxredirs]).to eq(1)
73
+ end
74
+ end
75
+ end
76
+
77
+ describe "#perform_request" do
78
+ let(:env) { {} }
79
+
80
+ context "when body" do
81
+ let(:env) { { :body => double(:read => "body") } }
82
+
83
+ it "reads body" do
84
+ expect(adapter.method(:read_body).call(env)).to eq("body")
85
+ end
86
+ end
87
+
88
+ context "parallel_manager" do
89
+ context "when given" do
90
+ let(:env) { { :parallel_manager => double(:queue => true), :ssl => {}, :request => {} } }
91
+
92
+ it "uses" do
93
+ adapter.method(:perform_request).call(env)
94
+ end
95
+ end
96
+
97
+ context "when not given" do
98
+ let(:env) { { :method => :get, :ssl => {}, :request => {} } }
99
+
100
+ it "falls back to single" do
101
+ expect(Typhoeus::Request).to receive(:new).and_return(double(:options => {}, :on_complete => [], :run => true))
102
+ adapter.method(:perform_request).call(env)
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ describe "#request" do
109
+ let(:env) do
110
+ { :url => "url", :method => :get, :body => "body", :request_headers => {}, :ssl => {}, :request => {} }
111
+ end
112
+
113
+ let(:request) { adapter.method(:request).call(env) }
114
+
115
+ it "returns request" do
116
+ expect(request).to be_a(Typhoeus::Request)
117
+ end
118
+
119
+ it "sets url" do
120
+ expect(request.base_url).to eq("url")
121
+ end
122
+
123
+ it "sets http method" do
124
+ expect(request.original_options[:method]).to eq(:get)
125
+ end
126
+
127
+ it "sets body" do
128
+ expect(request.original_options[:body]).to eq("body")
129
+ end
130
+
131
+ it "sets headers" do
132
+ expect(request.original_options[:headers]).to eq({})
133
+ end
134
+
135
+ it "sets on_complete callback" do
136
+ expect(request.on_complete.size).to eq(1)
137
+ end
138
+ end
139
+
140
+ context "when the connection failed" do
141
+ before do
142
+ stub = Typhoeus::Response.new \
143
+ :response_code => 0,
144
+ :return_code => 0,
145
+ :mock => true
146
+
147
+ Typhoeus.stub(base_url + '/').and_return(stub)
148
+ end
149
+
150
+ context "when parallel" do
151
+ it "isn't successful" do
152
+ response = nil
153
+ conn.in_parallel { response = conn.get("/") }
154
+ expect(response.success?).to be_falsey
155
+ end
156
+
157
+ it "translates the response code into an error message" do
158
+ response = nil
159
+ conn.in_parallel { response = conn.get("/") }
160
+ expect(response.env[:typhoeus_return_message]).to eq("No error")
161
+ end
162
+ end
163
+
164
+ context "when not parallel" do
165
+ it "raises an error" do
166
+ expect { conn.get("/") }.to raise_error(Faraday::ConnectionFailed, "No error")
167
+ end
168
+ end
169
+ end
170
+
171
+ describe "#configure_socket" do
172
+ let(:env) { { :request => { :bind => { :host => "interface" } } } }
173
+
174
+ before { adapter.method(:configure_socket).call(request, env) }
175
+
176
+ context "when host" do
177
+ it "sets interface" do
178
+ expect(request.options[:interface]).to eq("interface")
179
+ end
180
+ end
181
+ end
182
+
183
+ describe "#configure_timeout" do
184
+ before { adapter.method(:configure_timeout).call(request, env) }
185
+
186
+ context "when timeout" do
187
+ let(:env) { { :request => { :timeout => 1 } } }
188
+
189
+ it "sets timeout_ms" do
190
+ expect(request.options[:timeout_ms]).to eq(1000)
191
+ end
192
+ end
193
+
194
+ context "when open_timeout" do
195
+ let(:env) { { :request => { :open_timeout => 1 } } }
196
+
197
+ it "sets connecttimeout_ms" do
198
+ expect(request.options[:connecttimeout_ms]).to eq(1000)
199
+ end
200
+ end
201
+ end
202
+
203
+ describe "#configure_proxy" do
204
+ before { adapter.method(:configure_proxy).call(request, env) }
205
+
206
+ context "when proxy" do
207
+ let(:env) { { :request => { :proxy => { :uri => double(:scheme => 'http', :host => "localhost", :port => "3001") } } } }
208
+
209
+ it "sets proxy" do
210
+ expect(request.options[:proxy]).to eq("http://localhost:3001")
211
+ end
212
+
213
+ context "when username and password" do
214
+ let(:env) do
215
+ { :request => { :proxy => {
216
+ :uri => double(:scheme => 'http', :host => :a, :port => :b),
217
+ :user => "a",
218
+ :password => "b"
219
+ } } }
220
+ end
221
+
222
+ it "sets proxyuserpwd" do
223
+ expect(request.options[:proxyuserpwd]).to eq("a:b")
224
+ end
225
+ end
226
+ end
227
+ end
228
+
229
+ describe "#configure_ssl" do
230
+ before { adapter.method(:configure_ssl).call(request, env) }
231
+
232
+ context "when version" do
233
+ let(:env) { { :ssl => { :version => "a" } } }
234
+
235
+ it "sets sslversion" do
236
+ expect(request.options[:sslversion]).to eq("a")
237
+ end
238
+ end
239
+
240
+ context "when client_cert" do
241
+ let(:env) { { :ssl => { :client_cert => "a" } } }
242
+
243
+ it "sets sslcert" do
244
+ expect(request.options[:sslcert]).to eq("a")
245
+ end
246
+ end
247
+
248
+ context "when client_key" do
249
+ let(:env) { { :ssl => { :client_key => "a" } } }
250
+
251
+ it "sets sslkey" do
252
+ expect(request.options[:sslkey]).to eq("a")
253
+ end
254
+ end
255
+
256
+ context "when ca_file" do
257
+ let(:env) { { :ssl => { :ca_file => "a" } } }
258
+
259
+ it "sets cainfo" do
260
+ expect(request.options[:cainfo]).to eq("a")
261
+ end
262
+ end
263
+
264
+ context "when ca_path" do
265
+ let(:env) { { :ssl => { :ca_path => "a" } } }
266
+
267
+ it "sets capath" do
268
+ expect(request.options[:capath]).to eq("a")
269
+ end
270
+ end
271
+
272
+ context "when client_cert_passwd" do
273
+ let(:env) { { :ssl => { :client_cert_passwd => "a" } } }
274
+
275
+ it "sets keypasswd to the value of client_cert_passwd" do
276
+ expect(request.options[:keypasswd]).to eq("a")
277
+ end
278
+ end
279
+
280
+ context "when client_certificate_password" do
281
+ let(:env) { { :ssl => { :client_certificate_password => "a" } } }
282
+
283
+ it "sets keypasswd to the value of client_cert_passwd" do
284
+ expect(request.options[:keypasswd]).to eq("a")
285
+ end
286
+ end
287
+
288
+ context "when no client_cert_passwd" do
289
+ let(:env) { { :ssl => { } } }
290
+
291
+ it "does not set keypasswd on options" do
292
+ expect(request.options).not_to have_key :keypasswd
293
+ end
294
+ end
295
+
296
+ context "when verify is false" do
297
+ let(:env) { { :ssl => { :verify => false } } }
298
+
299
+ it "sets ssl_verifyhost to 0" do
300
+ expect(request.options[:ssl_verifyhost]).to eq(0)
301
+ end
302
+
303
+ it "sets ssl_verifypeer to false" do
304
+ expect(request.options[:ssl_verifypeer]).to be_falsey
305
+ end
306
+ end
307
+
308
+ context "when verify is true" do
309
+ let(:env) { { :ssl => { :verify => true } } }
310
+
311
+ it "sets ssl_verifyhost to 2" do
312
+ expect(request.options[:ssl_verifyhost]).to eq(2)
313
+ end
314
+
315
+ it "sets ssl_verifypeer to true" do
316
+ expect(request.options[:ssl_verifypeer]).to be_truthy
317
+ end
318
+ end
319
+ end
320
+
321
+ describe "#parallel?" do
322
+ context "when parallel_manager" do
323
+ let(:env) { { :parallel_manager => true } }
324
+
325
+ it "returns true" do
326
+ expect(adapter.method(:parallel?).call(env)).to be_truthy
327
+ end
328
+ end
329
+
330
+ context "when no parallel_manager" do
331
+ let(:env) { { :parallel_manager => nil } }
332
+
333
+ it "returns false" do
334
+ expect(adapter.method(:parallel?).call(env)).to be_falsey
335
+ end
336
+ end
337
+ end
338
+ end
339
+ end
@@ -0,0 +1,41 @@
1
+ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("1.9.0")
2
+ require 'dalli'
3
+ require 'typhoeus/cache/dalli'
4
+ require 'spec_helper'
5
+
6
+ describe Typhoeus::Cache::Dalli do
7
+ let(:dalli) { instance_double(Dalli::Client) }
8
+ let(:cache) { Typhoeus::Cache::Dalli.new(dalli) }
9
+
10
+ let(:base_url) { "localhost:3001" }
11
+ let(:request) { Typhoeus::Request.new(base_url, {:method => :get}) }
12
+ let(:response) { Typhoeus::Response.new(:response_code => 0, :return_code => 0, :mock => true) }
13
+
14
+ describe "#set" do
15
+ it "sends the request to Dalli" do
16
+ expect(dalli).to receive(:set).with(request.cache_key, response, nil)
17
+
18
+ cache.set(request, response)
19
+ end
20
+ end
21
+
22
+ describe "#get" do
23
+ it "returns nil when the key is not in the cache" do
24
+ expect(dalli).to receive(:get).with(request.cache_key).and_return(nil)
25
+
26
+ expect(cache.get(request)).to be_nil
27
+ end
28
+
29
+ it "returns the cached response when the key is in cache" do
30
+ expect(dalli).to receive(:get).with(request.cache_key).and_return(response)
31
+
32
+ result = cache.get(request)
33
+ expect(result).to_not be_nil
34
+ expect(result.response_code).to eq(response.response_code)
35
+ expect(result.return_code).to eq(response.return_code)
36
+ expect(result.headers).to eq(response.headers)
37
+ expect(result.body).to eq(response.body)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,41 @@
1
+ require 'redis'
2
+ require 'typhoeus/cache/redis'
3
+ require 'spec_helper'
4
+
5
+ describe Typhoeus::Cache::Redis do
6
+ let(:redis) { instance_double(Redis) }
7
+ let(:cache) { Typhoeus::Cache::Redis.new(redis) }
8
+
9
+ let(:base_url) { "localhost:3001" }
10
+ let(:request) { Typhoeus::Request.new(base_url, {:method => :get}) }
11
+ let(:response) { Typhoeus::Response.new(:response_code => 0, :return_code => 0, :mock => true) }
12
+ let(:serialized_response) { Marshal.dump(response) }
13
+
14
+ describe "#set" do
15
+ it "sends the serialized request to Redis" do
16
+ expect(redis).to receive(:set).with(request.cache_key, serialized_response)
17
+ expect(redis).to_not receive(:expire).with(request.cache_key, request.cache_ttl)
18
+
19
+ cache.set(request, response)
20
+ end
21
+ end
22
+
23
+ describe "#get" do
24
+ it "returns nil when the key is not in Redis" do
25
+ expect(redis).to receive(:get).with(request.cache_key).and_return(nil)
26
+
27
+ expect(cache.get(request)).to be_nil
28
+ end
29
+
30
+ it "returns the cached response when the key is in Redis" do
31
+ expect(redis).to receive(:get).with(request.cache_key).and_return(serialized_response)
32
+
33
+ result = cache.get(request)
34
+ expect(result).to_not be_nil
35
+ expect(result.response_code).to eq(response.response_code)
36
+ expect(result.return_code).to eq(response.return_code)
37
+ expect(result.headers).to eq(response.headers)
38
+ expect(result.body).to eq(response.body)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Typhoeus::Config do
4
+ let(:config) { Typhoeus::Config }
5
+
6
+ [:block_connection, :memoize, :verbose, :cache, :user_agent, :proxy].each do |name|
7
+ it "responds to #{name}" do
8
+ expect(config).to respond_to(name)
9
+ end
10
+
11
+ it "responds to #{name}=" do
12
+ expect(config).to respond_to("#{name}=")
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,143 @@
1
+ require 'spec_helper'
2
+
3
+ describe Typhoeus::EasyFactory do
4
+ let(:base_url) { "http://localhost:3001" }
5
+ let(:hydra) { Typhoeus::Hydra.new(:max_concurrency => 1) }
6
+ let(:options) { {} }
7
+ let(:request) { Typhoeus::Request.new(base_url, options) }
8
+ let(:easy_factory) { described_class.new(request, hydra) }
9
+
10
+ describe "#get" do
11
+ context "when option[:cache_ttl]" do
12
+ let(:options) { {:cache_ttl => 1} }
13
+
14
+ it "creates Ethon::Easy" do
15
+ expect(easy_factory.get).to be_a(Ethon::Easy)
16
+ end
17
+ end
18
+
19
+ context "timeouts" do
20
+ it "sets nosignal to true by default" do
21
+ expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:nosignal => true))
22
+ easy_factory.get
23
+ end
24
+
25
+ context "when timeout is not a whole number and timeout_ms is not set" do
26
+ let(:options) { {:timeout => 0.1} }
27
+ it "ceils timeout and sets timeout_ms" do
28
+ expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:timeout_ms => 100, :timeout => 1))
29
+ easy_factory.get
30
+ end
31
+ end
32
+
33
+ context "when timeout is not a whole number and timeout_ms is set" do
34
+ let(:options) { {:timeout => 0.1, :timeout_ms => 123} }
35
+ it "ceils timeout and does not change timeout_ms" do
36
+ expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:timeout_ms => 123, :timeout => 1))
37
+ easy_factory.get
38
+ end
39
+ end
40
+
41
+ context "when connecttimeout is not a whole number and connecttimeout_ms is not set" do
42
+ let(:options) { {:connecttimeout => 0.1} }
43
+ it "ceils connecttimeout and sets connecttimeout_ms" do
44
+ expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:connecttimeout_ms => 100, :connecttimeout => 1))
45
+ easy_factory.get
46
+ end
47
+ end
48
+
49
+ context "when connecttimeout is not a whole number and connecttimeout_ms is set" do
50
+ let(:options) { {:connecttimeout => 0.1, :connecttimeout_ms => 123} }
51
+ it "ceils connecttimeout and does not change connecttimeout_ms" do
52
+ expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:connecttimeout_ms => 123, :connecttimeout => 1))
53
+ easy_factory.get
54
+ end
55
+ end
56
+
57
+
58
+ end
59
+
60
+ context "when invalid option" do
61
+ let(:options) { {:invalid => 1} }
62
+
63
+ it "reraises" do
64
+ expect{ easy_factory.get }.to raise_error(Ethon::Errors::InvalidOption)
65
+ end
66
+ end
67
+
68
+ context "when removed option" do
69
+ let(:options) { {:cache_timeout => 1} }
70
+
71
+ it "reraises with help" do
72
+ expect{ easy_factory.get }.to raise_error(
73
+ Ethon::Errors::InvalidOption, /The option cache_timeout was removed/
74
+ )
75
+ end
76
+ end
77
+
78
+ context "when changed option" do
79
+ let(:options) { {:proxy_auth_method => 1} }
80
+
81
+ it "reraises with help" do
82
+ expect{ easy_factory.get }.to raise_error(
83
+ Ethon::Errors::InvalidOption, /Please try proxyauth instead of proxy_auth_method/
84
+ )
85
+ end
86
+ end
87
+
88
+ context "when renamed option" do
89
+ let(:options) { {:connect_timeout => 1} }
90
+
91
+ it "warns" do
92
+ expect(easy_factory).to receive(:warn).with(
93
+ "Deprecated option connect_timeout. Please use connecttimeout instead."
94
+ )
95
+ easy_factory.get
96
+ end
97
+
98
+ it "passes correct option" do
99
+ expect(easy_factory).to receive(:warn)
100
+ expect(easy_factory.easy).to receive(:connecttimeout=).with(1)
101
+ easy_factory.get
102
+ end
103
+ end
104
+ end
105
+
106
+ describe "#set_callback" do
107
+ it "sets easy.on_progress callback when an on_progress callback is provided" do
108
+ request.on_progress { 1 }
109
+ expect(easy_factory.easy).to receive(:on_progress)
110
+ easy_factory.send(:set_callback)
111
+ end
112
+
113
+ it "sets easy.on_complete callback" do
114
+ expect(easy_factory.easy).to receive(:on_complete)
115
+ easy_factory.send(:set_callback)
116
+ end
117
+
118
+ it "finishes request" do
119
+ easy_factory.send(:set_callback)
120
+ expect(request).to receive(:finish)
121
+ easy_factory.easy.complete
122
+ end
123
+
124
+ it "resets easy" do
125
+ easy_factory.send(:set_callback)
126
+ expect(easy_factory.easy).to receive(:reset)
127
+ easy_factory.easy.complete
128
+ end
129
+
130
+ it "pushes easy back into the pool" do
131
+ easy_factory.send(:set_callback)
132
+ easy_factory.easy.complete
133
+ expect(Typhoeus::Pool.send(:easies)).to include(easy_factory.easy)
134
+ end
135
+
136
+ it "adds next request" do
137
+ easy_factory.hydra.instance_variable_set(:@queued_requests, [request])
138
+ expect(easy_factory.hydra).to receive(:add).with(request)
139
+ easy_factory.send(:set_callback)
140
+ easy_factory.easy.complete
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Typhoeus::Errors::NoStub do
4
+ let(:base_url) { "localhost:3001" }
5
+ let(:request) { Typhoeus::Request.new(base_url) }
6
+ let(:message) { "The connection is blocked and no stub defined: " }
7
+
8
+ subject { Typhoeus::Errors::NoStub }
9
+
10
+ it "displays the request url" do
11
+ expect { raise subject.new(request) }.to raise_error(subject, message + base_url)
12
+ end
13
+ end