vcr 1.4.0 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. data/CHANGELOG.md +23 -0
  2. data/Gemfile +0 -2
  3. data/Gemfile.lock +15 -14
  4. data/Guardfile +2 -3
  5. data/LICENSE +1 -1
  6. data/README.md +5 -1
  7. data/features/.nav +28 -0
  8. data/features/README.md +1 -1
  9. data/features/cassettes/automatic_re_recording.feature +2 -2
  10. data/features/cassettes/format.feature +2 -2
  11. data/features/cassettes/no_cassette.feature +3 -3
  12. data/features/cassettes/request_matching.feature +8 -8
  13. data/features/configuration/allow_http_connections_when_no_cassette.feature +1 -1
  14. data/features/configuration/cassette_library_dir.feature +1 -1
  15. data/features/configuration/default_cassette_options.feature +2 -2
  16. data/features/configuration/hooks.feature +276 -0
  17. data/features/configuration/ignore_localhost.feature +1 -1
  18. data/features/configuration/stub_with.feature +19 -20
  19. data/features/middleware/rack.feature +6 -6
  20. data/features/{cassettes/record_modes → record_modes}/all.feature +2 -2
  21. data/features/{cassettes/record_modes → record_modes}/new_episodes.feature +3 -3
  22. data/features/{cassettes/record_modes → record_modes}/none.feature +4 -4
  23. data/features/support/vcr_cucumber_helpers.rb +1 -1
  24. data/features/test_frameworks/cucumber.feature +11 -11
  25. data/features/test_frameworks/rspec.feature +12 -12
  26. data/features/test_frameworks/shoulda.feature +1 -1
  27. data/lib/vcr.rb +8 -4
  28. data/lib/vcr/cassette.rb +28 -39
  29. data/lib/vcr/cassette/reader.rb +58 -0
  30. data/lib/vcr/config.rb +45 -40
  31. data/lib/vcr/deprecations.rb +1 -1
  32. data/lib/vcr/extensions/net_http.rb +6 -1
  33. data/lib/vcr/hooks.rb +45 -0
  34. data/lib/vcr/http_stubbing_adapters/common.rb +16 -13
  35. data/lib/vcr/http_stubbing_adapters/fakeweb.rb +4 -4
  36. data/lib/vcr/http_stubbing_adapters/faraday.rb +4 -4
  37. data/lib/vcr/http_stubbing_adapters/typhoeus.rb +4 -4
  38. data/lib/vcr/http_stubbing_adapters/webmock.rb +4 -4
  39. data/lib/vcr/structs.rb +8 -0
  40. data/lib/vcr/{basic_object.rb → util/basic_object.rb} +0 -0
  41. data/lib/vcr/{internet_connection.rb → util/internet_connection.rb} +1 -1
  42. data/lib/vcr/{ping.rb → util/ping.rb} +0 -0
  43. data/lib/vcr/version.rb +1 -1
  44. data/script/FullBuildRakeFile +6 -0
  45. data/script/full_build +1 -1
  46. data/script/spec +1 -0
  47. data/spec/fixtures/1.9.1/cassette_spec/empty.yml +0 -0
  48. data/spec/fixtures/not_1.9.1/cassette_spec/empty.yml +0 -0
  49. data/spec/spec_helper.rb +7 -4
  50. data/spec/support/http_library_adapters.rb +8 -0
  51. data/spec/support/http_stubbing_adapter.rb +2 -2
  52. data/spec/vcr/cassette/reader_spec.rb +59 -0
  53. data/spec/{cassette_spec.rb → vcr/cassette_spec.rb} +115 -54
  54. data/spec/{config_spec.rb → vcr/config_spec.rb} +0 -0
  55. data/spec/{cucumber_tags_spec.rb → vcr/cucumber_tags_spec.rb} +0 -0
  56. data/spec/{deprecations_spec.rb → vcr/deprecations_spec.rb} +0 -0
  57. data/spec/{extensions → vcr/extensions}/net_http_response_spec.rb +0 -0
  58. data/spec/{extensions → vcr/extensions}/net_http_spec.rb +0 -0
  59. data/spec/vcr/hooks_spec.rb +95 -0
  60. data/spec/{http_stubbing_adapters → vcr/http_stubbing_adapters}/fakeweb_spec.rb +0 -0
  61. data/spec/{http_stubbing_adapters → vcr/http_stubbing_adapters}/faraday_spec.rb +5 -3
  62. data/spec/{http_stubbing_adapters → vcr/http_stubbing_adapters}/multi_object_proxy_spec.rb +0 -0
  63. data/spec/{http_stubbing_adapters → vcr/http_stubbing_adapters}/typhoeus_spec.rb +0 -0
  64. data/spec/{http_stubbing_adapters → vcr/http_stubbing_adapters}/webmock_spec.rb +0 -0
  65. data/spec/{middleware → vcr/middleware}/cassette_arguments_spec.rb +0 -0
  66. data/spec/{middleware → vcr/middleware}/faraday_spec.rb +0 -0
  67. data/spec/{middleware → vcr/middleware}/rack_spec.rb +0 -0
  68. data/spec/{request_matcher_spec.rb → vcr/request_matcher_spec.rb} +0 -0
  69. data/spec/{rspec_spec.rb → vcr/rspec_spec.rb} +0 -0
  70. data/spec/{structs_spec.rb → vcr/structs_spec.rb} +15 -4
  71. data/spec/{internet_connection_spec.rb → vcr/util/internet_connection_spec.rb} +0 -0
  72. data/spec/{version_spec.rb → vcr/version_spec.rb} +0 -0
  73. data/spec/vcr_spec.rb +10 -3
  74. data/vcr.gemspec +3 -3
  75. metadata +123 -101
  76. data/spec/fixtures/1.9.1/cassette_spec/erb_with_no_vars.yml +0 -32
  77. data/spec/fixtures/1.9.1/cassette_spec/erb_with_vars.yml +0 -32
  78. data/spec/fixtures/not_1.9.1/cassette_spec/erb_with_no_vars.yml +0 -32
  79. data/spec/fixtures/not_1.9.1/cassette_spec/erb_with_vars.yml +0 -32
