mustwin-vcr 2.9.3
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.
- checksums.yaml +7 -0
- data/features/about_these_examples.md +18 -0
- data/features/cassettes/allow_unused_http_interactions.feature +100 -0
- data/features/cassettes/automatic_re_recording.feature +72 -0
- data/features/cassettes/decompress.feature +74 -0
- data/features/cassettes/dynamic_erb.feature +100 -0
- data/features/cassettes/exclusive.feature +126 -0
- data/features/cassettes/format.feature +323 -0
- data/features/cassettes/freezing_time.feature +68 -0
- data/features/cassettes/naming.feature +28 -0
- data/features/cassettes/no_cassette.feature +152 -0
- data/features/cassettes/update_content_length_header.feature +112 -0
- data/features/configuration/allow_http_connections_when_no_cassette.feature +55 -0
- data/features/configuration/cassette_library_dir.feature +31 -0
- data/features/configuration/debug_logging.feature +59 -0
- data/features/configuration/default_cassette_options.feature +100 -0
- data/features/configuration/filter_sensitive_data.feature +153 -0
- data/features/configuration/hook_into.feature +172 -0
- data/features/configuration/ignore_request.feature +192 -0
- data/features/configuration/preserve_exact_body_bytes.feature +108 -0
- data/features/configuration/query_parser.feature +84 -0
- data/features/configuration/uri_parser.feature +89 -0
- data/features/getting_started.md +82 -0
- data/features/hooks/after_http_request.feature +58 -0
- data/features/hooks/around_http_request.feature +57 -0
- data/features/hooks/before_http_request.feature +63 -0
- data/features/hooks/before_playback.feature +184 -0
- data/features/hooks/before_record.feature +172 -0
- data/features/http_libraries/em_http_request.feature +250 -0
- data/features/http_libraries/net_http.feature +179 -0
- data/features/middleware/faraday.feature +56 -0
- data/features/middleware/rack.feature +92 -0
- data/features/record_modes/all.feature +82 -0
- data/features/record_modes/new_episodes.feature +79 -0
- data/features/record_modes/none.feature +72 -0
- data/features/record_modes/once.feature +95 -0
- data/features/request_matching/README.md +30 -0
- data/features/request_matching/body.feature +91 -0
- data/features/request_matching/body_as_json.feature +90 -0
- data/features/request_matching/custom_matcher.feature +135 -0
- data/features/request_matching/headers.feature +85 -0
- data/features/request_matching/host.feature +95 -0
- data/features/request_matching/identical_request_sequence.feature +89 -0
- data/features/request_matching/method.feature +96 -0
- data/features/request_matching/path.feature +96 -0
- data/features/request_matching/playback_repeats.feature +98 -0
- data/features/request_matching/query.feature +97 -0
- data/features/request_matching/uri.feature +94 -0
- data/features/request_matching/uri_without_param.feature +101 -0
- data/features/step_definitions/cli_steps.rb +193 -0
- data/features/support/env.rb +44 -0
- data/features/support/http_lib_filters.rb +53 -0
- data/features/test_frameworks/cucumber.feature +211 -0
- data/features/test_frameworks/rspec_macro.feature +81 -0
- data/features/test_frameworks/rspec_metadata.feature +150 -0
- data/features/test_frameworks/test_unit.feature +49 -0
- data/lib/vcr.rb +347 -0
- data/lib/vcr/cassette.rb +291 -0
- data/lib/vcr/cassette/erb_renderer.rb +55 -0
- data/lib/vcr/cassette/http_interaction_list.rb +108 -0
- data/lib/vcr/cassette/migrator.rb +118 -0
- data/lib/vcr/cassette/persisters.rb +42 -0
- data/lib/vcr/cassette/persisters/file_system.rb +64 -0
- data/lib/vcr/cassette/serializers.rb +57 -0
- data/lib/vcr/cassette/serializers/json.rb +48 -0
- data/lib/vcr/cassette/serializers/psych.rb +48 -0
- data/lib/vcr/cassette/serializers/syck.rb +61 -0
- data/lib/vcr/cassette/serializers/yaml.rb +50 -0
- data/lib/vcr/configuration.rb +555 -0
- data/lib/vcr/deprecations.rb +109 -0
- data/lib/vcr/errors.rb +266 -0
- data/lib/vcr/extensions/net_http_response.rb +36 -0
- data/lib/vcr/library_hooks.rb +18 -0
- data/lib/vcr/library_hooks/excon.rb +27 -0
- data/lib/vcr/library_hooks/fakeweb.rb +196 -0
- data/lib/vcr/library_hooks/faraday.rb +51 -0
- data/lib/vcr/library_hooks/typhoeus.rb +120 -0
- data/lib/vcr/library_hooks/typhoeus_0.4.rb +103 -0
- data/lib/vcr/library_hooks/webmock.rb +164 -0
- data/lib/vcr/middleware/excon.rb +221 -0
- data/lib/vcr/middleware/excon/legacy_methods.rb +33 -0
- data/lib/vcr/middleware/faraday.rb +118 -0
- data/lib/vcr/middleware/rack.rb +79 -0
- data/lib/vcr/request_handler.rb +114 -0
- data/lib/vcr/request_ignorer.rb +43 -0
- data/lib/vcr/request_matcher_registry.rb +149 -0
- data/lib/vcr/structs.rb +578 -0
- data/lib/vcr/tasks/vcr.rake +9 -0
- data/lib/vcr/test_frameworks/cucumber.rb +64 -0
- data/lib/vcr/test_frameworks/rspec.rb +47 -0
- data/lib/vcr/util/hooks.rb +61 -0
- data/lib/vcr/util/internet_connection.rb +43 -0
- data/lib/vcr/util/logger.rb +59 -0
- data/lib/vcr/util/variable_args_block_caller.rb +13 -0
- data/lib/vcr/util/version_checker.rb +48 -0
- data/lib/vcr/version.rb +34 -0
- data/spec/acceptance/threading_spec.rb +34 -0
- data/spec/fixtures/cassette_spec/1_x_cassette.yml +110 -0
- data/spec/fixtures/cassette_spec/empty.yml +0 -0
- data/spec/fixtures/cassette_spec/example.yml +111 -0
- data/spec/fixtures/cassette_spec/with_localhost_requests.yml +111 -0
- data/spec/fixtures/fake_example_responses.yml +110 -0
- data/spec/fixtures/match_requests_on.yml +187 -0
- data/spec/lib/vcr/cassette/erb_renderer_spec.rb +53 -0
- data/spec/lib/vcr/cassette/http_interaction_list_spec.rb +295 -0
- data/spec/lib/vcr/cassette/migrator_spec.rb +195 -0
- data/spec/lib/vcr/cassette/persisters/file_system_spec.rb +69 -0
- data/spec/lib/vcr/cassette/persisters_spec.rb +39 -0
- data/spec/lib/vcr/cassette/serializers_spec.rb +176 -0
- data/spec/lib/vcr/cassette_spec.rb +618 -0
- data/spec/lib/vcr/configuration_spec.rb +326 -0
- data/spec/lib/vcr/deprecations_spec.rb +85 -0
- data/spec/lib/vcr/errors_spec.rb +162 -0
- data/spec/lib/vcr/extensions/net_http_response_spec.rb +86 -0
- data/spec/lib/vcr/library_hooks/excon_spec.rb +104 -0
- data/spec/lib/vcr/library_hooks/fakeweb_spec.rb +169 -0
- data/spec/lib/vcr/library_hooks/faraday_spec.rb +68 -0
- data/spec/lib/vcr/library_hooks/typhoeus_0.4_spec.rb +36 -0
- data/spec/lib/vcr/library_hooks/typhoeus_spec.rb +162 -0
- data/spec/lib/vcr/library_hooks/webmock_spec.rb +118 -0
- data/spec/lib/vcr/library_hooks_spec.rb +51 -0
- data/spec/lib/vcr/middleware/faraday_spec.rb +182 -0
- data/spec/lib/vcr/middleware/rack_spec.rb +115 -0
- data/spec/lib/vcr/request_ignorer_spec.rb +70 -0
- data/spec/lib/vcr/request_matcher_registry_spec.rb +345 -0
- data/spec/lib/vcr/structs_spec.rb +732 -0
- data/spec/lib/vcr/test_frameworks/cucumber_spec.rb +107 -0
- data/spec/lib/vcr/test_frameworks/rspec_spec.rb +83 -0
- data/spec/lib/vcr/util/hooks_spec.rb +158 -0
- data/spec/lib/vcr/util/internet_connection_spec.rb +37 -0
- data/spec/lib/vcr/util/version_checker_spec.rb +31 -0
- data/spec/lib/vcr/version_spec.rb +27 -0
- data/spec/lib/vcr_spec.rb +349 -0
- data/spec/monkey_patches.rb +182 -0
- data/spec/spec_helper.rb +62 -0
- data/spec/support/configuration_stubbing.rb +8 -0
- data/spec/support/cucumber_helpers.rb +35 -0
- data/spec/support/fixnum_extension.rb +10 -0
- data/spec/support/http_library_adapters.rb +289 -0
- data/spec/support/limited_uri.rb +21 -0
- data/spec/support/ruby_interpreter.rb +7 -0
- data/spec/support/shared_example_groups/excon.rb +63 -0
- data/spec/support/shared_example_groups/hook_into_http_library.rb +594 -0
- data/spec/support/shared_example_groups/request_hooks.rb +59 -0
- data/spec/support/sinatra_app.rb +86 -0
- data/spec/support/vcr_localhost_server.rb +76 -0
- data/spec/support/vcr_stub_helpers.rb +17 -0
- metadata +677 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
In order to properly replay previously recorded requests, VCR must match new
|
|
2
|
+
HTTP requests to a previously recorded one. By default, it matches on HTTP
|
|
3
|
+
method and URI, since that is usually deterministic and fully identifies the
|
|
4
|
+
resource and action for typical RESTful APIs.
|
|
5
|
+
|
|
6
|
+
You can customize how VCR matches requests using the `:match_requests_on` cassette option.
|
|
7
|
+
Specify an array of attributes to match on. Supported attributes are:
|
|
8
|
+
|
|
9
|
+
- `:method` - The HTTP method (i.e. GET, POST, PUT or DELETE) of the request.
|
|
10
|
+
- `:uri` - The full URI of the request.
|
|
11
|
+
- `:host` - The host of the URI. You can use this (alone, or in combination
|
|
12
|
+
with `:path`) as an alternative to `:uri` to cause VCR to match using a regex
|
|
13
|
+
that matches the host.
|
|
14
|
+
- `:path` - The path of the URI. You can use this (alone, or in combination
|
|
15
|
+
with `:host`) as an alternative to `:uri` to cause VCR to match using a regex
|
|
16
|
+
that matches the path.
|
|
17
|
+
- `:query` - The query string values of the URI. The query string ordering does
|
|
18
|
+
not affect matching results (it's order-agnostic).
|
|
19
|
+
- `:body` - The body of the request.
|
|
20
|
+
- `:headers` - The request headers.
|
|
21
|
+
|
|
22
|
+
You can also register a custom request matcher. This particularly comes
|
|
23
|
+
in handy for dealing with APIs that use non-deterministic URIs (i.e. by
|
|
24
|
+
including a timestamp as a query parameter or whatever).
|
|
25
|
+
|
|
26
|
+
When a cassette contains multiple HTTP interactions that match a request
|
|
27
|
+
based on the configured `:match_requests_on` setting, the responses are
|
|
28
|
+
sequenced: the first matching request will get the first response,
|
|
29
|
+
the second matching request will get the second response, etc.
|
|
30
|
+
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
Feature: Matching on Body
|
|
2
|
+
|
|
3
|
+
Use the `:body` request matcher to match requests on the request body.
|
|
4
|
+
|
|
5
|
+
Background:
|
|
6
|
+
Given a previously recorded cassette file "cassettes/example.yml" with:
|
|
7
|
+
"""
|
|
8
|
+
---
|
|
9
|
+
http_interactions:
|
|
10
|
+
- request:
|
|
11
|
+
method: post
|
|
12
|
+
uri: http://example.net/some/long/path
|
|
13
|
+
body:
|
|
14
|
+
encoding: UTF-8
|
|
15
|
+
string: body1
|
|
16
|
+
headers: {}
|
|
17
|
+
response:
|
|
18
|
+
status:
|
|
19
|
+
code: 200
|
|
20
|
+
message: OK
|
|
21
|
+
headers:
|
|
22
|
+
Content-Length:
|
|
23
|
+
- "14"
|
|
24
|
+
body:
|
|
25
|
+
encoding: UTF-8
|
|
26
|
+
string: body1 response
|
|
27
|
+
http_version: "1.1"
|
|
28
|
+
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
|
29
|
+
- request:
|
|
30
|
+
method: post
|
|
31
|
+
uri: http://example.net/some/long/path
|
|
32
|
+
body:
|
|
33
|
+
encoding: UTF-8
|
|
34
|
+
string: body2
|
|
35
|
+
headers: {}
|
|
36
|
+
response:
|
|
37
|
+
status:
|
|
38
|
+
code: 200
|
|
39
|
+
message: OK
|
|
40
|
+
headers:
|
|
41
|
+
Content-Length:
|
|
42
|
+
- "14"
|
|
43
|
+
body:
|
|
44
|
+
encoding: UTF-8
|
|
45
|
+
string: body2 response
|
|
46
|
+
http_version: "1.1"
|
|
47
|
+
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
|
48
|
+
recorded_with: VCR 2.0.0
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
Scenario Outline: Replay interaction that matches the body
|
|
52
|
+
And a file named "body_matching.rb" with:
|
|
53
|
+
"""ruby
|
|
54
|
+
include_http_adapter_for("<http_lib>")
|
|
55
|
+
|
|
56
|
+
require 'vcr'
|
|
57
|
+
|
|
58
|
+
VCR.configure do |c|
|
|
59
|
+
<configuration>
|
|
60
|
+
c.cassette_library_dir = 'cassettes'
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
VCR.use_cassette('example', :match_requests_on => [:body]) do
|
|
64
|
+
puts "Response for body2: " + response_body_for(:put, "http://example.com/", "body2")
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
VCR.use_cassette('example', :match_requests_on => [:body]) do
|
|
68
|
+
puts "Response for body1: " + response_body_for(:put, "http://example.com/", "body1")
|
|
69
|
+
end
|
|
70
|
+
"""
|
|
71
|
+
When I run `ruby body_matching.rb`
|
|
72
|
+
Then it should pass with:
|
|
73
|
+
"""
|
|
74
|
+
Response for body2: body2 response
|
|
75
|
+
Response for body1: body1 response
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
Examples:
|
|
79
|
+
| configuration | http_lib |
|
|
80
|
+
| c.hook_into :fakeweb | net/http |
|
|
81
|
+
| c.hook_into :webmock | net/http |
|
|
82
|
+
| c.hook_into :webmock | httpclient |
|
|
83
|
+
| c.hook_into :webmock | curb |
|
|
84
|
+
| c.hook_into :webmock | patron |
|
|
85
|
+
| c.hook_into :webmock | em-http-request |
|
|
86
|
+
| c.hook_into :webmock | typhoeus |
|
|
87
|
+
| c.hook_into :typhoeus | typhoeus |
|
|
88
|
+
| c.hook_into :excon | excon |
|
|
89
|
+
| c.hook_into :faraday | faraday (w/ net_http) |
|
|
90
|
+
| c.hook_into :faraday | faraday (w/ typhoeus) |
|
|
91
|
+
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
Feature: Matching on Body
|
|
2
|
+
|
|
3
|
+
Use the `:body_as_json` request matcher to match requests on the request body where the body is JSON.
|
|
4
|
+
|
|
5
|
+
Background:
|
|
6
|
+
Given a previously recorded cassette file "cassettes/example.yml" with:
|
|
7
|
+
"""
|
|
8
|
+
---
|
|
9
|
+
http_interactions:
|
|
10
|
+
- request:
|
|
11
|
+
method: post
|
|
12
|
+
uri: http://example.net/some/long/path
|
|
13
|
+
body:
|
|
14
|
+
encoding: UTF-8
|
|
15
|
+
string: '{ "a" : "1" }'
|
|
16
|
+
headers: {}
|
|
17
|
+
response:
|
|
18
|
+
status:
|
|
19
|
+
code: 200
|
|
20
|
+
message: OK
|
|
21
|
+
headers:
|
|
22
|
+
Content-Length:
|
|
23
|
+
- "14"
|
|
24
|
+
body:
|
|
25
|
+
encoding: UTF-8
|
|
26
|
+
string: body1 response
|
|
27
|
+
http_version: "1.1"
|
|
28
|
+
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
|
29
|
+
- request:
|
|
30
|
+
method: post
|
|
31
|
+
uri: http://example.net/some/long/path
|
|
32
|
+
body:
|
|
33
|
+
encoding: UTF-8
|
|
34
|
+
string: '{ "a" : "1", "b" : "2" }'
|
|
35
|
+
headers: {}
|
|
36
|
+
response:
|
|
37
|
+
status:
|
|
38
|
+
code: 200
|
|
39
|
+
message: OK
|
|
40
|
+
headers:
|
|
41
|
+
Content-Length:
|
|
42
|
+
- "14"
|
|
43
|
+
body:
|
|
44
|
+
encoding: UTF-8
|
|
45
|
+
string: body2 response
|
|
46
|
+
http_version: "1.1"
|
|
47
|
+
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
|
48
|
+
recorded_with: VCR 2.0.0
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
Scenario Outline: Replay interaction that matches the body as JSON
|
|
52
|
+
And a file named "body_as_json_matching.rb" with:
|
|
53
|
+
"""ruby
|
|
54
|
+
include_http_adapter_for("<http_lib>")
|
|
55
|
+
|
|
56
|
+
require 'vcr'
|
|
57
|
+
|
|
58
|
+
VCR.configure do |c|
|
|
59
|
+
<configuration>
|
|
60
|
+
c.cassette_library_dir = 'cassettes'
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
VCR.use_cassette('example', :match_requests_on => [:body_as_json]) do
|
|
64
|
+
puts "Response for body as json 2: " + response_body_for(:put, "http://example.com/", '{ "a" : "1", "b" : "2" }')
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
VCR.use_cassette('example', :match_requests_on => [:body_as_json]) do
|
|
68
|
+
puts "Response for body as json 1: " + response_body_for(:put, "http://example.com/", '{ "a" : "1" }')
|
|
69
|
+
end
|
|
70
|
+
"""
|
|
71
|
+
When I run `ruby body_as_json_matching.rb`
|
|
72
|
+
Then it should pass with:
|
|
73
|
+
"""
|
|
74
|
+
Response for body as json 2: body2 response
|
|
75
|
+
Response for body as json 1: body1 response
|
|
76
|
+
"""
|
|
77
|
+
|
|
78
|
+
Examples:
|
|
79
|
+
| configuration | http_lib |
|
|
80
|
+
| c.hook_into :fakeweb | net/http |
|
|
81
|
+
| c.hook_into :webmock | net/http |
|
|
82
|
+
| c.hook_into :webmock | httpclient |
|
|
83
|
+
| c.hook_into :webmock | curb |
|
|
84
|
+
| c.hook_into :webmock | patron |
|
|
85
|
+
| c.hook_into :webmock | em-http-request |
|
|
86
|
+
| c.hook_into :webmock | typhoeus |
|
|
87
|
+
| c.hook_into :typhoeus | typhoeus |
|
|
88
|
+
| c.hook_into :excon | excon |
|
|
89
|
+
| c.hook_into :faraday | faraday (w/ net_http) |
|
|
90
|
+
| c.hook_into :faraday | faraday (w/ typhoeus) |
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
Feature: Register and use a custom matcher
|
|
2
|
+
|
|
3
|
+
If the built-in matchers do not meet your needs, you can use a custom matcher.
|
|
4
|
+
|
|
5
|
+
Any 2-argument callable (that is, an object that responds to #call and accepts
|
|
6
|
+
2 arguments) can be a matcher. Simply put the callable in your
|
|
7
|
+
`:match_requests_on` array.
|
|
8
|
+
|
|
9
|
+
In addition, you can register a named custom matcher with VCR, and use
|
|
10
|
+
the name in your `:match_requests_on` array.
|
|
11
|
+
|
|
12
|
+
Either way, your custom matcher should return a truthy value if the
|
|
13
|
+
given requests should be considered equivalent.
|
|
14
|
+
|
|
15
|
+
Background:
|
|
16
|
+
Given a previously recorded cassette file "cassettes/example.yml" with:
|
|
17
|
+
"""
|
|
18
|
+
---
|
|
19
|
+
http_interactions:
|
|
20
|
+
- request:
|
|
21
|
+
method: get
|
|
22
|
+
uri: http://foo.com:9000/foo
|
|
23
|
+
body:
|
|
24
|
+
encoding: UTF-8
|
|
25
|
+
string: ""
|
|
26
|
+
headers: {}
|
|
27
|
+
response:
|
|
28
|
+
status:
|
|
29
|
+
code: 200
|
|
30
|
+
message: OK
|
|
31
|
+
headers:
|
|
32
|
+
Content-Length:
|
|
33
|
+
- "18"
|
|
34
|
+
body:
|
|
35
|
+
encoding: UTF-8
|
|
36
|
+
string: port 9000 response
|
|
37
|
+
http_version: "1.1"
|
|
38
|
+
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
|
39
|
+
- request:
|
|
40
|
+
method: get
|
|
41
|
+
uri: http://foo.com:8000/foo
|
|
42
|
+
body:
|
|
43
|
+
encoding: UTF-8
|
|
44
|
+
string: ""
|
|
45
|
+
headers: {}
|
|
46
|
+
response:
|
|
47
|
+
status:
|
|
48
|
+
code: 200
|
|
49
|
+
message: OK
|
|
50
|
+
headers:
|
|
51
|
+
Content-Length:
|
|
52
|
+
- "18"
|
|
53
|
+
body:
|
|
54
|
+
encoding: UTF-8
|
|
55
|
+
string: port 8000 response
|
|
56
|
+
http_version: "1.1"
|
|
57
|
+
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
|
58
|
+
recorded_with: VCR 2.0.0
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
Scenario Outline: Use a callable as a custom request matcher
|
|
62
|
+
And a file named "callable_matcher.rb" with:
|
|
63
|
+
"""ruby
|
|
64
|
+
include_http_adapter_for("<http_lib>")
|
|
65
|
+
|
|
66
|
+
require 'vcr'
|
|
67
|
+
|
|
68
|
+
VCR.configure do |c|
|
|
69
|
+
<configuration>
|
|
70
|
+
c.cassette_library_dir = 'cassettes'
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
port_matcher = lambda do |request_1, request_2|
|
|
74
|
+
URI(request_1.uri).port == URI(request_2.uri).port
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
VCR.use_cassette('example', :match_requests_on => [:method, port_matcher]) do
|
|
78
|
+
puts "Response for port 8000: " + response_body_for(:get, "http://example.com:8000/")
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
VCR.use_cassette('example', :match_requests_on => [:method, port_matcher]) do
|
|
82
|
+
puts "Response for port 9000: " + response_body_for(:get, "http://example.com:9000/")
|
|
83
|
+
end
|
|
84
|
+
"""
|
|
85
|
+
When I run `ruby callable_matcher.rb`
|
|
86
|
+
Then it should pass with:
|
|
87
|
+
"""
|
|
88
|
+
Response for port 8000: port 8000 response
|
|
89
|
+
Response for port 9000: port 9000 response
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
Examples:
|
|
93
|
+
| configuration | http_lib |
|
|
94
|
+
| c.hook_into :fakeweb | net/http |
|
|
95
|
+
| c.hook_into :webmock | net/http |
|
|
96
|
+
| c.hook_into :webmock | httpclient |
|
|
97
|
+
| c.hook_into :webmock | curb |
|
|
98
|
+
| c.hook_into :webmock | patron |
|
|
99
|
+
| c.hook_into :webmock | em-http-request |
|
|
100
|
+
| c.hook_into :webmock | typhoeus |
|
|
101
|
+
| c.hook_into :typhoeus | typhoeus |
|
|
102
|
+
| c.hook_into :excon | excon |
|
|
103
|
+
| c.hook_into :faraday | faraday (w/ net_http) |
|
|
104
|
+
| c.hook_into :faraday | faraday (w/ typhoeus) |
|
|
105
|
+
|
|
106
|
+
Scenario: Register a named custom matcher
|
|
107
|
+
And a file named "register_custom_matcher.rb" with:
|
|
108
|
+
"""ruby
|
|
109
|
+
include_http_adapter_for("net/http")
|
|
110
|
+
|
|
111
|
+
require 'vcr'
|
|
112
|
+
|
|
113
|
+
VCR.configure do |c|
|
|
114
|
+
c.hook_into :webmock
|
|
115
|
+
c.cassette_library_dir = 'cassettes'
|
|
116
|
+
c.register_request_matcher :port do |request_1, request_2|
|
|
117
|
+
URI(request_1.uri).port == URI(request_2.uri).port
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
VCR.use_cassette('example', :match_requests_on => [:method, :port]) do
|
|
122
|
+
puts "Response for port 8000: " + response_body_for(:get, "http://example.com:8000/")
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
VCR.use_cassette('example', :match_requests_on => [:method, :port]) do
|
|
126
|
+
puts "Response for port 9000: " + response_body_for(:get, "http://example.com:9000/")
|
|
127
|
+
end
|
|
128
|
+
"""
|
|
129
|
+
When I run `ruby register_custom_matcher.rb`
|
|
130
|
+
Then it should pass with:
|
|
131
|
+
"""
|
|
132
|
+
Response for port 8000: port 8000 response
|
|
133
|
+
Response for port 9000: port 9000 response
|
|
134
|
+
"""
|
|
135
|
+
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
Feature: Matching on Headers
|
|
2
|
+
|
|
3
|
+
Use the `:headers` request matcher to match requests on the request headers.
|
|
4
|
+
|
|
5
|
+
Scenario Outline: Replay interaction that matches the headers
|
|
6
|
+
Given a previously recorded cassette file "cassettes/example.yml" with:
|
|
7
|
+
"""
|
|
8
|
+
---
|
|
9
|
+
http_interactions:
|
|
10
|
+
- request:
|
|
11
|
+
method: post
|
|
12
|
+
uri: http://example.net/some/long/path
|
|
13
|
+
body:
|
|
14
|
+
encoding: UTF-8
|
|
15
|
+
string: ""
|
|
16
|
+
headers:
|
|
17
|
+
X-User-Id:
|
|
18
|
+
- "1"
|
|
19
|
+
response:
|
|
20
|
+
status:
|
|
21
|
+
code: 200
|
|
22
|
+
message: OK
|
|
23
|
+
headers:
|
|
24
|
+
Content-Length:
|
|
25
|
+
- "15"
|
|
26
|
+
body:
|
|
27
|
+
encoding: UTF-8
|
|
28
|
+
string: user 1 response
|
|
29
|
+
http_version: "1.1"
|
|
30
|
+
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
|
31
|
+
- request:
|
|
32
|
+
method: post
|
|
33
|
+
uri: http://example.net/some/long/path
|
|
34
|
+
body:
|
|
35
|
+
encoding: UTF-8
|
|
36
|
+
string: ""
|
|
37
|
+
headers:
|
|
38
|
+
X-User-Id:
|
|
39
|
+
- "2"
|
|
40
|
+
response:
|
|
41
|
+
status:
|
|
42
|
+
code: 200
|
|
43
|
+
message: OK
|
|
44
|
+
headers:
|
|
45
|
+
Content-Length:
|
|
46
|
+
- "15"
|
|
47
|
+
body:
|
|
48
|
+
encoding: UTF-8
|
|
49
|
+
string: user 2 response
|
|
50
|
+
http_version: "1.1"
|
|
51
|
+
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
|
52
|
+
recorded_with: VCR 2.0.0
|
|
53
|
+
"""
|
|
54
|
+
And a file named "header_matching.rb" with:
|
|
55
|
+
"""ruby
|
|
56
|
+
include_http_adapter_for("<http_lib>")
|
|
57
|
+
|
|
58
|
+
require 'vcr'
|
|
59
|
+
|
|
60
|
+
VCR.configure do |c|
|
|
61
|
+
<configuration>
|
|
62
|
+
c.cassette_library_dir = 'cassettes'
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
VCR.use_cassette('example', :match_requests_on => [:headers]) do
|
|
66
|
+
puts "Response for user 2: " + response_body_for(:get, "http://example.com/", nil, 'X-User-Id' => '2')
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
VCR.use_cassette('example', :match_requests_on => [:headers]) do
|
|
70
|
+
puts "Response for user 1: " + response_body_for(:get, "http://example.com/", nil, 'X-User-Id' => '1')
|
|
71
|
+
end
|
|
72
|
+
"""
|
|
73
|
+
When I run `ruby header_matching.rb`
|
|
74
|
+
Then it should pass with:
|
|
75
|
+
"""
|
|
76
|
+
Response for user 2: user 2 response
|
|
77
|
+
Response for user 1: user 1 response
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
Examples:
|
|
81
|
+
| configuration | http_lib |
|
|
82
|
+
| c.hook_into :webmock | curb |
|
|
83
|
+
| c.hook_into :webmock | patron |
|
|
84
|
+
| c.hook_into :webmock | em-http-request |
|
|
85
|
+
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
Feature: Matching on Host
|
|
2
|
+
|
|
3
|
+
Use the `:host` request matcher to match requests on the request host.
|
|
4
|
+
|
|
5
|
+
You can use this (alone, or in combination with `:path`) as an
|
|
6
|
+
alternative to `:uri` so that non-deterministic portions of the URI
|
|
7
|
+
are not considered as part of the request matching.
|
|
8
|
+
|
|
9
|
+
Background:
|
|
10
|
+
Given a previously recorded cassette file "cassettes/example.yml" with:
|
|
11
|
+
"""
|
|
12
|
+
---
|
|
13
|
+
http_interactions:
|
|
14
|
+
- request:
|
|
15
|
+
method: post
|
|
16
|
+
uri: http://host1.com/some/long/path
|
|
17
|
+
body:
|
|
18
|
+
encoding: UTF-8
|
|
19
|
+
string: ""
|
|
20
|
+
headers: {}
|
|
21
|
+
response:
|
|
22
|
+
status:
|
|
23
|
+
code: 200
|
|
24
|
+
message: OK
|
|
25
|
+
headers:
|
|
26
|
+
Content-Length:
|
|
27
|
+
- "14"
|
|
28
|
+
body:
|
|
29
|
+
encoding: UTF-8
|
|
30
|
+
string: host1 response
|
|
31
|
+
http_version: "1.1"
|
|
32
|
+
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
|
33
|
+
- request:
|
|
34
|
+
method: post
|
|
35
|
+
uri: http://host2.com/some/other/long/path
|
|
36
|
+
body:
|
|
37
|
+
encoding: UTF-8
|
|
38
|
+
string: ""
|
|
39
|
+
headers: {}
|
|
40
|
+
response:
|
|
41
|
+
status:
|
|
42
|
+
code: 200
|
|
43
|
+
message: OK
|
|
44
|
+
headers:
|
|
45
|
+
Content-Length:
|
|
46
|
+
- "16"
|
|
47
|
+
body:
|
|
48
|
+
encoding: UTF-8
|
|
49
|
+
string: host2 response
|
|
50
|
+
http_version: "1.1"
|
|
51
|
+
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
|
52
|
+
recorded_with: VCR 2.0.0
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
Scenario Outline: Replay interaction that matches the host
|
|
56
|
+
And a file named "host_matching.rb" with:
|
|
57
|
+
"""ruby
|
|
58
|
+
include_http_adapter_for("<http_lib>")
|
|
59
|
+
|
|
60
|
+
require 'vcr'
|
|
61
|
+
|
|
62
|
+
VCR.configure do |c|
|
|
63
|
+
<configuration>
|
|
64
|
+
c.cassette_library_dir = 'cassettes'
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
VCR.use_cassette('example', :match_requests_on => [:host]) do
|
|
68
|
+
puts "Response for host2: " + response_body_for(:get, "http://host2.com/home")
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
VCR.use_cassette('example', :match_requests_on => [:host]) do
|
|
72
|
+
puts "Response for host1: " + response_body_for(:get, "http://host1.com/about")
|
|
73
|
+
end
|
|
74
|
+
"""
|
|
75
|
+
When I run `ruby host_matching.rb`
|
|
76
|
+
Then it should pass with:
|
|
77
|
+
"""
|
|
78
|
+
Response for host2: host2 response
|
|
79
|
+
Response for host1: host1 response
|
|
80
|
+
"""
|
|
81
|
+
|
|
82
|
+
Examples:
|
|
83
|
+
| configuration | http_lib |
|
|
84
|
+
| c.hook_into :fakeweb | net/http |
|
|
85
|
+
| c.hook_into :webmock | net/http |
|
|
86
|
+
| c.hook_into :webmock | httpclient |
|
|
87
|
+
| c.hook_into :webmock | curb |
|
|
88
|
+
| c.hook_into :webmock | patron |
|
|
89
|
+
| c.hook_into :webmock | em-http-request |
|
|
90
|
+
| c.hook_into :webmock | typhoeus |
|
|
91
|
+
| c.hook_into :typhoeus | typhoeus |
|
|
92
|
+
| c.hook_into :excon | excon |
|
|
93
|
+
| c.hook_into :faraday | faraday (w/ net_http) |
|
|
94
|
+
| c.hook_into :faraday | faraday (w/ typhoeus) |
|
|
95
|
+
|