webmock 0.8.2 → 0.9.0

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.
@@ -36,11 +36,11 @@ describe Response do
36
36
  it "should not raise error if no error assigned" do
37
37
  @response.raise_error_if_any
38
38
  end
39
-
39
+
40
40
  end
41
41
 
42
42
  describe "body" do
43
-
43
+
44
44
  it "should return empty body by default" do
45
45
  @response.body.should == ''
46
46
  end
@@ -49,23 +49,88 @@ describe Response do
49
49
  @response = Response.new(:body => "abc")
50
50
  @response.body.should == "abc"
51
51
  end
52
-
52
+
53
53
  it "should report string even if existing file path was provided" do
54
54
  @response = Response.new(:body => __FILE__)
55
55
  @response.body.should == __FILE__
56
56
  end
57
-
57
+
58
58
  it "should report content of a IO object if provided" do
59
59
  @response = Response.new(:body => File.new(__FILE__))
60
60
  @response.body.should == File.new(__FILE__).read
61
61
  end
62
-
62
+
63
63
  it "should report many times content of a IO object if provided" do
64
64
  @response = Response.new(:body => File.new(__FILE__))
65
65
  @response.body.should == File.new(__FILE__).read
66
66
  @response.body.should == File.new(__FILE__).read
67
67
  end
68
-
68
+
69
69
  end
70
-
70
+
71
+ describe "from raw response" do
72
+
73
+ describe "when input is IO" do
74
+ before(:each) do
75
+ @file = File.new(File.expand_path(File.dirname(__FILE__)) + "/example_curl_output.txt")
76
+ @response = Response.new(@file)
77
+ end
78
+
79
+
80
+ it "should read status" do
81
+ @response.status.should == 200
82
+ end
83
+
84
+ it "should read headers" do
85
+ @response.headers.should == {
86
+ "Date"=>"Sat, 23 Jan 2010 01:01:05 GMT",
87
+ "Content-Type"=>"text/html; charset=UTF-8",
88
+ "Content-Length"=>"438",
89
+ "Connection"=>"Keep-Alive"
90
+ }
91
+ end
92
+
93
+ it "should read body" do
94
+ @response.body.size.should == 438
95
+ end
96
+
97
+ it "should close IO" do
98
+ @file.should be_closed
99
+ end
100
+
101
+ end
102
+
103
+ describe "when input is String" do
104
+ before(:each) do
105
+ @input = File.new(File.expand_path(File.dirname(__FILE__)) + "/example_curl_output.txt").read
106
+ @response = Response.new(@input)
107
+ end
108
+
109
+ it "should read status" do
110
+ @response.status.should == 200
111
+ end
112
+
113
+ it "should read headers" do
114
+ @response.headers.should == {
115
+ "Date"=>"Sat, 23 Jan 2010 01:01:05 GMT",
116
+ "Content-Type"=>"text/html; charset=UTF-8",
117
+ "Content-Length"=>"438",
118
+ "Connection"=>"Keep-Alive"
119
+ }
120
+ end
121
+
122
+ it "should read body" do
123
+ @response.body.size.should == 438
124
+ end
125
+
126
+ it "should work with transfer-encoding set to chunked" do
127
+ @input.gsub!("Content-Length: 438", "Transfer-Encoding: chunked")
128
+ @response = Response.new(@input)
129
+ @response.body.size.should == 438
130
+ end
131
+
132
+ end
133
+
134
+ end
135
+
71
136
  end
@@ -7,6 +7,8 @@ require 'spec/autorun'
7
7
 
8
8
  require 'webmock/rspec'
9
9
 
10
+ require 'json'
11
+
10
12
  include WebMock
11
13
 
12
14
  def fail()
@@ -31,3 +33,28 @@ def setup_expectations_for_real_example_com_request(options = {})
31
33
  setup_expectations_for_real_request(defaults.merge(options))
32
34
  end
33
35
 
36
+ def client_specific_request_string(string)
37
+ method = string.gsub(/.*Unregistered request: ([^ ]+).+/, '\1')
38
+ has_body = string.include?(" with body")
39
+ default_headers = default_client_request_headers(method, has_body)
40
+ if default_headers
41
+ default_headers_string = WebMock::Util::Headers.normalize_headers(default_headers).inspect.gsub("\"","'")
42
+ default_headers_string.gsub!(/[{}]/, "")
43
+ if string.include?(" with headers")
44
+ current_headers = JSON.parse(string.gsub(/.*with headers (\{[^}]+\}).*/, '\1').gsub("=>",":").gsub("'","\""))
45
+ default_headers = WebMock::Util::Headers.normalize_headers(default_headers)
46
+ default_headers.reject! {|k,v| current_headers.has_key?(k) }
47
+ default_headers_string = default_headers.inspect.gsub("\"","'").gsub!(/[{}]/, "")
48
+ string.gsub!(/(.*)(with headers \{[^}]*)(\}.*)/, '\1\2' + ", #{default_headers_string}}") if !default_headers_string.empty?
49
+ string
50
+ else
51
+ headers_string =
52
+ " with headers #{WebMock::Util::Headers.normalize_headers(default_headers).inspect.gsub("\"","'")}"
53
+ string << headers_string
54
+ end
55
+ end
56
+ string
57
+ end
58
+
59
+
60
+
@@ -6,6 +6,8 @@ unless defined? SAMPLE_HEADERS
6
6
  NOT_ESCAPED_PARAMS = "z='Stop!' said Fred&x=ab c"
7
7
  end
8
8
 
9
+ class MyException < StandardError; end;
10
+
9
11
  describe "WebMock", :shared => true do
10
12
  before(:each) do
11
13
  WebMock.disable_net_connect!
@@ -50,7 +52,7 @@ describe "WebMock", :shared => true do
50
52
  it "should raise exception if request was not stubbed" do
51
53
  lambda {
52
54
  http_request(:get, "http://www.example.com/")
53
- }.should fail_with("Real HTTP connections are disabled. Unregistered request: GET http://www.example.com/")
55
+ }.should fail_with(client_specific_request_string("Real HTTP connections are disabled. Unregistered request: GET http://www.example.com/"))
54
56
  end
55
57
  end
56
58
 
@@ -89,7 +91,8 @@ describe "WebMock", :shared => true do
89
91
  http_request(:get, "http://www.example.com/").status.should == "200"
90
92
  lambda {
91
93
  http_request(:post, "http://www.example.com/")
92
- }.should fail_with("Real HTTP connections are disabled. Unregistered request: POST http://www.example.com/"
94
+ }.should fail_with(client_specific_request_string(
95
+ "Real HTTP connections are disabled. Unregistered request: POST http://www.example.com/")
93
96
  )
94
97
  end
95
98
 
@@ -98,24 +101,44 @@ describe "WebMock", :shared => true do
98
101
  describe "on body" do
99
102
 
100
103
  it "should match requests if body is the same" do
101
- stub_http_request(:get, "www.example.com").with(:body => "abc")
104
+ stub_http_request(:post, "www.example.com").with(:body => "abc")
102
105
  http_request(
103
- :get, "http://www.example.com/",
106
+ :post, "http://www.example.com/",
104
107
  :body => "abc").status.should == "200"
105
108
  end
106
109
 
107
110
  it "should match requests if body is not set in the stub" do
