vcr 2.0.0.rc1 → 2.0.0.rc2
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 +2 -0
- data/.limited_red +1 -0
- data/.travis.yml +10 -1
- data/.yardopts +9 -0
- data/CHANGELOG.md +51 -1
- data/Gemfile +5 -1
- data/LICENSE +1 -1
- data/README.md +23 -28
- data/Rakefile +63 -18
- data/Upgrade.md +200 -0
- data/features/.nav +2 -0
- data/features/cassettes/automatic_re_recording.feature +19 -15
- data/features/cassettes/dynamic_erb.feature +12 -4
- data/features/cassettes/exclusive.feature +31 -23
- data/features/cassettes/format.feature +54 -30
- data/features/cassettes/naming.feature +1 -1
- data/features/cassettes/update_content_length_header.feature +16 -12
- data/features/configuration/allow_http_connections_when_no_cassette.feature +1 -1
- data/features/configuration/debug_logging.feature +52 -0
- data/features/configuration/filter_sensitive_data.feature +4 -4
- data/features/configuration/hook_into.feature +5 -2
- data/features/configuration/ignore_request.feature +5 -3
- data/features/configuration/preserve_exact_body_bytes.feature +103 -0
- data/features/hooks/after_http_request.feature +17 -4
- data/features/hooks/around_http_request.feature +2 -1
- data/features/hooks/before_http_request.feature +25 -8
- data/features/hooks/before_playback.feature +16 -12
- data/features/hooks/before_record.feature +2 -2
- data/features/http_libraries/em_http_request.feature +82 -58
- data/features/http_libraries/net_http.feature +6 -6
- data/features/middleware/faraday.feature +2 -1
- data/features/middleware/rack.feature +2 -2
- data/features/record_modes/all.feature +19 -15
- data/features/record_modes/new_episodes.feature +17 -13
- data/features/record_modes/none.feature +15 -11
- data/features/record_modes/once.feature +16 -12
- data/features/request_matching/body.feature +28 -20
- data/features/request_matching/custom_matcher.feature +28 -20
- data/features/request_matching/headers.feature +34 -26
- data/features/request_matching/host.feature +28 -20
- data/features/request_matching/identical_request_sequence.feature +28 -20
- data/features/request_matching/method.feature +28 -20
- data/features/request_matching/path.feature +28 -20
- data/features/request_matching/playback_repeats.feature +28 -20
- data/features/request_matching/uri.feature +28 -20
- data/features/request_matching/uri_without_param.feature +28 -20
- data/features/support/env.rb +7 -6
- data/features/support/vcr_cucumber_helpers.rb +1 -0
- data/features/test_frameworks/cucumber.feature +8 -8
- data/features/test_frameworks/rspec_macro.feature +4 -4
- data/features/test_frameworks/rspec_metadata.feature +6 -6
- data/features/test_frameworks/shoulda.feature +1 -1
- data/features/test_frameworks/test_unit.feature +1 -1
- data/lib/vcr.rb +156 -5
- data/lib/vcr/cassette.rb +80 -30
- data/lib/vcr/cassette/http_interaction_list.rb +33 -4
- data/lib/vcr/cassette/migrator.rb +2 -3
- data/lib/vcr/cassette/reader.rb +1 -0
- data/lib/vcr/cassette/serializers.rb +22 -0
- data/lib/vcr/cassette/serializers/json.rb +27 -2
- data/lib/vcr/cassette/serializers/psych.rb +26 -2
- data/lib/vcr/cassette/serializers/syck.rb +28 -2
- data/lib/vcr/cassette/serializers/yaml.rb +28 -2
- data/lib/vcr/configuration.rb +348 -10
- data/lib/vcr/deprecations.rb +8 -0
- data/lib/vcr/errors.rb +40 -0
- data/lib/vcr/extensions/net_http_response.rb +12 -11
- data/lib/vcr/library_hooks.rb +1 -0
- data/lib/vcr/library_hooks/excon.rb +24 -3
- data/lib/vcr/library_hooks/fakeweb.rb +32 -16
- data/lib/vcr/library_hooks/faraday.rb +3 -0
- data/lib/vcr/library_hooks/typhoeus.rb +40 -37
- data/lib/vcr/library_hooks/webmock.rb +54 -34
- data/lib/vcr/middleware/faraday.rb +13 -0
- data/lib/vcr/middleware/rack.rb +35 -0
- data/lib/vcr/request_handler.rb +60 -8
- data/lib/vcr/request_ignorer.rb +1 -0
- data/lib/vcr/request_matcher_registry.rb +28 -0
- data/lib/vcr/structs.rb +245 -38
- data/lib/vcr/test_frameworks/cucumber.rb +10 -0
- data/lib/vcr/test_frameworks/rspec.rb +26 -1
- data/lib/vcr/util/hooks.rb +29 -27
- data/lib/vcr/util/internet_connection.rb +2 -0
- data/lib/vcr/util/logger.rb +25 -0
- data/lib/vcr/util/variable_args_block_caller.rb +1 -0
- data/lib/vcr/util/version_checker.rb +1 -0
- data/lib/vcr/version.rb +8 -1
- data/spec/capture_warnings.rb +3 -3
- data/spec/monkey_patches.rb +28 -13
- data/spec/spec_helper.rb +17 -0
- data/spec/support/http_library_adapters.rb +7 -4
- data/spec/support/shared_example_groups/hook_into_http_library.rb +96 -32
- data/spec/support/shared_example_groups/request_hooks.rb +9 -8
- data/spec/support/sinatra_app.rb +3 -1
- data/spec/support/vcr_localhost_server.rb +1 -0
- data/spec/vcr/cassette/http_interaction_list_spec.rb +119 -54
- data/spec/vcr/cassette/migrator_spec.rb +19 -6
- data/spec/vcr/cassette/serializers_spec.rb +51 -6
- data/spec/vcr/cassette_spec.rb +44 -19
- data/spec/vcr/configuration_spec.rb +91 -6
- data/spec/vcr/library_hooks/excon_spec.rb +54 -16
- data/spec/vcr/library_hooks/fakeweb_spec.rb +12 -21
- data/spec/vcr/library_hooks/typhoeus_spec.rb +2 -29
- data/spec/vcr/library_hooks/webmock_spec.rb +4 -18
- data/spec/vcr/middleware/faraday_spec.rb +1 -16
- data/spec/vcr/structs_spec.rb +194 -61
- data/spec/vcr/test_frameworks/rspec_spec.rb +10 -0
- data/spec/vcr/util/hooks_spec.rb +104 -56
- data/spec/vcr/util/version_checker_spec.rb +45 -0
- data/spec/vcr_spec.rb +11 -0
- data/vcr.gemspec +30 -34
- metadata +149 -95
- data/spec/support/shared_example_groups/version_checking.rb +0 -34
|
@@ -51,7 +51,7 @@ Feature: Filter sensitive data
|
|
|
51
51
|
"""
|
|
52
52
|
When I run `ruby filtering.rb --with-server`
|
|
53
53
|
Then the output should contain "Response: Hello World"
|
|
54
|
-
And the file "cassettes/filtering.yml" should contain "
|
|
54
|
+
And the file "cassettes/filtering.yml" should contain "<GREETING> <LOCATION>"
|
|
55
55
|
And the file "cassettes/filtering.yml" should not contain "Hello"
|
|
56
56
|
And the file "cassettes/filtering.yml" should not contain "World"
|
|
57
57
|
|
|
@@ -90,8 +90,8 @@ Feature: Filter sensitive data
|
|
|
90
90
|
Then the output should contain each of the following:
|
|
91
91
|
| Tagged Response: Hello World 1 |
|
|
92
92
|
| Untagged Response: Hello World 2 |
|
|
93
|
-
And the file "cassettes/tagged.yml" should contain "
|
|
94
|
-
And the file "cassettes/untagged.yml" should contain "
|
|
93
|
+
And the file "cassettes/tagged.yml" should contain "Hello <LOCATION> 1"
|
|
94
|
+
And the file "cassettes/untagged.yml" should contain "Hello World 2"
|
|
95
95
|
|
|
96
96
|
When I run `ruby tagged_filtering.rb`
|
|
97
97
|
Then the output should contain each of the following:
|
|
@@ -141,7 +141,7 @@ Feature: Filter sensitive data
|
|
|
141
141
|
"""
|
|
142
142
|
When I run `ruby dynamic_filtering.rb --with-server`
|
|
143
143
|
Then the output should contain "john.doe/monkey"
|
|
144
|
-
And the file "cassettes/example.yml" should contain "
|
|
144
|
+
And the file "cassettes/example.yml" should contain "john.doe/<PASSWORD>"
|
|
145
145
|
And the file "cassettes/example.yml" should contain a YAML fragment like:
|
|
146
146
|
"""
|
|
147
147
|
X-Http-Password:
|
|
@@ -12,6 +12,7 @@ Feature: hook_into
|
|
|
12
12
|
- Curb (Curl::Easy, but not Curl::Multi)
|
|
13
13
|
- EM HTTP Request
|
|
14
14
|
- Typhoeus (Typhoeus::Hydra, but not Typhoeus::Easy or Typhoeus::Multi)
|
|
15
|
+
- Excon
|
|
15
16
|
- :typhoeus can be used to hook into itself (as long as you use Typhoeus::Hydra,
|
|
16
17
|
but not Typhoeus::Easy or Typhoeus::Multi).
|
|
17
18
|
- :excon can be used to hook into itself.
|
|
@@ -53,6 +54,7 @@ Feature: hook_into
|
|
|
53
54
|
<configuration>
|
|
54
55
|
c.cassette_library_dir = 'vcr_cassettes'
|
|
55
56
|
c.ignore_localhost = false
|
|
57
|
+
c.default_cassette_options = { :serialize_with => :syck }
|
|
56
58
|
end
|
|
57
59
|
|
|
58
60
|
VCR.use_cassette('example') do
|
|
@@ -63,13 +65,13 @@ Feature: hook_into
|
|
|
63
65
|
Then the output should contain each of the following:
|
|
64
66
|
| The response for request 1 was: Hello World |
|
|
65
67
|
| The response for request 2 was: Hello World |
|
|
66
|
-
And the file "vcr_cassettes/example.yml" should contain "
|
|
68
|
+
And the file "vcr_cassettes/example.yml" should contain "Hello World"
|
|
67
69
|
|
|
68
70
|
When I run `ruby hook_into_http_lib_combo.rb 'Goodbye World'`
|
|
69
71
|
Then the output should contain each of the following:
|
|
70
72
|
| The response for request 1 was: Goodbye World |
|
|
71
73
|
| The response for request 2 was: Hello World |
|
|
72
|
-
And the file "vcr_cassettes/example.yml" should contain "
|
|
74
|
+
And the file "vcr_cassettes/example.yml" should contain "Hello World"
|
|
73
75
|
|
|
74
76
|
Examples:
|
|
75
77
|
| configuration | http_lib |
|
|
@@ -80,6 +82,7 @@ Feature: hook_into
|
|
|
80
82
|
| c.hook_into :webmock | patron |
|
|
81
83
|
| c.hook_into :webmock | em-http-request |
|
|
82
84
|
| c.hook_into :webmock | typhoeus |
|
|
85
|
+
| c.hook_into :webmock | excon |
|
|
83
86
|
| c.hook_into :typhoeus | typhoeus |
|
|
84
87
|
| c.hook_into :excon | excon |
|
|
85
88
|
| c.hook_into :faraday | faraday (w/ net_http) |
|
|
@@ -48,6 +48,7 @@ Feature: Ignore Request
|
|
|
48
48
|
URI(request.uri).port == 7777
|
|
49
49
|
end
|
|
50
50
|
|
|
51
|
+
c.default_cassette_options = { :serialize_with => :syck }
|
|
51
52
|
c.cassette_library_dir = 'cassettes'
|
|
52
53
|
<configuration>
|
|
53
54
|
end
|
|
@@ -75,8 +76,8 @@ Feature: Ignore Request
|
|
|
75
76
|
Port 7777 Response 1
|
|
76
77
|
Port 7777 Response 2
|
|
77
78
|
"""
|
|
78
|
-
And the file "cassettes/example.yml" should contain "
|
|
79
|
-
And the file "cassettes/example.yml" should not contain "
|
|
79
|
+
And the file "cassettes/example.yml" should contain "Port 8888"
|
|
80
|
+
And the file "cassettes/example.yml" should not contain "Port 7777"
|
|
80
81
|
|
|
81
82
|
Examples:
|
|
82
83
|
| configuration | http_lib |
|
|
@@ -132,6 +133,7 @@ Feature: Ignore Request
|
|
|
132
133
|
|
|
133
134
|
VCR.configure do |c|
|
|
134
135
|
c.cassette_library_dir = 'cassettes'
|
|
136
|
+
c.default_cassette_options = { :serialize_with => :syck }
|
|
135
137
|
<configuration>
|
|
136
138
|
end
|
|
137
139
|
|
|
@@ -143,7 +145,7 @@ Feature: Ignore Request
|
|
|
143
145
|
"""
|
|
144
146
|
When I run `ruby localhost_not_ignored.rb`
|
|
145
147
|
Then it should fail with "An HTTP request has been made that VCR does not know how to handle"
|
|
146
|
-
And the file "cassettes/localhost.yml" should contain "
|
|
148
|
+
And the file "cassettes/localhost.yml" should contain "Port 7777 Response 1"
|
|
147
149
|
|
|
148
150
|
Examples:
|
|
149
151
|
| configuration | http_lib |
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
@exclude-18
|
|
2
|
+
Feature: Preserve Exact Body Bytes
|
|
3
|
+
|
|
4
|
+
Some HTTP servers are not well-behaved and respond with invalid data: the response body may
|
|
5
|
+
not be encoded according to the encoding specified in the HTTP headers, or there may be bytes
|
|
6
|
+
that are invalid for the given encoding. The YAML and JSON serializers are not generally
|
|
7
|
+
designed to handle these cases gracefully, and you may get errors when the cassette is serialized
|
|
8
|
+
or deserialized. Also, the encoding may not be preserved when round-tripped through the
|
|
9
|
+
serializer.
|
|
10
|
+
|
|
11
|
+
VCR provides a configuration option to deal with cases like these. The `preserve_exact_body_bytes`
|
|
12
|
+
method accepts a block that VCR will use to determine if the body of the given request or response object
|
|
13
|
+
should be base64 encoded in order to preserve the bytes exactly as-is. VCR does not do this by
|
|
14
|
+
default, since base64-encoding the string removes the human readibility of the cassette.
|
|
15
|
+
|
|
16
|
+
Alternately, if you want to force an entire cassette to preserve the exact body bytes,
|
|
17
|
+
you can pass the `:preserve_exact_body_bytes => true` cassette option when inserting your
|
|
18
|
+
cassette.
|
|
19
|
+
|
|
20
|
+
Scenario: Preserve exact bytes for response body with invalid encoding
|
|
21
|
+
Given a file named "preserve.rb" with:
|
|
22
|
+
"""ruby
|
|
23
|
+
# encoding: utf-8
|
|
24
|
+
string = "abc \xFA"
|
|
25
|
+
puts "Valid encoding: #{string.valid_encoding?}"
|
|
26
|
+
|
|
27
|
+
start_sinatra_app(:port => 7777) do
|
|
28
|
+
get('/') { string }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
require 'vcr'
|
|
32
|
+
|
|
33
|
+
VCR.configure do |c|
|
|
34
|
+
c.cassette_library_dir = 'cassettes'
|
|
35
|
+
c.hook_into :fakeweb
|
|
36
|
+
c.preserve_exact_body_bytes do |http_message|
|
|
37
|
+
http_message.body.encoding.name == 'ASCII-8BIT' ||
|
|
38
|
+
!http_message.body.valid_encoding?
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def make_request(label)
|
|
43
|
+
puts
|
|
44
|
+
puts label
|
|
45
|
+
VCR.use_cassette('example', :serialize_with => :json) do
|
|
46
|
+
body = Net::HTTP.get_response(URI("http://localhost:7777/")).body
|
|
47
|
+
puts "Body: #{body.inspect}"
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
make_request("Recording:")
|
|
52
|
+
make_request("Playback:")
|
|
53
|
+
"""
|
|
54
|
+
When I run `ruby preserve.rb`
|
|
55
|
+
Then the output should contain exactly:
|
|
56
|
+
"""
|
|
57
|
+
Valid encoding: false
|
|
58
|
+
|
|
59
|
+
Recording:
|
|
60
|
+
Body: "abc \xFA"
|
|
61
|
+
|
|
62
|
+
Playback:
|
|
63
|
+
Body: "abc \xFA"
|
|
64
|
+
|
|
65
|
+
"""
|
|
66
|
+
And the file "cassettes/example.json" should contain:
|
|
67
|
+
"""
|
|
68
|
+
"body":{"encoding":"ASCII-8BIT","base64_string":"YWJjIPo=\n"}
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
Scenario: Preserve exact bytes for cassette with `:preserve_exact_body_bytes` option
|
|
72
|
+
Given a file named "preserve.rb" with:
|
|
73
|
+
"""ruby
|
|
74
|
+
start_sinatra_app(:port => 7777) do
|
|
75
|
+
get('/') { "Hello World" }
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
require 'vcr'
|
|
79
|
+
|
|
80
|
+
VCR.configure do |c|
|
|
81
|
+
c.cassette_library_dir = 'cassettes'
|
|
82
|
+
c.hook_into :fakeweb
|
|
83
|
+
c.default_cassette_options = { :serialize_with => :json }
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
VCR.use_cassette('preserve_bytes', :preserve_exact_body_bytes => true) do
|
|
87
|
+
Net::HTTP.get_response(URI("http://localhost:7777/"))
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
VCR.use_cassette('dont_preserve_bytes') do
|
|
91
|
+
Net::HTTP.get_response(URI("http://localhost:7777/"))
|
|
92
|
+
end
|
|
93
|
+
"""
|
|
94
|
+
When I run `ruby preserve.rb`
|
|
95
|
+
Then the file "cassettes/preserve_bytes.json" should contain:
|
|
96
|
+
"""
|
|
97
|
+
"body":{"encoding":"US-ASCII","base64_string":"SGVsbG8gV29ybGQ=\n"}
|
|
98
|
+
"""
|
|
99
|
+
And the file "cassettes/dont_preserve_bytes.json" should contain:
|
|
100
|
+
"""
|
|
101
|
+
"body":{"encoding":"US-ASCII","string":"Hello World"}
|
|
102
|
+
"""
|
|
103
|
+
|
|
@@ -7,13 +7,24 @@ Feature: after_http_request hook
|
|
|
7
7
|
* ejecting the current cassette (i.e. if you inserted it in a
|
|
8
8
|
`before_http_request` hook)
|
|
9
9
|
|
|
10
|
+
You can also pass one or more "filters" to `after_http_request`, to make
|
|
11
|
+
the hook only be called for some requests. Any object that responds to `#to_proc`
|
|
12
|
+
can be a filter. Here are some simple examples:
|
|
13
|
+
|
|
14
|
+
* `:real?` -- only real requests
|
|
15
|
+
* `:stubbed?` -- only stubbed requests
|
|
16
|
+
* `:ignored?` -- only ignored requests
|
|
17
|
+
* `:recordable?` -- only requests that are being recorded
|
|
18
|
+
* `lambda { |req| URI(req.uri).host == 'amazon.com' }` -- only requests to amazon.com.
|
|
19
|
+
|
|
10
20
|
Scenario Outline: log all requests and responses using after_http_request hook
|
|
11
21
|
Given a file named "after_http_request.rb" with:
|
|
12
22
|
"""ruby
|
|
13
23
|
include_http_adapter_for("<http_lib>")
|
|
14
24
|
|
|
15
25
|
start_sinatra_app(:port => 7777) do
|
|
16
|
-
get('/') { "Hello World" }
|
|
26
|
+
get('/foo') { "Hello World (foo)" }
|
|
27
|
+
get('/bar') { "Hello World (bar)" }
|
|
17
28
|
end
|
|
18
29
|
|
|
19
30
|
require 'vcr'
|
|
@@ -22,15 +33,17 @@ Feature: after_http_request hook
|
|
|
22
33
|
<configuration>
|
|
23
34
|
c.cassette_library_dir = 'cassettes'
|
|
24
35
|
c.ignore_localhost = true
|
|
25
|
-
c.after_http_request do |request, response|
|
|
36
|
+
c.after_http_request(lambda { |req| req.uri =~ /foo/ }) do |request, response|
|
|
26
37
|
puts "Response for #{request.method} #{request.uri}: #{response.body}"
|
|
27
38
|
end
|
|
28
39
|
end
|
|
29
40
|
|
|
30
|
-
make_http_request(:get, "http://localhost:7777/")
|
|
41
|
+
make_http_request(:get, "http://localhost:7777/foo")
|
|
42
|
+
make_http_request(:get, "http://localhost:7777/bar")
|
|
31
43
|
"""
|
|
32
44
|
When I run `ruby after_http_request.rb`
|
|
33
|
-
Then
|
|
45
|
+
Then the output should contain "Response for get http://localhost:7777/foo: Hello World (foo)"
|
|
46
|
+
But the output should not contain "bar"
|
|
34
47
|
|
|
35
48
|
Examples:
|
|
36
49
|
| configuration | http_lib |
|
|
@@ -28,6 +28,7 @@ Feature: around_http_request hook
|
|
|
28
28
|
VCR.configure do |c|
|
|
29
29
|
<configuration>
|
|
30
30
|
c.cassette_library_dir = 'cassettes'
|
|
31
|
+
c.default_cassette_options = { :serialize_with => :syck }
|
|
31
32
|
c.around_http_request do |request|
|
|
32
33
|
VCR.use_cassette('global', :record => :new_episodes, &request)
|
|
33
34
|
end
|
|
@@ -42,7 +43,7 @@ Feature: around_http_request hook
|
|
|
42
43
|
Response for request 1: Response 1
|
|
43
44
|
Response for request 2: Response 1
|
|
44
45
|
"""
|
|
45
|
-
And the file "cassettes/global.yml" should contain "
|
|
46
|
+
And the file "cassettes/global.yml" should contain "Response 1"
|
|
46
47
|
|
|
47
48
|
Examples:
|
|
48
49
|
| configuration | http_lib |
|
|
@@ -7,13 +7,25 @@ Feature: before_http_request hook
|
|
|
7
7
|
* inserting a particular cassette based on the request URI host
|
|
8
8
|
* raising a timeout error
|
|
9
9
|
|
|
10
|
+
You can also pass one or more "filters" to `before_http_request`, to make
|
|
11
|
+
the hook only be called for some requests. Any object that responds to `#to_proc`
|
|
12
|
+
can be a filter. Here are some simple examples:
|
|
13
|
+
|
|
14
|
+
* `:real?` -- only real requests
|
|
15
|
+
* `:stubbed?` -- only stubbed requests
|
|
16
|
+
* `:ignored?` -- only ignored requests
|
|
17
|
+
* `:recordable?` -- only requests that are being recorded
|
|
18
|
+
* `lambda { |r| URI(r.uri).host == 'amazon.com' }` -- only requests to amazon.com.
|
|
19
|
+
|
|
10
20
|
Scenario Outline: log all requests using a before_http_request hook
|
|
11
21
|
Given a file named "before_http_request.rb" with:
|
|
12
22
|
"""ruby
|
|
13
23
|
include_http_adapter_for("<http_lib>")
|
|
14
24
|
|
|
15
|
-
|
|
16
|
-
|
|
25
|
+
if ARGV.include?('--with-server')
|
|
26
|
+
start_sinatra_app(:port => 7777) do
|
|
27
|
+
get('/') { "Hello World" }
|
|
28
|
+
end
|
|
17
29
|
end
|
|
18
30
|
|
|
19
31
|
require 'vcr'
|
|
@@ -21,16 +33,21 @@ Feature: before_http_request hook
|
|
|
21
33
|
VCR.configure do |c|
|
|
22
34
|
<configuration>
|
|
23
35
|
c.cassette_library_dir = 'cassettes'
|
|
24
|
-
c.
|
|
25
|
-
|
|
26
|
-
|
|
36
|
+
c.before_http_request(:real?) do |request|
|
|
37
|
+
File.open(ARGV.first, 'w') do |f|
|
|
38
|
+
f.write("before real request: #{request.method} #{request.uri}")
|
|
39
|
+
end
|
|
27
40
|
end
|
|
28
41
|
end
|
|
29
42
|
|
|
30
|
-
|
|
43
|
+
VCR.use_cassette('hook_example') do
|
|
44
|
+
make_http_request(:get, "http://localhost:7777/")
|
|
45
|
+
end
|
|
31
46
|
"""
|
|
32
|
-
When I run `ruby before_http_request.rb`
|
|
33
|
-
Then
|
|
47
|
+
When I run `ruby before_http_request.rb run1.log --with-server`
|
|
48
|
+
Then the file "run1.log" should contain "before real request: get http://localhost:7777/"
|
|
49
|
+
When I run `ruby before_http_request.rb run2.log`
|
|
50
|
+
Then the file "run2.log" should not exist
|
|
34
51
|
|
|
35
52
|
Examples:
|
|
36
53
|
| configuration | http_lib |
|
|
@@ -26,24 +26,28 @@ Feature: before_playback hook
|
|
|
26
26
|
Background:
|
|
27
27
|
Given a previously recorded cassette file "cassettes/example.yml" with:
|
|
28
28
|
"""
|
|
29
|
-
---
|
|
30
|
-
http_interactions:
|
|
31
|
-
- request:
|
|
29
|
+
---
|
|
30
|
+
http_interactions:
|
|
31
|
+
- request:
|
|
32
32
|
method: get
|
|
33
33
|
uri: http://localhost:7777/
|
|
34
|
-
body:
|
|
34
|
+
body:
|
|
35
|
+
encoding: UTF-8
|
|
36
|
+
string: ""
|
|
35
37
|
headers: {}
|
|
36
|
-
response:
|
|
37
|
-
status:
|
|
38
|
+
response:
|
|
39
|
+
status:
|
|
38
40
|
code: 200
|
|
39
41
|
message: OK
|
|
40
|
-
headers:
|
|
41
|
-
Content-Type:
|
|
42
|
+
headers:
|
|
43
|
+
Content-Type:
|
|
42
44
|
- text/html;charset=utf-8
|
|
43
|
-
Content-Length:
|
|
44
|
-
-
|
|
45
|
-
body:
|
|
46
|
-
|
|
45
|
+
Content-Length:
|
|
46
|
+
- "20"
|
|
47
|
+
body:
|
|
48
|
+
encoding: UTF-8
|
|
49
|
+
string: previously recorded response
|
|
50
|
+
http_version: "1.1"
|
|
47
51
|
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
|
48
52
|
recorded_with: VCR 2.0.0
|
|
49
53
|
"""
|
|
@@ -46,7 +46,7 @@ Feature: before_record hook
|
|
|
46
46
|
end
|
|
47
47
|
"""
|
|
48
48
|
When I run `ruby before_record_example.rb`
|
|
49
|
-
Then the file "cassettes/recording_example.yml" should contain "
|
|
49
|
+
Then the file "cassettes/recording_example.yml" should contain "Hello World"
|
|
50
50
|
And the file "cassettes/recording_example.yml" should not contain "Earth"
|
|
51
51
|
|
|
52
52
|
Scenario: Modify recorded response based on the cassette
|
|
@@ -72,7 +72,7 @@ Feature: before_record hook
|
|
|
72
72
|
end
|
|
73
73
|
"""
|
|
74
74
|
When I run `ruby before_record_example.rb`
|
|
75
|
-
Then the file "cassettes/recording_example.yml" should contain "
|
|
75
|
+
Then the file "cassettes/recording_example.yml" should contain "Hello Earth (recording_example)"
|
|
76
76
|
|
|
77
77
|
Scenario: Prevent recording by ignoring interaction in before_record hook
|
|
78
78
|
Given a file named "before_record_ignore.rb" with:
|
|
@@ -59,57 +59,69 @@ Feature: EM HTTP Request
|
|
|
59
59
|
"""
|
|
60
60
|
And the file "cassettes/em_http.yml" should contain YAML like:
|
|
61
61
|
"""
|
|
62
|
-
---
|
|
63
|
-
http_interactions:
|
|
64
|
-
- request:
|
|
62
|
+
---
|
|
63
|
+
http_interactions:
|
|
64
|
+
- request:
|
|
65
65
|
method: get
|
|
66
66
|
uri: http://localhost:7777/foo
|
|
67
|
-
body:
|
|
67
|
+
body:
|
|
68
|
+
encoding: UTF-8
|
|
69
|
+
string: ""
|
|
68
70
|
headers: {}
|
|
69
|
-
response:
|
|
70
|
-
status:
|
|
71
|
+
response:
|
|
72
|
+
status:
|
|
71
73
|
code: 200
|
|
72
74
|
message: OK
|
|
73
|
-
headers:
|
|
74
|
-
Content-Type:
|
|
75
|
+
headers:
|
|
76
|
+
Content-Type:
|
|
75
77
|
- text/html;charset=utf-8
|
|
76
|
-
Content-Length:
|
|
77
|
-
-
|
|
78
|
-
body:
|
|
78
|
+
Content-Length:
|
|
79
|
+
- "9"
|
|
80
|
+
body:
|
|
81
|
+
encoding: UTF-8
|
|
82
|
+
string: Hello foo
|
|
79
83
|
http_version:
|
|
80
84
|
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
|
81
|
-
- request:
|
|
85
|
+
- request:
|
|
82
86
|
method: get
|
|
83
87
|
uri: http://localhost:7777/bar
|
|
84
|
-
body:
|
|
88
|
+
body:
|
|
89
|
+
encoding: UTF-8
|
|
90
|
+
string: ""
|
|
85
91
|
headers: {}
|
|
86
|
-
response:
|
|
87
|
-
status:
|
|
92
|
+
response:
|
|
93
|
+
status:
|
|
88
94
|
code: 200
|
|
89
95
|
message: OK
|
|
90
|
-
headers:
|
|
91
|
-
Content-Type:
|
|
96
|
+
headers:
|
|
97
|
+
Content-Type:
|
|
92
98
|
- text/html;charset=utf-8
|
|
93
|
-
Content-Length:
|
|
94
|
-
-
|
|
95
|
-
body:
|
|
99
|
+
Content-Length:
|
|
100
|
+
- "9"
|
|
101
|
+
body:
|
|
102
|
+
encoding: UTF-8
|
|
103
|
+
string: Hello bar
|
|
96
104
|
http_version:
|
|
97
105
|
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
|
98
|
-
- request:
|
|
106
|
+
- request:
|
|
99
107
|
method: get
|
|
100
108
|
uri: http://localhost:7777/bazz
|
|
101
|
-
body:
|
|
109
|
+
body:
|
|
110
|
+
encoding: UTF-8
|
|
111
|
+
string: ""
|
|
102
112
|
headers: {}
|
|
103
|
-
response:
|
|
104
|
-
status:
|
|
113
|
+
response:
|
|
114
|
+
status:
|
|
105
115
|
code: 200
|
|
106
116
|
message: OK
|
|
107
|
-
headers:
|
|
108
|
-
Content-Type:
|
|
117
|
+
headers:
|
|
118
|
+
Content-Type:
|
|
109
119
|
- text/html;charset=utf-8
|
|
110
|
-
Content-Length:
|
|
111
|
-
-
|
|
112
|
-
body:
|
|
120
|
+
Content-Length:
|
|
121
|
+
- "10"
|
|
122
|
+
body:
|
|
123
|
+
encoding: UTF-8
|
|
124
|
+
string: Hello bazz
|
|
113
125
|
http_version:
|
|
114
126
|
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
|
115
127
|
recorded_with: VCR 2.0.0
|
|
@@ -154,57 +166,69 @@ Feature: EM HTTP Request
|
|
|
154
166
|
"""
|
|
155
167
|
And the file "cassettes/em_http.yml" should contain YAML like:
|
|
156
168
|
"""
|
|
157
|
-
---
|
|
158
|
-
http_interactions:
|
|
159
|
-
- request:
|
|
169
|
+
---
|
|
170
|
+
http_interactions:
|
|
171
|
+
- request:
|
|
160
172
|
method: get
|
|
161
173
|
uri: http://localhost:7777/foo
|
|
162
|
-
body:
|
|
174
|
+
body:
|
|
175
|
+
encoding: UTF-8
|
|
176
|
+
string: ""
|
|
163
177
|
headers: {}
|
|
164
|
-
response:
|
|
165
|
-
status:
|
|
178
|
+
response:
|
|
179
|
+
status:
|
|
166
180
|
code: 200
|
|
167
181
|
message: OK
|
|
168
|
-
headers:
|
|
169
|
-
Content-Type:
|
|
182
|
+
headers:
|
|
183
|
+
Content-Type:
|
|
170
184
|
- text/html;charset=utf-8
|
|
171
|
-
Content-Length:
|
|
172
|
-
-
|
|
173
|
-
body:
|
|
185
|
+
Content-Length:
|
|
186
|
+
- "9"
|
|
187
|
+
body:
|
|
188
|
+
encoding: UTF-8
|
|
189
|
+
string: Hello foo
|
|
174
190
|
http_version:
|
|
175
191
|
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
|
176
|
-
- request:
|
|
192
|
+
- request:
|
|
177
193
|
method: get
|
|
178
194
|
uri: http://localhost:7777/bar
|
|
179
|
-
body:
|
|
195
|
+
body:
|
|
196
|
+
encoding: UTF-8
|
|
197
|
+
string: ""
|
|
180
198
|
headers: {}
|
|
181
|
-
response:
|
|
182
|
-
status:
|
|
199
|
+
response:
|
|
200
|
+
status:
|
|
183
201
|
code: 200
|
|
184
202
|
message: OK
|
|
185
|
-
headers:
|
|
186
|
-
Content-Type:
|
|
203
|
+
headers:
|
|
204
|
+
Content-Type:
|
|
187
205
|
- text/html;charset=utf-8
|
|
188
|
-
Content-Length:
|
|
189
|
-
-
|
|
190
|
-
body:
|
|
206
|
+
Content-Length:
|
|
207
|
+
- "9"
|
|
208
|
+
body:
|
|
209
|
+
encoding: UTF-8
|
|
210
|
+
string: Hello bar
|
|
191
211
|
http_version:
|
|
192
212
|
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
|
193
|
-
- request:
|
|
213
|
+
- request:
|
|
194
214
|
method: get
|
|
195
215
|
uri: http://localhost:7777/bazz
|
|
196
|
-
body:
|
|
216
|
+
body:
|
|
217
|
+
encoding: UTF-8
|
|
218
|
+
string: ""
|
|
197
219
|
headers: {}
|
|
198
|
-
response:
|
|
199
|
-
status:
|
|
220
|
+
response:
|
|
221
|
+
status:
|
|
200
222
|
code: 200
|
|
201
223
|
message: OK
|
|
202
|
-
headers:
|
|
203
|
-
Content-Type:
|
|
224
|
+
headers:
|
|
225
|
+
Content-Type:
|
|
204
226
|
- text/html;charset=utf-8
|
|
205
|
-
Content-Length:
|
|
206
|
-
-
|
|
207
|
-
body:
|
|
227
|
+
Content-Length:
|
|
228
|
+
- "10"
|
|
229
|
+
body:
|
|
230
|
+
encoding: UTF-8
|
|
231
|
+
string: Hello bazz
|
|
208
232
|
http_version:
|
|
209
233
|
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
|
210
234
|
recorded_with: VCR 2.0.0
|