curb-fu 0.4.3
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/curb-fu.rb +64 -0
- data/lib/curb-fu/authentication.rb +5 -0
- data/lib/curb-fu/core_ext.rb +59 -0
- data/lib/curb-fu/entity.rb +54 -0
- data/lib/curb-fu/request.rb +12 -0
- data/lib/curb-fu/request/base.rb +118 -0
- data/lib/curb-fu/request/common.rb +34 -0
- data/lib/curb-fu/request/parameter.rb +33 -0
- data/lib/curb-fu/request/test.rb +153 -0
- data/lib/curb-fu/response.rb +179 -0
- data/lib/curb-fu/test.rb +6 -0
- data/lib/curb-fu/test/request_logger.rb +31 -0
- data/lib/curb-fu/test/server.rb +21 -0
- data/spec/fixtures/foo.txt +1 -0
- data/spec/lib/curb-fu/core_ext_spec.rb +100 -0
- data/spec/lib/curb-fu/entity_spec.rb +37 -0
- data/spec/lib/curb-fu/request/base_spec.rb +240 -0
- data/spec/lib/curb-fu/request/parameter_spec.rb +77 -0
- data/spec/lib/curb-fu/request/test_spec.rb +223 -0
- data/spec/lib/curb-fu/response_spec.rb +99 -0
- data/spec/lib/curb_fu_spec.rb +49 -0
- data/spec/spec.opts +6 -0
- data/spec/spec_helper.rb +11 -0
- metadata +95 -0
@@ -0,0 +1,77 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
|
2
|
+
require 'curb-fu/core_ext'
|
3
|
+
|
4
|
+
describe CurbFu::Request::Parameter do
|
5
|
+
describe "initialize" do
|
6
|
+
it "should accept a key and value pair" do
|
7
|
+
param = CurbFu::Request::Parameter.new("simple", "value")
|
8
|
+
param.name.should == "simple"
|
9
|
+
param.value.should == "value"
|
10
|
+
end
|
11
|
+
it "should accept a hash" do
|
12
|
+
lambda { CurbFu::Request::Parameter.new("policy",
|
13
|
+
{ "archive_length_units" => "eons", "to" => "cthulhu@goo.org" }) }.should_not raise_error
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "to_uri_param" do
|
18
|
+
it "should serialize the key and value into an acceptable uri format" do
|
19
|
+
param = CurbFu::Request::Parameter.new("simple", "value")
|
20
|
+
param.to_uri_param.should == "simple=value"
|
21
|
+
end
|
22
|
+
describe "complex cases" do
|
23
|
+
it "should convert a hash parameter into the appropriate set of name-value pairs" do
|
24
|
+
params = CurbFu::Request::Parameter.new("policy", { "archive_length_units" => "eons", "to" => "cthulhu@goo.org" })
|
25
|
+
params.to_uri_param.should =~ /policy\[archive_length_units\]=eons/
|
26
|
+
params.to_uri_param.should =~ /policy\[to\]=cthulhu\%40goo\.org/
|
27
|
+
params.to_uri_param.should =~ /.+&.+/
|
28
|
+
end
|
29
|
+
it "should even handle cases where one of the hash parameters is an array" do
|
30
|
+
params = CurbFu::Request::Parameter.new("messages", { "failed" => [2134, 123, 4325], "policy_id" => 45 })
|
31
|
+
params.to_uri_param.should =~ /messages\[failed\]\[\]=2134/
|
32
|
+
params.to_uri_param.should =~ /messages\[failed\]\[\]=123/
|
33
|
+
params.to_uri_param.should =~ /messages\[failed\]\[\]=4325/
|
34
|
+
params.to_uri_param.should =~ /messages\[policy_id\]=45/
|
35
|
+
params.to_uri_param.should =~ /.+&.+&.+&.+/
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "to_curl_post_field" do
|
41
|
+
it "should serialize the key and value into an acceptable uri format" do
|
42
|
+
param = CurbFu::Request::Parameter.new("simple", "value")
|
43
|
+
field = param.to_curl_post_field
|
44
|
+
field.name.should == 'simple'
|
45
|
+
field.content.should == 'value'
|
46
|
+
end
|
47
|
+
describe "complex cases" do
|
48
|
+
it "should convert a hash parameter into the appropriate set of name-value pairs" do
|
49
|
+
params = CurbFu::Request::Parameter.new("policy",
|
50
|
+
{ "archive_length_units" => "eons", "to" => "cthulhu@goo.org" })
|
51
|
+
fields = params.to_curl_post_field
|
52
|
+
fields.find { |f| f.name == 'policy[archive_length_units]' && f.content == 'eons'}.should_not be_nil
|
53
|
+
fields.find { |f| f.name == 'policy[to]' && f.content == 'cthulhu@goo.org'}.should_not be_nil
|
54
|
+
end
|
55
|
+
it "should even handle cases where one of the hash parameters is an array" do
|
56
|
+
params = CurbFu::Request::Parameter.new("messages", { "failed" => [2134, 123, 4325], "policy_id" => 45 }).
|
57
|
+
to_curl_post_field
|
58
|
+
params.find { |p| p.name == 'messages[failed][]' && p.content == '2134' }.should_not be_nil
|
59
|
+
params.find { |p| p.name == 'messages[failed][]' && p.content == '123' }.should_not be_nil
|
60
|
+
params.find { |p| p.name == 'messages[failed][]' && p.content == '4325' }.should_not be_nil
|
61
|
+
params.find { |p| p.name == 'messages[policy_id]' && p.content == '45' }.should_not be_nil
|
62
|
+
end
|
63
|
+
it "should not send a CGI-escaped value to Curl::PostField" do
|
64
|
+
field = CurbFu::Request::Parameter.new("messages", "uh-oh! We've failed!").
|
65
|
+
to_curl_post_field
|
66
|
+
|
67
|
+
field.content.should == "uh-oh! We've failed!"
|
68
|
+
end
|
69
|
+
it "should not CGI-escape @ symbols" do
|
70
|
+
field = CurbFu::Request::Parameter.new("messages", "bob@apple.com").
|
71
|
+
to_curl_post_field
|
72
|
+
|
73
|
+
field.content.should == "bob@apple.com"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,223 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../../spec_helper'
|
2
|
+
|
3
|
+
def test_file_path
|
4
|
+
File.dirname(__FILE__) + "/../../../fixtures/foo.txt"
|
5
|
+
end
|
6
|
+
|
7
|
+
describe CurbFu::Request::Test do
|
8
|
+
before :each do
|
9
|
+
@a_server = mock(Object, :call => [200, { 'Content-Type' => 'spec/testcase' }, ["A is for Archer, an excellent typeface."]])
|
10
|
+
@b_server = mock(Object, :call => [200, {},["B is for Ballyhoo, like what happened when Twitter switched to Scala"]])
|
11
|
+
@c_server = mock(Object, :call => [200, {}, ["C is for Continuous, as in Integration"]])
|
12
|
+
|
13
|
+
CurbFu.stubs = {
|
14
|
+
'a.example.com' => @a_server,
|
15
|
+
'b.example.com' => @b_server,
|
16
|
+
'c.example.com' => @c_server
|
17
|
+
}
|
18
|
+
|
19
|
+
@mock_rack_response = mock(Rack::MockResponse, :status => 200, :headers => {}, :body => "C is for Continuous, as in Integration")
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "module inclusion" do
|
23
|
+
it "should define a 'get' method" do
|
24
|
+
class Test
|
25
|
+
include CurbFu::Request::Test
|
26
|
+
end
|
27
|
+
Test.should respond_to(:get)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "parse_hostname" do
|
32
|
+
it "should return just the hostname from a full URL" do
|
33
|
+
CurbFu::Request.parse_hostname('http://a.example.com/foo/bar?transaxle=true').
|
34
|
+
should == 'a.example.com'
|
35
|
+
end
|
36
|
+
it 'should return the hostname if just a hostname is given' do
|
37
|
+
CurbFu::Request.parse_hostname('b.example.com').
|
38
|
+
should == 'b.example.com'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "process_headers" do
|
43
|
+
it "should convert http headers into their upcased, HTTP_ prepended form for the Rack environment" do
|
44
|
+
CurbFu::Request.process_headers({'X-Mirror-Request' => 'true'}).should == {"HTTP_X_MIRROR_REQUEST" => "true"}
|
45
|
+
end
|
46
|
+
it "should handle a whole hashful of headers" do
|
47
|
+
CurbFu::Request.process_headers({
|
48
|
+
'X-Mirror-Request' => 'true',
|
49
|
+
'Accept-Encoding' => '*/*',
|
50
|
+
'X-Forwarded-For' => 'greenviewdata.com'
|
51
|
+
}).should == {
|
52
|
+
"HTTP_X_MIRROR_REQUEST" => "true",
|
53
|
+
"HTTP_ACCEPT_ENCODING" => "*/*",
|
54
|
+
"HTTP_X_FORWARDED_FOR" => "greenviewdata.com"
|
55
|
+
}
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "match_host" do
|
60
|
+
it "should return the appropriate Rack::Test instance to delegate the request to" do
|
61
|
+
CurbFu::Request.match_host("a.example.com").app.should == @a_server
|
62
|
+
end
|
63
|
+
it "should return nil if no match is made" do
|
64
|
+
CurbFu::Request.match_host("m.google.com").should be_nil
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "build_request_options" do
|
69
|
+
it "should parse headers" do
|
70
|
+
CurbFu::Request.build_request_options({:host => 'd.example.com', :path => '/big/white/dog', :headers => { 'Accept' => 'beer/pilsner' }}).
|
71
|
+
should include(:headers => { 'Accept' => 'beer/pilsner' })
|
72
|
+
end
|
73
|
+
it "should parse url" do
|
74
|
+
CurbFu::Request.build_request_options({:host => 'd.example.com', :path => '/big/white/dog'}).
|
75
|
+
should include(:url => 'http://d.example.com/big/white/dog')
|
76
|
+
end
|
77
|
+
it "should parse username and password" do
|
78
|
+
CurbFu::Request.build_request_options({:host => 'd.example.com', :path => '/big/white/dog', :username => 'bill', :password => 's3cr3t' }).
|
79
|
+
should include(:username => 'bill', :password => 's3cr3t')
|
80
|
+
end
|
81
|
+
it "should get an interface" do
|
82
|
+
CurbFu::Request.build_request_options({:host => 'c.example.com', :path => '/big/white/dog'}).
|
83
|
+
should include(:interface => CurbFu.stubs['c.example.com'])
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "get_interface" do
|
88
|
+
it "should parse a string" do
|
89
|
+
CurbFu::Request.get_interface('http://a.example.com').app.should == @a_server
|
90
|
+
end
|
91
|
+
it "should parse a hash" do
|
92
|
+
CurbFu::Request.get_interface({:host => 'a.example.com'}).app.should == @a_server
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "respond" do
|
97
|
+
it "should convert headers to uppercase, underscorized" do
|
98
|
+
CurbFu::Response::Base.stub!(:from_rack_response)
|
99
|
+
mock_interface = mock(Object, :send => mock(Object, :status => 200), :hostname= => nil, :hostname => 'a.example.com')
|
100
|
+
mock_interface.should_receive(:header).with('HTTP_X_MONARCHY','false')
|
101
|
+
mock_interface.should_receive(:header).with('HTTP_X_ANARCHO_SYNDICALIST_COMMUNE','true')
|
102
|
+
|
103
|
+
CurbFu::Request.respond(mock_interface, :get, 'http://a.example.com/', {},
|
104
|
+
{'X-Anarcho-Syndicalist-Commune' => 'true', 'X-Monarchy' => 'false'}, nil, nil)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
describe "hashify_params" do
|
109
|
+
it "should turn a URL-formatted query string into a hash of parameters" do
|
110
|
+
hash = CurbFu::Request.hashify_params("color=red&shape=round")
|
111
|
+
hash.should include('color' => 'red')
|
112
|
+
hash.should include('shape' => 'round')
|
113
|
+
end
|
114
|
+
it "should convert array-formatted params into a hash of arrays" do
|
115
|
+
hash = CurbFu::Request.hashify_params("make[]=Chevrolet&make[]=Pontiac&make[]=GMC")
|
116
|
+
hash.should == {'make' => ['Chevrolet','Pontiac','GMC']}
|
117
|
+
end
|
118
|
+
it "should convert hash parameters into a hash of hashes" do
|
119
|
+
hash = CurbFu::Request.hashify_params("car[make]=Chevrolet&car[color]=red&car[wheel_shape]=round")
|
120
|
+
hash.should == {'car' => {
|
121
|
+
'make' => 'Chevrolet',
|
122
|
+
'color' => 'red',
|
123
|
+
'wheel_shape' => 'round'
|
124
|
+
}}
|
125
|
+
end
|
126
|
+
it 'should remove any leading ?s' do
|
127
|
+
hash = CurbFu::Request.hashify_params("?q=134&dave=astronaut")
|
128
|
+
hash.keys.should_not include('?q')
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
describe "get" do
|
133
|
+
it 'should delegate the get request to the Rack::Test instance' do
|
134
|
+
CurbFu.stubs['a.example.com'].should_receive(:get).with('http://a.example.com/gimme/html', anything, anything).and_return(@mock_rack_response)
|
135
|
+
@a_server.should respond_to(:call)
|
136
|
+
CurbFu::Request.get('http://a.example.com/gimme/html')
|
137
|
+
end
|
138
|
+
it 'should raise Curl::Err::ConnectionFailedError if hostname is not defined in stub list' do
|
139
|
+
lambda { CurbFu::Request.get('http://m.google.com/gimme/html') }.should raise_error(Curl::Err::ConnectionFailedError)
|
140
|
+
end
|
141
|
+
it 'should return a CurbFu::Response object' do
|
142
|
+
response = CurbFu::Request.get('http://a.example.com/gimme/html')
|
143
|
+
response.should be_a_kind_of(CurbFu::Response::Base)
|
144
|
+
response.status.should == 200
|
145
|
+
response.headers.should == { 'Content-Type' => 'spec/testcase' }
|
146
|
+
response.body.should == "A is for Archer, an excellent typeface."
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
describe "post" do
|
151
|
+
it 'should delegate the post request to the Rack::Test instance' do
|
152
|
+
CurbFu.stubs['b.example.com'].should_receive(:post).
|
153
|
+
with('http://b.example.com/html/backatcha', {'html' => 'CSRF in da house! <script type="text/compromise">alert("gotcha!")</script>'}, anything).
|
154
|
+
and_return(@mock_rack_response)
|
155
|
+
CurbFu::Request.post('http://b.example.com/html/backatcha',
|
156
|
+
{'html' => 'CSRF in da house! <script type="text/compromise">alert("gotcha!")</script>'})
|
157
|
+
end
|
158
|
+
it 'should raise Curl::Err::ConnectionFailedError if hostname is not defined in stub list' do
|
159
|
+
lambda { CurbFu::Request.post('http://m.google.com/gimme/html') }.should raise_error(Curl::Err::ConnectionFailedError)
|
160
|
+
end
|
161
|
+
it 'should return a CurbFu::Response object' do
|
162
|
+
response = CurbFu::Request.post('http://a.example.com/gimme/html')
|
163
|
+
response.should be_a_kind_of(CurbFu::Response::Base)
|
164
|
+
response.status.should == 200
|
165
|
+
response.headers.should == { 'Content-Type' => 'spec/testcase' }
|
166
|
+
response.body.should == "A is for Archer, an excellent typeface."
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
describe "post_file" do
|
171
|
+
it 'should delegate the post request to the Rack::Test instance' do
|
172
|
+
CurbFu.stubs['b.example.com'].should_receive(:post).
|
173
|
+
with('http://b.example.com/html/backatcha', hash_including("foo.txt"=>anything, "filename"=>"asdf ftw"), anything).
|
174
|
+
and_return(@mock_rack_response)
|
175
|
+
CurbFu::Request.post_file('http://b.example.com/html/backatcha', {'filename' => 'asdf ftw'}, {'foo.txt' => test_file_path })
|
176
|
+
end
|
177
|
+
it 'should raise Curl::Err::ConnectionFailedError if hostname is not defined in stub list' do
|
178
|
+
lambda { CurbFu::Request.post_file('http://m.google.com/gimme/html') }.should raise_error(Curl::Err::ConnectionFailedError)
|
179
|
+
end
|
180
|
+
it 'should return a CurbFu::Response object' do
|
181
|
+
response = CurbFu::Request.post_file('http://a.example.com/gimme/html')
|
182
|
+
response.should be_a_kind_of(CurbFu::Response::Base)
|
183
|
+
response.status.should == 200
|
184
|
+
response.headers.should == { 'Content-Type' => 'spec/testcase' }
|
185
|
+
response.body.should == "A is for Archer, an excellent typeface."
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
describe "put" do
|
190
|
+
it 'should delegate the put request to the Rack::Test instance' do
|
191
|
+
CurbFu.stubs['a.example.com'].should_receive(:put).with('http://a.example.com/gimme/html', anything, anything).and_return(@mock_rack_response)
|
192
|
+
CurbFu::Request.put('http://a.example.com/gimme/html')
|
193
|
+
end
|
194
|
+
it 'should raise Curl::Err::ConnectionFailedError if hostname is not defined in stub list' do
|
195
|
+
lambda { CurbFu::Request.put('http://m.google.com/gimme/html') }.should raise_error(Curl::Err::ConnectionFailedError)
|
196
|
+
end
|
197
|
+
it 'should return a CurbFu::Response object' do
|
198
|
+
response = CurbFu::Request.put('http://a.example.com/gimme/html')
|
199
|
+
response.should be_a_kind_of(CurbFu::Response::Base)
|
200
|
+
response.status.should == 200
|
201
|
+
response.headers.should == { 'Content-Type' => 'spec/testcase' }
|
202
|
+
response.body.should == "A is for Archer, an excellent typeface."
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
describe "delete" do
|
207
|
+
it 'should delegate the delete request to the Rack::Test instance' do
|
208
|
+
CurbFu.stubs['a.example.com'].should_receive(:delete).with('http://a.example.com/gimme/html', anything, anything).and_return(@mock_rack_response)
|
209
|
+
@a_server.should respond_to(:call)
|
210
|
+
CurbFu::Request.delete('http://a.example.com/gimme/html')
|
211
|
+
end
|
212
|
+
it 'should raise Curl::Err::ConnectionFailedError if hostname is not defined in stub list' do
|
213
|
+
lambda { CurbFu::Request.delete('http://m.google.com/gimme/html') }.should raise_error(Curl::Err::ConnectionFailedError)
|
214
|
+
end
|
215
|
+
it 'should return a CurbFu::Response object' do
|
216
|
+
response = CurbFu::Request.delete('http://a.example.com/gimme/html')
|
217
|
+
response.should be_a_kind_of(CurbFu::Response::Base)
|
218
|
+
response.status.should == 200
|
219
|
+
response.headers.should == { 'Content-Type' => 'spec/testcase' }
|
220
|
+
response.body.should == "A is for Archer, an excellent typeface."
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
require 'htmlentities'
|
3
|
+
|
4
|
+
describe CurbFu::Response::Base do
|
5
|
+
describe "from_rack_response" do
|
6
|
+
it "should create a new CurbFu::Response object out of a rack response (array)" do
|
7
|
+
rack = mock(Object, :status => 200, :headers => { 'Expires' => '05-12-2034' }, :body => "This will never go out of style")
|
8
|
+
response = CurbFu::Response::Base.from_rack_response(rack)
|
9
|
+
response.should be_a_kind_of(CurbFu::Response::OK)
|
10
|
+
response.body.should == "This will never go out of style"
|
11
|
+
response.headers.should include('Expires' => '05-12-2034')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "from_curb_response" do
|
16
|
+
it "should create a new CurbFu::Response object out of a curb response object" do
|
17
|
+
curb = mock(Curl::Easy, :body_str => "Miscellaneous Facts About Curb", :header_str => "HTTP/1.1 200 OK\r\nCache-Control: private, max-age=0\r\nDate: Tue, 17 Mar 2009 17:34:08 GMT\r\nExpires: -1\r\n", :response_code => 200 )
|
18
|
+
response = CurbFu::Response::Base.from_curb_response(curb)
|
19
|
+
response.should be_a_kind_of(CurbFu::Response::OK)
|
20
|
+
response.body.should == "Miscellaneous Facts About Curb"
|
21
|
+
response.headers.should include("Expires" => '-1', "Cache-Control" => 'private, max-age=0')
|
22
|
+
response.status.should == 200
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "successes" do
|
27
|
+
it "should create a success (200) response" do
|
28
|
+
mock_curb = mock(Object, :response_code => 200, :body_str => 'OK', :header_str => "")
|
29
|
+
r = CurbFu::Response::Base.from_curb_response(mock_curb)
|
30
|
+
r.should be_a_kind_of(CurbFu::Response::Base)
|
31
|
+
r.should be_a_kind_of(CurbFu::Response::Success)
|
32
|
+
r.should be_a_kind_of(CurbFu::Response::OK)
|
33
|
+
r.should_not be_a_kind_of(CurbFu::Response::Created)
|
34
|
+
end
|
35
|
+
it "should create a success (201) response" do
|
36
|
+
mock_curb = mock(Object, :response_code => 201, :body_str => 'OK', :header_str => "")
|
37
|
+
r = CurbFu::Response::Base.from_curb_response(mock_curb)
|
38
|
+
r.should be_a_kind_of(CurbFu::Response::Base)
|
39
|
+
r.should be_a_kind_of(CurbFu::Response::Success)
|
40
|
+
r.should be_a_kind_of(CurbFu::Response::Created)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
it "should create a 400 response" do
|
44
|
+
mock_curb = mock(Object, :response_code => 404, :body_str => 'OK', :header_str => "", :timeout= => nil)
|
45
|
+
r = CurbFu::Response::Base.from_curb_response(mock_curb)
|
46
|
+
r.should be_a_kind_of(CurbFu::Response::Base)
|
47
|
+
r.should be_a_kind_of(CurbFu::Response::ClientError)
|
48
|
+
end
|
49
|
+
it "should create a 500 response" do
|
50
|
+
mock_curb = mock(Object, :response_code => 503, :body_str => 'OK', :header_str => "", :timeout= => nil)
|
51
|
+
r = CurbFu::Response::Base.from_curb_response(mock_curb)
|
52
|
+
r.should be_a_kind_of(CurbFu::Response::Base)
|
53
|
+
r.should be_a_kind_of(CurbFu::Response::ServerError)
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "response modules" do
|
57
|
+
describe "to_i" do
|
58
|
+
it "should return the status code represented by the module" do
|
59
|
+
CurbFu::Response::OK.to_i.should == 200
|
60
|
+
CurbFu::Response::NotFound.to_i.should == 404
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "parse_headers" do
|
66
|
+
before(:each) do
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "test data" do
|
70
|
+
it "should parse all of Google's headers" do
|
71
|
+
headers = "HTTP/1.1 200 OK\r\nCache-Control: private, max-age=0\r\nDate: Tue, 17 Mar 2009 17:34:08 GMT\r\nExpires: -1\r\nContent-Type: text/html; charset=ISO-8859-1\r\nSet-Cookie: PREF=ID=16472704f58eb437:TM=1237311248:LM=1237311248:S=KrWlq33vvam8d_De; expires=Thu, 17-Mar-2011 17:34:08 GMT; path=/; domain=.google.com\r\nServer: gws\r\nTransfer-Encoding: chunked\r\n\r\n"
|
72
|
+
mock_curb = mock(Object, :response_code => 200, :body_str => 'OK', :header_str => headers, :timeout= => nil)
|
73
|
+
@cf = CurbFu::Response::Base.from_curb_response(mock_curb)
|
74
|
+
|
75
|
+
@cf.headers['Cache-Control'].should == 'private, max-age=0'
|
76
|
+
@cf.headers['Date'].should == 'Tue, 17 Mar 2009 17:34:08 GMT'
|
77
|
+
@cf.headers['Expires'].should == '-1'
|
78
|
+
@cf.headers['Content-Type'].should == 'text/html; charset=ISO-8859-1'
|
79
|
+
@cf.headers['Set-Cookie'].should == 'PREF=ID=16472704f58eb437:TM=1237311248:LM=1237311248:S=KrWlq33vvam8d_De; expires=Thu, 17-Mar-2011 17:34:08 GMT; path=/; domain=.google.com'
|
80
|
+
@cf.headers['Server'].should == 'gws'
|
81
|
+
@cf.headers['Transfer-Encoding'].should == 'chunked'
|
82
|
+
@cf.headers.keys.length.should == 7
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should parse our json headers from the data_store" do
|
86
|
+
headers = "HTTP/1.1 200 OK\r\nServer: nginx/0.6.34\r\nDate: Tue, 17 Mar 2009 05:40:32 GMT\r\nContent-Type: text/json\r\nConnection: close\r\nContent-Length: 18\r\n\r\n"
|
87
|
+
mock_curb = mock(Object, :response_code => 200, :body_str => 'OK', :header_str => headers, :timeout= => nil)
|
88
|
+
@cf = CurbFu::Response::Base.from_curb_response(mock_curb)
|
89
|
+
|
90
|
+
@cf.headers['Server'].should == 'nginx/0.6.34'
|
91
|
+
@cf.headers['Date'].should == 'Tue, 17 Mar 2009 05:40:32 GMT'
|
92
|
+
@cf.headers['Content-Type'].should == 'text/json'
|
93
|
+
@cf.headers['Connection'].should == 'close'
|
94
|
+
@cf.headers['Content-Length'].should == '18'
|
95
|
+
@cf.headers.keys.length.should == 5
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe CurbFu do
|
4
|
+
describe "stubs=" do
|
5
|
+
it 'should insert the CurbFu::Request::Test module into CurbFu::Request' do
|
6
|
+
CurbFu.stubs = { 'example.com' => mock(Object, :call => [200, {}, "Hello, World"] ) }
|
7
|
+
CurbFu::Request.should include(CurbFu::Request::Test)
|
8
|
+
end
|
9
|
+
it 'should not insert the CurbFu::StubbedRequest module into CurbFu::Request if it is already there' do
|
10
|
+
CurbFu::Request.stub!(:include?).and_return(false, true)
|
11
|
+
CurbFu::Request.should_receive(:include).once
|
12
|
+
CurbFu.stubs = { 'example.com' => mock(Object, :call => [200, {}, "Hello, World"] ) }
|
13
|
+
CurbFu.stubs = { 'example.net' => mock(Object, :call => [404, {}, "not found"] ) }
|
14
|
+
end
|
15
|
+
it 'should not insert the CurbFu::StubbedRequest module if the method is given nil instead of a hash' do
|
16
|
+
CurbFu::Request.should_not_receive(:include)
|
17
|
+
CurbFu.stubs = nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe 'stub' do
|
22
|
+
it 'should create a stub interface for the given hostname using the supplied object' do
|
23
|
+
CurbFu.stubs = { 'localhost' => Object }
|
24
|
+
my_rack_app = mock(Object)
|
25
|
+
CurbFu.stub('webserver.com',my_rack_app)
|
26
|
+
CurbFu.stubs['webserver.com'].
|
27
|
+
should be_an_instance_of(CurbFu::Request::Test::Interface)
|
28
|
+
CurbFu.stubs = nil
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'stubs' do
|
33
|
+
it 'should return nil by default' do
|
34
|
+
CurbFu.stubs = nil # no way to guarantee that CurbFu.stubs hasn't already been set by another spec
|
35
|
+
CurbFu.stubs.should be_nil
|
36
|
+
end
|
37
|
+
it 'should return a hash of hostnames pointing to CurbFu::StubbedRequest::TestInterfaces' do
|
38
|
+
CurbFu.stubs = { 'example.com' => mock(Object, :call => [200, {}, "Hello, World"] ) }
|
39
|
+
CurbFu.stubs['example.com'].should be_a_kind_of(CurbFu::Request::Test::Interface)
|
40
|
+
end
|
41
|
+
it 'should set the hostname on each interface' do
|
42
|
+
CurbFu.stubs = {
|
43
|
+
'ysthevanishedomens.com' => mock(Object)
|
44
|
+
}
|
45
|
+
|
46
|
+
CurbFu.stubs['ysthevanishedomens.com'].hostname.should == 'ysthevanishedomens.com'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|