108
- stub_http_request(:get, "www.example.com")
111
+ stub_http_request(:post, "www.example.com")
109
112
  http_request(
110
- :get, "http://www.example.com/",
113
+ :post, "http://www.example.com/",
111
114
  :body => "abc").status.should == "200"
112
115
  end
113
116
 
114
117
  it "should not match requests if body is different" do
115
- stub_http_request(:get, "www.example.com").with(:body => "abc")
118
+ stub_http_request(:post, "www.example.com").with(:body => "abc")
116
119
  lambda {
117
- http_request(:get, "http://www.example.com/", :body => "def")
118
- }.should fail_with("Real HTTP connections are disabled. Unregistered request: GET http://www.example.com/ with body 'def'")
120
+ http_request(:post, "http://www.example.com/", :body => "def")
121
+ }.should fail_with(client_specific_request_string(
122
+ "Real HTTP connections are disabled. Unregistered request: POST http://www.example.com/ with body 'def'"))
123
+ end
124
+
125
+ describe "with regular expressions" do
126
+
127
+ it "should match requests if body matches regexp" do
128
+ stub_http_request(:post, "www.example.com").with(:body => /\d+abc$/)
129
+ http_request(
130
+ :post, "http://www.example.com/",
131
+ :body => "123abc").status.should == "200"
132
+ end
133
+
134
+ it "should not match requests if body doesn't match regexp" do
135
+ stub_http_request(:post, "www.example.com").with(:body => /^abc/)
136
+ lambda {
137
+ http_request(:post, "http://www.example.com/", :body => "xabc")
138
+ }.should fail_with(client_specific_request_string(
139
+ "Real HTTP connections are disabled. Unregistered request: POST http://www.example.com/ with body 'xabc'"))
140
+ end
141
+
119
142
  end
120
143
 
121
144
  end
@@ -143,17 +166,41 @@ describe "WebMock", :shared => true do
143
166
  http_request(
144
167
  :get, "http://www.example.com/",
145
168
  :headers => { 'Content-Length' => '9999'})