data/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
  # Changelog
2
2
 
3
+ ## In git
4
+
5
+ [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.5.0...master)
6
+
7
+ ## 1.5.0 (January 12, 2011)
8
+
9
+ [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.4.0...v1.5.0)
10
+
11
+ * Fix VCR::Cassette so it does not raise an error when a cassette file is
12
+ empty. Bug reported and fixed by [Karl Baum](https://github.com/kbaum).
13
+ * Lots of code cleanup.
14
+ * Fix the stubbing adapters so that they use the cassette instance
15
+ rather than the cassette name to create and restore checkpoints.
16
+ * Raise an appropriate error when a nested cassette is inserted with the
17
+ same name as a cassette that is already in the stack (VCR's design
18
+ doesn't allow this and you would get weird errors later on).
19
+ * Raise an appropriate error when restoring a stubs checkpoint if the
20
+ checkpoint cannot be found.
21
+ * Add `before_record` and `before_playback` hooks. Idea and initial
22
+ implementation by [Oliver Searle-Barnes](https://github.com/opsb);
23
+ futher suggestions, testing and feedback by
24
+ [Nathaniel Bibler](https://github.com/nbibler).
25
+
3
26
  ## 1.4.0 (December 3, 2010)
4
27
 
5
28
  [Full Changelog](http://github.com/myronmarston/vcr/compare/v1.3.3...v1.4.0)
data/Gemfile CHANGED
@@ -13,8 +13,6 @@ group :development do
13
13
  platforms :jruby do
14
14
  gem 'jruby-openssl'
15
15
  end
16
-
17
- gem 'shoulda'
18
16
  end
19
17
 
20
18
  # Additional gems that are useful, but not required for development.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- vcr (1.4.0)
4
+ vcr (1.5.0)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
@@ -29,12 +29,13 @@ GEM
29
29
  addressable (>= 2.0.0)
30
30
  eventmachine (>= 0.12.9)
31
31
  eventmachine (0.12.10)
32
+ eventmachine (0.12.10-java)
32
33
  fakeweb (1.3.0)
33
34
  faraday (0.5.3)
34
35
  addressable (~> 2.2.2)
35
36
  multipart-post (~> 1.0.1)
36
37
  rack (>= 1.1.0, < 2)
37
- fuubar (0.0.2)
38
+ fuubar (0.0.3)
38
39
  rspec (~> 2.0)
39
40
  rspec-instafail (~> 0.1.4)
40
41
  ruby-progressbar (~> 0.0.9)
@@ -73,21 +74,21 @@ GEM
73
74
  rake (0.8.7)
74
75
  rb-fsevent (0.3.6)
75
76
  rcov (0.9.9)
76
- relish (0.1.5)
77
+ relish (0.2.0)
77
78
  archive-tar-minitar (~> 0.5.2)
78
79
  json (~> 1.4.6)
79
80
  rest-client (~> 1.6.1)
80
81
  rest-client (1.6.1)
81
82
  mime-types (>= 1.16)
82
- rspec (2.1.0)
83
- rspec-core (~> 2.1.0)
84
- rspec-expectations (~> 2.1.0)
85
- rspec-mocks (~> 2.1.0)
86
- rspec-core (2.1.0)
87
- rspec-expectations (2.1.0)
83
+ rspec (2.4.0)
84
+ rspec-core (~> 2.4.0)
85
+ rspec-expectations (~> 2.4.0)
86
+ rspec-mocks (~> 2.4.0)
87
+ rspec-core (2.4.0)
88
+ rspec-expectations (2.4.0)
88
89
  diff-lcs (~> 1.1.2)
89
- rspec-instafail (0.1.4)
90
- rspec-mocks (2.1.0)
90
+ rspec-instafail (0.1.5)
91
+ rspec-mocks (2.4.0)
91
92
  ruby-debug (0.10.3)
92
93
  columnize (>= 0.1)
93
94
  ruby-debug-base (~> 0.10.3.0)
@@ -113,7 +114,7 @@ GEM
113
114
  tilt (1.1)
114
115
  timecop (0.3.5)
115
116
  typhoeus (0.2.0)
116
- webmock (1.6.1)
117
+ webmock (1.6.2)
117
118
  addressable (>= 2.2.2)
118
119
  crack (>= 0.1.7)
119
120
 
@@ -141,11 +142,11 @@ DEPENDENCIES
141
142
  rb-fsevent
142
143
  rcov
143
144
  relish
144
- rspec (~> 2.1.0)
145
+ rspec (~> 2.4.0)
145
146
  ruby-debug
146
147
  ruby-debug-base19 (= 0.11.23)
147
148
  ruby-debug19
148
- shoulda
149
+ shoulda (~> 2.9.2)
149
150
  sinatra (~> 1.1.0)
150
151
  timecop (~> 0.3.5)
151
152
  typhoeus (~> 0.2.0)
data/Guardfile CHANGED
@@ -3,9 +3,8 @@
3
3
 
4
4
  guard 'rspec', :version => 2 do
5
5
  watch('^spec/(.*)_spec.rb')
6
- watch('^lib/vcr.rb') { "spec/vcr_spec.rb" }
7
- watch('^lib/vcr/(.*)\.rb') { |m| "spec/#{m[1]}_spec.rb" }
8
- watch('^spec/spec_helper.rb') { "spec" }
6
+ watch('^lib/(.*)\.rb') { |m| "spec/#{m[1]}_spec.rb" }
7
+ watch('^spec/spec_helper.rb') { "spec" }
9
8
  end
10
9
 
11
10
  guard 'cucumber' do
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010 Myron Marston
1
+ Copyright (c) 2010-2011 Myron Marston
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -4,6 +4,7 @@ Record your test suite's HTTP interactions and replay them during future test ru
4
4
 
5
5
  ## Synopsis
6
6
 
7
+ require 'rubygems'
7
8
  require 'test/unit'
8
9
  require 'vcr'
9
10
 
@@ -87,7 +88,10 @@ Thanks also to the following people who have contributed patches or helpful sugg
87
88
  * [Bartosz Blimke](http://github.com/bblimke)
88
89
  * [Ben Hutton](http://github.com/benhutton)
89
90
  * [Eric Allam](http://github.com/rubymaverick)
91
+ * [Karl Baum](https://github.com/kbaum)
92
+ * [Nathaniel Bibler](https://github.com/nbibler)
93
+ * [Oliver Searle-Barnes](https://github.com/opsb)
90
94
 
91
95
  ## Copyright
92
96
 
93
- Copyright (c) 2010 Myron Marston. See LICENSE for details.
97
+ Copyright (c) 2010-2011 Myron Marston. See LICENSE for details.
data/features/.nav ADDED
@@ -0,0 +1,28 @@
1
+ - cassettes:
2
+ - format.feature
3
+ - no_cassette.feature
4
+ - request_matching.feature
5
+ - dynamic_erb.feature
6
+ - automatic_re_recording.feature
7
+ - record_modes:
8
+ - new_episodes.feature
9
+ - none.feature
10
+ - all.feature
11
+ - configuration:
12
+ - cassette_library_dir.feature
13
+ - stub_with.feature
14
+ - default_cassette_options.feature
15
+ - ignore_localhost.feature
16
+ - hooks.feature
17
+ - allow_http_connections_when_no_cassette.feature
18
+ - test_frameworks:
19
+ - test_unit.feature
20
+ - shoulda.feature
21
+ - rspec.feature
22
+ - cucumber.feature
23
+ - middleware:
24
+ - rack.feature
25
+ - faraday.feature
26
+ - http_libraries:
27
+ - net_http.feature
28
+ - em_http_request.feature
data/features/README.md CHANGED
@@ -12,7 +12,7 @@ provided by `vcr_cucumber_helpers.rb`:
12
12
  the replaying of a recorded HTTP response.
13
13
  * `include_http_adapter_for`: includes a module that implements a common
14
14
  HTTP interface for the given HTTP library. The `response_body_for`
15
- method will make an HTTP request using the given this library. This
15
+ method will make an HTTP request using the given library. This
16
16
  allows scenarios to be run against each different supported HTTP
17
17
  library.
18
18
 
@@ -2,12 +2,12 @@ Feature: Automatic Re-recording
2
2
 
3
3
  Over time, your cassettes may get out-of-date. APIs change and sites you
4
4
  scrape get updated. VCR provides a facility to automatically re-record your
5
- cassettes. Enable re-recording using the :re_record_interval option.
5
+ cassettes. Enable re-recording using the `:re_record_interval` option.
6
6
 
7
7
  The value provided should be an interval (expressed in seconds) that
8
8
  determines how often VCR will re-record the cassette. When a cassette
9
9
  is used, VCR checks the file modification time; if more time than the
10
- interval has passed, VCR will use the :all record mode to cause it be
10
+ interval has passed, VCR will use the `:all` record mode to cause it be
11
11
  re-recorded.
12
12
 
13
13
  Background:
@@ -5,8 +5,8 @@ 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 method, uri, body, headers
9
+ - Response status (code & message), headers, body, http version
10
10
 
11
11
  Scenario Outline: Request/Response data is saved to disk as YAML
12
12
  Given a file named "cassette_format.rb" with:
@@ -11,9 +11,9 @@ Feature: Error for HTTP request made when no cassette is in use
11
11
  (see configuration/allow_http_connections_when_no_cassette.feature) or
12
12
  you can temporarily turn VCR off:
13
13
 
14
- * VCR.turn_off! => turn VCR off so HTTP requests are allowed
15
- * VCR.turn_on! => turn VCR back on
16
- * VCR.turned_off { ... } => turn VCR off for the duration of the
14
+ - `VCR.turn_off!` => turn VCR off so HTTP requests are allowed
15
+ - `VCR.turn_on!` => turn VCR back on
16
+ - `VCR.turned_off { ... }` => turn VCR off for the duration of the
17
17
  provided block.
18
18
 
19
19
  Scenario Outline: Error for request when no cassette is in use
@@ -8,16 +8,16 @@ Feature: Request matching
8
8
  You can customize how VCR matches requests using the `:match_requests_on` option.
9
9
  Specify an array of attributes to match on. Supported attributes are:
10
10
 
11
- * :method - The HTTP method (i.e. GET, POST, PUT or DELETE) of the request.
12
- * :uri - The full URI of the request.
13
- * :host - The host of the URI. You can use this (alone, or in combination
14
- with :path) as an alternative to :uri to cause VCR to match using a regex
11
+ - `:method` - The HTTP method (i.e. GET, POST, PUT or DELETE) of the request.
12
+ - `:uri` - The full URI of the request.
13
+ - `:host` - The host of the URI. You can use this (alone, or in combination
14
+ with `:path`) as an alternative to `:uri` to cause VCR to match using a regex
15
15
  that matches the host.
16
- * :path - The path of the URI. You can use this (alone, or in combination
17
- with :host) as an alternative to :uri to cause VCR to match using a regex
16
+ - `:path` - The path of the URI. You can use this (alone, or in combination
17
+ with `:host`) as an alternative to `:uri` to cause VCR to match using a regex
18
18
  that matches the path.
19
- * :body - The body of the request. (Unsupported when you use FakeWeb.)
20
- * :headers - The request headers. (Unsupported when you use FakeWeb.)
19
+ - `:body` - The body of the request. (Unsupported when you use FakeWeb.)
20
+ - `:headers` - The request headers. (Unsupported when you use FakeWeb.)
21
21
 
22
22
  Alternately, you can manually edit a cassette and change a URI to the YAML
23
23
  of a regular expression.
@@ -1,4 +1,4 @@
1
- Feature: allow_http_connections_when_no_cassette configuration option
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,4 +1,4 @@
1
- Feature: cassette_library_dir configuration option
1
+ Feature: cassette_library_dir
2
2
 
3
3
  The `cassette_library_dir` configuration option sets a directory
4
4
  where VCR saves each cassette.
@@ -1,10 +1,10 @@
1
- Feature: default_cassette_options configuration option
1
+ Feature: default_cassette_options
2
2
 
3
3
  The `default_cassette_options` configuration option takes a hash
4
4
  that provides defaults for each cassette you use. Any cassette
5
5
  can override the defaults as well as set additional options.
6
6
 
7
- The `:match_requests_on` option defaults to [:method, :uri] when
7
+ The `:match_requests_on` option defaults to `[:method, :uri]` when
8
8
  it has not been set.
9
9
 
10
10
  Background:
@@ -0,0 +1,276 @@
1
+ Feature: Hooks
2
+
3
+ VCR provides two global hooks that you can use to customize recording and
4
+ playback:
5
+
6
+ - `before_record`: Called before a cassette is written to disk.
7
+ - `before_playback`: Called before a cassette sets up its stubs for playback.
8
+
9
+ To use these, call `config.before_record` or `config.before_playback` in
10
+ your `VCR.config` block. Provide a block that accepts 0, 1 or 2 arguments.
11
+
12
+ The first argument, if the block accepts it, will be an HTTP interaction.
13
+ Changes you make to the interaction will be reflected in the recording or
14
+ playback. You can also call `#ignore!` on the interaction to cause VCR to
15
+ ignore it. It will not be recorded or played back (depending on which
16
+ kind of hook you use).
17
+
18
+ The second argument, if the block accepts it, will be the
19
+ `VCR::Cassette` instance. This may be useful for hooks that you want to
20
+ behave differently for different cassettes.
21
+
22
+ You can also use tagging to apply hooks to particular cassettes. Consider
23
+ this code:
24
+
25
+ VCR.config do |c|
26
+ c.before_record(:twitter) { ... } # modify the interactions somehow
27
+ end
28
+
29
+ VCR.use_cassette('cassette_1', :tag => :twitter) { ... }
30
+ VCR.use_cassette('cassette_2') { ... }
31
+
32
+ In this example, the hook would apply to the first cassette but not the
33
+ second cassette.
34
+
35
+ You can setup as many hooks as you like; each will be invoked at the
36
+ appropriate time.
37
+
38
+ Background:
39
+ Given a previously recorded cassette file "cassettes/example.yml" with:
40
+ """
41
+ ---
42
+ - !ruby/struct:VCR::HTTPInteraction
43
+ request: !ruby/struct:VCR::Request
44
+ method: :get
45
+ uri: http://example.com:80/foo
46
+ body:
47
+ headers:
48
+ response: !ruby/struct:VCR::Response
49
+ status: !ruby/struct:VCR::ResponseStatus
50
+ code: 200
51
+ message: OK
52
+ headers:
53
+ content-type:
54
+ - text/html;charset=utf-8
55
+ content-length:
56
+ - "20"
57
+ body: example.com response
58
+ http_version: "1.1"
59
+ """
60
+
61
+ Scenario: Replace sensitive data with before_record hook
62
+ Given a file named "before_record_example.rb" with:
63
+ """
64
+ require 'vcr_cucumber_helpers'
65
+
66
+ start_sinatra_app(:port => 7777) do
67
+ get('/') { "Hello <secret>" }
68
+ end
69
+
70
+ require 'vcr'
71
+
72
+ VCR.config do |c|
73
+ c.stub_with :fakeweb
74
+ c.cassette_library_dir = 'cassettes'
75
+
76
+ c.before_record do |i|
77
+ i.response.body.sub!(/^Hello .*$/, 'Hello World')
78
+ end
79
+
80
+ end
81
+
82
+ VCR.use_cassette('recording_example', :record => :new_episodes) do
83
+ Net::HTTP.get_response('localhost', '/', 7777)
84
+ end
85
+ """
86
+ When I run "ruby before_record_example.rb"
87
+ Then the file "cassettes/recording_example.yml" should contain "body: Hello World"
88
+ And the file "cassettes/recording_example.yml" should not contain "secret"
89
+
90
+ Scenario: Prevent recording by ignoring interaction in before_record hook
91
+ Given a file named "before_record_ignore.rb" with:
92
+ """
93
+ require 'vcr_cucumber_helpers'
94
+
95
+ start_sinatra_app(:port => 7777) do
96
+ get('/') { "Hello World" }
97
+ end
98
+
99
+ require 'vcr'
100
+
101
+ VCR.config do |c|
102
+ c.stub_with :fakeweb
103
+ c.cassette_library_dir = 'cassettes'
104
+ c.before_record { |i| i.ignore! }
105
+ end
106
+
107
+ VCR.use_cassette('recording_example', :record => :new_episodes) do
108
+ response = Net::HTTP.get_response('localhost', '/', 7777)
109
+ puts "Response: #{response.body}"
110
+ end
111
+ """
112
+ When I run "ruby before_record_ignore.rb"
113
+ Then it should pass with "Response: Hello World"
114
+ And the file "cassettes/recording_example.yml" should not exist
115
+
116
+ Scenario: Change playback with before_playback hook
117
+ Given a file named "before_playback_example.rb" with:
118
+ """
119
+ require 'vcr'
120
+
121
+ VCR.config do |c|
122
+ c.stub_with :fakeweb
123
+ c.cassette_library_dir = 'cassettes'
124
+
125
+ c.before_playback do |i|
126
+ i.response.body = 'response from before_playback'
127
+ end
128
+ end
129
+
130
+ VCR.use_cassette('example', :record => :new_episodes) do
131
+ response = Net::HTTP.get_response('example.com', '/foo')
132
+ puts "Response: #{response.body}"
133
+ end
134
+ """
135
+ When I run "ruby before_playback_example.rb"
136
+ Then it should pass with "Response: response from before_playback"
137
+
138
+ Scenario: Prevent playback by ignoring interaction in before_playback hook
139
+ Given a previously recorded cassette file "cassettes/localhost.yml" with:
140
+ """
141
+ ---
142
+ - !ruby/struct:VCR::HTTPInteraction
143
+ request: !ruby/struct:VCR::Request
144
+ method: :get
145
+ uri: http://localhost:7777/
146
+ body:
147
+ headers:
148
+ response: !ruby/struct:VCR::Response
149
+ status: !ruby/struct:VCR::ResponseStatus
150
+ code: 200
151
+ message: OK
152
+ headers:
153
+ content-type:
154
+ - text/html;charset=utf-8
155
+ content-length:
156
+ - "20"
157
+ body: recorded response
158
+ http_version: "1.1"
159
+ """
160
+ And a file named "before_playback_ignore.rb" with:
161
+ """
162
+ require 'vcr_cucumber_helpers'
163
+
164
+ start_sinatra_app(:port => 7777) do
165
+ get('/') { "sinatra response" }
166
+ end
167
+
168
+ require 'vcr'
169
+
170
+ VCR.config do |c|
171
+ c.stub_with :fakeweb
172
+ c.cassette_library_dir = 'cassettes'
173
+ c.before_playback { |i| i.ignore! }
174
+ end
175
+
176
+ VCR.use_cassette('localhost', :record => :new_episodes) do
177
+ response = Net::HTTP.get_response('localhost', '/', 7777)
178
+ puts "Response: #{response.body}"
179
+ end
180
+ """
181
+ When I run "ruby before_playback_ignore.rb"
182
+ Then it should pass with "Response: sinatra response"
183
+
184
+ Scenario: Multiple hooks are run in order
185
+ Given a file named "multiple_hooks.rb" with:
186
+ """
187
+ require 'vcr_cucumber_helpers'
188
+
189
+ start_sinatra_app(:port => 7777) do
190
+ get('/') { "Hello World" }
191
+ end
192
+
193
+ require 'vcr'
194
+
195
+ VCR.config do |c|
196
+ c.stub_with :fakeweb
197
+ c.cassette_library_dir = 'cassettes'
198
+
199
+ c.before_record { puts "In before_record hook 1" }
200
+ c.before_record { puts "In before_record hook 2" }
201
+
202
+ c.before_playback { puts "In before_playback hook 1" }
203
+ c.before_playback { puts "In before_playback hook 2" }
204
+ end
205
+
206
+ VCR.use_cassette('example', :record => :new_episodes) do
207
+ response = Net::HTTP.get_response('localhost', '/', 7777)
208
+ puts "Response 1: #{response.body}"
209
+
210
+ response = Net::HTTP.get_response('example.com', '/foo')
211
+ puts "Response 2: #{response.body}"
212
+ end
213
+ """
214
+ When I run "ruby multiple_hooks.rb"
215
+ Then it should pass with:
216
+ """
217
+ In before_playback hook 1
218
+ In before_playback hook 2
219
+ Response 1: Hello World
220
+ Response 2: example.com response
221
+ In before_record hook 1
222
+ In before_record hook 2
223
+ """
224
+
225
+ Scenario: Use tagging to apply hooks to only certain cassettes
226
+ Given a file named "tagged_hooks.rb" with:
227
+ """
228
+ require 'vcr_cucumber_helpers'
229
+
230
+ start_sinatra_app(:port => 7777) do
231
+ get('/') { "Hello World" }
232
+ end
233
+
234
+ require 'vcr'
235
+
236
+ VCR.config do |c|
237
+ c.stub_with :fakeweb
238
+ c.cassette_library_dir = 'cassettes'
239
+
240
+ c.before_record(:tag_1) { |i| puts "In before_record hook for tag_1 (#{i.response.body})" }
241
+ c.before_playback(:tag_2) { |i| puts "In before_playback hook for tag_2 (#{i.response.body})" }
242
+ end
243
+
244
+ [:tag_1, :tag_2, nil].each do |tag|
245
+ puts
246
+ puts "Using tag: #{tag.inspect}"
247
+
248
+ VCR.use_cassette('example', :record => :new_episodes, :tag => tag) do
249
+ response = Net::HTTP.get_response('localhost', '/', 7777)
250
+ puts "Response 1: #{response.body}"
251
+
252
+ response = Net::HTTP.get_response('example.com', '/foo')
253
+ puts "Response 2: #{response.body}"
254
+ end
255
+ end
256
+ """
257
+ When I run "ruby tagged_hooks.rb"
258
+ Then it should pass with:
259
+ """
260
+ Using tag: :tag_1
261
+ Response 1: Hello World
262
+ Response 2: example.com response
263
+ In before_record hook for tag_1 (example.com response)
264
+ In before_record hook for tag_1 (Hello World)
265
+
266
+ Using tag: :tag_2
267
+ In before_playback hook for tag_2 (example.com response)
268
+ In before_playback hook for tag_2 (Hello World)
269
+ Response 1: Hello World
270
+ Response 2: example.com response
271
+
272
+ Using tag: nil
273
+ Response 1: Hello World
274
+ Response 2: example.com response
275
+ """
276
+