pauldix-typhoeus 0.0.12 → 0.0.13
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.
- data/lib/typhoeus/remote.rb +66 -13
- data/lib/typhoeus/remote_proxy_object.rb +7 -2
- data/lib/typhoeus/response.rb +11 -7
- data/lib/typhoeus.rb +1 -1
- data/spec/typhoeus/remote_proxy_object_spec.rb +7 -1
- data/spec/typhoeus/remote_spec.rb +68 -3
- data/spec/typhoeus/response_spec.rb +15 -5
- metadata +3 -2
data/lib/typhoeus/remote.rb
CHANGED
@@ -4,8 +4,19 @@ module Typhoeus
|
|
4
4
|
def self.included(base)
|
5
5
|
base.extend ClassMethods
|
6
6
|
end
|
7
|
+
|
8
|
+
class MockExpectedError < StandardError; end
|
7
9
|
|
8
10
|
module ClassMethods
|
11
|
+
def allow_net_connect
|
12
|
+
@allow_net_connect = true if @allow_net_connect.nil?
|
13
|
+
@allow_net_connect
|
14
|
+
end
|
15
|
+
|
16
|
+
def allow_net_connect=(value)
|
17
|
+
@allow_net_connect = value
|
18
|
+
end
|
19
|
+
|
9
20
|
def mock(method, args = {})
|
10
21
|
@remote_mocks ||= {}
|
11
22
|
@remote_mocks[method] ||= {}
|
@@ -21,10 +32,18 @@ module Typhoeus
|
|
21
32
|
def get_mock(method, url, options)
|
22
33
|
return nil unless @remote_mocks
|
23
34
|
if @remote_mocks.has_key? method
|
35
|
+
extra_response_args = { :requested_http_method => method,
|
36
|
+
:requested_url => url }
|
24
37
|
if @remote_mocks[method].has_key? url
|
25
|
-
get_mock_and_run_handlers(method,
|
38
|
+
get_mock_and_run_handlers(method,
|
39
|
+
@remote_mocks[method][url].merge(
|
40
|
+
extra_response_args),
|
41
|
+
options)
|
26
42
|
elsif @remote_mocks[method].has_key? :catch_all
|
27
|
-
get_mock_and_run_handlers(method,
|
43
|
+
get_mock_and_run_handlers(method,
|
44
|
+
@remote_mocks[method][:catch_all].merge(
|
45
|
+
extra_response_args),
|
46
|
+
options)
|
28
47
|
else
|
29
48
|
nil
|
30
49
|
end
|
@@ -32,9 +51,19 @@ module Typhoeus
|
|
32
51
|
nil
|
33
52
|
end
|
34
53
|
end
|
54
|
+
|
55
|
+
def enforce_allow_net_connect!(http_verb, url)
|
56
|
+
if !allow_net_connect
|
57
|
+
raise MockExpectedError,
|
58
|
+
"Real HTTP connections are disabled. Unregistered request: " <<
|
59
|
+
"#{http_verb.to_s.upcase} #{url}\n" <<
|
60
|
+
" Try: mock(:#{http_verb}, :url => \"#{url}\")"
|
61
|
+
end
|
62
|
+
end
|
35
63
|
|
36
64
|
def get_mock_and_run_handlers(method, response_args, options)
|
37
|
-
response = Response.new(response_args
|
65
|
+
response = Response.new(response_args)
|
66
|
+
|
38
67
|
if response_args.has_key? :expected_body
|
39
68
|
raise "#{method} expected body of \"#{response_args[:expected_body]}\" but received #{options[:body]}" if response_args[:expected_body] != options[:body]
|
40
69
|
end
|
@@ -53,26 +82,42 @@ module Typhoeus
|
|
53
82
|
|
54
83
|
def get(url, options = {})
|
55
84
|
mock_object = get_mock(:get, url, options)
|
56
|
-
|
57
|
-
|
85
|
+
unless mock_object.nil?
|
86
|
+
mock_object
|
87
|
+
else
|
88
|
+
enforce_allow_net_connect!(:get, url)
|
89
|
+
remote_proxy_object(url, :get, options)
|
90
|
+
end
|
58
91
|
end
|
59
92
|
|
60
93
|
def post(url, options = {}, &block)
|
61
94
|
mock_object = get_mock(:post, url, options)
|
62
|
-
|
63
|
-
|
95
|
+
unless mock_object.nil?
|
96
|
+
mock_object
|
97
|
+
else
|
98
|
+
enforce_allow_net_connect!(:post, url)
|
99
|
+
remote_proxy_object(url, :post, options)
|
100
|
+
end
|
64
101
|
end
|
65
102
|
|
66
103
|
def put(url, options = {}, &block)
|
67
104
|
mock_object = get_mock(:put, url, options)
|
68
|
-
|
69
|
-
|
105
|
+
unless mock_object.nil?
|
106
|
+
mock_object
|
107
|
+
else
|
108
|
+
enforce_allow_net_connect!(:put, url)
|
109
|
+
remote_proxy_object(url, :put, options)
|
110
|
+
end
|
70
111
|
end
|
71
112
|
|
72
113
|
def delete(url, options = {}, &block)
|
73
114
|
mock_object = get_mock(:delete, url, options)
|
74
|
-
|
75
|
-
|
115
|
+
unless mock_object.nil?
|
116
|
+
mock_object
|
117
|
+
else
|
118
|
+
enforce_allow_net_connect!(:delete, url)
|
119
|
+
remote_proxy_object(url, :delete, options)
|
120
|
+
end
|
76
121
|
end
|
77
122
|
|
78
123
|
def remote_proxy_object(url, method, options)
|
@@ -92,7 +137,15 @@ module Typhoeus
|
|
92
137
|
end
|
93
138
|
|
94
139
|
def remote_defaults(options)
|
95
|
-
@remote_defaults
|
140
|
+
@remote_defaults ||= {}
|
141
|
+
@remote_defaults.merge!(options)
|
142
|
+
@remote_defaults
|
143
|
+
end
|
144
|
+
|
145
|
+
# If we get subclassed, make sure that child inherits the remote defaults
|
146
|
+
# of the parent class.
|
147
|
+
def inherited(child)
|
148
|
+
child.__send__(:remote_defaults, @remote_defaults)
|
96
149
|
end
|
97
150
|
|
98
151
|
def call_remote_method(method_name, args)
|
@@ -176,4 +229,4 @@ module Typhoeus
|
|
176
229
|
SRC
|
177
230
|
end
|
178
231
|
end # ClassMethods
|
179
|
-
end
|
232
|
+
end
|
@@ -21,7 +21,12 @@ module Typhoeus
|
|
21
21
|
|
22
22
|
unless @proxied_object
|
23
23
|
Typhoeus.perform_easy_requests
|
24
|
-
response = Response.new(
|
24
|
+
response = Response.new(:code => @easy.response_code,
|
25
|
+
:headers => @easy.response_header,
|
26
|
+
:body => @easy.response_body,
|
27
|
+
:time => @easy.total_time_taken,
|
28
|
+
:requested_url => @easy.url,
|
29
|
+
:requested_http_method => @easy.method)
|
25
30
|
if @easy.response_code >= 200 && @easy.response_code < 300
|
26
31
|
Typhoeus.release_easy_object(@easy)
|
27
32
|
@proxied_object = @success.nil? ? response : @success.call(response)
|
@@ -39,4 +44,4 @@ module Typhoeus
|
|
39
44
|
@proxied_object.__send__(sym, *args, &block)
|
40
45
|
end
|
41
46
|
end
|
42
|
-
end
|
47
|
+
end
|
data/lib/typhoeus/response.rb
CHANGED
@@ -1,12 +1,16 @@
|
|
1
1
|
module Typhoeus
|
2
2
|
class Response
|
3
|
-
attr_reader :code, :headers, :body, :time
|
3
|
+
attr_reader :code, :headers, :body, :time,
|
4
|
+
:requested_url, :requested_remote_method,
|
5
|
+
:requested_http_method
|
4
6
|
|
5
|
-
def initialize(
|
6
|
-
@code
|
7
|
-
@headers
|
8
|
-
@body
|
9
|
-
@time
|
7
|
+
def initialize(params = {})
|
8
|
+
@code = params[:code]
|
9
|
+
@headers = params[:headers]
|
10
|
+
@body = params[:body]
|
11
|
+
@time = params[:time]
|
12
|
+
@requested_url = params[:requested_url]
|
13
|
+
@requested_http_method = params[:requested_http_method]
|
10
14
|
end
|
11
15
|
end
|
12
|
-
end
|
16
|
+
end
|
data/lib/typhoeus.rb
CHANGED
@@ -34,6 +34,12 @@ describe Typhoeus::RemoteProxyObject do
|
|
34
34
|
Typhoeus.should_receive(:perform_easy_requests).exactly(0).times
|
35
35
|
response.code.should == 200
|
36
36
|
end
|
37
|
+
|
38
|
+
it "should set the requested_url and requested_http_method on the response" do
|
39
|
+
response = Typhoeus::RemoteProxyObject.new(lambda {}, @easy)
|
40
|
+
response.requested_url.should == "http://localhost:3001"
|
41
|
+
response.requested_http_method.should == :get
|
42
|
+
end
|
37
43
|
|
38
44
|
it "should call the on_success method with an easy object and proxy to the result of on_success" do
|
39
45
|
klass = Class.new do
|
@@ -64,4 +70,4 @@ describe Typhoeus::RemoteProxyObject do
|
|
64
70
|
k = Typhoeus::RemoteProxyObject.new(lambda {}, @easy, :on_failure => lambda {|e| klass.new(e)})
|
65
71
|
k.blah.should == 0
|
66
72
|
end
|
67
|
-
end
|
73
|
+
end
|
@@ -14,7 +14,48 @@ describe Typhoeus do
|
|
14
14
|
after(:all) do
|
15
15
|
stop_method_server(@pid)
|
16
16
|
end
|
17
|
-
|
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
|
+
end
|
58
|
+
|
18
59
|
describe "mocking" do
|
19
60
|
it "should mock out GET" do
|
20
61
|
@klass.mock(:get)
|
@@ -117,6 +158,23 @@ describe Typhoeus do
|
|
117
158
|
@klass.mock(:get, :url => "http://localhost:3001", :body => "hi", :code => 500)
|
118
159
|
@klass.do_stuff.should == :fail
|
119
160
|
end
|
161
|
+
|
162
|
+
it "should allow for subclassing a class that includes Typhoeus, and merging defaults" do
|
163
|
+
class TestA
|
164
|
+
include Typhoeus
|
165
|
+
remote_defaults :on_failure => lambda { |response|
|
166
|
+
:fail
|
167
|
+
}
|
168
|
+
end
|
169
|
+
|
170
|
+
class TestB < TestA
|
171
|
+
remote_defaults :base_uri => "http://localhost"
|
172
|
+
define_remote_method :do_stuff
|
173
|
+
end
|
174
|
+
|
175
|
+
TestB.mock(:get, :url => "http://localhost", :body => "hi", :code => 500)
|
176
|
+
TestB.do_stuff.should == :fail
|
177
|
+
end
|
120
178
|
end
|
121
179
|
|
122
180
|
describe "response hash" do
|
@@ -421,7 +479,14 @@ describe Typhoeus do
|
|
421
479
|
define_remote_method :do_stuff, :base_uri => "http://localhost:3001", :params => {:foo => :bar}
|
422
480
|
end
|
423
481
|
|
424
|
-
@klass.do_stuff(:params => {:asdf => :jkl})
|
482
|
+
result = @klass.do_stuff(:params => {:asdf => :jkl})
|
483
|
+
|
484
|
+
# Make this test more robust to hash ordering.
|
485
|
+
query_string = result.body.match(/QUERY_STRING=([^\n]+)/)
|
486
|
+
params = query_string[1].split("&")
|
487
|
+
["asdf=jkl", "foo=bar"].each do |param|
|
488
|
+
params.should include(param)
|
489
|
+
end
|
425
490
|
end
|
426
491
|
end
|
427
492
|
|
@@ -539,4 +604,4 @@ describe Typhoeus do
|
|
539
604
|
# end
|
540
605
|
# end
|
541
606
|
# end
|
542
|
-
end
|
607
|
+
end
|
@@ -3,19 +3,29 @@ require File.dirname(__FILE__) + '/../spec_helper'
|
|
3
3
|
describe Typhoeus::Response do
|
4
4
|
describe "initialize" do
|
5
5
|
it "should store response_code" do
|
6
|
-
Typhoeus::Response.new(
|
6
|
+
Typhoeus::Response.new(:code => 200).code.should == 200
|
7
7
|
end
|
8
8
|
|
9
9
|
it "should store response_headers" do
|
10
|
-
Typhoeus::Response.new(
|
10
|
+
Typhoeus::Response.new(:headers => "a header!").headers.should == "a header!"
|
11
11
|
end
|
12
12
|
|
13
13
|
it "should store response_body" do
|
14
|
-
Typhoeus::Response.new(
|
14
|
+
Typhoeus::Response.new(:body => "a body!").body.should == "a body!"
|
15
15
|
end
|
16
16
|
|
17
17
|
it "should store request_time" do
|
18
|
-
Typhoeus::Response.new(
|
18
|
+
Typhoeus::Response.new(:time => 1.23).time.should == 1.23
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should store requested_url" do
|
22
|
+
response = Typhoeus::Response.new(:requested_url => "http://test.com")
|
23
|
+
response.requested_url.should == "http://test.com"
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should store requested_http_method" do
|
27
|
+
response = Typhoeus::Response.new(:requested_http_method => :delete)
|
28
|
+
response.requested_http_method.should == :delete
|
19
29
|
end
|
20
30
|
end
|
21
|
-
end
|
31
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pauldix-typhoeus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paul Dix
|
@@ -51,6 +51,7 @@ files:
|
|
51
51
|
- spec/servers/method_server.rb
|
52
52
|
has_rdoc: true
|
53
53
|
homepage: http://github.com/pauldix/typhoeus
|
54
|
+
licenses:
|
54
55
|
post_install_message:
|
55
56
|
rdoc_options: []
|
56
57
|
|
@@ -72,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
73
|
requirements: []
|
73
74
|
|
74
75
|
rubyforge_project:
|
75
|
-
rubygems_version: 1.
|
76
|
+
rubygems_version: 1.3.5
|
76
77
|
signing_key:
|
77
78
|
specification_version: 2
|
78
79
|
summary: A library for interacting with web services (and building SOAs) at blinding speed.
|