146
- }.should fail_with(%q(Real HTTP connections are disabled. Unregistered request: GET http://www.example.com/ with headers {'Content-Length'=>'9999'}))
169
+ }.should fail_with(client_specific_request_string(
170
+ %q(Real HTTP connections are disabled. Unregistered request: GET http://www.example.com/ with headers {'Content-Length'=>'9999'})))
147
171
  end
148
-
172
+
149
173
  it "should not match if accept header is different" do
150
174
  stub_http_request(:get, "www.example.com").
151
175
  with(:headers => { 'Accept' => 'application/json'})
152
176
  lambda {
153
177
  http_request(
154
178
  :get, "http://www.example.com/",
155
- :headers => { 'Accept' => 'application/xml'})
156
- }.should fail_with(%q(Real HTTP connections are disabled. Unregistered request: GET http://www.example.com/ with headers {'Accept'=>'application/xml'}))
179
+ :headers => { 'Accept' => 'application/xml'})
180
+ }.should fail_with(client_specific_request_string(
181
+ %q(Real HTTP connections are disabled. Unregistered request: GET http://www.example.com/ with headers {'Accept'=>'application/xml'})))
182
+ end
183
+
184
+ describe "with regular expressions" do
185
+
186
+ it "should match requests if header values match regular expression" do
187
+ stub_http_request(:get, "www.example.com").with(:headers => { :user_agent => /^MyAppName$/ })
188
+ http_request(
189
+ :get, "http://www.example.com/",
190
+ :headers => { 'user-agent' => 'MyAppName' }).status.should == "200"
191
+ end
192
+
193
+ it "should not match requests if headers values do not match regular expression" do
194
+ stub_http_request(:get, "www.example.com").with(:headers => { :user_agent => /^MyAppName$/ })
195
+
196
+ lambda {
197
+ http_request(
198
+ :get, "http://www.example.com/",
199
+ :headers => { 'user-agent' => 'xMyAppName' })
200
+ }.should fail_with(client_specific_request_string(
201
+ %q(Real HTTP connections are disabled. Unregistered request: GET http://www.example.com/ with headers {'User-Agent'=>'xMyAppName'})))
202
+ end
203
+
157
204
  end
158
205
  end
159
206
 
@@ -168,415 +215,712 @@ describe "WebMock", :shared => true do
168
215
  stub_http_request(:get, "user:pass@www.example.com")
169
216
  lambda {
170
217
  http_request(:get, "http://user:pazz@www.example.com/").status.should == "200"
171
- }.should fail_with(%q(Real HTTP connections are disabled. Unregistered request: GET http://user:pazz@www.example.com/))
218
+ }.should fail_with(client_specific_request_string(
219
+ %q(Real HTTP connections are disabled. Unregistered request: GET http://user:pazz@www.example.com/)))
172
220
  end
173
221
 
174
222
  it "should not match if credentials are stubbed but not provided in the request" do
175
223
  stub_http_request(:get, "user:pass@www.example.com")
176
224
  lambda {
177
225
  http_request(:get, "http://www.example.com/").status.should == "200"
178
- }.should fail_with(%q(Real HTTP connections are disabled. Unregistered request: GET http://www.example.com/))
226
+ }.should fail_with(client_specific_request_string(
227
+ %q(Real HTTP connections are disabled. Unregistered request: GET http://www.example.com/)))
179
228
  end
180
229
 
181
230
  it "should not match if credentials are not stubbed but exist in the request" do
182
231
  stub_http_request(:get, "www.example.com")
183
232
  lambda {
184
233
  http_request(:get, "http://user:pazz@www.example.com/").status.should == "200"
185
- }.should fail_with(%q(Real HTTP connections are disabled. Unregistered request: GET http://user:pazz@www.example.com/))
234
+ }.should fail_with(client_specific_request_string(
235
+ %q(Real HTTP connections are disabled. Unregistered request: GET http://user:pazz@www.example.com/)))
186
236
  end
187
237
 
188
238
  end
239
+
240
+ describe "with block" do
241
+
242
+ it "should match if block returns true" do
243
+ stub_http_request(:get, "www.example.com").with { |request| true }
244
+ http_request(:get, "http://www.example.com/").status.should == "200"
245
+ end
246
+
247
+ it "should not match if block returns false" do
248
+ stub_http_request(:get, "www.example.com").with { |request| false }
249
+ lambda {
250
+ http_request(:get, "http://www.example.com/")
251
+ }.should fail_with(client_specific_request_string(
252
+ "Real HTTP connections are disabled. Unregistered request: GET http://www.example.com/"))
253
+ end
254
+
255
+ it "should pass the request to the block" do
256
+ stub_http_request(:post, "www.example.com").with { |request| request.body == "wadus" }
257
+ http_request(
258
+ :post, "http://www.example.com/",
259
+ :body => "wadus").status.should == "200"
260
+ lambda {
261
+ http_request(:post, "http://www.example.com/", :body => "jander")
262
+ }.should fail_with(client_specific_request_string(
263
+ "Real HTTP connections are disabled. Unregistered request: POST http://www.example.com/ with body 'jander'"))
264
+ end
265
+
266
+ end
189
267
 
190
268
  end
191
269
 
192
270
  describe "raising stubbed exceptions" do
193
271
 
194
- it "should raise exception if declared in a stubbed response" do
195
- class MyException < StandardError; end;
272
+ it "should raise exception if declared in a stubbed response" do
196
273
  stub_http_request(:get, "www.example.com").to_raise(MyException)
197
274
  lambda {
198
275
  http_request(:get, "http://www.example.com/")
199
276
  }.should raise_error(MyException, "Exception from WebMock")
200
277
  end
201
278
 
202
- end
203
-
204
-
205
- describe "returning stubbed responses" do
206
-
207
- it "should return declared body" do
208
- stub_http_request(:get, "www.example.com").to_return(:body => "abc")
209
- http_request(:get, "http://www.example.com/").body.should == "abc"
210
- end
211
-
212
- it "should return declared headers" do
213
- stub_http_request(:get, "www.example.com").to_return(:headers => SAMPLE_HEADERS)
214
- response = http_request(:get, "http://www.example.com/")
215
- response.headers["Content-Length"].should == "8888"
216
- end
217
-
218
- it "should return declared status" do
219
- stub_http_request(:get, "www.example.com").to_return(:status => 500)
220
- http_request(:get, "http://www.example.com/").status.should == "500"
221
- end
222
-
223
- it "should return body declared as IO" do
224
- stub_http_request(:get, "www.example.com").to_return(:body => File.new(__FILE__))
225
- http_request(:get, "http://www.example.com/").body.should == File.new(__FILE__).read
226
- end
227
-
228
- it "should return body declared as IO if requested many times" do
229
- stub_http_request(:get, "www.example.com").to_return(:body => File.new(__FILE__))
230
- 2.times do
231
- http_request(:get, "http://www.example.com/").body.should == File.new(__FILE__).read
279
+ it "should raise exception if declared in a stubbed response after returning declared response" do
280
+ stub_http_request(:get, "www.example.com").to_return(:body => "abc").then.to_raise(MyException)
281
+ http_request(:get, "http://www.example.com/").body.should == "abc"
282
+ lambda {
283
+ http_request(:get, "http://www.example.com/")
284
+ }.should raise_error(MyException, "Exception from WebMock")
232
285
  end
233
- end
234
286
 
235
- it "should close IO declared as response body after reading" do
236
- stub_http_request(:get, "www.example.com").to_return(:body => @file = File.new(__FILE__))
237
- @file.should be_closed
238
287
  end
239
288
 
240
- describe "dynamic responses" do
241
-
242
- it "should return evaluated response body" do
243
- stub_http_request(:post, "www.example.com").to_return(:body => lambda { |request| request.body })
244
- http_request(:post, "http://www.example.com/", :body => "echo").body.should == "echo"
245
- end
246
-
247
- it "should return evaluated response headers" do
248
- stub_http_request(:post, "www.example.com").to_return(:headers => lambda { |request| request.headers })
249
- http_request(:post, "http://www.example.com/", :headers => {'A' => 'B'}).headers['A'].should == 'B'
250
- end
251
-
252
- end
253
289
 
254
- end
255
-
256
-
257
- describe "precedence of stubs" do
258
-
259
- it "should use the last declared matching request stub" do
260
- stub_http_request(:get, "www.example.com").to_return(:body => "abc")
261
- stub_http_request(:get, "www.example.com").to_return(:body => "def")
262
- http_request(:get, "http://www.example.com/").body.should == "def"
263
- end
290
+ describe "returning stubbed responses" do
264
291
 
265
- it "should not be affected by the type of uri or request method" do
266
- stub_http_request(:get, "www.example.com").to_return(:body => "abc")
267
- stub_http_request(:any, /.*example.*/).to_return(:body => "def")
268
- http_request(:get, "http://www.example.com/").body.should == "def"
269
- end
270
-
271
- end
272
-
273
- describe "verification of request expectation" do
274
-
275
- describe "when net connect not allowed" do
276
-
277
- before(:each) do
278
- WebMock.disable_net_connect!
279
- stub_http_request(:any, "http://www.example.com")
280
- stub_http_request(:any, "https://www.example.com")
281
- end
282
-
283
- it "should pass if request was executed with the same uri and method" do
284
- lambda {
285
- http_request(:get, "http://www.example.com/")
286
- request(:get, "http://www.example.com").should have_been_made.once
287
- }.should_not raise_error
292
+ it "should return declared body" do
293
+ stub_http_request(:get, "www.example.com").to_return(:body => "abc")
294
+ http_request(:get, "http://www.example.com/").body.should == "abc"
288
295
  end
289
296
 
290
- it "should pass if request was not expected and not executed" do
291
- lambda {
292
- request(:get, "http://www.example.com").should_not have_been_made
293
- }.should_not raise_error
297
+ it "should return declared headers" do
298
+ stub_http_request(:get, "www.example.com").to_return(:headers => SAMPLE_HEADERS)
299
+ response = http_request(:get, "http://www.example.com/")
300
+ response.headers["Content-Length"].should == "8888"
294
301
  end
295
302
 
296
- it "should fail if request was not expected but executed" do
297
- lambda {
298
- http_request(:get, "http://www.example.com/")
299
- request(:get, "http://www.example.com").should_not have_been_made
300
- }.should fail_with("The request GET http://www.example.com/ was expected to execute 0 times but it executed 1 time")
303
+ it "should return declared status" do
304
+ stub_http_request(:get, "www.example.com").to_return(:status => 500)
305
+ http_request(:get, "http://www.example.com/").status.should == "500"
301
306
  end
302
307
 
303
-
304
- it "should fail if request was not executed" do
305
- lambda {
306
- request(:get, "http://www.example.com").should have_been_made
307
- }.should fail_with("The request GET http://www.example.com/ was expected to execute 1 time but it executed 0 times")
308
- end
309
-
310
- it "should fail if request was executed to different uri" do
311
- lambda {
312
- http_request(:get, "http://www.example.com/")
313
- request(:get, "http://www.example.org").should have_been_made
314
- }.should fail_with("The request GET http://www.example.org/ was expected to execute 1 time but it executed 0 times")
308
+ it "should return body declared as IO" do
309
+ stub_http_request(:get, "www.example.com").to_return(:body => File.new(__FILE__))
310
+ http_request(:get, "http://www.example.com/").body.should == File.new(__FILE__).read
315
311
  end
316
312
 
317
- it "should fail if request was executed with different method" do
318
- lambda {
319
- http_request(:post, "http://www.example.com/")
320
- request(:get, "http://www.example.com").should have_been_made
321
- }.should fail_with("The request GET http://www.example.com/ was expected to execute 1 time but it executed 0 times")
313
+ it "should return body declared as IO if requested many times" do
314
+ stub_http_request(:get, "www.example.com").to_return(:body => File.new(__FILE__))
315
+ 2.times do
316
+ http_request(:get, "http://www.example.com/").body.should == File.new(__FILE__).read
317
+ end
322
318
  end
323
319
 
324
- it "should pass if request was executed with different form of uri" do
325
- lambda {
326
- http_request(:get, "http://www.example.com/")
327
- request(:get, "www.example.com").should have_been_made
328
- }.should_not raise_error
320
+ it "should close IO declared as response body after reading" do
321
+ stub_http_request(:get, "www.example.com").to_return(:body => @file = File.new(__FILE__))
322
+ @file.should be_closed
329
323
  end
330
324
 
331
- it "should pass if request was executed with different form of uri without port " do
332
- lambda {
333
- http_request(:get, "http://www.example.com/")
334
- request(:get, "www.example.com:80").should have_been_made
335
- }.should_not raise_error
336
- end
325
+ describe "dynamic responses" do
337
326
 
338
- it "should pass if request was executed with different form of uri with port" do
339
- lambda {
340
- http_request(:get, "http://www.example.com/")
341
- request(:get, "www.example.com:80").should have_been_made
342
- }.should_not raise_error
343
- end
327
+ it "should return evaluated response body" do
328
+ stub_http_request(:post, "www.example.com").to_return(:body => lambda { |request| request.body })
329
+ http_request(:post, "http://www.example.com/", :body => "echo").body.should == "echo"
330
+ end
344
331
 
345
- it "should fail if request was executed with different port" do
346
- lambda {
347
- http_request(:get, "http://www.example.com:80/")
348
- request(:get, "www.example.com:90").should have_been_made
349
- }.should fail_with("The request GET http://www.example.com:90/ was expected to execute 1 time but it executed 0 times")
350
- end
332
+ it "should return evaluated response headers" do
333
+ stub_http_request(:post, "www.example.com").to_return(:headers => lambda { |request| request.headers })
334
+ http_request(:post, "http://www.example.com/", :headers => {'A' => 'B'}).headers['A'].should == 'B'
335
+ end
351
336
 
352
- it "should pass if request was executed with different form of uri with https port" do
353
- lambda {
354
- http_request(:get, "https://www.example.com/")
355
- request(:get, "https://www.example.com:443/").should have_been_made
356
- }.should_not raise_error
357
337
  end
358
338
 
359
- describe "when matching requests with escaped uris" do
339
+ describe "replying raw responses from file" do
360
340
 
361
341
  before(:each) do
362
- WebMock.disable_net_connect!
363
- stub_http_request(:any, "http://www.example.com/?#{NOT_ESCAPED_PARAMS}")
342
+ @file = File.new(File.expand_path(File.dirname(__FILE__)) + "/example_curl_output.txt")
343
+ stub_http_request(:get, "www.example.com").to_return(@file)
344
+ @response = http_request(:get, "http://www.example.com/")
364
345
  end
365
346
 
366
- it "should pass if request was executed with escaped params" do
367
- lambda {
368
- http_request(:get, "http://www.example.com/?#{ESCAPED_PARAMS}")
369
- request(:get, "http://www.example.com/?#{NOT_ESCAPED_PARAMS}").should have_been_made
370
- }.should_not raise_error
347
+ it "should return recorded headers" do
348
+ @response.headers.should == {
349
+ "Date"=>"Sat, 23 Jan 2010 01:01:05 GMT",
350
+ "Content-Type"=>"text/html; charset=UTF-8",
351
+ "Content-Length"=>"438",
352
+ "Connection"=>"Keep-Alive"
353
+ }
371
354
  end
372
355
 
373
- it "should pass if request was executed with non escaped params but escaped expected" do
374
- lambda {
375
- http_request(:get, "http://www.example.com/?#{NOT_ESCAPED_PARAMS}")
376
- request(:get, "http://www.example.com/?#{ESCAPED_PARAMS}").should have_been_made
377
- }.should_not raise_error
356
+ it "should return recorded body" do
357
+ @response.body.size.should == 438
378
358
  end
379
359
 
380
- it "should pass if request was executed with escaped params but uri matichg regexp expected" do
381
- lambda {
382
- http_request(:get, "http://www.example.com/?#{ESCAPED_PARAMS}")
383
- request(:get, /.*example.*/).should have_been_made
384
- }.should_not raise_error
360
+ it "should ensure file is closed" do
361
+ @file.should be_closed
385
362
  end
386
- end
387
363
 
388
- it "should fail if requested more times than expected" do
389
- lambda {
390
- http_request(:get, "http://www.example.com/")
391
- http_request(:get, "http://www.example.com/")
392
- request(:get, "http://www.example.com").should have_been_made
393
- }.should fail_with("The request GET http://www.example.com/ was expected to execute 1 time but it executed 2 times")
394
364
  end
395
365
 
396
- it "should fail if requested less times than expected" do
397
- lambda {
398
- http_request(:get, "http://www.example.com/")
399
- request(:get, "http://www.example.com").should have_been_made.twice
400
- }.should fail_with("The request GET http://www.example.com/ was expected to execute 2 times but it executed 1 time")
401
- end
402
-
403
- it "should fail if requested less times than expected when 3 times expected" do
404
- lambda {
405
- http_request(:get, "http://www.example.com/")
406
- request(:get, "http://www.example.com").should have_been_made.times(3)
407
- }.should fail_with("The request GET http://www.example.com/ was expected to execute 3 times but it executed 1 time")
408
- end
409
-
410
- it "should succeed if request was executed with the same body" do
411
- lambda {
412
- http_request(:get, "http://www.example.com/", :body => "abc")
413
- request(:get, "www.example.com").with(:body => "abc").should have_been_made
414
- }.should_not raise_error
415
- end
416
-
417
- it "should fail if request was executed with different body" do
418
- lambda {
419
- http_request(:get, "http://www.example.com/", :body => "abc")
420
- request(:get, "www.example.com").
421
- with(:body => "def").should have_been_made
422
- }.should fail_with("The request GET http://www.example.com/ with body 'def' was expected to execute 1 time but it executed 0 times")
423
- end
366
+ describe "replying responses raw responses from string" do
424
367
 
425
- it "should succeed if request was executed with the same headers" do
426
- lambda {
427
- http_request(:get, "http://www.example.com/", :headers => SAMPLE_HEADERS)
428
- request(:get, "www.example.com").
429
- with(:headers => SAMPLE_HEADERS).should have_been_made
430
- }.should_not raise_error
431
- end
432
-
433
- it "should fail if request was executed with different headers" do
434
- lambda {
435
- http_request(:get, "http://www.example.com/", :headers => SAMPLE_HEADERS)
436
- request(:get, "www.example.com").
437
- with(:headers => { 'Content-Length' => '9999'}).should have_been_made
438
- }.should fail_with("The request GET http://www.example.com/ with headers {'Content-Length'=>'9999'} was expected to execute 1 time but it executed 0 times")
439
- end
368
+ before(:each) do
369
+ @input = File.new(File.expand_path(File.dirname(__FILE__)) + "/example_curl_output.txt").read
370
+ stub_http_request(:get, "www.example.com").to_return(@input)
371
+ @response = http_request(:get, "http://www.example.com/")
372
+ end
440
373
 
441
- it "should fail if request was executed with less headers" do
442
- lambda {
443
- http_request(:get, "http://www.example.com/", :headers => {'A' => 'a'})
444
- request(:get, "www.example.com").
445
- with(:headers => {'A' => 'a', 'B' => 'b'}).should have_been_made
446
- }.should fail_with("The request GET http://www.example.com/ with headers {'A'=>'a', 'B'=>'b'} was expected to execute 1 time but it executed 0 times")
447
- end
374
+ it "should return recorded headers" do
375
+ @response.headers.should == {
376
+ "Date"=>"Sat, 23 Jan 2010 01:01:05 GMT",
377
+ "Content-Type"=>"text/html; charset=UTF-8",
378
+ "Content-Length"=>"438",
379
+ "Connection"=>"Keep-Alive"
380
+ }
381
+ end
448
382
 
449
- it "should succeed if request was executed with more headers" do
450
- lambda {
451
- http_request(:get, "http://www.example.com/",
452
- :headers => {'A' => 'a', 'B' => 'b'}
453
- )
454
- request(:get, "www.example.com").
455
- with(:headers => {'A' => 'a'}).should have_been_made
456
- }.should_not raise_error
457
- end
383
+ it "should return recorded body" do
384
+ @response.body.size.should == 438
385
+ end
458
386
 
459
- it "should succeed if request was executed with body and headers but they were not specified in expectantion" do
460
- lambda {
461
- http_request(:get, "http://www.example.com/",
462
- :body => "abc",
463
- :headers => SAMPLE_HEADERS
464
- )
465
- request(:get, "www.example.com").should have_been_made
466
- }.should_not raise_error
467
387
  end
468
388
 
389
+ describe "sequences of responses" do
469
390
 
470
- describe "with authentication" do
471
- before(:each) do
472
- stub_http_request(:any, "http://user:pass@www.example.com")
473
- stub_http_request(:any, "http://user:pazz@www.example.com")
391
+ it "should return responses one by one if declared in array" do
392
+ stub_http_request(:get, "www.example.com").to_return([ {:body => "1"}, {:body => "2"}, {:body => "3"} ])
393
+ http_request(:get, "http://www.example.com/").body.should == "1"
394
+ http_request(:get, "http://www.example.com/").body.should == "2"
395
+ http_request(:get, "http://www.example.com/").body.should == "3"
474
396
  end
475
397
 
476
- it "should succeed if succeed if request was executed with expected credentials" do
477
- lambda {
478
- http_request(:get, "http://user:pass@www.example.com/")
479
- request(:get, "http://user:pass@www.example.com").should have_been_made.once
480
- }.should_not raise_error
398
+ it "should repeat returning last declared response from a sequence after all responses were returned" do
399
+ stub_http_request(:get, "www.example.com").to_return([ {:body => "1"}, {:body => "2"} ])
400
+ http_request(:get, "http://www.example.com/").body.should == "1"
401
+ http_request(:get, "http://www.example.com/").body.should == "2"
402
+ http_request(:get, "http://www.example.com/").body.should == "2"
481
403
  end
482
404
 
483
- it "should fail if request was executed with different credentials than expected" do
484
- lambda {
485
- http_request(:get, "http://user:pass@www.example.com/")
486
- request(:get, "http://user:pazz@www.example.com").should have_been_made.once
487
- }.should fail_with("The request GET http://user:pazz@www.example.com/ was expected to execute 1 time but it executed 0 times")
405
+ it "should return responses one by one if declared as comma separated params" do
406
+ stub_http_request(:get, "www.example.com").to_return({:body => "1"}, {:body => "2"}, {:body => "3"})
407
+ http_request(:get, "http://www.example.com/").body.should == "1"
408
+ http_request(:get, "http://www.example.com/").body.should == "2"
409
+ http_request(:get, "http://www.example.com/").body.should == "3"
488
410
  end
489
411
 
490
- it "should fail if request was executed without credentials but credentials were expected" do
491
- lambda {
492
- http_request(:get, "http://www.example.com/")
493
- request(:get, "http://user:pass@www.example.com").should have_been_made.once
494
- }.should fail_with("The request GET http://user:pass@www.example.com/ was expected to execute 1 time but it executed 0 times")
412
+ it "should return responses one by one if declared with several to_return invokations" do
413
+ stub_http_request(:get, "www.example.com").
414
+ to_return({:body => "1"}).
415
+ to_return({:body => "2"}).
416
+ to_return({:body => "3"})
417
+ http_request(:get, "http://www.example.com/").body.should == "1"
418
+ http_request(:get, "http://www.example.com/").body.should == "2"
419
+ http_request(:get, "http://www.example.com/").body.should == "3"
495
420
  end
496
421
 
497
- it "should fail if request was executed with credentials but expected without" do
498
- lambda {
499
- http_request(:get, "http://user:pass@www.example.com/")
500
- request(:get, "http://www.example.com").should have_been_made.once
501
- }.should fail_with("The request GET http://www.example.com/ was expected to execute 1 time but it executed 0 times")
422
+ it "should return responses one by one if declared with to_return invocations separated with then syntactic sugar" do
423
+ stub_http_request(:get, "www.example.com").to_return({:body => "1"}).then.
424
+ to_return({:body => "2"}).then.to_return({:body => "3"})
425
+ http_request(:get, "http://www.example.com/").body.should == "1"
426
+ http_request(:get, "http://www.example.com/").body.should == "2"
427
+ http_request(:get, "http://www.example.com/").body.should == "3"
502
428
  end
503
429
 
504
430
  end
505
431
 
506
- describe "using webmock matcher" do
507
-
508
- it "should verify expected requests occured" do
509
- lambda {
510
- http_request(:get, "http://www.example.com/")
511
- WebMock.should have_requested(:get, "http://www.example.com").once
512
- }.should_not raise_error
432
+ describe "repeating declared responses more than once" do
433
+
434
+ it "should repeat one response declared number of times" do
435
+ stub_http_request(:get, "www.example.com").
436
+ to_return({:body => "1"}).times(2).
437
+ to_return({:body => "2"})
438
+ http_request(:get, "http://www.example.com/").body.should == "1"
439
+ http_request(:get, "http://www.example.com/").body.should == "1"
440
+ http_request(:get, "http://www.example.com/").body.should == "2"
513
441
  end
514
-
515
- it "should verify expected requests occured" do
516
- lambda {
517
- http_request(:get, "http://www.example.com/", :body => "abc", :headers => {'A' => 'a'})
518
- WebMock.should have_requested(:get, "http://www.example.com").with(:body => "abc", :headers => {'A' => 'a'}).once
519
- }.should_not raise_error
442
+
443
+
444
+ it "should repeat sequence of response declared number of times" do
445
+ stub_http_request(:get, "www.example.com").
446
+ to_return({:body => "1"}, {:body => "2"}).times(2).
447
+ to_return({:body => "3"})
448
+ http_request(:get, "http://www.example.com/").body.should == "1"
449
+ http_request(:get, "http://www.example.com/").body.should == "2"
450
+ http_request(:get, "http://www.example.com/").body.should == "1"
451
+ http_request(:get, "http://www.example.com/").body.should == "2"
452
+ http_request(:get, "http://www.example.com/").body.should == "3"
520
453
  end
521
-
522
- it "should verify that non expected requests didn't occur" do
523
- lambda {
524
- http_request(:get, "http://www.example.com/")
525
- WebMock.should_not have_requested(:get, "http://www.example.com")
526
- }.should fail_with("The request GET http://www.example.com/ was expected to execute 0 times but it executed 1 time")
454
+
455
+
456
+ it "should repeat infinitely last response even if number of declared times is lower" do
457
+ stub_http_request(:get, "www.example.com").
458
+ to_return({:body => "1"}).times(2)
459
+ http_request(:get, "http://www.example.com/").body.should == "1"
460
+ http_request(:get, "http://www.example.com/").body.should == "1"
461
+ http_request(:get, "http://www.example.com/").body.should == "1"
527
462
  end
528
- end
529
-
530
-
531
-
532
- describe "using assert_requested" do
533
-
534
- it "should verify expected requests occured" do
463
+
464
+ it "should give error if times is declared without specifying response" do
535
465
  lambda {
536
- http_request(:get, "http://www.example.com/")
537
- assert_requested(:get, "http://www.example.com", :times => 1)
538
- assert_requested(:get, "http://www.example.com")
539
- }.should_not raise_error
466
+ stub_http_request(:get, "www.example.com").times(3)
467
+ }.should raise_error("Invalid WebMock stub declaration. times(N) can be declared only after response declaration.")
540
468
  end
541
-
542
- it "should verify expected requests occured" do
543
- lambda {
544
- http_request(:get, "http://www.example.com/", :body => "abc", :headers => {'A' => 'a'})
545
- assert_requested(:get, "http://www.example.com", :body => "abc", :headers => {'A' => 'a'})
546
- }.should_not raise_error
469
+
470
+ end
471
+
472
+ describe "raising declared exceptions more than once" do
473
+
474
+ it "should repeat raising exception declared number of times" do
475
+ stub_http_request(:get, "www.example.com").
476
+ to_raise(MyException).times(2).
477
+ to_return({:body => "2"})
478
+ lambda {
479
+ http_request(:get, "http://www.example.com/")
480
+ }.should raise_error(MyException, "Exception from WebMock")
481
+ lambda {
482
+ http_request(:get, "http://www.example.com/")
483
+ }.should raise_error(MyException, "Exception from WebMock")
484
+ http_request(:get, "http://www.example.com/").body.should == "2"
547
485
  end
548
-
549
- it "should verify that non expected requests didn't occur" do
550
- lambda {
551
- http_request(:get, "http://www.example.com/")
552
- assert_not_requested(:get, "http://www.example.com")
553
- }.should fail_with("The request GET http://www.example.com/ was expected to execute 0 times but it executed 1 time")
486
+
487
+ it "should repeat raising sequence of exceptions declared number of times" do
488
+ stub_http_request(:get, "www.example.com").
489
+ to_raise(MyException, ArgumentError).times(2).
490
+ to_return({:body => "2"})
491
+ lambda {
492
+ http_request(:get, "http://www.example.com/")
493
+ }.should raise_error(MyException, "Exception from WebMock")
494
+ lambda {
495
+ http_request(:get, "http://www.example.com/")
496
+ }.should raise_error(ArgumentError)
497
+ lambda {
498
+ http_request(:get, "http://www.example.com/")
499
+ }.should raise_error(MyException, "Exception from WebMock")
500
+ lambda {
501
+ http_request(:get, "http://www.example.com/")
502
+ }.should raise_error(ArgumentError)
503
+ http_request(:get, "http://www.example.com/").body.should == "2"
554
504
  end
555
505
  end
556
506
  end
557
507
 
508
+ describe "precedence of stubs" do
558
509
 
559
- describe "when net connect allowed" do
560
- before(:each) do
561
- WebMock.allow_net_connect!
562
- end
510
+ it "should use the last declared matching request stub" do
511
+ stub_http_request(:get, "www.example.com").to_return(:body => "abc")
512
+ stub_http_request(:get, "www.example.com").to_return(:body => "def")
513
+ http_request(:get, "http://www.example.com/").body.should == "def"
514
+ end
563
515
 
564
- it "should verify expected requests occured" do
565
- setup_expectations_for_real_example_com_request
566
- lambda {
567
- http_request(:get, "http://www.example.com/")
568
- request(:get, "http://www.example.com").should have_been_made
569
- }.should_not raise_error
570
- end
516
+ it "should not be affected by the type of uri or request method" do
517
+ stub_http_request(:get, "www.example.com").to_return(:body => "abc")
518
+ stub_http_request(:any, /.*example.*/).to_return(:body => "def")
519
+ http_request(:get, "http://www.example.com/").body.should == "def"
520
+ end
571
521
 
572
- it "should verify that non expected requests didn't occur" do
573
- lambda {
574
- http_request(:get, "http://www.example.com/")
575
- request(:get, "http://www.example.com").should_not have_been_made
576
- }.should fail_with("The request GET http://www.example.com/ was expected to execute 0 times but it executed 1 time")
577
- end
578
- end
522
+ end
579
523
 
580
- end
524
+ describe "verification of request expectation" do
525
+
526
+ describe "when net connect not allowed" do
527
+
528
+ before(:each) do
529
+ WebMock.disable_net_connect!
530
+ stub_http_request(:any, "http://www.example.com")
531
+ stub_http_request(:any, "https://www.example.com")
532
+ end
533
+
534
+ it "should pass if request was executed with the same uri and method" do
535
+ lambda {
536
+ http_request(:get, "http://www.example.com/")
537
+ request(:get, "http://www.example.com").should have_been_made.once
538
+ }.should_not raise_error
539
+ end
540
+
541
+ it "should pass if request was not expected and not executed" do
542
+ lambda {
543
+ request(:get, "http://www.example.com").should_not have_been_made
544
+ }.should_not raise_error
545
+ end
546
+
547
+ it "should fail if request was not expected but executed" do
548
+ lambda {
549
+ http_request(:get, "http://www.example.com/")
550
+ request(:get, "http://www.example.com").should_not have_been_made
551
+ }.should fail_with("The request GET http://www.example.com/ was expected to execute 0 times but it executed 1 time")
552
+ end
553
+
554
+
555
+ it "should fail if request was not executed" do
556
+ lambda {
557
+ request(:get, "http://www.example.com").should have_been_made
558
+ }.should fail_with("The request GET http://www.example.com/ was expected to execute 1 time but it executed 0 times")
559
+ end
560
+
561
+ it "should fail if request was executed to different uri" do
562
+ lambda {
563
+ http_request(:get, "http://www.example.com/")
564
+ request(:get, "http://www.example.org").should have_been_made
565
+ }.should fail_with("The request GET http://www.example.org/ was expected to execute 1 time but it executed 0 times")
566
+ end
567
+
568
+ it "should fail if request was executed with different method" do
569
+ lambda {
570
+ http_request(:post, "http://www.example.com/")
571
+ request(:get, "http://www.example.com").should have_been_made
572
+ }.should fail_with("The request GET http://www.example.com/ was expected to execute 1 time but it executed 0 times")
573
+ end
574
+
575
+ it "should pass if request was executed with different form of uri" do
576
+ lambda {
577
+ http_request(:get, "http://www.example.com/")
578
+ request(:get, "www.example.com").should have_been_made
579
+ }.should_not raise_error
580
+ end
581
+
582
+ it "should pass if request was executed with different form of uri without port " do
583
+ lambda {
584
+ http_request(:get, "http://www.example.com/")
585
+ request(:get, "www.example.com:80").should have_been_made
586
+ }.should_not raise_error
587
+ end
588
+
589
+ it "should pass if request was executed with different form of uri with port" do
590
+ lambda {
591
+ http_request(:get, "http://www.example.com/")
592
+ request(:get, "www.example.com:80").should have_been_made
593
+ }.should_not raise_error
594
+ end
595
+
596
+ it "should fail if request was executed with different port" do
597
+ lambda {
598
+ http_request(:get, "http://www.example.com:80/")
599
+ request(:get, "www.example.com:90").should have_been_made
600
+ }.should fail_with("The request GET http://www.example.com:90/ was expected to execute 1 time but it executed 0 times")
601
+ end
602
+
603
+ it "should pass if request was executed with different form of uri with https port" do
604
+ lambda {
605
+ http_request(:get, "https://www.example.com/")
606
+ request(:get, "https://www.example.com:443/").should have_been_made
607
+ }.should_not raise_error
608
+ end
609
+
610
+ describe "when matching requests with escaped uris" do
611
+
612
+ before(:each) do
613
+ WebMock.disable_net_connect!
614
+ stub_http_request(:any, "http://www.example.com/?#{NOT_ESCAPED_PARAMS}")
615
+ end
616
+
617
+ it "should pass if request was executed with escaped params" do
618
+ lambda {
619
+ http_request(:get, "http://www.example.com/?#{ESCAPED_PARAMS}")
620
+ request(:get, "http://www.example.com/?#{NOT_ESCAPED_PARAMS}").should have_been_made
621
+ }.should_not raise_error
622
+ end
623
+
624
+ it "should pass if request was executed with non escaped params but escaped expected" do
625
+ lambda {
626
+ http_request(:get, "http://www.example.com/?#{NOT_ESCAPED_PARAMS}")
627
+ request(:get, "http://www.example.com/?#{ESCAPED_PARAMS}").should have_been_made
628
+ }.should_not raise_error
629
+ end
630
+
631
+ it "should pass if request was executed with escaped params but uri matichg regexp expected" do
632
+ lambda {
633
+ http_request(:get, "http://www.example.com/?#{ESCAPED_PARAMS}")
634
+ request(:get, /.*example.*/).should have_been_made
635
+ }.should_not raise_error
636
+ end
637
+ end
638
+
639
+ it "should fail if requested more times than expected" do
640
+ lambda {
641
+ http_request(:get, "http://www.example.com/")
642
+ http_request(:get, "http://www.example.com/")
643
+ request(:get, "http://www.example.com").should have_been_made
644
+ }.should fail_with("The request GET http://www.example.com/ was expected to execute 1 time but it executed 2 times")
645
+ end
646
+
647
+ it "should fail if requested less times than expected" do
648
+ lambda {
649
+ http_request(:get, "http://www.example.com/")
650
+ request(:get, "http://www.example.com").should have_been_made.twice
651
+ }.should fail_with("The request GET http://www.example.com/ was expected to execute 2 times but it executed 1 time")
652
+ end
653
+
654
+ it "should fail if requested less times than expected when 3 times expected" do
655
+ lambda {
656
+ http_request(:get, "http://www.example.com/")
657
+ request(:get, "http://www.example.com").should have_been_made.times(3)
658
+ }.should fail_with("The request GET http://www.example.com/ was expected to execute 3 times but it executed 1 time")
659
+ end
660
+
661
+ it "should succeed if request was executed with the same body" do
662
+ lambda {
663
+ http_request(:get, "http://www.example.com/", :body => "abc")
664
+ request(:get, "www.example.com").with(:body => "abc").should have_been_made
665
+ }.should_not raise_error
666
+ end
667
+
668
+ it "should fail if request was executed with different body" do
669
+ lambda {
670
+ http_request(:get, "http://www.example.com/", :body => "abc")
671
+ request(:get, "www.example.com").
672
+ with(:body => "def").should have_been_made
673
+ }.should fail_with("The request GET http://www.example.com/ with body 'def' was expected to execute 1 time but it executed 0 times")
674
+ end
675
+
676
+ it "should succeed if request was executed with the same body" do
677
+ lambda {
678
+ http_request(:get, "http://www.example.com/", :body => "abc")
679
+ request(:get, "www.example.com").with(:body => /^abc$/).should have_been_made
680
+ }.should_not raise_error
681
+ end
682
+
683
+ it "should fail if request was executed with different body" do
684
+ lambda {
685
+ http_request(:get, "http://www.example.com/", :body => /^abc/)
686
+ request(:get, "www.example.com").
687
+ with(:body => "xabc").should have_been_made
688
+ }.should fail_with("The request GET http://www.example.com/ with body 'xabc' was expected to execute 1 time but it executed 0 times")
689
+ end
690
+
691
+ it "should succeed if request was executed with the same headers" do
692
+ lambda {
693
+ http_request(:get, "http://www.example.com/", :headers => SAMPLE_HEADERS)
694
+ request(:get, "www.example.com").
695
+ with(:headers => SAMPLE_HEADERS).should have_been_made
696
+ }.should_not raise_error
697
+ end
698
+
699
+ it "should fail if request was executed with different headers" do
700
+ lambda {
701
+ http_request(:get, "http://www.example.com/", :headers => SAMPLE_HEADERS)
702
+ request(:get, "www.example.com").
703
+ with(:headers => { 'Content-Length' => '9999'}).should have_been_made
704
+ }.should fail_with("The request GET http://www.example.com/ with headers {'Content-Length'=>'9999'} was expected to execute 1 time but it executed 0 times")
705
+ end
706
+
707
+ it "should fail if request was executed with less headers" do
708
+ lambda {
709
+ http_request(:get, "http://www.example.com/", :headers => {'A' => 'a'})
710
+ request(:get, "www.example.com").
711
+ with(:headers => {'A' => 'a', 'B' => 'b'}).should have_been_made
712
+ }.should fail_with("The request GET http://www.example.com/ with headers {'A'=>'a', 'B'=>'b'} was expected to execute 1 time but it executed 0 times")
713
+ end
714
+
715
+ it "should succeed if request was executed with more headers" do
716
+ lambda {
717
+ http_request(:get, "http://www.example.com/",
718
+ :headers => {'A' => 'a', 'B' => 'b'}
719
+ )
720
+ request(:get, "www.example.com").
721
+ with(:headers => {'A' => 'a'}).should have_been_made
722
+ }.should_not raise_error
723
+ end
724
+
725
+ it "should succeed if request was executed with body and headers but they were not specified in expectantion" do
726
+ lambda {
727
+ http_request(:get, "http://www.example.com/",
728
+ :body => "abc",
729
+ :headers => SAMPLE_HEADERS
730
+ )
731
+ request(:get, "www.example.com").should have_been_made
732
+ }.should_not raise_error
733
+ end
734
+
735
+ it "should succeed if request was executed with headers matching regular expressions" do
736
+ lambda {
737
+ http_request(:get, "http://www.example.com/", :headers => { 'user-agent' => 'MyAppName' })
738
+ request(:get, "www.example.com").
739
+ with(:headers => { :user_agent => /^MyAppName$/ }).should have_been_made
740
+ }.should_not raise_error
741
+ end
742
+
743
+ it "should fail if request was executed with headers not matching regular expression" do
744
+ lambda {
745
+ http_request(:get, "http://www.example.com/", :headers => { 'user_agent' => 'xMyAppName' })
746
+ request(:get, "www.example.com").
747
+ with(:headers => { :user_agent => /^MyAppName$/ }).should have_been_made
748
+ }.should fail_with("The request GET http://www.example.com/ with headers {'User-Agent'=>/^MyAppName$/} was expected to execute 1 time but it executed 0 times")
749
+ end
750
+
751
+ it "should suceed if request was executed and block evaluated to true" do
752
+ lambda {
753
+ http_request(:post, "http://www.example.com/", :body => "wadus")
754
+ request(:post, "www.example.com").with { |req| req.body == "wadus" }.should have_been_made
755
+ }.should_not raise_error
756
+ end
757
+
758
+ it "should fail if request was executed and block evaluated to false" do
759
+ lambda {
760
+ http_request(:post, "http://www.example.com/")
761
+ request(:post, "www.example.com").with { |req| req.body == "wadus" }.should have_been_made
762
+ }.should fail_with("The request POST http://www.example.com/ with given block was expected to execute 1 time but it executed 0 times")
763
+ end
764
+
765
+ it "should fail if request was not expected but it executed and block matched request" do
766
+ lambda {
767
+ http_request(:post, "http://www.example.com/", :body => "wadus")
768
+ request(:post, "www.example.com").with { |req| req.body == "wadus" }.should_not have_been_made
769
+ }.should fail_with("The request POST http://www.example.com/ with given block was expected to execute 0 times but it executed 1 time")
770
+ end
771
+
772
+ describe "with authentication" do
773
+ before(:each) do
774
+ stub_http_request(:any, "http://user:pass@www.example.com")
775
+ stub_http_request(:any, "http://user:pazz@www.example.com")
776
+ end
777
+
778
+ it "should succeed if succeed if request was executed with expected credentials" do
779
+ lambda {
780
+ http_request(:get, "http://user:pass@www.example.com/")
781
+ request(:get, "http://user:pass@www.example.com").should have_been_made.once
782
+ }.should_not raise_error
783
+ end
784
+
785
+ it "should fail if request was executed with different credentials than expected" do
786
+ lambda {
787
+ http_request(:get, "http://user:pass@www.example.com/")
788
+ request(:get, "http://user:pazz@www.example.com").should have_been_made.once
789
+ }.should fail_with("The request GET http://user:pazz@www.example.com/ was expected to execute 1 time but it executed 0 times")
790
+ end
791
+
792
+ it "should fail if request was executed without credentials but credentials were expected" do
793
+ lambda {
794
+ http_request(:get, "http://www.example.com/")
795
+ request(:get, "http://user:pass@www.example.com").should have_been_made.once
796
+ }.should fail_with("The request GET http://user:pass@www.example.com/ was expected to execute 1 time but it executed 0 times")
797
+ end
798
+
799
+ it "should fail if request was executed with credentials but expected without" do
800
+ lambda {
801
+ http_request(:get, "http://user:pass@www.example.com/")
802
+ request(:get, "http://www.example.com").should have_been_made.once
803
+ }.should fail_with("The request GET http://www.example.com/ was expected to execute 1 time but it executed 0 times")
804
+ end
805
+
806
+ end
807
+
808
+ describe "using webmock matcher" do
809
+
810
+ it "should verify expected requests occured" do
811
+ lambda {
812
+ http_request(:get, "http://www.example.com/")
813
+ WebMock.should have_requested(:get, "http://www.example.com").once
814
+ }.should_not raise_error
815
+ end
816
+
817
+ it "should verify expected requests occured" do
818
+ lambda {
819
+ http_request(:get, "http://www.example.com/", :body => "abc", :headers => {'A' => 'a'})
820
+ WebMock.should have_requested(:get, "http://www.example.com").with(:body => "abc", :headers => {'A' => 'a'}).once
821
+ }.should_not raise_error
822
+ end
823
+
824
+ it "should verify that non expected requests didn't occur" do
825
+ lambda {
826
+ http_request(:get, "http://www.example.com/")
827
+ WebMock.should_not have_requested(:get, "http://www.example.com")
828
+ }.should fail_with("The request GET http://www.example.com/ was expected to execute 0 times but it executed 1 time")
829
+ end
830
+
831
+ it "should succeed if request was executed and block evaluated to true" do
832
+ lambda {
833
+ http_request(:post, "http://www.example.com/", :body => "wadus")
834
+ WebMock.should have_requested(:post, "www.example.com").with { |req| req.body == "wadus" }
835
+ }.should_not raise_error
836
+ end
837
+
838
+ it "should fail if request was executed and block evaluated to false" do
839
+ lambda {
840
+ http_request(:post, "http://www.example.com/")
841
+ WebMock.should have_requested(:post, "www.example.com").with { |req| req.body == "wadus" }
842
+ }.should fail_with("The request POST http://www.example.com/ with given block was expected to execute 1 time but it executed 0 times")
843
+ end
844
+
845
+ it "should fail if request was not expected but executed and block matched request" do
846
+ lambda {
847
+ http_request(:post, "http://www.example.com/", :body => "wadus")
848
+ WebMock.should_not have_requested(:post, "www.example.com").with { |req| req.body == "wadus" }
849
+ }.should fail_with("The request POST http://www.example.com/ with given block was expected to execute 0 times but it executed 1 time")
850
+ end
851
+ end
852
+
853
+
854
+
855
+ describe "using assert_requested" do
856
+
857
+ it "should verify expected requests occured" do
858
+ lambda {
859
+ http_request(:get, "http://www.example.com/")
860
+ assert_requested(:get, "http://www.example.com", :times => 1)
861
+ assert_requested(:get, "http://www.example.com")
862
+ }.should_not raise_error
863
+ end
864
+
865
+ it "should verify expected requests occured" do
866
+ lambda {
867
+ http_request(:get, "http://www.example.com/", :body => "abc", :headers => {'A' => 'a'})
868
+ assert_requested(:get, "http://www.example.com", :body => "abc", :headers => {'A' => 'a'})
869
+ }.should_not raise_error
870
+ end
871
+
872
+ it "should verify that non expected requests didn't occur" do
873
+ lambda {
874
+ http_request(:get, "http://www.example.com/")
875
+ assert_not_requested(:get, "http://www.example.com")
876
+ }.should fail_with("The request GET http://www.example.com/ was expected to execute 0 times but it executed 1 time")
877
+ end
878
+
879
+ it "should verify if non expected request executed and block evaluated to true" do
880
+ lambda {
881
+ http_request(:post, "http://www.example.com/", :body => "wadus")
882
+ assert_not_requested(:post, "www.example.com") { |req| req.body == "wadus" }
883
+ }.should fail_with("The request POST http://www.example.com/ with given block was expected to execute 0 times but it executed 1 time")
884
+ end
885
+
886
+ it "should verify if request was executed and block evaluated to true" do
887
+ lambda {
888
+ http_request(:post, "http://www.example.com/", :body => "wadus")
889
+ assert_requested(:post, "www.example.com") { |req| req.body == "wadus" }
890
+ }.should_not raise_error
891
+ end
892
+
893
+ it "should verify if request was executed and block evaluated to false" do
894
+ lambda {
895
+ http_request(:post, "http://www.example.com/")
896
+ assert_requested(:post, "www.example.com") { |req| req.body == "wadus" }
897
+ }.should fail_with("The request POST http://www.example.com/ with given block was expected to execute 1 time but it executed 0 times")
898
+ end
899
+ end
900
+ end
901
+
902
+
903
+ describe "when net connect allowed" do
904
+ before(:each) do
905
+ WebMock.allow_net_connect!
906
+ end
907
+
908
+ it "should verify expected requests occured" do
909
+ setup_expectations_for_real_example_com_request
910
+ lambda {
911
+ http_request(:get, "http://www.example.com/")
912
+ request(:get, "http://www.example.com").should have_been_made
913
+ }.should_not raise_error
914
+ end
915
+
916
+ it "should verify that non expected requests didn't occur" do
917
+ lambda {
918
+ http_request(:get, "http://www.example.com/")
919
+ request(:get, "http://www.example.com").should_not have_been_made
920
+ }.should fail_with("The request GET http://www.example.com/ was expected to execute 0 times but it executed 1 time")
921
+ end
922
+ end
581
923
 
582
- end
924
+ end
925
+
926
+ end