typhoeus 0.4.2 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/.rspec +4 -0
- data/.travis.yml +26 -0
- data/CHANGELOG.md +341 -28
- data/CONTRIBUTING.md +20 -0
- data/Gemfile +31 -2
- data/Guardfile +9 -0
- data/LICENSE +1 -1
- data/README.md +486 -357
- data/Rakefile +21 -12
- data/UPGRADE.md +55 -0
- data/lib/rack/typhoeus/middleware/params_decoder/helper.rb +76 -0
- data/lib/rack/typhoeus/middleware/params_decoder.rb +57 -0
- data/lib/rack/typhoeus.rb +1 -0
- data/lib/typhoeus/adapters/faraday.rb +180 -0
- data/lib/typhoeus/cache/dalli.rb +28 -0
- data/lib/typhoeus/cache/rails.rb +28 -0
- data/lib/typhoeus/cache/redis.rb +35 -0
- data/lib/typhoeus/config.rb +69 -0
- data/lib/typhoeus/easy_factory.rb +180 -0
- data/lib/typhoeus/errors/no_stub.rb +12 -0
- data/lib/typhoeus/errors/typhoeus_error.rb +8 -0
- data/lib/typhoeus/errors.rb +9 -0
- data/lib/typhoeus/expectation.rb +217 -0
- data/lib/typhoeus/hydra/addable.rb +23 -0
- data/lib/typhoeus/hydra/before.rb +31 -0
- data/lib/typhoeus/hydra/block_connection.rb +35 -0
- data/lib/typhoeus/hydra/cacheable.rb +15 -0
- data/lib/typhoeus/hydra/memoizable.rb +56 -0
- data/lib/typhoeus/hydra/queueable.rb +83 -0
- data/lib/typhoeus/hydra/runnable.rb +19 -0
- data/lib/typhoeus/hydra/stubbable.rb +28 -0
- data/lib/typhoeus/hydra.rb +84 -236
- data/lib/typhoeus/pool.rb +70 -0
- data/lib/typhoeus/railtie.rb +12 -0
- data/lib/typhoeus/request/actions.rb +125 -0
- data/lib/typhoeus/request/before.rb +30 -0
- data/lib/typhoeus/request/block_connection.rb +52 -0
- data/lib/typhoeus/request/cacheable.rb +38 -0
- data/lib/typhoeus/request/callbacks.rb +151 -0
- data/lib/typhoeus/request/marshal.rb +22 -0
- data/lib/typhoeus/request/memoizable.rb +38 -0
- data/lib/typhoeus/request/operations.rb +40 -0
- data/lib/typhoeus/request/responseable.rb +29 -0
- data/lib/typhoeus/request/streamable.rb +34 -0
- data/lib/typhoeus/request/stubbable.rb +30 -0
- data/lib/typhoeus/request.rb +186 -231
- data/lib/typhoeus/response/cacheable.rb +14 -0
- data/lib/typhoeus/response/header.rb +105 -0
- data/lib/typhoeus/response/informations.rb +248 -0
- data/lib/typhoeus/response/status.rb +106 -0
- data/lib/typhoeus/response.rb +60 -115
- data/lib/typhoeus/version.rb +3 -1
- data/lib/typhoeus.rb +126 -39
- data/perf/profile.rb +14 -0
- data/perf/vs_nethttp.rb +64 -0
- data/spec/rack/typhoeus/middleware/params_decoder/helper_spec.rb +156 -0
- data/spec/rack/typhoeus/middleware/params_decoder_spec.rb +31 -0
- data/spec/spec_helper.rb +29 -0
- data/spec/support/localhost_server.rb +94 -0
- data/spec/support/memory_cache.rb +15 -0
- data/spec/support/server.rb +116 -0
- data/spec/typhoeus/adapters/faraday_spec.rb +339 -0
- data/spec/typhoeus/cache/dalli_spec.rb +41 -0
- data/spec/typhoeus/cache/redis_spec.rb +41 -0
- data/spec/typhoeus/config_spec.rb +15 -0
- data/spec/typhoeus/easy_factory_spec.rb +143 -0
- data/spec/typhoeus/errors/no_stub_spec.rb +13 -0
- data/spec/typhoeus/expectation_spec.rb +280 -0
- data/spec/typhoeus/hydra/addable_spec.rb +22 -0
- data/spec/typhoeus/hydra/before_spec.rb +98 -0
- data/spec/typhoeus/hydra/block_connection_spec.rb +18 -0
- data/spec/typhoeus/hydra/cacheable_spec.rb +88 -0
- data/spec/typhoeus/hydra/memoizable_spec.rb +53 -0
- data/spec/typhoeus/hydra/queueable_spec.rb +98 -0
- data/spec/typhoeus/hydra/runnable_spec.rb +137 -0
- data/spec/typhoeus/hydra/stubbable_spec.rb +48 -0
- data/spec/typhoeus/hydra_spec.rb +22 -0
- data/spec/typhoeus/pool_spec.rb +137 -0
- data/spec/typhoeus/request/actions_spec.rb +19 -0
- data/spec/typhoeus/request/before_spec.rb +93 -0
- data/spec/typhoeus/request/block_connection_spec.rb +75 -0
- data/spec/typhoeus/request/cacheable_spec.rb +94 -0
- data/spec/typhoeus/request/callbacks_spec.rb +91 -0
- data/spec/typhoeus/request/marshal_spec.rb +60 -0
- data/spec/typhoeus/request/memoizable_spec.rb +34 -0
- data/spec/typhoeus/request/operations_spec.rb +101 -0
- data/spec/typhoeus/request/responseable_spec.rb +13 -0
- data/spec/typhoeus/request/stubbable_spec.rb +45 -0
- data/spec/typhoeus/request_spec.rb +232 -0
- data/spec/typhoeus/response/header_spec.rb +147 -0
- data/spec/typhoeus/response/informations_spec.rb +283 -0
- data/spec/typhoeus/response/status_spec.rb +256 -0
- data/spec/typhoeus/response_spec.rb +100 -0
- data/spec/typhoeus_spec.rb +105 -0
- data/typhoeus.gemspec +25 -0
- metadata +146 -158
- data/lib/typhoeus/curl.rb +0 -453
- data/lib/typhoeus/easy/auth.rb +0 -14
- data/lib/typhoeus/easy/callbacks.rb +0 -33
- data/lib/typhoeus/easy/ffi_helper.rb +0 -61
- data/lib/typhoeus/easy/infos.rb +0 -90
- data/lib/typhoeus/easy/options.rb +0 -115
- data/lib/typhoeus/easy/proxy.rb +0 -20
- data/lib/typhoeus/easy/ssl.rb +0 -82
- data/lib/typhoeus/easy.rb +0 -115
- data/lib/typhoeus/filter.rb +0 -28
- data/lib/typhoeus/form.rb +0 -61
- data/lib/typhoeus/header.rb +0 -54
- data/lib/typhoeus/hydra/callbacks.rb +0 -24
- data/lib/typhoeus/hydra/connect_options.rb +0 -61
- data/lib/typhoeus/hydra/stubbing.rb +0 -68
- data/lib/typhoeus/hydra_mock.rb +0 -131
- data/lib/typhoeus/multi.rb +0 -146
- data/lib/typhoeus/param_processor.rb +0 -43
- data/lib/typhoeus/remote.rb +0 -306
- data/lib/typhoeus/remote_method.rb +0 -108
- data/lib/typhoeus/remote_proxy_object.rb +0 -50
- 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
|