vcr 1.1.0 → 1.1.1

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.
Files changed (84) hide show
  1. data/.document +5 -0
  2. data/.gitignore +27 -0
  3. data/CHANGELOG.md +13 -0
  4. data/Gemfile +24 -0
  5. data/Gemfile.lock +119 -0
  6. data/README.md +3 -6
  7. data/Rakefile +70 -0
  8. data/benchmarks/http_stubbing_libraries.rb +59 -0
  9. data/features/fixtures/vcr_cassettes/1.9.1/cucumber_tags/regex_cassette.yml +43 -0
  10. data/features/fixtures/vcr_cassettes/1.9.1/cucumber_tags/replay_cassette1.yml +43 -0
  11. data/features/fixtures/vcr_cassettes/1.9.1/cucumber_tags/replay_cassette2.yml +63 -0
  12. data/features/fixtures/vcr_cassettes/1.9.1/cucumber_tags/replay_cassette3.yml +85 -0
  13. data/features/fixtures/vcr_cassettes/1.9.1/erb_cassette.yml +36 -0
  14. data/features/fixtures/vcr_cassettes/1.9.1/match_requests_on.yml +35 -0
  15. data/features/fixtures/vcr_cassettes/1.9.1/nested_replay_cassette.yml +32 -0
  16. data/features/fixtures/vcr_cassettes/1.9.1/not_the_real_response.yml +43 -0
  17. data/features/fixtures/vcr_cassettes/1.9.1/replay_localhost_cassette.yml +32 -0
  18. data/features/fixtures/vcr_cassettes/not_1.9.1/cucumber_tags/regex_cassette.yml +43 -0
  19. data/features/fixtures/vcr_cassettes/not_1.9.1/cucumber_tags/replay_cassette1.yml +43 -0
  20. data/features/fixtures/vcr_cassettes/not_1.9.1/cucumber_tags/replay_cassette2.yml +47 -0
  21. data/features/fixtures/vcr_cassettes/not_1.9.1/cucumber_tags/replay_cassette3.yml +85 -0
  22. data/features/fixtures/vcr_cassettes/not_1.9.1/erb_cassette.yml +36 -0
  23. data/features/fixtures/vcr_cassettes/not_1.9.1/match_requests_on.yml +35 -0
  24. data/features/fixtures/vcr_cassettes/not_1.9.1/nested_replay_cassette.yml +24 -0
  25. data/features/fixtures/vcr_cassettes/not_1.9.1/not_the_real_response.yml +43 -0
  26. data/features/fixtures/vcr_cassettes/not_1.9.1/replay_localhost_cassette.yml +32 -0
  27. data/features/http_client.feature +16 -0
  28. data/features/net_http.feature +27 -0
  29. data/features/record_response.feature +66 -0
  30. data/features/replay_recorded_response.feature +96 -0
  31. data/features/step_definitions/http_client_steps.rb +7 -0
  32. data/features/step_definitions/net_http_steps.rb +37 -0
  33. data/features/step_definitions/vcr_steps.rb +240 -0
  34. data/features/support/env.rb +104 -0
  35. data/features/webmock.feature +26 -0
  36. data/lib/vcr.rb +2 -2
  37. data/lib/vcr/extensions/net_http.rb +0 -8
  38. data/lib/vcr/http_stubbing_adapters/common.rb +39 -0
  39. data/lib/vcr/http_stubbing_adapters/fakeweb.rb +74 -70
  40. data/lib/vcr/http_stubbing_adapters/webmock.rb +61 -62
  41. data/lib/vcr/version.rb +1 -1
  42. data/spec/cassette_spec.rb +280 -0
  43. data/spec/config_spec.rb +76 -0
  44. data/spec/cucumber_tags_spec.rb +55 -0
  45. data/spec/deprecations_spec.rb +52 -0
  46. data/spec/extensions/net_http_response_spec.rb +85 -0
  47. data/spec/extensions/net_http_spec.rb +77 -0
  48. data/spec/fixtures/1.9.1/0_3_1_cassette.yml +29 -0
  49. data/spec/fixtures/1.9.1/cassette_spec/erb_with_no_vars.yml +32 -0
  50. data/spec/fixtures/1.9.1/cassette_spec/erb_with_vars.yml +32 -0
  51. data/spec/fixtures/1.9.1/cassette_spec/example.yml +110 -0
  52. data/spec/fixtures/1.9.1/cassette_spec/with_localhost_requests.yml +86 -0
  53. data/spec/fixtures/1.9.1/example_net_http.yml +14 -0
  54. data/spec/fixtures/1.9.1/example_net_http_request.yml +12 -0
  55. data/spec/fixtures/1.9.1/example_net_http_response.yml +25 -0
  56. data/spec/fixtures/1.9.1/fake_example.com_responses.yml +106 -0
  57. data/spec/fixtures/1.9.1/match_requests_on.yml +185 -0
  58. data/spec/fixtures/not_1.9.1/0_3_1_cassette.yml +29 -0
  59. data/spec/fixtures/not_1.9.1/cassette_spec/erb_with_no_vars.yml +32 -0
  60. data/spec/fixtures/not_1.9.1/cassette_spec/erb_with_vars.yml +32 -0
  61. data/spec/fixtures/not_1.9.1/cassette_spec/example.yml +110 -0
  62. data/spec/fixtures/not_1.9.1/cassette_spec/with_localhost_requests.yml +86 -0
  63. data/spec/fixtures/not_1.9.1/example_net_http.yml +14 -0
  64. data/spec/fixtures/not_1.9.1/example_net_http_request.yml +12 -0
  65. data/spec/fixtures/not_1.9.1/example_net_http_response.yml +25 -0
  66. data/spec/fixtures/not_1.9.1/fake_example.com_responses.yml +106 -0
  67. data/spec/fixtures/not_1.9.1/match_requests_on.yml +185 -0
  68. data/spec/http_stubbing_adapters/fakeweb_spec.rb +35 -0
  69. data/spec/http_stubbing_adapters/webmock_spec.rb +35 -0
  70. data/spec/request_matcher_spec.rb +194 -0
  71. data/spec/spec_helper.rb +40 -0
  72. data/spec/structs_spec.rb +121 -0
  73. data/spec/support/disable_warnings.rb +12 -0
  74. data/spec/support/http_library_adapters.rb +272 -0
  75. data/spec/support/http_stubbing_adapter.rb +100 -0
  76. data/spec/support/pending_on_heroku.rb +14 -0
  77. data/spec/support/temp_cassette_library_dir.rb +16 -0
  78. data/spec/support/vcr_localhost_server.rb +53 -0
  79. data/spec/vcr_spec.rb +198 -0
  80. data/spec/version_spec.rb +11 -0
  81. data/vcr.gemspec +43 -0
  82. metadata +134 -73
  83. data/lib/vcr/http_stubbing_adapters/base.rb +0 -36
  84. data/lib/vcr/version.rbc +0 -572
