vcr 1.7.0 → 1.7.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.
data/.gitignore CHANGED
@@ -30,4 +30,4 @@ Gemfile.lock
30
30
 
31
31
  features/README.md
32
32
  features/CHANGELOG.md
33
- features/LICENSE
33
+ features/LICENSE.md
@@ -1,8 +1,13 @@
1
- # Changelog
2
-
3
1
  ## In git
4
2
 
5
- [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.7.0...master)
3
+ [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.7.1...master)
4
+
5
+ ## 1.7.1 (March 19, 2011)
6
+
7
+ [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.7.0...v1.7.1)
8
+
9
+ * Fix Faraday adapter so that it properly normalizes query parameters
10
+ in the same way that Faraday itself does.
6
11
 
7
12
  ## 1.7.0 (March 1, 2011)
8
13
 
data/README.md CHANGED
@@ -32,17 +32,17 @@ maintenance) and accurate (the response from example.com will contain the same h
32
32
  * Automatically records and replays your HTTP interactions with minimal setup/configuration code.
33
33
  * Supports and works with the HTTP stubbing facilities of multiple libraries. Currently, the
34
34
  following are supported:
35
- * FakeWeb
36
- * WebMock
37
- * Typhoeus
38
- * Faraday
35
+ * [FakeWeb](https://github.com/chrisk/fakeweb)
36
+ * [WebMock](https://github.com/bblimke/webmock)
37
+ * [Typhoeus](https://github.com/dbalatero/typhoeus)
38
+ * [Faraday](https://github.com/technoweenie/faraday)
39
39
  * Supports multiple HTTP libraries:
40
40
  * [Patron](http://github.com/toland/patron) (when using WebMock)
41
41
  * [Curb](http://github.com/taf2/curb) (when using WebMock -- only supports Curb::Easy at the moment)
42
42
  * [HTTPClient](http://github.com/nahi/httpclient) (when using WebMock)
43
43
  * [em-http-request](http://github.com/igrigorik/em-http-request) (when using WebMock)
44
44
  * [Net::HTTP](http://www.ruby-doc.org/stdlib/libdoc/net/http/rdoc/index.html) (when using FakeWeb and WebMock)
45
- * [Typhoeus](https://github.com/pauldix/typhoeus) (Typhoeus::Hydra, but not Typhoeus::Easy or Typhoeus::Multi)
45
+ * [Typhoeus](https://github.com/dbalatero/typhoeus) (Typhoeus::Hydra, but not Typhoeus::Easy or Typhoeus::Multi)
46
46
  * [Faraday](https://github.com/technoweenie/faraday)
47
47
  * And of course any library built on Net::HTTP, such as [Mechanize](http://github.com/tenderlove/mechanize),
48
48
  [HTTParty](http://github.com/jnunemaker/httparty) or [Rest Client](http://github.com/archiloque/rest-client).
data/Rakefile CHANGED
@@ -47,7 +47,9 @@ namespace :ci do
47
47
  end
48
48
 
49
49
  def ensure_relish_doc_symlinked(filename)
50
- from = File.expand_path("../features/#{filename}", __FILE__)
50
+ from_filename = filename.dup
51
+ from_filename << '.md' unless filename =~ /\.md$/
52
+ from = File.expand_path("../features/#{from_filename}", __FILE__)
51
53
  to = File.expand_path("../#{filename}", __FILE__)
52
54
 
53
55
  if File.symlink?(from)
@@ -1,7 +1,7 @@
1
- getting_started.md (Getting Started)
2
- CHANGELOG.md (Changelog)
3
- about_the_cucumber_features.md (About the Cucumber Features)
4
- LICENSE (License)
1
+ - getting_started.md (Getting Started)
2
+ - CHANGELOG.md (Changelog)
3
+ - about_these_examples.md (About These Examples)
4
+ - LICENSE.md (License)
5
5
  - cassettes:
6
6
  - format.feature
7
7
  - no_cassette.feature
@@ -1,5 +1,3 @@
1
- ## About the Cucumber Features
2
-
3
1
  The cucumber features provided here demonstrate all of the major features of
4
2
  VCR. These features are executable documentation for VCR.
5
3
 
@@ -5,8 +5,18 @@ Feature: Cassette format
5
5
  human-readable/editable format. A cassette contains an array
6
6
  of HTTP interactions, each of which has the following:
7
7
 
8
- - Request method, uri, body, headers
9
- - Response status (code & message), headers, body, http version
8
+ - request
9
+ - method
10
+ - uri
11
+ - body
12
+ - headers
13
+ - response
14
+ - status
15
+ - code
16
+ - message
17
+ - headers
18
+ - body
19
+ - http version
10
20
 
11
21
  Scenario Outline: Request/Response data is saved to disk as YAML
12
22
  Given a file named "cassette_format.rb" with:
@@ -40,7 +40,7 @@ Feature: Update content_length header
40
40
  body: Hello <modified>
41
41
  http_version: "1.1"
42
42
  """
43
- Given a file named "common_stuff.rb" with:
43
+ And a file named "common_stuff.rb" with:
44
44
  """
45
45
  require 'vcr'
46
46
 
@@ -1,4 +1,4 @@
1
- Feature: allow_http_connections_when_no_cassette
1
+ Feature: Allow HTTP connections when no cassette
2
2
 
3
3
  Usually, HTTP requests made when no cassette is inserted will result
4
4
  in an error (see cassettes/no_cassette.feature). You can set the
@@ -1,5 +1,3 @@
1
- ## Getting Started
2
-
3
1
  ### Install it
4
2
 
5
3
  [sudo] gem install vcr
@@ -26,7 +26,8 @@ module VCR
26
26
 
27
27
  def stub_requests(http_interactions, match_attributes)
28
28
  grouped_responses(http_interactions, match_attributes).each do |request_matcher, responses|
29
- queue = stub_queues[request_matcher]
29
+ matcher = request_matcher_with_normalized_uri(request_matcher)
30
+ queue = stub_queues[matcher]
30
31
  responses.each { |res| queue << res }
31
32
  end
32
33
  end
@@ -82,6 +83,15 @@ module VCR
82
83
  def hash_of_arrays
83
84
  Hash.new { |h, k| h[k] = [] }
84
85
  end
86
+
87
+ def request_matcher_with_normalized_uri(matcher)
88
+ return matcher unless matcher.uri.is_a?(String) && matcher.uri.include?('+')
89
+
90
+ request = matcher.request.dup
91
+ request.uri = request.uri.gsub('+', '%20')
92
+
93
+ RequestMatcher.new(request, matcher.match_attributes)
94
+ end
85
95
  end
86
96
  end
87
97
  end
@@ -18,7 +18,7 @@ module VCR
18
18
  elsif response = VCR::HttpStubbingAdapters::Faraday.stubbed_response_for(request_matcher)
19
19
  env.update(
20
20
  :status => response.status.code,
21
- :response_headers => correctly_cased_headers(response.headers),
21
+ :response_headers => correctly_cased_headers(response.headers || {}),
22
22
  :body => response.body
23
23
  )
24
24
 
@@ -3,7 +3,7 @@ module VCR
3
3
 
4
4
  def version
5
5
  @version ||= begin
6
- string = '1.7.0'
6
+ string = '1.7.1'
7
7
 
8
8
  def string.parts
9
9
  split('.').map { |p| p.to_i }
@@ -11,7 +11,7 @@ HTTP_LIBRARY_ADAPTERS['net/http'] = Module.new do
11
11
 
12
12
  def make_http_request(method, url, body = nil, headers = {})
13
13
  uri = URI.parse(url)
14
- Net::HTTP.new(uri.host, uri.port).send_request(method.to_s.upcase, uri.path, body, headers)
14
+ Net::HTTP.new(uri.host, uri.port).send_request(method.to_s.upcase, uri.request_uri, body, headers)
15
15
  end
16
16
  end
17
17
 
@@ -1,3 +1,5 @@
1
+ require 'cgi'
2
+
1
3
  NET_CONNECT_NOT_ALLOWED_ERROR = /You can use VCR to automatically record this request and replay it later/
2
4
 
3
5
  shared_examples_for "an http library" do |library, supported_request_match_attributes, *other|
@@ -12,7 +14,53 @@ shared_examples_for "an http library" do |library, supported_request_match_attri
12
14
  # so this gives us another alias we can use for the original method.
13
15
  alias make_request make_http_request
14
16
 
15
- describe '#stub_requests using specific match_attributes' do
17
+ describe 'making an HTTP request' do
18
+ let(:status) { VCR::ResponseStatus.new(200, 'OK') }
19
+ let(:interaction) { VCR::HTTPInteraction.new(request, response) }
20
+ let(:response_body) { "The response body" }
21
+ let(:match_requests_on) { [:method, :uri] }
22
+ let(:record_mode) { :none }
23
+
24
+ before(:each) do
25
+ subject.stub_requests([interaction], match_requests_on)
26
+ end
27
+
28
+ context "when the the stubbed request and response has no headers" do
29
+ let(:request) { VCR::Request.new(:get, 'http://example.com:80/') }
30
+ let(:response) { VCR::Response.new(status, nil, response_body, '1.1') }
31
+
32
+ it 'returns the response for a matching request' do
33
+ get_body_string(make_http_request(:get, 'http://example.com/')).should == response_body
34
+ end
35
+ end
36
+
37
+ def self.test_url(description, url)
38
+ context "when a URL #{description} has been stubbed" do
39
+ let(:request) { VCR::Request.new(:get, url) }
40
+ let(:response) { VCR::Response.new(status, nil, response_body, '1.1') }
41
+
42
+ def should_be_pending?
43
+ return false unless described_class == VCR::HttpStubbingAdapters::WebMock
44
+ return false unless request.uri.include?(CGI.escape('&'))
45
+ self.class.included_modules.first.http_library_name == 'EM HTTP Request'
46
+ end
47
+
48
+ it 'returns the expected response for the same request' do
49
+ pending "WebMock/EM-HTTP bug", :if => should_be_pending? do
50
+ get_body_string(make_http_request(:get, url)).should == response_body
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ test_url "that has query params", "http://example.com/search?q=param"
57
+ test_url "with spaces encoded as +", "http://example.com/search?q=a+b"
58
+ test_url "with spaces encoded as %20", "http://example.com/search?q=a%20b"
59
+ test_url "with an encoded ampersand", "http://example.com:80/search?q=#{CGI.escape("Q&A")}"
60
+ test_url "with a complex escaped query param", "http://example.com:80/search?q=#{CGI.escape("A&(! 234k !@ kasdj232\#$ kjw35")}"
61
+ end
62
+
63
+ describe '.stub_requests using specific match_attributes' do
16
64
  before(:each) { subject.http_connections_allowed = false }
17
65
  let(:interactions) { VCR::YAML.load_file(File.join(VCR::SPEC_ROOT, 'fixtures', YAML_SERIALIZATION_VERSION, 'match_requests_on.yml')) }
18
66
 
@@ -43,19 +43,6 @@ shared_examples_for "an http stubbing adapter" do |supported_http_libraries, sup
43
43
  end
44
44
  end
45
45
 
46
- describe '.stub_requests' do
47
- let(:request) { VCR::Request.new(:get, 'http://example.com/') }
48
- let(:status) { VCR::ResponseStatus.new(200, 'OK') }
49
- let(:response) { VCR::Response.new(status) }
50
- let(:interaction) { VCR::HTTPInteraction.new(request, response) }
51
-
52
- it 'works when the request and response has no headers' do
53
- expect {
54
- subject.stub_requests([interaction], [:method, :uri])
55
- }.not_to raise_error
56
- end
57
- end
58
-
59
46
  if other.include?(:needs_net_http_extension)
60
47
  describe '.request_uri' do
61
48
  it 'returns the uri for the given http request' do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vcr
3
3
  version: !ruby/object:Gem::Version
4
- hash: 11
4
+ hash: 9
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 7
9
- - 0
10
- version: 1.7.0
9
+ - 1
10
+ version: 1.7.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Myron Marston
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-01 00:00:00 -08:00
18
+ date: 2011-03-19 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -314,7 +314,7 @@ files:
314
314
  - benchmarks/http_stubbing_libraries.rb
315
315
  - cucumber.yml
316
316
  - features/.nav
317
- - features/about_the_cucumber_features.md
317
+ - features/about_these_examples.md
318
318
  - features/cassettes/automatic_re_recording.feature
319
319
  - features/cassettes/dynamic_erb.feature
320
320
  - features/cassettes/format.feature
@@ -489,7 +489,7 @@ signing_key:
489
489
  specification_version: 3
490
490
  summary: Record your test suite's HTTP interactions and replay them during future test runs for fast, deterministic, accurate tests.
491
491
  test_files:
492
- - features/about_the_cucumber_features.md
492
+ - features/about_these_examples.md
493
493
  - features/cassettes/automatic_re_recording.feature
494
494
  - features/cassettes/dynamic_erb.feature
495
495
  - features/cassettes/format.feature