vcr 1.6.0 → 1.7.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.
- data/.gemtest +0 -0
- data/.gitignore +5 -0
- data/.travis.yml +1 -0
- data/CHANGELOG.md +29 -2
- data/Gemfile +3 -3
- data/README.md +55 -11
- data/Rakefile +45 -4
- data/features/.nav +6 -0
- data/features/{README.md → about_the_cucumber_features.md} +1 -1
- data/features/cassettes/update_content_length_header.feature +106 -0
- data/features/configuration/default_cassette_options.feature +20 -2
- data/features/configuration/filter_sensitive_data.feature +154 -0
- data/features/getting_started.md +67 -0
- data/features/record_modes/all.feature +4 -2
- data/features/record_modes/new_episodes.feature +8 -2
- data/features/record_modes/none.feature +4 -2
- data/features/record_modes/once.feature +92 -0
- data/features/step_definitions/cli_steps.rb +18 -0
- data/lib/vcr.rb +13 -6
- data/lib/vcr/cassette.rb +36 -15
- data/lib/vcr/config.rb +14 -2
- data/lib/vcr/deprecations/cassette.rb +29 -0
- data/lib/vcr/deprecations/config.rb +18 -0
- data/lib/vcr/deprecations/http_stubbing_adapters/common.rb +9 -0
- data/lib/vcr/deprecations/http_stubbing_adapters/fakeweb.rb +11 -0
- data/lib/vcr/http_stubbing_adapters/common.rb +1 -1
- data/lib/vcr/http_stubbing_adapters/fakeweb.rb +2 -7
- data/lib/vcr/http_stubbing_adapters/multi_object_proxy.rb +1 -1
- data/lib/vcr/middleware/common.rb +3 -5
- data/lib/vcr/rspec.rb +1 -38
- data/lib/vcr/structs/http_interaction.rb +29 -0
- data/lib/vcr/structs/request.rb +6 -0
- data/lib/vcr/structs/response.rb +4 -0
- data/lib/vcr/{cucumber_tags.rb → test_frameworks/cucumber.rb} +10 -2
- data/lib/vcr/test_frameworks/rspec.rb +37 -0
- data/lib/vcr/util/basic_object.rb +32 -28
- data/lib/vcr/{hooks.rb → util/hooks.rb} +3 -6
- data/lib/vcr/util/internet_connection.rb +1 -1
- data/lib/vcr/util/ping.rb +21 -17
- data/lib/vcr/util/variable_args_block_caller.rb +12 -0
- data/lib/vcr/util/yaml.rb +11 -0
- data/lib/vcr/version.rb +1 -1
- data/script/FullBuildRakeFile +7 -0
- data/spec/monkey_patches.rb +0 -7
- data/spec/spec_helper.rb +40 -8
- data/spec/support/http_library_adapters.rb +0 -262
- data/spec/support/shared_example_groups/http_library.rb +256 -0
- data/spec/support/{http_stubbing_adapter.rb → shared_example_groups/http_stubbing_adapter.rb} +15 -3
- data/spec/support/shared_example_groups/ignore_localhost_deprecation.rb +28 -0
- data/spec/support/{normalizers.rb → shared_example_groups/normalizers.rb} +3 -3
- data/spec/support/{version_checker.rb → shared_example_groups/version_checking.rb} +1 -1
- data/spec/vcr/cassette_spec.rb +80 -28
- data/spec/vcr/config_spec.rb +55 -8
- data/spec/vcr/deprecations/cassette_spec.rb +57 -0
- data/spec/vcr/deprecations/config_spec.rb +30 -0
- data/spec/vcr/deprecations/http_stubbing_adapters/common_spec.rb +7 -0
- data/spec/vcr/deprecations/http_stubbing_adapters/fakeweb_spec.rb +16 -0
- data/spec/vcr/extensions/net_http_response_spec.rb +1 -3
- data/spec/vcr/extensions/net_http_spec.rb +1 -3
- data/spec/vcr/http_stubbing_adapters/fakeweb_spec.rb +1 -4
- data/spec/vcr/http_stubbing_adapters/faraday_spec.rb +1 -4
- data/spec/vcr/http_stubbing_adapters/typhoeus_spec.rb +1 -4
- data/spec/vcr/http_stubbing_adapters/webmock_spec.rb +1 -3
- data/spec/vcr/middleware/faraday_spec.rb +4 -4
- data/spec/vcr/middleware/rack_spec.rb +4 -4
- data/spec/vcr/structs/http_interaction_spec.rb +61 -0
- data/spec/vcr/structs/request_spec.rb +20 -2
- data/spec/vcr/structs/response_spec.rb +23 -1
- data/spec/vcr/structs/response_status_spec.rb +1 -1
- data/spec/vcr/{cucumber_tags_spec.rb → test_frameworks/cucumber_spec.rb} +12 -8
- data/spec/vcr/{rspec_spec.rb → test_frameworks/rspec_spec.rb} +0 -0
- data/spec/vcr/{hooks_spec.rb → util/hooks_spec.rb} +3 -3
- data/spec/vcr/util/internet_connection_spec.rb +3 -3
- data/spec/vcr_spec.rb +3 -3
- data/vcr.gemspec +5 -5
- metadata +149 -131
- data/Gemfile.lock +0 -155
- data/lib/vcr/deprecations.rb +0 -54
- data/spec/support/disable_warnings.rb +0 -12
- data/spec/support/temp_cassette_library_dir.rb +0 -16
- data/spec/support/webmock_macros.rb +0 -14
- data/spec/vcr/deprecations_spec.rb +0 -139
data/.gemtest
ADDED
File without changes
|
data/.gitignore
CHANGED
data/.travis.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
script: "rake ci:build"
|
data/CHANGELOG.md
CHANGED
@@ -2,7 +2,34 @@
|
|
2
2
|
|
3
3
|
## In git
|
4
4
|
|
5
|
-
[Full Changelog](http://github.com/myronmarston/vcr/compare/v1.
|
5
|
+
[Full Changelog](http://github.com/myronmarston/vcr/compare/v1.7.0...master)
|
6
|
+
|
7
|
+
## 1.7.0 (March 1, 2011)
|
8
|
+
|
9
|
+
[Full Changelog](http://github.com/myronmarston/vcr/compare/v1.6.0...v1.7.0)
|
10
|
+
|
11
|
+
* Use Psych for YAML serialization/deserialization when it is available.
|
12
|
+
Syck, Ruby's old YAML engine, will remove whitespace from some
|
13
|
+
strings. Bug reported by [Robert Poor](https://github.com/rdpoor).
|
14
|
+
* Add new `:update_content_length_header` cassette option. The option
|
15
|
+
will ensure the `content-length` header value matches the actual
|
16
|
+
response body length.
|
17
|
+
* Add new `:once` record mode. It operates like `:new_episodes` except
|
18
|
+
when the cassette file already exists, in which case it causes
|
19
|
+
new requests to raise an error. Feature suggested by
|
20
|
+
[Jamie Cobbett](https://github.com/jamiecobbett).
|
21
|
+
* Made `:once` the default record mode.
|
22
|
+
* Add new `filter_sensitive_data` configuration option. Feature
|
23
|
+
suggested by [Nathaniel Bibler](https://github.com/nbibler).
|
24
|
+
* Commit to [Semantic Versioning](http://semver.org/). The cucumber
|
25
|
+
features document the public API for the purposes of semver.
|
26
|
+
* Add support for CI builds using [travis-ci](http://travis-ci.org/myronmarston/vcr).
|
27
|
+
* Add support for running tests through `gem test vcr`. Visit
|
28
|
+
[test.rubygems.org](http://test.rubygems.org/gems/vcr) to see
|
29
|
+
the results.
|
30
|
+
* Fix cucumber support to use separate `Before` & `After` hooks rather than
|
31
|
+
a single `Around` hook because of a bug in cucumber that prevents
|
32
|
+
background steps from running within the `Around` hook.
|
6
33
|
|
7
34
|
## 1.6.0 (February 3, 2011)
|
8
35
|
|
@@ -20,7 +47,7 @@
|
|
20
47
|
|
21
48
|
* Fix response and request serialization so that the headers are raw
|
22
49
|
strings. This fixes intermittent YAML seg faults for paperclip
|
23
|
-
uploads to S3.
|
50
|
+
uploads to S3. Bug reported by [Rob Slifka](https://github.com/rslifka).
|
24
51
|
|
25
52
|
## 1.5.0 (January 12, 2011)
|
26
53
|
|
data/Gemfile
CHANGED
@@ -4,9 +4,9 @@ gemspec
|
|
4
4
|
group :development do
|
5
5
|
# patron and em-http-request can't install on JRuby, so we have to limit their platform here.
|
6
6
|
platforms :ruby do
|
7
|
-
gem 'patron', '
|
7
|
+
gem 'patron', '0.4.9'
|
8
8
|
gem 'em-http-request', '~> 0.2.7'
|
9
|
-
gem 'curb', '
|
9
|
+
gem 'curb', '0.7.8'
|
10
10
|
gem 'typhoeus', '~> 0.2.1'
|
11
11
|
end
|
12
12
|
|
@@ -34,7 +34,7 @@ group :extras do
|
|
34
34
|
|
35
35
|
platforms :mri_19 do
|
36
36
|
gem 'ruby-debug19'
|
37
|
-
gem 'ruby-debug-base19', '0.11.23'
|
37
|
+
gem 'ruby-debug-base19', RUBY_VERSION == '1.9.1' ? '0.11.23' : '~> 0.11.24'
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# VCR
|
1
|
+
# VCR [](http://travis-ci.org/myronmarston/vcr)
|
2
2
|
|
3
3
|
Record your test suite's HTTP interactions and replay them during future test runs for fast, deterministic, accurate tests.
|
4
4
|
|
@@ -30,15 +30,20 @@ maintenance) and accurate (the response from example.com will contain the same h
|
|
30
30
|
## Features
|
31
31
|
|
32
32
|
* Automatically records and replays your HTTP interactions with minimal setup/configuration code.
|
33
|
-
* Supports
|
34
|
-
are supported
|
33
|
+
* Supports and works with the HTTP stubbing facilities of multiple libraries. Currently, the
|
34
|
+
following are supported:
|
35
|
+
* FakeWeb
|
36
|
+
* WebMock
|
37
|
+
* Typhoeus
|
38
|
+
* Faraday
|
35
39
|
* Supports multiple HTTP libraries:
|
36
|
-
* [Patron](http://github.com/toland/patron) (WebMock)
|
37
|
-
* [Curb](http://github.com/taf2/curb) (WebMock -- only supports Curb::Easy at the moment)
|
38
|
-
* [HTTPClient](http://github.com/nahi/httpclient) (WebMock)
|
39
|
-
* [em-http-request](http://github.com/igrigorik/em-http-request) (WebMock)
|
40
|
-
* [Net::HTTP](http://www.ruby-doc.org/stdlib/libdoc/net/http/rdoc/index.html) (FakeWeb and WebMock)
|
40
|
+
* [Patron](http://github.com/toland/patron) (when using WebMock)
|
41
|
+
* [Curb](http://github.com/taf2/curb) (when using WebMock -- only supports Curb::Easy at the moment)
|
42
|
+
* [HTTPClient](http://github.com/nahi/httpclient) (when using WebMock)
|
43
|
+
* [em-http-request](http://github.com/igrigorik/em-http-request) (when using WebMock)
|
44
|
+
* [Net::HTTP](http://www.ruby-doc.org/stdlib/libdoc/net/http/rdoc/index.html) (when using FakeWeb and WebMock)
|
41
45
|
* [Typhoeus](https://github.com/pauldix/typhoeus) (Typhoeus::Hydra, but not Typhoeus::Easy or Typhoeus::Multi)
|
46
|
+
* [Faraday](https://github.com/technoweenie/faraday)
|
42
47
|
* And of course any library built on Net::HTTP, such as [Mechanize](http://github.com/tenderlove/mechanize),
|
43
48
|
[HTTParty](http://github.com/jnunemaker/httparty) or [Rest Client](http://github.com/archiloque/rest-client).
|
44
49
|
* Request matching is configurable based on HTTP method, URI, host, path, body and headers.
|
@@ -48,6 +53,7 @@ maintenance) and accurate (the response from example.com will contain the same h
|
|
48
53
|
* Automatically re-records cassettes on a configurable regular interval to keep them fresh and current.
|
49
54
|
* Disables all HTTP requests that you don't explicitly allow.
|
50
55
|
* Simple cucumber integration is provided using tags.
|
56
|
+
* Includes convenient RSpec macro.
|
51
57
|
* Known to work well with many popular ruby libraries including RSpec 1 & 2, Cucumber, Test::Unit,
|
52
58
|
Capybara, Mechanize, Rest-Client and HTTParty.
|
53
59
|
* Extensively tested on 7 different ruby interpretters.
|
@@ -55,13 +61,51 @@ maintenance) and accurate (the response from example.com will contain the same h
|
|
55
61
|
|
56
62
|
## Usage
|
57
63
|
|
58
|
-
Browse the [
|
59
|
-
the [wiki](http://github.com/myronmarston/vcr/wiki) for usage info and
|
60
|
-
documentation.
|
64
|
+
Browse the [documentation](http://relishapp.com/myronmarston/vcr) for usage info.
|
61
65
|
|
62
66
|
The [VCR talk given at Philly.rb](http://philly-rb-vcr-talk.heroku.com/) also
|
63
67
|
contains good usage info.
|
64
68
|
|
69
|
+
## Release Policy
|
70
|
+
|
71
|
+
VCR follows the principles of [semantic versioning](http://semver.org/).
|
72
|
+
The [cucumber features](http://relishapp.com/myronmarston/vcr) define
|
73
|
+
VCR's public API. Patch level releases contain only bug fixes. Minor
|
74
|
+
releases contain backward-compatible new features. Major new releases
|
75
|
+
contain backwards-incompatible changes to the public API.
|
76
|
+
|
77
|
+
## Ruby Interpreter Compatibility
|
78
|
+
|
79
|
+
VCR has been tested on the following ruby interpreters:
|
80
|
+
|
81
|
+
* MRI 1.8.6
|
82
|
+
* MRI 1.8.7
|
83
|
+
* MRI 1.9.1
|
84
|
+
* MRI 1.9.2
|
85
|
+
* REE 1.8.7
|
86
|
+
* JRuby 1.5.6
|
87
|
+
* Rubinius 1.2.1
|
88
|
+
|
89
|
+
## Known Issues
|
90
|
+
|
91
|
+
* VCR uses YAML to serialize the HTTP interactions to disk in a
|
92
|
+
human-readable, human-editable format. Unfortunately there are bugs
|
93
|
+
in Syck, Ruby's default YAML engine, that cause it to modify strings
|
94
|
+
when serializing them. It appears the the bug is limited to entire
|
95
|
+
lines of whitespace. A string such as `"1\n \n2"` will get changed
|
96
|
+
to `"1\n\n2"` (see [this gist](https://gist.github.com/815754) for
|
97
|
+
example code). In practice, this usually isn't so bad, but it can
|
98
|
+
occassionally cause problems, especially when the recorded
|
99
|
+
response includes a `content_length` header and you are using an
|
100
|
+
HTTP client that relies on this. Mechanize will raise an `EOFError`
|
101
|
+
when the `content_length` header does not match the response body
|
102
|
+
length. One solution is to use Psych, the new YAML engine included
|
103
|
+
in Ruby 1.9. VCR attempts to use Psych if possible, but you may have
|
104
|
+
to [re-compile ruby 1.9](http://rhnh.net/2011/01/31/psych-yaml-in-ruby-1-9-2-with-rvm-and-snow-leopard-osx)
|
105
|
+
to use it. See [this issue](https://github.com/myronmarston/vcr/issues#issue/43)
|
106
|
+
for more info. You can also use the `:update_content_length_header`
|
107
|
+
cassette option to ensure the header has the correct value.
|
108
|
+
|
65
109
|
## Development
|
66
110
|
|
67
111
|
* Source hosted on [GitHub](http://github.com/myronmarston/vcr).
|
data/Rakefile
CHANGED
@@ -1,13 +1,18 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
using_git = File.exist?(File.expand_path('../.git/', __FILE__))
|
2
|
+
|
3
|
+
if using_git
|
4
|
+
require 'bundler'
|
5
|
+
require 'bundler/setup'
|
6
|
+
Bundler::GemHelper.install_tasks
|
7
|
+
end
|
4
8
|
|
5
9
|
require 'rake'
|
6
10
|
require "rspec/core/rake_task"
|
7
11
|
|
8
12
|
RSpec::Core::RakeTask.new(:spec) do |t|
|
9
13
|
t.verbose = false
|
10
|
-
t.
|
14
|
+
t.skip_bundler = true unless using_git
|
15
|
+
t.rspec_opts = %w[--format progress] if (ENV['FULL_BUILD'] || !using_git)
|
11
16
|
end
|
12
17
|
|
13
18
|
desc "Run all examples using rcov"
|
@@ -25,8 +30,42 @@ Cucumber::Rake::Task.new
|
|
25
30
|
|
26
31
|
task :default => [:spec, :cucumber]
|
27
32
|
|
33
|
+
namespace :ci do
|
34
|
+
desc "Sets things up for a ci build on travis-ci.org"
|
35
|
+
task :setup do
|
36
|
+
sh "git submodule init"
|
37
|
+
sh "git submodule update"
|
38
|
+
end
|
39
|
+
|
40
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
41
|
+
t.verbose = true
|
42
|
+
t.rspec_opts = %w[--format progress --backtrace]
|
43
|
+
end
|
44
|
+
|
45
|
+
desc "Run a ci build"
|
46
|
+
task :build => [:setup, :spec, :cucumber]
|
47
|
+
end
|
48
|
+
|
49
|
+
def ensure_relish_doc_symlinked(filename)
|
50
|
+
from = File.expand_path("../features/#{filename}", __FILE__)
|
51
|
+
to = File.expand_path("../#{filename}", __FILE__)
|
52
|
+
|
53
|
+
if File.symlink?(from)
|
54
|
+
return if File.readlink(from) == to
|
55
|
+
|
56
|
+
# delete the old symlink
|
57
|
+
File.unlink(from)
|
58
|
+
end
|
59
|
+
|
60
|
+
FileUtils.ln_s to, from
|
61
|
+
end
|
62
|
+
|
28
63
|
desc "Push cukes to relishapp using the relish-client-gem"
|
29
64
|
task :relish do
|
65
|
+
%w[ README.md CHANGELOG.md LICENSE ].each do |file|
|
66
|
+
ensure_relish_doc_symlinked(file)
|
67
|
+
end
|
68
|
+
|
30
69
|
require 'vcr/version'
|
31
70
|
sh "relish versions:add myronmarston/vcr:#{VCR.version}"
|
32
71
|
sh "relish push vcr:#{VCR.version}"
|
@@ -34,3 +73,5 @@ end
|
|
34
73
|
|
35
74
|
task :release => :relish
|
36
75
|
|
76
|
+
# For gem-test: http://gem-testers.org/
|
77
|
+
task :test => :spec
|
data/features/.nav
CHANGED
@@ -1,10 +1,16 @@
|
|
1
|
+
getting_started.md (Getting Started)
|
2
|
+
CHANGELOG.md (Changelog)
|
3
|
+
about_the_cucumber_features.md (About the Cucumber Features)
|
4
|
+
LICENSE (License)
|
1
5
|
- cassettes:
|
2
6
|
- format.feature
|
3
7
|
- no_cassette.feature
|
4
8
|
- request_matching.feature
|
5
9
|
- dynamic_erb.feature
|
6
10
|
- automatic_re_recording.feature
|
11
|
+
- update_content_length_header.feature
|
7
12
|
- record_modes:
|
13
|
+
- once.feature
|
8
14
|
- new_episodes.feature
|
9
15
|
- none.feature
|
10
16
|
- all.feature
|
@@ -0,0 +1,106 @@
|
|
1
|
+
Feature: Update content_length header
|
2
|
+
|
3
|
+
When the `:update_content_length_header` option is set to a truthy value,
|
4
|
+
VCR will ensure that the `content-length` header will have the correct
|
5
|
+
value. This is useful in several situations:
|
6
|
+
|
7
|
+
- When you manually edit the cassette file and change the resonse body
|
8
|
+
length. You can use this option so you don't have to manually calculate
|
9
|
+
and update the body length.
|
10
|
+
- When you use ERB, the response body length may vary. This will ensure
|
11
|
+
it is always correct.
|
12
|
+
- Syck, the default YAML engine for ruby 1.8 (and 1.9, unless you compile
|
13
|
+
it to use Psych), has a bug where it sometimes will remove some
|
14
|
+
whitespace strings when you serialize them. This may cause the
|
15
|
+
`content-length` header to have the wrong value.
|
16
|
+
|
17
|
+
This is especially important when you use a client that checks the
|
18
|
+
`content-length` header. Mechanize, for example, will raise an `EOFError`
|
19
|
+
when the header value does not match the actual body length.
|
20
|
+
|
21
|
+
Background:
|
22
|
+
Given a previously recorded cassette file "cassettes/example.yml" with:
|
23
|
+
"""
|
24
|
+
---
|
25
|
+
- !ruby/struct:VCR::HTTPInteraction
|
26
|
+
request: !ruby/struct:VCR::Request
|
27
|
+
method: :get
|
28
|
+
uri: http://example.com:80/
|
29
|
+
body:
|
30
|
+
headers:
|
31
|
+
response: !ruby/struct:VCR::Response
|
32
|
+
status: !ruby/struct:VCR::ResponseStatus
|
33
|
+
code: 200
|
34
|
+
message: OK
|
35
|
+
headers:
|
36
|
+
content-type:
|
37
|
+
- text/html;charset=utf-8
|
38
|
+
content-length:
|
39
|
+
- "11"
|
40
|
+
body: Hello <modified>
|
41
|
+
http_version: "1.1"
|
42
|
+
"""
|
43
|
+
Given a file named "common_stuff.rb" with:
|
44
|
+
"""
|
45
|
+
require 'vcr'
|
46
|
+
|
47
|
+
VCR.config do |c|
|
48
|
+
c.cassette_library_dir = 'cassettes'
|
49
|
+
c.stub_with :fakeweb
|
50
|
+
end
|
51
|
+
|
52
|
+
def make_request_and_print_results
|
53
|
+
response = Net::HTTP.get_response('example.com', '/')
|
54
|
+
puts "Body length: #{response.body.length}"
|
55
|
+
puts "Header value: #{response['content-length']}"
|
56
|
+
end
|
57
|
+
"""
|
58
|
+
|
59
|
+
Scenario: Default :update_content_length_header setting
|
60
|
+
Given a file named "default.rb" with:
|
61
|
+
"""
|
62
|
+
require 'common_stuff'
|
63
|
+
|
64
|
+
VCR.use_cassette('example', :record => :none) do
|
65
|
+
make_request_and_print_results
|
66
|
+
end
|
67
|
+
"""
|
68
|
+
When I run "ruby default.rb"
|
69
|
+
Then the output should contain:
|
70
|
+
"""
|
71
|
+
Body length: 16
|
72
|
+
Header value: 11
|
73
|
+
"""
|
74
|
+
|
75
|
+
Scenario: :update_content_length_header => false
|
76
|
+
Given a file named "false.rb" with:
|
77
|
+
"""
|
78
|
+
require 'common_stuff'
|
79
|
+
|
80
|
+
VCR.use_cassette('example', :record => :none, :update_content_length_header => false) do
|
81
|
+
make_request_and_print_results
|
82
|
+
end
|
83
|
+
"""
|
84
|
+
When I run "ruby false.rb"
|
85
|
+
Then the output should contain:
|
86
|
+
"""
|
87
|
+
Body length: 16
|
88
|
+
Header value: 11
|
89
|
+
"""
|
90
|
+
|
91
|
+
Scenario: :update_content_length_header => true
|
92
|
+
Given a file named "true.rb" with:
|
93
|
+
"""
|
94
|
+
require 'common_stuff'
|
95
|
+
|
96
|
+
VCR.use_cassette('example', :record => :none, :update_content_length_header => true) do
|
97
|
+
make_request_and_print_results
|
98
|
+
end
|
99
|
+
"""
|
100
|
+
When I run "ruby true.rb"
|
101
|
+
Then the output should contain:
|
102
|
+
"""
|
103
|
+
Body length: 16
|
104
|
+
Header value: 16
|
105
|
+
"""
|
106
|
+
|
@@ -21,7 +21,7 @@ Feature: default_cassette_options
|
|
21
21
|
end
|
22
22
|
"""
|
23
23
|
|
24
|
-
Scenario: cassettes get default values from configured default_cassette_options
|
24
|
+
Scenario: cassettes get default values from configured `default_cassette_options`
|
25
25
|
Given a file named "default_cassette_options.rb" with:
|
26
26
|
"""
|
27
27
|
require 'vcr_setup.rb'
|
@@ -38,7 +38,7 @@ Feature: default_cassette_options
|
|
38
38
|
ERB: true
|
39
39
|
"""
|
40
40
|
|
41
|
-
Scenario:
|
41
|
+
Scenario: `:match_requests_on` defaults to `[:method, :uri]` when it has not been set
|
42
42
|
Given a file named "default_cassette_options.rb" with:
|
43
43
|
"""
|
44
44
|
require 'vcr_setup.rb'
|
@@ -50,6 +50,24 @@ Feature: default_cassette_options
|
|
50
50
|
When I run "ruby default_cassette_options.rb"
|
51
51
|
Then the output should contain "Match Requests On: [:method, :uri]"
|
52
52
|
|
53
|
+
Scenario: `:record` defaults to `:once` when it has not been set
|
54
|
+
Given a file named "default_record_mode.rb" with:
|
55
|
+
"""
|
56
|
+
require 'vcr'
|
57
|
+
|
58
|
+
VCR.config do |c|
|
59
|
+
# not important for this example, but must be set to something
|
60
|
+
c.stub_with :webmock
|
61
|
+
c.cassette_library_dir = 'cassettes'
|
62
|
+
end
|
63
|
+
|
64
|
+
VCR.use_cassette('example') do
|
65
|
+
puts "Record mode: #{VCR.current_cassette.record_mode.inspect}"
|
66
|
+
end
|
67
|
+
"""
|
68
|
+
When I run "ruby default_record_mode.rb"
|
69
|
+
Then the output should contain "Record mode: :once"
|
70
|
+
|
53
71
|
Scenario: cassettes can set their own options
|
54
72
|
Given a file named "default_cassette_options.rb" with:
|
55
73
|
"""
|
@@ -0,0 +1,154 @@
|
|
1
|
+
Feature: Filter sensitive data
|
2
|
+
|
3
|
+
The `filter_sensitive_data` configuration option can be used to prevent
|
4
|
+
sensitive data from being written to your cassette files. This may be
|
5
|
+
important if you commit your cassettes files to source controla and do
|
6
|
+
not want your sensitive data exposed. Pass the following arguments to
|
7
|
+
`filter_sensitive_data`:
|
8
|
+
|
9
|
+
- A substitution string. This is the string that will be written to
|
10
|
+
the cassettte file as a placeholder. It should be unique and you
|
11
|
+
may want to wrap it in special characters like `{ }` or `< >`.
|
12
|
+
- A symbol specifying a tag (optional). If a tag is given, the
|
13
|
+
filtering will only be applied to cassettes with the given tag.
|
14
|
+
- A block. The block should return the sensitive text that you want
|
15
|
+
replaced with the substitution string. If your block accepts an
|
16
|
+
argument, the HTTP interaction will be yielded so that you can
|
17
|
+
dynamically specify the sensitive text based on the interaction
|
18
|
+
(see the last scenario for an example of this).
|
19
|
+
|
20
|
+
When the interactions are replayed, the sensitive text will replace the
|
21
|
+
substitution string so that the interaction will be identical to what was
|
22
|
+
originally recorded.
|
23
|
+
|
24
|
+
You can specify as many filterings as you want.
|
25
|
+
|
26
|
+
Scenario: Multiple filterings
|
27
|
+
Given a file named "filtering.rb" with:
|
28
|
+
"""
|
29
|
+
require 'vcr_cucumber_helpers'
|
30
|
+
|
31
|
+
if ARGV.include?('--with-server')
|
32
|
+
start_sinatra_app(:port => 7777) do
|
33
|
+
get('/') { "Hello World" }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
require 'vcr'
|
38
|
+
|
39
|
+
VCR.config do |c|
|
40
|
+
c.stub_with :fakeweb
|
41
|
+
c.cassette_library_dir = 'cassettes'
|
42
|
+
c.filter_sensitive_data('<GREETING>') { 'Hello' }
|
43
|
+
c.filter_sensitive_data('<LOCATION>') { 'World' }
|
44
|
+
end
|
45
|
+
|
46
|
+
VCR.use_cassette('filtering', :record => :new_episodes) do
|
47
|
+
response = Net::HTTP.get_response('localhost', '/', 7777)
|
48
|
+
puts "Response: #{response.body}"
|
49
|
+
end
|
50
|
+
"""
|
51
|
+
When I run "ruby filtering.rb --with-server"
|
52
|
+
Then the output should contain "Response: Hello World"
|
53
|
+
And the file "cassettes/filtering.yml" should contain "body: <GREETING> <LOCATION>"
|
54
|
+
And the file "cassettes/filtering.yml" should not contain "Hello"
|
55
|
+
And the file "cassettes/filtering.yml" should not contain "World"
|
56
|
+
|
57
|
+
When I run "ruby filtering.rb"
|
58
|
+
Then the output should contain "Hello World"
|
59
|
+
|
60
|
+
Scenario: Filter tagged cassettes
|
61
|
+
Given a file named "tagged_filtering.rb" with:
|
62
|
+
"""
|
63
|
+
require 'vcr_cucumber_helpers'
|
64
|
+
|
65
|
+
if ARGV.include?('--with-server')
|
66
|
+
response_count = 0
|
67
|
+
start_sinatra_app(:port => 7777) do
|
68
|
+
get('/') { "Hello World #{response_count += 1 }" }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
require 'vcr'
|
73
|
+
|
74
|
+
VCR.config do |c|
|
75
|
+
c.stub_with :fakeweb
|
76
|
+
c.cassette_library_dir = 'cassettes'
|
77
|
+
c.filter_sensitive_data('<LOCATION>', :my_tag) { 'World' }
|
78
|
+
end
|
79
|
+
|
80
|
+
VCR.use_cassette('tagged', :tag => :my_tag, :record => :new_episodes) do
|
81
|
+
response = Net::HTTP.get_response('localhost', '/', 7777)
|
82
|
+
puts "Tagged Response: #{response.body}"
|
83
|
+
end
|
84
|
+
|
85
|
+
VCR.use_cassette('untagged', :record => :new_episodes) do
|
86
|
+
response = Net::HTTP.get_response('localhost', '/', 7777)
|
87
|
+
puts "Untagged Response: #{response.body}"
|
88
|
+
end
|
89
|
+
"""
|
90
|
+
When I run "ruby tagged_filtering.rb --with-server"
|
91
|
+
Then the output should contain each of the following:
|
92
|
+
| Tagged Response: Hello World 1 |
|
93
|
+
| Untagged Response: Hello World 2 |
|
94
|
+
And the file "cassettes/tagged.yml" should contain "body: Hello <LOCATION> 1"
|
95
|
+
And the file "cassettes/untagged.yml" should contain "body: Hello World 2"
|
96
|
+
|
97
|
+
When I run "ruby tagged_filtering.rb"
|
98
|
+
Then the output should contain each of the following:
|
99
|
+
| Tagged Response: Hello World 1 |
|
100
|
+
| Untagged Response: Hello World 2 |
|
101
|
+
|
102
|
+
Scenario: Filter dynamic data based on yielded HTTP interaction
|
103
|
+
Given a file named "dynamic_filtering.rb" with:
|
104
|
+
"""
|
105
|
+
require 'vcr_cucumber_helpers'
|
106
|
+
include_http_adapter_for('net/http')
|
107
|
+
|
108
|
+
if ARGV.include?('--with-server')
|
109
|
+
start_sinatra_app(:port => 7777) do
|
110
|
+
helpers do
|
111
|
+
def request_header_for(header_key_fragment)
|
112
|
+
key = env.keys.find { |k| k =~ /#{header_key_fragment}/i }
|
113
|
+
env[key]
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
get('/') { "#{request_header_for('username')}/#{request_header_for('password')}" }
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
require 'vcr'
|
122
|
+
|
123
|
+
USER_PASSWORDS = {
|
124
|
+
'john.doe' => 'monkey',
|
125
|
+
'jane.doe' => 'cheetah'
|
126
|
+
}
|
127
|
+
|
128
|
+
VCR.config do |c|
|
129
|
+
c.stub_with :webmock
|
130
|
+
c.cassette_library_dir = 'cassettes'
|
131
|
+
c.filter_sensitive_data('<PASSWORD>') do |interaction|
|
132
|
+
USER_PASSWORDS[interaction.request.headers['x-http-username'].first]
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
VCR.use_cassette('example', :record => :new_episodes, :match_requests_on => [:method, :uri, :headers]) do
|
137
|
+
puts "Response: " + response_body_for(
|
138
|
+
:get, 'http://localhost:7777/', nil,
|
139
|
+
'X-HTTP-USERNAME' => 'john.doe',
|
140
|
+
'X-HTTP-PASSWORD' => USER_PASSWORDS['john.doe']
|
141
|
+
)
|
142
|
+
end
|
143
|
+
"""
|
144
|
+
When I run "ruby dynamic_filtering.rb --with-server"
|
145
|
+
Then the output should contain "john.doe/monkey"
|
146
|
+
And the file "cassettes/example.yml" should contain "body: john.doe/<PASSWORD>"
|
147
|
+
And the file "cassettes/example.yml" should contain a YAML fragment like:
|
148
|
+
"""
|
149
|
+
x-http-password:
|
150
|
+
- <PASSWORD>
|
151
|
+
"""
|
152
|
+
|
153
|
+
When I run "ruby dynamic_filtering.rb"
|
154
|
+
Then the output should contain "john.doe/monkey"
|