@@ -0,0 +1,40 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ Bundler.setup
4
+
5
+ require 'patron' unless RUBY_PLATFORM =~ /java/
6
+ require 'httpclient'
7
+ require 'em-http-request' unless RUBY_PLATFORM =~ /java/
8
+ require 'vcr'
9
+ require 'vcr/http_stubbing_adapters/fakeweb'
10
+ require 'vcr/http_stubbing_adapters/webmock'
11
+ require 'rspec'
12
+
13
+ # Ruby 1.9.1 has a different yaml serialization format.
14
+ YAML_SERIALIZATION_VERSION = RUBY_VERSION == '1.9.1' ? '1.9.1' : 'not_1.9.1'
15
+
16
+ # Requires supporting files with custom matchers and macros, etc,
17
+ # in ./support/ and its subdirectories.
18
+ Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].each {|f| require f}
19
+
20
+ RSpec.configure do |config|
21
+ config.extend TempCassetteLibraryDir
22
+ config.extend DisableWarnings
23
+
24
+ config.color_enabled = true
25
+ config.debug = RUBY_PLATFORM != 'java'
26
+
27
+ config.before(:each) do
28
+ VCR::Config.default_cassette_options = { :record => :new_episodes }
29
+ VCR::Config.http_stubbing_library = :fakeweb
30
+
31
+ WebMock.allow_net_connect!
32
+ WebMock.reset_webmock
33
+
34
+ FakeWeb.allow_net_connect = true
35
+ FakeWeb.clean_registry
36
+ end
37
+
38
+ config.filter_run :focus => true
39
+ config.run_all_when_everything_filtered = true
40
+ end
@@ -0,0 +1,121 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ shared_examples_for "a header normalizer" do
4
+ let(:instance) do
5
+ with_headers('Some_Header' => 'value1', 'aNother' => ['a', 'b'], 'third' => [], 'FOURTH' => nil)
6
+ end
7
+
8
+ it 'normalizes the hash to lower case keys and arrays of values' do
9
+ instance.headers.should == {
10
+ 'some_header' => ['value1'],
11
+ 'another' => ['a', 'b'],
12
+ 'third' => [],
13
+ 'fourth' => []
14
+ }
15
+ end
16
+
17
+ it 'set nil header to an empty hash' do
18
+ with_headers(nil).headers.should == {}
19
+ end
20
+ end
21
+
22
+ describe VCR::Request do
23
+ describe '#matcher' do
24
+ it 'returns a matcher with the given request' do
25
+ req = VCR::Request.new
26
+ req.matcher([:uri]).request.should == req
27
+ end
28
+
29
+ it 'returns a matcher with the given match_attributes' do
30
+ req = VCR::Request.new
31
+ req.matcher([:uri, :headers]).match_attributes.to_a.should =~ [:uri, :headers]
32
+ end
33
+ end
34
+
35
+ describe '.from_net_http_request' do
36
+ let(:net_http) { YAML.load(File.read(File.dirname(__FILE__) + "/fixtures/#{YAML_SERIALIZATION_VERSION}/example_net_http.yml")) }
37
+ let(:request) { YAML.load(File.read(File.dirname(__FILE__) + "/fixtures/#{YAML_SERIALIZATION_VERSION}/example_net_http_request.yml")) }
38
+ subject { described_class.from_net_http_request(net_http, request) }
39
+
40
+ before(:each) do
41
+ VCR.http_stubbing_adapter.should respond_to(:request_uri)
42
+ VCR.http_stubbing_adapter.stub!(:request_uri)
43
+ end
44
+
45
+ it { should be_instance_of(VCR::Request) }
46
+ its(:method) { should == :post }
47
+ its(:body) { should == 'id=7' }
48
+ its(:headers) { should == { "accept" => ["*/*"], "content-type" => ["application/x-www-form-urlencoded"] } }
49
+
50
+ it 'sets the uri using the http_stubbing_adapter.request_uri' do
51
+ VCR.http_stubbing_adapter.should_receive(:request_uri).with(net_http, request).and_return('foo/bar')
52
+ subject.uri.should == 'foo/bar'
53
+ end
54
+ end
55
+
56
+ def with_headers(headers)
57
+ described_class.new(:get, 'http://example.com/', nil, headers)
58
+ end
59
+ it_should_behave_like 'a header normalizer'
60
+ end
61
+
62
+ describe VCR::ResponseStatus do
63
+ describe '.from_net_http_response' do
64
+ let(:response) { YAML.load(File.read(File.dirname(__FILE__) + "/fixtures/#{YAML_SERIALIZATION_VERSION}/example_net_http_response.yml")) }
65
+ subject { described_class.from_net_http_response(response) }
66
+
67
+ it { should be_instance_of(described_class) }
68
+ its(:code) { should == 200 }
69
+ its(:message) { should == 'OK' }
70
+ end
71
+ end
72
+
73
+ describe VCR::Response do
74
+ describe '.from_net_http_response' do
75
+ let(:response) { YAML.load(File.read(File.dirname(__FILE__) + "/fixtures/#{YAML_SERIALIZATION_VERSION}/example_net_http_response.yml")) }
76
+ subject { described_class.from_net_http_response(response) }
77
+
78
+ it { should be_instance_of(described_class) }
79
+ its(:body) { should == 'The response from example.com' }
80
+ its(:http_version) { should == '1.1' }
81
+ its(:headers) { should == {
82
+ "last-modified" => ['Tue, 15 Nov 2005 13:24:10 GMT'],
83
+ "connection" => ['close'],
84
+ "etag" => ["\"24ec5-1b6-4059a80bfd280\""],
85
+ "content-type" => ["text/html; charset=UTF-8"],
86
+ "date" => ['Wed, 31 Mar 2010 02:43:26 GMT'],
87
+ "server" => ['Apache/2.2.3 (CentOS)'],
88
+ "content-length" => ['438'],
89
+ "accept-ranges" => ['bytes']
90
+ } }
91
+
92
+ it 'assigns the status using VCR::ResponseStatus.from_net_http_response' do
93
+ VCR::ResponseStatus.should respond_to(:from_net_http_response)
94
+ VCR::ResponseStatus.should_receive(:from_net_http_response).with(response).and_return(:the_status)
95
+ subject.status.should == :the_status
96
+ end
97
+ end
98
+
99
+ def with_headers(headers)
100
+ described_class.new(:status, headers, nil, '1.1')
101
+ end
102
+ it_should_behave_like 'a header normalizer'
103
+
104
+ it "ensures the body is serialized to yaml as a raw string" do
105
+ body = "My String"
106
+ body.instance_variable_set(:@foo, 7)
107
+ instance = described_class.new(:status, {}, body, :version)
108
+ instance.body.to_yaml.should == "My String".to_yaml
109
+ end
110
+ end
111
+
112
+ describe VCR::HTTPInteraction do
113
+ %w( uri method ).each do |attr|
114
+ it "delegates :#{attr} to the request signature" do
115
+ sig = mock('request signature')
116
+ sig.should_receive(attr).and_return(:the_value)
117
+ instance = described_class.new(sig, nil)
118
+ instance.send(attr).should == :the_value
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,12 @@
1
+ module DisableWarnings
2
+ def disable_warnings
3
+ before(:all) do
4
+ @orig_std_err = $stderr
5
+ $stderr = StringIO.new
6
+ end
7
+
8
+ after(:all) do
9
+ $stderr = @orig_std_err
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,272 @@
1
+ HTTP_LIBRARY_ADAPTERS = {}
2
+
3
+ HTTP_LIBRARY_ADAPTERS['net/http'] = Module.new do
4
+ def self.http_library_name; 'Net::HTTP'; end
5
+
6
+ def get_body_string(response); response.body; end
7
+
8
+ def get_header(header_key, response)
9
+ response.get_fields(header_key)
10
+ end
11
+
12
+ def make_http_request(method, url, body = nil, headers = {})
13
+ uri = URI.parse(url)
14
+ Net::HTTP.new(uri.host, uri.port).send_request(method.to_s.upcase, uri.path, body, headers)
15
+ end
16
+ end
17
+
18
+ HTTP_LIBRARY_ADAPTERS['patron'] = Module.new do
19
+ def self.http_library_name; 'Patron'; end
20
+
21
+ def get_body_string(response); response.body; end
22
+
23
+ def get_header(header_key, response)
24
+ response.headers[header_key]
25
+ end
26
+
27
+ def make_http_request(method, url, body = nil, headers = {})
28
+ Patron::Session.new.request(method, url, headers, :data => body || '')
29
+ end
30
+ end
31
+
32
+ HTTP_LIBRARY_ADAPTERS['httpclient'] = Module.new do
33
+ def self.http_library_name; 'HTTP Client'; end
34
+
35
+ def get_body_string(response)
36
+ string = response.body.content
37
+ string.respond_to?(:read) ? string.read : string
38
+ end
39
+
40
+ def get_header(header_key, response)
41
+ response.header[header_key]
42
+ end
43
+
44
+ def make_http_request(method, url, body = nil, headers = {})
45
+ HTTPClient.new.request(method, url, nil, body, headers)
46
+ end
47
+ end
48
+
49
+ HTTP_LIBRARY_ADAPTERS['em-http-request'] = Module.new do
50
+ def self.http_library_name; 'EM HTTP Request'; end
51
+
52
+ def get_body_string(response)
53
+ response.response
54
+ end
55
+
56
+ def get_header(header_key, response)
57
+ response.response_header[header_key.upcase.gsub('-', '_')].split(', ')
58
+ end
59
+
60
+ def make_http_request(method, url, body = nil, headers = {})
61
+ http = nil
62
+ EventMachine.run do
63
+ http = EventMachine::HttpRequest.new(url).send(method, :body => body, :head => headers)
64
+ http.callback { EventMachine.stop }
65
+ end
66
+ http
67
+ end
68
+ end
69
+
70
+ NET_CONNECT_NOT_ALLOWED_ERROR = /You can use VCR to automatically record this request and replay it later/
71
+
72
+ module HttpLibrarySpecs
73
+ def test_http_library(library, supported_request_match_attributes)
74
+ # patron and em-http-client cannot be installed on jruby
75
+ return if %w[patron em-http-request].include?(library) && RUBY_PLATFORM == 'java'
76
+
77
+ unless adapter_module = HTTP_LIBRARY_ADAPTERS[library]
78
+ raise ArgumentError.new("No http library adapter module could be found for #{library}")
79
+ end
80
+
81
+ describe "using #{adapter_module.http_library_name}" do
82
+ include adapter_module
83
+
84
+ # Necessary for ruby 1.9.2. On 1.9.2 we get an error when we use super,
85
+ # so this gives us another alias we can use for the original method.
86
+ alias make_request make_http_request
87
+
88
+ describe '#stub_requests using specific match_attributes' do
89
+ before(:each) { subject.http_connections_allowed = false }
90
+ let(:interactions) { YAML.load(File.read(File.join(File.dirname(__FILE__), '..', 'fixtures', YAML_SERIALIZATION_VERSION, 'match_requests_on.yml'))) }
91
+
92
+ @supported_request_match_attributes = supported_request_match_attributes
93
+ def self.matching_on(attribute, valid, invalid, &block)
94
+ supported_request_match_attributes = @supported_request_match_attributes
95
+
96
+ describe ":#{attribute}" do
97
+ let(:perform_stubbing) { subject.stub_requests(interactions, [attribute]) }
98
+
99
+ if supported_request_match_attributes.include?(attribute)
100
+ before(:each) { perform_stubbing }
101
+ module_eval(&block)
102
+
103
+ valid.each do |val, response|
104
+ it "returns the expected response for a #{val.inspect} request" do
105
+ get_body_string(make_http_request(val)).should == response
106
+ end
107
+ end
108
+
109
+ it 'raises an error for another method' do
110
+ expect { make_http_request(invalid) }.to raise_error(NET_CONNECT_NOT_ALLOWED_ERROR)
111
+ end
112
+ else
113
+ it 'raises an error indicating matching requests on this attribute is not supported' do
114
+ expect { perform_stubbing }.to raise_error(/does not support matching requests on #{attribute}/)
115
+ end
116
+ end
117
+ end
118
+ end
119
+
120
+ matching_on :method, { :get => "get method response", :post => "post method response" }, :put do
121
+ def make_http_request(http_method)
122
+ make_request(http_method, 'http://some-wrong-domain.com/', nil, {})
123
+ end
124
+ end
125
+
126
+ matching_on :host, { 'example1.com' => 'example1.com host response', 'example2.com' => 'example2.com host response' }, 'example3.com' do
127
+ def make_http_request(host)
128
+ make_request(:get, "http://#{host}/some/wrong/path", nil, {})
129
+ end
130
+ end
131
+
132
+ matching_on :path, { '/path1' => 'path1 response', '/path2' => 'path2 response' }, '/path3' do
133
+ def make_http_request(path)
134
+ make_request(:get, "http://some.wrong.domain.com#{path}?p=q", nil, {})
135
+ end
136
+ end
137
+
138
+ matching_on :uri, { 'http://example.com/uri1' => 'uri1 response', 'http://example.com/uri2' => 'uri2 response' }, 'http://example.com/uri3' do
139
+ def make_http_request(uri)
140
+ make_request(:get, uri, nil, {})
141
+ end
142
+ end
143
+
144
+ matching_on :body, { 'param=val1' => 'val1 body response', 'param=val2' => 'val2 body response' }, 'param=val3' do
145
+ def make_http_request(body)
146
+ make_request(:put, "http://wrong-domain.com/wrong/path", body, {})
147
+ end
148
+ end
149
+
150
+ matching_on :headers, {{ 'X-HTTP-HEADER1' => 'val1' } => 'val1 header response', { 'X-HTTP-HEADER1' => 'val2' } => 'val2 header response' }, { 'X-HTTP-HEADER1' => 'val3' } do
151
+ def make_http_request(headers)
152
+ make_request(:get, "http://wrong-domain.com/wrong/path", nil, headers)
153
+ end
154
+ end
155
+ end
156
+
157
+ def self.test_real_http_request(http_allowed)
158
+ if http_allowed
159
+
160
+ it 'allows real http requests' do
161
+ get_body_string(make_http_request(:get, 'http://example.com/foo')).should =~ /The requested URL \/foo was not found/
162
+ end
163
+
164
+ it 'records new http requests' do
165
+ VCR.should_receive(:record_http_interaction) do |interaction|
166
+ URI.parse(interaction.request.uri).to_s.should == URI.parse('http://example.com/foo').to_s
167
+ interaction.request.method.should == :get
168
+ interaction.response.status.code.should == 404
169
+ interaction.response.status.message.should == 'Not Found'
170
+ interaction.response.body.should =~ /The requested URL \/foo was not found/
171
+ end
172
+
173
+ make_http_request(:get, 'http://example.com/foo')
174
+ end
175
+
176
+ else
177
+ it 'does not allow real HTTP requests or record them' do
178
+ VCR.should_receive(:record_http_interaction).never
179
+ lambda { make_http_request(:get, 'http://example.com/foo') }.should raise_error(NET_CONNECT_NOT_ALLOWED_ERROR)
180
+ end
181
+ end
182
+ end
183
+
184
+ def test_request_stubbed(method, url, expected)
185
+ subject.request_stubbed?(VCR::Request.new(method, url), [:method, :uri]).should == expected
186
+ end
187
+
188
+ [true, false].each do |http_allowed|
189
+ context "when #http_connections_allowed is set to #{http_allowed}" do
190
+ before(:each) { subject.http_connections_allowed = http_allowed }
191
+
192
+ it "returns #{http_allowed} for #http_connections_allowed?" do
193
+ subject.http_connections_allowed?.should == http_allowed
194
+ end
195
+
196
+ test_real_http_request(http_allowed)
197
+
198
+ unless http_allowed
199
+ describe '.ignore_localhost =' do
200
+ let(:localhost_response) { 'A localhost response!' }
201
+ let(:localhost_server) { VCR::LocalhostServer::STATIC_SERVERS[localhost_response] }
202
+
203
+ VCR::LOCALHOST_ALIASES.each do |localhost_alias|
204
+ describe 'when set to true' do
205
+ extend PendingOnHeroku
206
+ before(:each) { subject.ignore_localhost = true }
207
+
208
+ it "allows requests to #{localhost_alias}" do
209
+ get_body_string(make_http_request(:get, "http://#{localhost_alias}:#{localhost_server.port}/")).should == localhost_response
210
+ end
211
+ end
212
+
213
+ describe 'when set to false' do
214
+ before(:each) { subject.ignore_localhost = false }
215
+
216
+ it "does not allow requests to #{localhost_alias}" do
217
+ expect { make_http_request(:get, "http://#{localhost_alias}:#{localhost_server.port}/") }.to raise_error(NET_CONNECT_NOT_ALLOWED_ERROR)
218
+ end
219
+ end
220
+ end
221
+ end
222
+ end
223
+
224
+ context 'when some requests are stubbed, after setting a checkpoint' do
225
+ before(:each) do
226
+ subject.create_stubs_checkpoint(:my_checkpoint)
227
+ @recorded_interactions = YAML.load(File.read(File.join(File.dirname(__FILE__), '..', 'fixtures', YAML_SERIALIZATION_VERSION, 'fake_example.com_responses.yml')))
228
+ subject.stub_requests(@recorded_interactions, VCR::RequestMatcher::DEFAULT_MATCH_ATTRIBUTES)
229
+ end
230
+
231
+ it 'returns true from #request_stubbed? for the requests that are stubbed' do
232
+ test_request_stubbed(:post, 'http://example.com', true)
233
+ test_request_stubbed(:get, 'http://example.com/foo', true)
234
+ end
235
+
236
+ it 'returns false from #request_stubbed? for requests that are not stubbed' do
237
+ test_request_stubbed(:post, 'http://example.com/foo', false)
238
+ test_request_stubbed(:get, 'http://google.com', false)
239
+ end
240
+
241
+ it 'gets the stubbed responses when multiple post requests are made to http://example.com, and does not record them' do
242
+ VCR.should_receive(:record_http_interaction).never
243
+ get_body_string(make_http_request(:post, 'http://example.com/', { 'id' => '7' })).should == 'example.com post response with id=7'
244
+ get_body_string(make_http_request(:post, 'http://example.com/', { 'id' => '3' })).should == 'example.com post response with id=3'
245
+ end
246
+
247
+ it 'gets the stubbed responses when requests are made to http://example.com/foo, and does not record them' do
248
+ VCR.should_receive(:record_http_interaction).never
249
+ get_body_string(make_http_request(:get, 'http://example.com/foo')).should == 'example.com get response with path=foo'
250
+ end
251
+
252
+ it "correctly handles stubbing multiple values for the same header" do
253
+ get_header('Set-Cookie', make_http_request(:get, 'http://example.com/two_set_cookie_headers')).should =~ ['bar=bazz', 'foo=bar']
254
+ end
255
+
256
+ context 'when we restore our previous check point' do
257
+ before(:each) { subject.restore_stubs_checkpoint(:my_checkpoint) }
258
+
259
+ test_real_http_request(http_allowed)
260
+
261
+ it 'returns false from #request_stubbed?' do
262
+ test_request_stubbed(:get, 'http://example.com/foo', false)
263
+ test_request_stubbed(:post, 'http://example.com', false)
264
+ test_request_stubbed(:get, 'http://google.com', false)
265
+ end
266
+ end
267
+ end
268
+ end
269
+ end
270
+ end
271
+ end
272
+ end