vcr 2.1.1 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +2 -1
- data/CHANGELOG.md +58 -1
- data/Gemfile +0 -6
- data/README.md +12 -3
- data/Rakefile +2 -2
- data/features/.nav +2 -0
- data/features/cassettes/allow_unused_http_interactions.feature +86 -0
- data/features/cassettes/naming.feature +3 -2
- data/features/cassettes/persistence.feature +63 -0
- data/features/configuration/debug_logging.feature +3 -3
- data/features/configuration/ignore_request.feature +1 -1
- data/features/hooks/after_http_request.feature +1 -1
- data/features/step_definitions/cli_steps.rb +33 -0
- data/features/support/env.rb +0 -1
- data/lib/vcr.rb +13 -0
- data/lib/vcr/cassette.rb +57 -44
- data/lib/vcr/cassette/{reader.rb → erb_renderer.rb} +9 -11
- data/lib/vcr/cassette/http_interaction_list.rb +18 -0
- data/lib/vcr/cassette/persisters.rb +42 -0
- data/lib/vcr/cassette/persisters/file_system.rb +60 -0
- data/lib/vcr/cassette/serializers.rb +1 -1
- data/lib/vcr/cassette/serializers/json.rb +1 -1
- data/lib/vcr/cassette/serializers/psych.rb +1 -1
- data/lib/vcr/cassette/serializers/syck.rb +1 -1
- data/lib/vcr/cassette/serializers/yaml.rb +1 -1
- data/lib/vcr/configuration.rb +49 -25
- data/lib/vcr/errors.rb +6 -0
- data/lib/vcr/library_hooks/excon.rb +1 -1
- data/lib/vcr/library_hooks/fakeweb.rb +16 -3
- data/lib/vcr/library_hooks/faraday.rb +13 -0
- data/lib/vcr/library_hooks/typhoeus.rb +5 -1
- data/lib/vcr/library_hooks/webmock.rb +90 -35
- data/lib/vcr/middleware/faraday.rb +12 -4
- data/lib/vcr/request_handler.rb +10 -2
- data/lib/vcr/structs.rb +31 -7
- data/lib/vcr/version.rb +1 -1
- data/script/ci.sh +14 -0
- data/spec/spec_helper.rb +8 -1
- data/spec/support/shared_example_groups/hook_into_http_library.rb +31 -1
- data/spec/vcr/cassette/{reader_spec.rb → erb_renderer_spec.rb} +15 -21
- data/spec/vcr/cassette/http_interaction_list_spec.rb +15 -0
- data/spec/vcr/cassette/persisters/file_system_spec.rb +64 -0
- data/spec/vcr/cassette/persisters_spec.rb +39 -0
- data/spec/vcr/cassette/serializers_spec.rb +4 -3
- data/spec/vcr/cassette_spec.rb +65 -41
- data/spec/vcr/configuration_spec.rb +33 -2
- data/spec/vcr/library_hooks/fakeweb_spec.rb +11 -0
- data/spec/vcr/library_hooks/faraday_spec.rb +24 -0
- data/spec/vcr/library_hooks/webmock_spec.rb +82 -2
- data/spec/vcr/middleware/faraday_spec.rb +32 -0
- data/spec/vcr/structs_spec.rb +60 -20
- data/spec/vcr/util/hooks_spec.rb +7 -0
- data/spec/vcr_spec.rb +7 -0
- data/vcr.gemspec +2 -2
- metadata +31 -26
- data/Guardfile +0 -9
- data/script/FullBuildRakeFile +0 -56
- data/script/full_build +0 -1
- data/script/spec +0 -1
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,63 @@
|
|
1
1
|
## In git
|
2
2
|
|
3
|
-
[Full Changelog](http://github.com/myronmarston/vcr/compare/v2.
|
3
|
+
[Full Changelog](http://github.com/myronmarston/vcr/compare/v2.2.0...master)
|
4
|
+
|
5
|
+
## 2.2.0 (May 31, 2012)
|
6
|
+
|
7
|
+
[Full Changelog](http://github.com/myronmarston/vcr/compare/v2.1.1...v2.2.0)
|
8
|
+
|
9
|
+
Enhancements:
|
10
|
+
|
11
|
+
* Add new `:persist_with` cassette option. It allows you to provide a
|
12
|
+
customized persistence implementation so you can persist it to
|
13
|
+
something other than disk (i.e. a key-value store or a database).
|
14
|
+
Thanks to [Chris Le](https://github.com/chrisle) for the idea and
|
15
|
+
help with the implementation.
|
16
|
+
* Allow requests to be stubbed by external libraries (e.g. WebMock,
|
17
|
+
FakeWeb or Typhoeus) without needing to turn VCR off.
|
18
|
+
* Add new `:allow_unused_http_interactions` cassette option. When set
|
19
|
+
to false, an error will be raised when a cassette is ejected and
|
20
|
+
there are remaining unused HTTP interactions. Thanks to
|
21
|
+
[Mattias Putman](https://github.com/challengee) for the idea
|
22
|
+
and initial implementation.
|
23
|
+
|
24
|
+
Bug Fixes:
|
25
|
+
|
26
|
+
* Fix `after_http_request` to handle symbol request predicate filters
|
27
|
+
(e.g. `:ignored?`, `:stubbed?`, `:recordable?`, `:unhandled?`, `:real?`)
|
28
|
+
properly. Previously using one of these would raise an ArgumentError.
|
29
|
+
Thanks to [playupchris](https://github.com/playupchris) for reporting
|
30
|
+
the bug and providing a fix.
|
31
|
+
* Fix FakeWeb hook so that it no longer breaks
|
32
|
+
`FakeWeb.allow_net_connect?` with arguments. Thanks to
|
33
|
+
[Ingemar](https://github.com/ingemar) for reporting the bug and
|
34
|
+
providing a fix.
|
35
|
+
* Fix WebMock hook so that it no longer breaks
|
36
|
+
`WebMock.net_connect_allowed?` with arguments. Thanks to
|
37
|
+
[Gordon Wilson](https://github.com/gordoncww) for reporting the bug and
|
38
|
+
providing a fix.
|
39
|
+
* Print a warning when VCR is used with a poorly behaved Faraday
|
40
|
+
connection stack that has a middleware after the HTTP adapter.
|
41
|
+
VCR may work improperly in this case.
|
42
|
+
* Raise an error if a response object is recorded with a non-string
|
43
|
+
body. This fails early and indicates the problem rather than failing
|
44
|
+
later with a strange error.
|
45
|
+
* Fix `filter_sensitive_data`/`define_cassette_placeholder` so that they
|
46
|
+
handle non-strings gracefully (e.g. the port number as a Fixnum).
|
47
|
+
* Gracefully handle Faraday connection stacks that do not explicitly
|
48
|
+
specify an HTTP adapter. Thanks to [Patrick Roby](https://github.com/proby)
|
49
|
+
for reporting the bug.
|
50
|
+
* Work around a bug in WebMock's em-http-request adapter that prevented
|
51
|
+
VCR from working when using the `:redirects` option with
|
52
|
+
em-http-request. This change is just a work around. It fixes the main
|
53
|
+
problem, but some features (such as the http request hooks) may not
|
54
|
+
work properly for this case. The bug will ultimately need to be
|
55
|
+
[fixed in WebMock](https://github.com/bblimke/webmock/pull/185).
|
56
|
+
Thanks to [Mark Abramov](https://github.com/markiz) for reporting
|
57
|
+
the bug and providing a great example test case.
|
58
|
+
* Fix bug in handling of Faraday requests with multipart uploads.
|
59
|
+
Thanks to [Tyler Hunt](https://github.com/tylerhunt) for reporting
|
60
|
+
and fixing the bug.
|
4
61
|
|
5
62
|
## 2.1.1 (April 24, 2012)
|
6
63
|
|
data/Gemfile
CHANGED
@@ -11,8 +11,6 @@ gem 'yard'
|
|
11
11
|
|
12
12
|
# Additional gems that are useful, but not required for development.
|
13
13
|
group :extras do
|
14
|
-
gem 'guard-rspec'
|
15
|
-
gem 'growl'
|
16
14
|
gem 'relish', '~> 0.5.0'
|
17
15
|
gem 'fuubar'
|
18
16
|
gem 'fuubar-cucumber'
|
@@ -20,10 +18,6 @@ group :extras do
|
|
20
18
|
gem 'redcarpet', '~> 1.17.2'
|
21
19
|
gem 'github-markup'
|
22
20
|
|
23
|
-
platforms :mri do
|
24
|
-
gem 'rb-fsevent'
|
25
|
-
end
|
26
|
-
|
27
21
|
platforms :mri_18, :jruby do
|
28
22
|
gem 'ruby-debug'
|
29
23
|
end
|
data/README.md
CHANGED
@@ -142,9 +142,12 @@ Thanks also to the following people who have contributed patches or helpful sugg
|
|
142
142
|
* [Bradley Isotope](https://github.com/bradleyisotope)
|
143
143
|
* [Carlos Kirkconnell](https://github.com/kirkconnell)
|
144
144
|
* [Chad Jolly](https://github.com/cjolly)
|
145
|
+
* [Chris Le](https://github.com/chrisle)
|
145
146
|
* [Eric Allam](http://github.com/rubymaverick)
|
146
147
|
* [Ezekiel Templin](https://github.com/ezkl)
|
147
148
|
* [Flaviu Simihaian](https://github.com/closedbracket)
|
149
|
+
* [Gordon Wilson](https://github.com/gordoncww)
|
150
|
+
* [Ingemar](https://github.com/ingemar)
|
148
151
|
* [Jeff Pollard](https://github.com/Fluxx)
|
149
152
|
* [Justin Smestad](https://github.com/jsmestad)
|
150
153
|
* [Karl Baum](https://github.com/kbaum)
|
@@ -154,25 +157,31 @@ Thanks also to the following people who have contributed patches or helpful sugg
|
|
154
157
|
* [Oliver Searle-Barnes](https://github.com/opsb)
|
155
158
|
* [Omer Rauchwerger](https://github.com/rauchy)
|
156
159
|
* [Paco Guzmán](https://github.com/pacoguzman)
|
160
|
+
* [playupchris](https://github.com/playupchris)
|
157
161
|
* [Ryan Bates](https://github.com/ryanb)
|
158
162
|
* [Sathya Sekaran](https://github.com/sfsekaran)
|
163
|
+
* [Tyler Hunt](https://github.com/tylerhunt)
|
159
164
|
* [Wesley Beary](https://github.com/geemus)
|
160
165
|
|
161
166
|
## Ports in other languages
|
162
167
|
|
163
168
|
* [Betamax](https://github.com/robfletcher/betamax) (Groovy)
|
164
|
-
* [VCR.js](https://github.com/elcuervo/vcr.js) (JavaScript)
|
165
|
-
* [TapeDeck.js](https://github.com/EndangeredMassa/TapeDeck.js) (JavaScript)
|
166
169
|
* [Mimic](https://github.com/acoulton/mimic) (PHP/Kohana)
|
170
|
+
* [Nock](https://github.com/flatiron/nock) (JavaScript/Node)
|
171
|
+
* [NSURLConnectionVCR](https://bitbucket.org/martijnthe/nsurlconnectionvcr) (Objective C)
|
172
|
+
* [TapeDeck.js](https://github.com/EndangeredMassa/TapeDeck.js) (JavaScript)
|
173
|
+
* [VCR.js](https://github.com/elcuervo/vcr.js) (JavaScript)
|
174
|
+
* [VCR.py](https://github.com/kevin1024/vcrpy) (Python)
|
175
|
+
* [vcr-clj](https://github.com/ifesdjeen/vcr-clj) (Clojure)
|
167
176
|
|
168
177
|
## Similar Libraries in Ruby
|
169
178
|
|
170
179
|
* [Ephemeral Response](https://github.com/sandro/ephemeral_response)
|
171
180
|
* [Net::HTTP Spy](http://github.com/martinbtt/net-http-spy)
|
172
181
|
* [NetRecorder](https://github.com/chrisyoung/netrecorder)
|
182
|
+
* [REST-assured](https://github.com/BBC/REST-assured)
|
173
183
|
* [Stale Fish](https://github.com/jsmestad/stale_fish)
|
174
184
|
* [WebFixtures](http://github.com/trydionel/web_fixtures)
|
175
|
-
* [REST-assured](https://github.com/BBC/REST-assured)
|
176
185
|
|
177
186
|
## Copyright
|
178
187
|
|
data/Rakefile
CHANGED
@@ -26,10 +26,10 @@ task :default => [:spec, :cucumber]
|
|
26
26
|
desc "Ensures we keep up 100% YARD coverage"
|
27
27
|
task :yard_coverage do
|
28
28
|
coverage_stats = `yard stats --list-undoc 2>&1`
|
29
|
+
puts coverage_stats
|
29
30
|
if coverage_stats.include?('100.00% documented')
|
30
|
-
puts "
|
31
|
+
puts "\nNice work! 100% documentation coverage"
|
31
32
|
else
|
32
|
-
puts coverage_stats
|
33
33
|
raise "Documentation coverage is less than 100%"
|
34
34
|
end
|
35
35
|
end
|
data/features/.nav
CHANGED
@@ -0,0 +1,86 @@
|
|
1
|
+
Feature: Allow Unused HTTP Interactions
|
2
|
+
|
3
|
+
If set to false, this cassette option will cause VCR to raise an error
|
4
|
+
when a cassette is ejected and there are unused HTTP interactions remaining.
|
5
|
+
|
6
|
+
It verifies that all requests included in the cassette were made, and allows
|
7
|
+
VCR to function a bit like a mock object at the HTTP layer.
|
8
|
+
|
9
|
+
The option defaults to true (mostly for backwards compatibility).
|
10
|
+
|
11
|
+
Background:
|
12
|
+
Given a file named "vcr_config.rb" with:
|
13
|
+
"""ruby
|
14
|
+
require 'vcr'
|
15
|
+
|
16
|
+
VCR.configure do |c|
|
17
|
+
c.hook_into :fakeweb
|
18
|
+
c.cassette_library_dir = 'cassettes'
|
19
|
+
end
|
20
|
+
"""
|
21
|
+
And a previously recorded cassette file "cassettes/example.yml" with:
|
22
|
+
"""
|
23
|
+
---
|
24
|
+
http_interactions:
|
25
|
+
- request:
|
26
|
+
method: get
|
27
|
+
uri: http://example.com/foo
|
28
|
+
body:
|
29
|
+
encoding: UTF-8
|
30
|
+
string: ""
|
31
|
+
headers: {}
|
32
|
+
response:
|
33
|
+
status:
|
34
|
+
code: 200
|
35
|
+
message: OK
|
36
|
+
headers:
|
37
|
+
Content-Length:
|
38
|
+
- "5"
|
39
|
+
body:
|
40
|
+
encoding: UTF-8
|
41
|
+
string: Hello
|
42
|
+
http_version: "1.1"
|
43
|
+
recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
|
44
|
+
recorded_with: VCR 2.0.0
|
45
|
+
"""
|
46
|
+
|
47
|
+
Scenario: Unused HTTP interactions are allowed by default
|
48
|
+
Given a file named "allowed_by_default.rb" with:
|
49
|
+
"""ruby
|
50
|
+
require 'vcr_config'
|
51
|
+
|
52
|
+
VCR.use_cassette("example") do
|
53
|
+
# no requests
|
54
|
+
end
|
55
|
+
"""
|
56
|
+
When I run `ruby allowed_by_default.rb`
|
57
|
+
Then it should pass
|
58
|
+
|
59
|
+
Scenario: Error raised if option is false and there are unused interactions
|
60
|
+
Given a file named "disallowed_with_no_requests.rb" with:
|
61
|
+
"""ruby
|
62
|
+
require 'vcr_config'
|
63
|
+
|
64
|
+
VCR.use_cassette("example", :allow_unused_http_interactions => false) do
|
65
|
+
# no requests
|
66
|
+
end
|
67
|
+
"""
|
68
|
+
When I run `ruby disallowed_with_no_requests.rb`
|
69
|
+
Then it should fail with an error like:
|
70
|
+
"""
|
71
|
+
There are unused HTTP interactions left in the cassette:
|
72
|
+
- [get http://example.com/foo] => [200 "Hello"]
|
73
|
+
"""
|
74
|
+
|
75
|
+
Scenario: No error raised if option is false and all interactions are used
|
76
|
+
Given a file named "disallowed_with_all_requests.rb" with:
|
77
|
+
"""ruby
|
78
|
+
require 'vcr_config'
|
79
|
+
|
80
|
+
VCR.use_cassette("example", :allow_unused_http_interactions => false) do
|
81
|
+
Net::HTTP.get_response(URI("http://example.com/foo"))
|
82
|
+
end
|
83
|
+
"""
|
84
|
+
When I run `ruby disallowed_with_all_requests.rb`
|
85
|
+
Then it should pass
|
86
|
+
|
@@ -1,8 +1,9 @@
|
|
1
1
|
Feature: Naming
|
2
2
|
|
3
3
|
When inserting or using a cassette, the first argument is the cassette name.
|
4
|
-
You can use any string for the name.
|
5
|
-
|
4
|
+
You can use any string for the name. If you use the default `:file_system`
|
5
|
+
storage backend, VCR will sanitize the string before using it as a file name,
|
6
|
+
so that it is a file-system friendly file name.
|
6
7
|
|
7
8
|
Scenario: Name sanitizing
|
8
9
|
Given a file named "name_sanitizing.rb" with:
|
@@ -0,0 +1,63 @@
|
|
1
|
+
Feature: Cassette Persistence
|
2
|
+
|
3
|
+
By default, cassettes will be persisted to the file system. However, you
|
4
|
+
can easily configure VCR to persist the cassettes to a database, a key-value
|
5
|
+
store, or anywhere you like.
|
6
|
+
|
7
|
+
To use something besides the file system, you must provide an object
|
8
|
+
that provides a hash-like interface:
|
9
|
+
|
10
|
+
* `persister[name]` should return the content previously persisted for the
|
11
|
+
given cassette name.
|
12
|
+
* `persister[name] = content` should persist the content for the
|
13
|
+
given cassette name.
|
14
|
+
|
15
|
+
Register this object with VCR, and then you can configure all cassettes
|
16
|
+
to use it (using the `default_cassette_options`) or just some cassettes
|
17
|
+
to use it (by passing it as an option to individual cassettes).
|
18
|
+
|
19
|
+
Scenario: Persist cassettes in Redis
|
20
|
+
Given the redis DB has no data
|
21
|
+
And a file named "use_redis.rb" with:
|
22
|
+
"""ruby
|
23
|
+
if ARGV.include?('--with-server')
|
24
|
+
start_sinatra_app(:port => 7777) do
|
25
|
+
get('/') { "Hello" }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
require 'redis'
|
30
|
+
|
31
|
+
class RedisCassettePersister
|
32
|
+
def initialize(redis)
|
33
|
+
@redis = redis
|
34
|
+
end
|
35
|
+
|
36
|
+
def [](name)
|
37
|
+
@redis.get(name)
|
38
|
+
end
|
39
|
+
|
40
|
+
def []=(name, content)
|
41
|
+
@redis.set(name, content)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
require 'vcr'
|
46
|
+
|
47
|
+
VCR.configure do |c|
|
48
|
+
c.hook_into :fakeweb
|
49
|
+
c.cassette_persisters[:redis] = RedisCassettePersister.new(Redis.connect)
|
50
|
+
c.default_cassette_options = { :persist_with => :redis }
|
51
|
+
end
|
52
|
+
|
53
|
+
VCR.use_cassette("redis_example") do
|
54
|
+
response = Net::HTTP.get_response('localhost', '/', 7777)
|
55
|
+
puts "Response: #{response.body}"
|
56
|
+
end
|
57
|
+
"""
|
58
|
+
When I run `ruby use_redis.rb --with-server`
|
59
|
+
Then it should pass with "Hello"
|
60
|
+
And the value stored at the redis key "redis_example.yml" should include "Hello"
|
61
|
+
|
62
|
+
When I run `ruby use_redis.rb`
|
63
|
+
Then it should pass with "Hello"
|
@@ -30,7 +30,7 @@ Feature: Debug Logging
|
|
30
30
|
When I run `ruby debug_logger.rb record.log --with-server`
|
31
31
|
Then the file "record.log" should contain exactly:
|
32
32
|
"""
|
33
|
-
[Cassette: 'example'] Initialized with options: {:record=>:once, :match_requests_on=>[:method, :uri], :serialize_with=>:yaml}
|
33
|
+
[Cassette: 'example'] Initialized with options: {:record=>:once, :match_requests_on=>[:method, :uri], :allow_unused_http_interactions=>true, :serialize_with=>:yaml, :persist_with=>:file_system}
|
34
34
|
[fakeweb] Handling request: [get http://localhost:7777/] (disabled: false)
|
35
35
|
[Cassette: 'example'] Initialized HTTPInteractionList with request matchers [:method, :uri] and 0 interaction(s): { }
|
36
36
|
[fakeweb] Identified request type (recordable) for [get http://localhost:7777/]
|
@@ -40,13 +40,13 @@ Feature: Debug Logging
|
|
40
40
|
When I run `ruby debug_logger.rb playback.log`
|
41
41
|
Then the file "playback.log" should contain exactly:
|
42
42
|
"""
|
43
|
-
[Cassette: 'example'] Initialized with options: {:record=>:once, :match_requests_on=>[:method, :uri], :serialize_with=>:yaml}
|
43
|
+
[Cassette: 'example'] Initialized with options: {:record=>:once, :match_requests_on=>[:method, :uri], :allow_unused_http_interactions=>true, :serialize_with=>:yaml, :persist_with=>:file_system}
|
44
44
|
[fakeweb] Handling request: [get http://localhost:7777/] (disabled: false)
|
45
45
|
[Cassette: 'example'] Initialized HTTPInteractionList with request matchers [:method, :uri] and 1 interaction(s): { [get http://localhost:7777/] => [200 "Hello World"] }
|
46
46
|
[Cassette: 'example'] Checking if [get http://localhost:7777/] matches [get http://localhost:7777/] using [:method, :uri]
|
47
47
|
[Cassette: 'example'] method (matched): current request [get http://localhost:7777/] vs [get http://localhost:7777/]
|
48
48
|
[Cassette: 'example'] uri (matched): current request [get http://localhost:7777/] vs [get http://localhost:7777/]
|
49
49
|
[Cassette: 'example'] Found matching interaction for [get http://localhost:7777/] at index 0: [200 "Hello World"]
|
50
|
-
[fakeweb] Identified request type (
|
50
|
+
[fakeweb] Identified request type (stubbed_by_vcr) for [get http://localhost:7777/]
|
51
51
|
|
52
52
|
"""
|
@@ -65,7 +65,7 @@ Feature: Ignore Request
|
|
65
65
|
puts response_body_for(:get, "http://localhost:8888/")
|
66
66
|
"""
|
67
67
|
When I run `ruby ignore_request.rb`
|
68
|
-
Then it should fail with:
|
68
|
+
Then it should fail with an error like:
|
69
69
|
"""
|
70
70
|
An HTTP request has been made that VCR does not know how to handle:
|
71
71
|
GET http://localhost:8888/
|
@@ -33,7 +33,7 @@ Feature: after_http_request hook
|
|
33
33
|
<configuration>
|
34
34
|
c.cassette_library_dir = 'cassettes'
|
35
35
|
c.ignore_localhost = true
|
36
|
-
c.after_http_request(lambda { |req| req.uri =~ /foo/ }) do |request, response|
|
36
|
+
c.after_http_request(:ignored?, lambda { |req| req.uri =~ /foo/ }) do |request, response|
|
37
37
|
puts "Response for #{request.method} #{request.uri}: #{response.body}"
|
38
38
|
end
|
39
39
|
end
|
@@ -73,6 +73,13 @@ module VCRHelpers
|
|
73
73
|
File.open(file_name, 'w') { |f| f.write(file) }
|
74
74
|
end
|
75
75
|
end
|
76
|
+
|
77
|
+
def redis
|
78
|
+
@redis ||= begin
|
79
|
+
require 'redis'
|
80
|
+
Redis.connect
|
81
|
+
end
|
82
|
+
end
|
76
83
|
end
|
77
84
|
World(VCRHelpers)
|
78
85
|
|
@@ -92,6 +99,10 @@ Given /^it is (.*)$/ do |date_string|
|
|
92
99
|
set_env('DATE_STRING', date_string)
|
93
100
|
end
|
94
101
|
|
102
|
+
Given /^the redis DB has no data$/ do
|
103
|
+
redis.flushdb
|
104
|
+
end
|
105
|
+
|
95
106
|
When /^I modify the file "([^"]*)" to replace "([^"]*)" with "([^"]*)"$/ do |file_name, orig_text, new_text|
|
96
107
|
modify_file(file_name, orig_text, new_text)
|
97
108
|
end
|
@@ -112,6 +123,20 @@ Then /^it should (pass|fail) with "([^"]*)"$/ do |pass_fail, partial_output|
|
|
112
123
|
assert_exit_status_and_partial_output(pass_fail == 'pass', partial_output)
|
113
124
|
end
|
114
125
|
|
126
|
+
Then /^it should (pass|fail) with an error like:$/ do |pass_fail, partial_output|
|
127
|
+
assert_success(pass_fail == 'pass')
|
128
|
+
|
129
|
+
# different implementations place the exception class at different
|
130
|
+
# places relative to the message (i.e. with a multiline error message)
|
131
|
+
process_output = all_output.gsub(/\s*\(VCR::Errors::\w+\)/, '')
|
132
|
+
|
133
|
+
# Some implementations include extra leading spaces, for some reason...
|
134
|
+
process_output.gsub!(/^\s*/, '')
|
135
|
+
partial_output.gsub!(/^\s*/, '')
|
136
|
+
|
137
|
+
assert_partial_output(partial_output, process_output)
|
138
|
+
end
|
139
|
+
|
115
140
|
Then /^the output should contain each of the following:$/ do |table|
|
116
141
|
table.raw.flatten.each do |string|
|
117
142
|
assert_partial_output(string, all_output)
|
@@ -168,3 +193,11 @@ Then /^the cassette "([^"]*)" should have the following response bodies:$/ do |f
|
|
168
193
|
actual_response_bodies.should =~ expected_response_bodies
|
169
194
|
end
|
170
195
|
|
196
|
+
Then /^the value stored at the redis key "([^"]*)" should include "([^"]*)"$/ do |key, value_fragment|
|
197
|
+
redis.get(key).should include(value_fragment)
|
198
|
+
end
|
199
|
+
|
200
|
+
Then /^it should (pass|fail)$/ do |pass_fail|
|
201
|
+
assert_success(pass_fail == 'pass')
|
202
|
+
end
|
203
|
+
|