mustwin-vcr 2.9.3
Sign up to get free protection for your applications and to get access to all the features.
- 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,172 @@
|
|
1
|
+
Feature: before_record hook
|
2
|
+
|
3
|
+
The `before_record` hook is called before a cassette is written to disk.
|
4
|
+
This can be used to modify the HTTP interaction before it is recorded.
|
5
|
+
|
6
|
+
Your block should accept up to 2 arguments. The first argument will be
|
7
|
+
the HTTP interaction that is about to be written to disk. The second
|
8
|
+
argument will be the current cassette.
|
9
|
+
|
10
|
+
If you wish to prevent VCR from recording the HTTP interaction you can call
|
11
|
+
`#ignore!` on the interaction.
|
12
|
+
|
13
|
+
If you don't want your hook to apply to all cassettes, you can use tags to
|
14
|
+
select which cassettes a given hook applies to. Consider this code:
|
15
|
+
|
16
|
+
VCR.configure do |c|
|
17
|
+
c.before_record(:twitter) { ... } # modify the interactions somehow
|
18
|
+
end
|
19
|
+
|
20
|
+
VCR.use_cassette('cassette_1', :tag => :twitter) { ... }
|
21
|
+
VCR.use_cassette('cassette_2') { ... }
|
22
|
+
|
23
|
+
In this example, the hook would apply to the first cassette but not the
|
24
|
+
second cassette.
|
25
|
+
|
26
|
+
Scenario: Modify recorded response
|
27
|
+
Given a file named "before_record_example.rb" with:
|
28
|
+
"""ruby
|
29
|
+
$server = start_sinatra_app do
|
30
|
+
get('/') { "Hello Earth" }
|
31
|
+
end
|
32
|
+
|
33
|
+
require 'vcr'
|
34
|
+
|
35
|
+
VCR.configure do |c|
|
36
|
+
c.hook_into :webmock
|
37
|
+
c.cassette_library_dir = 'cassettes'
|
38
|
+
|
39
|
+
c.before_record do |i|
|
40
|
+
i.response.body.sub!('Earth', 'World')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
VCR.use_cassette('recording_example') do
|
45
|
+
Net::HTTP.get_response('localhost', '/', $server.port)
|
46
|
+
end
|
47
|
+
"""
|
48
|
+
When I run `ruby before_record_example.rb`
|
49
|
+
Then the file "cassettes/recording_example.yml" should contain "Hello World"
|
50
|
+
And the file "cassettes/recording_example.yml" should not contain "Earth"
|
51
|
+
|
52
|
+
Scenario: Modify recorded response based on the cassette
|
53
|
+
Given a file named "before_record_example.rb" with:
|
54
|
+
"""ruby
|
55
|
+
$server = start_sinatra_app do
|
56
|
+
get('/') { "Hello Earth" }
|
57
|
+
end
|
58
|
+
|
59
|
+
require 'vcr'
|
60
|
+
|
61
|
+
VCR.configure do |c|
|
62
|
+
c.hook_into :webmock
|
63
|
+
c.cassette_library_dir = 'cassettes'
|
64
|
+
|
65
|
+
c.before_record do |interaction, cassette|
|
66
|
+
interaction.response.body << " (#{cassette.name})"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
VCR.use_cassette('recording_example') do
|
71
|
+
Net::HTTP.get_response('localhost', '/', $server.port)
|
72
|
+
end
|
73
|
+
"""
|
74
|
+
When I run `ruby before_record_example.rb`
|
75
|
+
Then the file "cassettes/recording_example.yml" should contain "Hello Earth (recording_example)"
|
76
|
+
|
77
|
+
Scenario: Prevent recording by ignoring interaction in before_record hook
|
78
|
+
Given a file named "before_record_ignore.rb" with:
|
79
|
+
"""ruby
|
80
|
+
$server = start_sinatra_app do
|
81
|
+
get('/') { "Hello World" }
|
82
|
+
end
|
83
|
+
|
84
|
+
require 'vcr'
|
85
|
+
|
86
|
+
VCR.configure do |c|
|
87
|
+
c.hook_into :webmock
|
88
|
+
c.cassette_library_dir = 'cassettes'
|
89
|
+
c.before_record { |i| i.ignore! }
|
90
|
+
end
|
91
|
+
|
92
|
+
VCR.use_cassette('recording_example') do
|
93
|
+
response = Net::HTTP.get_response('localhost', '/', $server.port)
|
94
|
+
puts "Response: #{response.body}"
|
95
|
+
end
|
96
|
+
"""
|
97
|
+
When I run `ruby before_record_ignore.rb`
|
98
|
+
Then it should pass with "Response: Hello World"
|
99
|
+
And the file "cassettes/recording_example.yml" should not exist
|
100
|
+
|
101
|
+
Scenario: Multiple hooks are run in order
|
102
|
+
Given a file named "multiple_hooks.rb" with:
|
103
|
+
"""ruby
|
104
|
+
$server = start_sinatra_app do
|
105
|
+
get('/') { "Hello World" }
|
106
|
+
end
|
107
|
+
|
108
|
+
require 'vcr'
|
109
|
+
|
110
|
+
VCR.configure do |c|
|
111
|
+
c.hook_into :webmock
|
112
|
+
c.cassette_library_dir = 'cassettes'
|
113
|
+
|
114
|
+
c.before_record { puts "In before_record hook 1" }
|
115
|
+
c.before_record { puts "In before_record hook 2" }
|
116
|
+
end
|
117
|
+
|
118
|
+
VCR.use_cassette('example', :record => :new_episodes) do
|
119
|
+
response = Net::HTTP.get_response('localhost', '/', $server.port)
|
120
|
+
puts "Response: #{response.body}"
|
121
|
+
end
|
122
|
+
"""
|
123
|
+
When I run `ruby multiple_hooks.rb`
|
124
|
+
Then it should pass with:
|
125
|
+
"""
|
126
|
+
Response: Hello World
|
127
|
+
In before_record hook 1
|
128
|
+
In before_record hook 2
|
129
|
+
"""
|
130
|
+
|
131
|
+
Scenario: Use tagging to apply hook to only certain cassettes
|
132
|
+
Given a file named "tagged_hooks.rb" with:
|
133
|
+
"""ruby
|
134
|
+
$server = start_sinatra_app do
|
135
|
+
get('/') { "Hello World" }
|
136
|
+
end
|
137
|
+
|
138
|
+
require 'vcr'
|
139
|
+
|
140
|
+
VCR.configure do |c|
|
141
|
+
c.hook_into :webmock
|
142
|
+
c.cassette_library_dir = 'cassettes'
|
143
|
+
|
144
|
+
c.before_record(:tag_1) do
|
145
|
+
puts "In before_record hook for tag_1"
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
[:tag_1, :tag_2, nil].each do |tag|
|
150
|
+
puts
|
151
|
+
puts "Using tag: #{tag.inspect}"
|
152
|
+
|
153
|
+
VCR.use_cassette('example', :record => :new_episodes, :tag => tag) do
|
154
|
+
response = Net::HTTP.get_response('localhost', '/', $server.port)
|
155
|
+
puts "Response: #{response.body}"
|
156
|
+
end
|
157
|
+
end
|
158
|
+
"""
|
159
|
+
When I run `ruby tagged_hooks.rb`
|
160
|
+
Then it should pass with:
|
161
|
+
"""
|
162
|
+
Using tag: :tag_1
|
163
|
+
Response: Hello World
|
164
|
+
In before_record hook for tag_1
|
165
|
+
|
166
|
+
Using tag: :tag_2
|
167
|
+
Response: Hello World
|
168
|
+
|
169
|
+
Using tag: nil
|
170
|
+
Response: Hello World
|
171
|
+
"""
|
172
|
+
|
@@ -0,0 +1,250 @@
|
|
1
|
+
@exclude-jruby @exclude-rbx
|
2
|
+
Feature: EM HTTP Request
|
3
|
+
|
4
|
+
EM HTTP Request allows multiple simultaneous asynchronous requests.
|
5
|
+
(The other HTTP libraries are synchronous). The scenarios below
|
6
|
+
demonstrate how VCR can be used with asynchronous em-http requests.
|
7
|
+
|
8
|
+
Background:
|
9
|
+
Given a file named "vcr_setup.rb" with:
|
10
|
+
"""ruby
|
11
|
+
require 'em-http-request'
|
12
|
+
|
13
|
+
$server = start_sinatra_app do
|
14
|
+
%w[ foo bar bazz ].each_with_index do |path, index|
|
15
|
+
get "/#{path}" do
|
16
|
+
sleep index * 0.1 # ensure the async callbacks are invoked in order
|
17
|
+
ARGV[0] + ' ' + path
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
require 'vcr'
|
23
|
+
|
24
|
+
VCR.configure do |c|
|
25
|
+
c.hook_into :webmock
|
26
|
+
c.cassette_library_dir = 'cassettes'
|
27
|
+
c.before_record do |i|
|
28
|
+
i.request.uri.sub!(/:\d+/, ':7777')
|
29
|
+
end
|
30
|
+
end
|
31
|
+
"""
|
32
|
+
|
33
|
+
Scenario: multiple simultaneous HttpRequest objects
|
34
|
+
Given a file named "make_requests.rb" with:
|
35
|
+
"""ruby
|
36
|
+
require 'vcr_setup'
|
37
|
+
|
38
|
+
VCR.use_cassette('em_http') do
|
39
|
+
EventMachine.run do
|
40
|
+
http_array = %w[ foo bar bazz ].map do |p|
|
41
|
+
EventMachine::HttpRequest.new("http://localhost:#{$server.port}/#{p}").get
|
42
|
+
end
|
43
|
+
|
44
|
+
http_array.each do |http|
|
45
|
+
http.callback do
|
46
|
+
puts http.response
|
47
|
+
|
48
|
+
if http_array.all? { |h| h.response.to_s != '' }
|
49
|
+
EventMachine.stop
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
"""
|
56
|
+
When I run `ruby make_requests.rb Hello`
|
57
|
+
Then the output should contain:
|
58
|
+
"""
|
59
|
+
Hello foo
|
60
|
+
Hello bar
|
61
|
+
Hello bazz
|
62
|
+
"""
|
63
|
+
And the file "cassettes/em_http.yml" should contain YAML like:
|
64
|
+
"""
|
65
|
+
---
|
66
|
+
http_interactions:
|
67
|
+
- request:
|
68
|
+
method: get
|
69
|
+
uri: http://localhost:7777/foo
|
70
|
+
body:
|
71
|
+
encoding: UTF-8
|
72
|
+
string: ""
|
73
|
+
headers: {}
|
74
|
+
response:
|
75
|
+
status:
|
76
|
+
code: 200
|
77
|
+
message: OK
|
78
|
+
headers:
|
79
|
+
Content-Type:
|
80
|
+
- text/html;charset=utf-8
|
81
|
+
Content-Length:
|
82
|
+
- "9"
|
83
|
+
body:
|
84
|
+
encoding: UTF-8
|
85
|
+
string: Hello foo
|
86
|
+
http_version:
|
87
|
+
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
88
|
+
- request:
|
89
|
+
method: get
|
90
|
+
uri: http://localhost:7777/bar
|
91
|
+
body:
|
92
|
+
encoding: UTF-8
|
93
|
+
string: ""
|
94
|
+
headers: {}
|
95
|
+
response:
|
96
|
+
status:
|
97
|
+
code: 200
|
98
|
+
message: OK
|
99
|
+
headers:
|
100
|
+
Content-Type:
|
101
|
+
- text/html;charset=utf-8
|
102
|
+
Content-Length:
|
103
|
+
- "9"
|
104
|
+
body:
|
105
|
+
encoding: UTF-8
|
106
|
+
string: Hello bar
|
107
|
+
http_version:
|
108
|
+
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
109
|
+
- request:
|
110
|
+
method: get
|
111
|
+
uri: http://localhost:7777/bazz
|
112
|
+
body:
|
113
|
+
encoding: UTF-8
|
114
|
+
string: ""
|
115
|
+
headers: {}
|
116
|
+
response:
|
117
|
+
status:
|
118
|
+
code: 200
|
119
|
+
message: OK
|
120
|
+
headers:
|
121
|
+
Content-Type:
|
122
|
+
- text/html;charset=utf-8
|
123
|
+
Content-Length:
|
124
|
+
- "10"
|
125
|
+
body:
|
126
|
+
encoding: UTF-8
|
127
|
+
string: Hello bazz
|
128
|
+
http_version:
|
129
|
+
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
130
|
+
recorded_with: VCR 2.0.0
|
131
|
+
"""
|
132
|
+
|
133
|
+
When I run `ruby make_requests.rb Goodbye`
|
134
|
+
Then the output should contain:
|
135
|
+
"""
|
136
|
+
Hello foo
|
137
|
+
Hello bar
|
138
|
+
Hello bazz
|
139
|
+
"""
|
140
|
+
|
141
|
+
Scenario: MultiRequest
|
142
|
+
Given a file named "make_requests.rb" with:
|
143
|
+
"""ruby
|
144
|
+
require 'vcr_setup'
|
145
|
+
|
146
|
+
VCR.use_cassette('em_http') do
|
147
|
+
EventMachine.run do
|
148
|
+
multi = EventMachine::MultiRequest.new
|
149
|
+
|
150
|
+
%w[ foo bar bazz ].each do |path|
|
151
|
+
multi.add(path, EventMachine::HttpRequest.new("http://localhost:#{$server.port}/#{path}").get)
|
152
|
+
end
|
153
|
+
|
154
|
+
multi.callback do
|
155
|
+
responses = Hash[multi.responses[:callback]]
|
156
|
+
|
157
|
+
%w[ foo bar bazz ].each do |path|
|
158
|
+
puts responses[path].response
|
159
|
+
end
|
160
|
+
|
161
|
+
EventMachine.stop
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
"""
|
166
|
+
When I run `ruby make_requests.rb Hello`
|
167
|
+
Then the output should contain:
|
168
|
+
"""
|
169
|
+
Hello foo
|
170
|
+
Hello bar
|
171
|
+
Hello bazz
|
172
|
+
"""
|
173
|
+
And the file "cassettes/em_http.yml" should contain YAML like:
|
174
|
+
"""
|
175
|
+
---
|
176
|
+
http_interactions:
|
177
|
+
- request:
|
178
|
+
method: get
|
179
|
+
uri: http://localhost:7777/foo
|
180
|
+
body:
|
181
|
+
encoding: UTF-8
|
182
|
+
string: ""
|
183
|
+
headers: {}
|
184
|
+
response:
|
185
|
+
status:
|
186
|
+
code: 200
|
187
|
+
message: OK
|
188
|
+
headers:
|
189
|
+
Content-Type:
|
190
|
+
- text/html;charset=utf-8
|
191
|
+
Content-Length:
|
192
|
+
- "9"
|
193
|
+
body:
|
194
|
+
encoding: UTF-8
|
195
|
+
string: Hello foo
|
196
|
+
http_version:
|
197
|
+
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
198
|
+
- request:
|
199
|
+
method: get
|
200
|
+
uri: http://localhost:7777/bar
|
201
|
+
body:
|
202
|
+
encoding: UTF-8
|
203
|
+
string: ""
|
204
|
+
headers: {}
|
205
|
+
response:
|
206
|
+
status:
|
207
|
+
code: 200
|
208
|
+
message: OK
|
209
|
+
headers:
|
210
|
+
Content-Type:
|
211
|
+
- text/html;charset=utf-8
|
212
|
+
Content-Length:
|
213
|
+
- "9"
|
214
|
+
body:
|
215
|
+
encoding: UTF-8
|
216
|
+
string: Hello bar
|
217
|
+
http_version:
|
218
|
+
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
219
|
+
- request:
|
220
|
+
method: get
|
221
|
+
uri: http://localhost:7777/bazz
|
222
|
+
body:
|
223
|
+
encoding: UTF-8
|
224
|
+
string: ""
|
225
|
+
headers: {}
|
226
|
+
response:
|
227
|
+
status:
|
228
|
+
code: 200
|
229
|
+
message: OK
|
230
|
+
headers:
|
231
|
+
Content-Type:
|
232
|
+
- text/html;charset=utf-8
|
233
|
+
Content-Length:
|
234
|
+
- "10"
|
235
|
+
body:
|
236
|
+
encoding: UTF-8
|
237
|
+
string: Hello bazz
|
238
|
+
http_version:
|
239
|
+
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
240
|
+
recorded_with: VCR 2.0.0
|
241
|
+
"""
|
242
|
+
|
243
|
+
When I run `ruby make_requests.rb Goodbye`
|
244
|
+
Then the output should contain:
|
245
|
+
"""
|
246
|
+
Hello foo
|
247
|
+
Hello bar
|
248
|
+
Hello bazz
|
249
|
+
"""
|
250
|
+
|
@@ -0,0 +1,179 @@
|
|
1
|
+
Feature: Net::HTTP
|
2
|
+
|
3
|
+
There are many ways to use Net::HTTP. The scenarios below provide regression
|
4
|
+
tests for some Net::HTTP APIs that have not worked properly with VCR and
|
5
|
+
FakeWeb or WebMock in the past (but have since been fixed).
|
6
|
+
|
7
|
+
Background:
|
8
|
+
Given a file named "vcr_setup.rb" with:
|
9
|
+
"""ruby
|
10
|
+
require 'ostruct'
|
11
|
+
|
12
|
+
if ARGV[0] == '--with-server'
|
13
|
+
$server = start_sinatra_app do
|
14
|
+
get('/') { 'VCR works with Net::HTTP gets!' }
|
15
|
+
post('/') { 'VCR works with Net::HTTP posts!' }
|
16
|
+
end
|
17
|
+
else
|
18
|
+
$server = OpenStruct(:port => 0)
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'vcr'
|
22
|
+
|
23
|
+
VCR.configure do |c|
|
24
|
+
c.default_cassette_options = {
|
25
|
+
:match_requests_on => [:method, :host, :path]
|
26
|
+
}
|
27
|
+
end
|
28
|
+
"""
|
29
|
+
|
30
|
+
Scenario Outline: Calling #post on new Net::HTTP instance
|
31
|
+
Given a file named "vcr_net_http.rb" with:
|
32
|
+
"""ruby
|
33
|
+
require 'vcr_setup.rb'
|
34
|
+
|
35
|
+
VCR.configure do |c|
|
36
|
+
c.hook_into <hook_into>
|
37
|
+
c.cassette_library_dir = 'cassettes'
|
38
|
+
end
|
39
|
+
|
40
|
+
VCR.use_cassette('net_http') do
|
41
|
+
puts Net::HTTP.new('localhost', $server.port).post('/', '').body
|
42
|
+
end
|
43
|
+
"""
|
44
|
+
When I run `ruby vcr_net_http.rb --with-server`
|
45
|
+
Then the output should contain "VCR works with Net::HTTP posts!"
|
46
|
+
And the file "cassettes/net_http.yml" should contain "VCR works with Net::HTTP posts!"
|
47
|
+
|
48
|
+
When I run `ruby vcr_net_http.rb`
|
49
|
+
Then the output should contain "VCR works with Net::HTTP posts!"
|
50
|
+
|
51
|
+
Examples:
|
52
|
+
| hook_into |
|
53
|
+
| :fakeweb |
|
54
|
+
| :webmock |
|
55
|
+
|
56
|
+
Scenario Outline: Return from yielded block
|
57
|
+
Given a file named "vcr_net_http.rb" with:
|
58
|
+
"""ruby
|
59
|
+
require 'vcr_setup.rb'
|
60
|
+
|
61
|
+
VCR.configure do |c|
|
62
|
+
c.hook_into <hook_into>
|
63
|
+
c.cassette_library_dir = 'cassettes'
|
64
|
+
end
|
65
|
+
|
66
|
+
def perform_request
|
67
|
+
Net::HTTP.new('localhost', $server.port).request(Net::HTTP::Get.new('/', {})) do |response|
|
68
|
+
return response
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
VCR.use_cassette('net_http') do
|
73
|
+
puts perform_request.body
|
74
|
+
end
|
75
|
+
"""
|
76
|
+
When I run `ruby vcr_net_http.rb --with-server`
|
77
|
+
Then the output should contain "VCR works with Net::HTTP gets!"
|
78
|
+
And the file "cassettes/net_http.yml" should contain "VCR works with Net::HTTP gets!"
|
79
|
+
|
80
|
+
When I run `ruby vcr_net_http.rb`
|
81
|
+
Then the output should contain "VCR works with Net::HTTP gets!"
|
82
|
+
|
83
|
+
Examples:
|
84
|
+
| hook_into |
|
85
|
+
| :fakeweb |
|
86
|
+
| :webmock |
|
87
|
+
|
88
|
+
Scenario Outline: Use Net::ReadAdapter to read body in fragments
|
89
|
+
Given a file named "vcr_net_http.rb" with:
|
90
|
+
"""ruby
|
91
|
+
require 'vcr_setup.rb'
|
92
|
+
|
93
|
+
VCR.configure do |c|
|
94
|
+
c.hook_into <hook_into>
|
95
|
+
c.cassette_library_dir = 'cassettes'
|
96
|
+
end
|
97
|
+
|
98
|
+
VCR.use_cassette('net_http') do
|
99
|
+
body = ''
|
100
|
+
|
101
|
+
Net::HTTP.new('localhost', $server.port).request_get('/') do |response|
|
102
|
+
response.read_body { |frag| body << frag }
|
103
|
+
end
|
104
|
+
|
105
|
+
puts body
|
106
|
+
end
|
107
|
+
"""
|
108
|
+
When I run `ruby vcr_net_http.rb --with-server`
|
109
|
+
Then the output should contain "VCR works with Net::HTTP gets!"
|
110
|
+
And the file "cassettes/net_http.yml" should contain "VCR works with Net::HTTP gets!"
|
111
|
+
|
112
|
+
When I run `ruby vcr_net_http.rb`
|
113
|
+
Then the output should contain "VCR works with Net::HTTP gets!"
|
114
|
+
|
115
|
+
Examples:
|
116
|
+
| hook_into |
|
117
|
+
| :fakeweb |
|
118
|
+
| :webmock |
|
119
|
+
|
120
|
+
Scenario Outline: Use open-uri (which is built on top of Net::HTTP and uses a seldom-used Net::HTTP API)
|
121
|
+
Given a file named "vcr_net_http.rb" with:
|
122
|
+
"""ruby
|
123
|
+
require 'open-uri'
|
124
|
+
require 'vcr_setup.rb'
|
125
|
+
|
126
|
+
VCR.configure do |c|
|
127
|
+
c.hook_into <hook_into>
|
128
|
+
c.cassette_library_dir = 'cassettes'
|
129
|
+
end
|
130
|
+
|
131
|
+
VCR.use_cassette('net_http') do
|
132
|
+
puts open("http://localhost:#{$server.port}/").read
|
133
|
+
end
|
134
|
+
"""
|
135
|
+
When I run `ruby vcr_net_http.rb --with-server`
|
136
|
+
Then the output should contain "VCR works with Net::HTTP gets!"
|
137
|
+
And the file "cassettes/net_http.yml" should contain "VCR works with Net::HTTP gets!"
|
138
|
+
|
139
|
+
When I run `ruby vcr_net_http.rb`
|
140
|
+
Then the output should contain "VCR works with Net::HTTP gets!"
|
141
|
+
|
142
|
+
Examples:
|
143
|
+
| hook_into |
|
144
|
+
| :fakeweb |
|
145
|
+
| :webmock |
|
146
|
+
|
147
|
+
Scenario Outline: Make an HTTPS request
|
148
|
+
Given a file named "vcr_https.rb" with:
|
149
|
+
"""ruby
|
150
|
+
require 'vcr'
|
151
|
+
|
152
|
+
VCR.configure do |c|
|
153
|
+
c.hook_into <hook_into>
|
154
|
+
c.cassette_library_dir = 'cassettes'
|
155
|
+
end
|
156
|
+
|
157
|
+
uri = URI("https://gist.githubusercontent.com/myronmarston/fb555cb593f3349d53af/raw/6921dd638337d3f6a51b0e02e7f30e3c414f70d6/vcr_gist")
|
158
|
+
|
159
|
+
VCR.use_cassette('https') do
|
160
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
161
|
+
http.use_ssl = true
|
162
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
163
|
+
response = http.request_get(uri.path)
|
164
|
+
|
165
|
+
puts response.body
|
166
|
+
end
|
167
|
+
"""
|
168
|
+
When I run `ruby vcr_https.rb`
|
169
|
+
Then the output should contain "VCR gist"
|
170
|
+
And the file "cassettes/https.yml" should contain "VCR gist"
|
171
|
+
|
172
|
+
When I modify the file "cassettes/https.yml" to replace "VCR gist" with "HTTPS replaying works"
|
173
|
+
And I run `ruby vcr_https.rb`
|
174
|
+
Then the output should contain "HTTPS replaying works"
|
175
|
+
|
176
|
+
Examples:
|
177
|
+
| hook_into |
|
178
|
+
| :fakeweb |
|
179
|
+
| :webmock |
|