NxtVcrHarness
NxtVcrHarness helps you with vcr cassette handling in RSpec.
Installation
Add this line to your application's Gemfile:
gem 'nxt_vcr_harness'
And then execute:
$ bundle
Or install it yourself as:
$ gem install nxt_vcr_harness
Usage
NxtVcrHarness provides three features.
1. List unused cassettes after each test run.
You can use it to find vcr cassettes that are not being used when you
run your test suite. Enable it by calling NxtVcrHarness.track_cassettes_if(...your condition in here...)
.
Note that the output only makes sense when you run your complete test suite.
If you run only a subset all cassettes that are used by your other test will be included too.
2. Use custom VCR tag
You can enable your custom :vcr tag by calling NxtVcrHarness.enable_vcr_tag
. This will
automatically name your vcr cassettes based on the your rspec example and the surrounding contexts. You can also
setup default cassette options for your vcr tag.
NxtVcrHarness.enable_vcr_tag(tag_name: :my_vcr_tag, default_cassette_options: { ... })
3. Keep cassettes small by removing unneeded headers
API responses typically contain useful headers, such as information about rate limits and pagination, but also many more unnecessary headers. You can drastically reduce the size of your cassettes by stripping unnecessary headers before saving.
# After VCR.configure:
NxtVcrHarness.strip_unneeded_headers_before_save
By default, nxt_vcr_harness will remove the following kinds of headers (case-insensitive) from responses:
- CORS headers (
Access-Control-*
) - Headers for browsers (
X-Frame-Options
,Content-Security-Policy
,Strict-Transport-Security
,X-Xss-Protection
,Expect-Ct
...) - Headers for browsers/proxies/CDNs (
Cache-Control
,Etag
,Vary
...) - Common cloud provider headers (CloudFlare, AWS)
- Server details (
Server-Timing
,X-Powered-By
,X-Runtime
,Via
,Date
)
From requests, Accept-Encoding
and Expect
headers will be removed.
See NxtVcrHarness::UnneededHeaders.default_headers_to_strip
for the full list of removed headers.
You can add or override headers to be removed (regexes or strings):
NxtVcrHarness.strip_unneeded_headers_before_save do |headers_to_strip|
headers_to_strip[:response] << /X-Dixa-.+/i
end
To run this slimming on existing cassettes, you can create a simple Ruby script or Rake task, for example::
require 'vcr'
require 'nxt_vcr_harness'
headers_to_strip = NxtVcrHarness::UnneededHeaders.default_headers_to_strip
headers_to_strip[:responses] << /X-Dixa-.+/i
task slim_cassettes: :environment do
Dir[Rails.root.join('spec/fixtures/vcr_cassettes/**/**.yml')].each do |file_path|
cassette = ::YAML.load(File.read(file_path))
cassette['http_interactions'].each do |interaction|
NxtVcrHarness::UnneededHeaders.strip(interaction['request']['headers'], headers_to_strip[:requests])
NxtVcrHarness::UnneededHeaders.strip(interaction['response']['headers'], headers_to_strip[:responses])
end
File.write(file_path, VCR.cassette_serializers[:yaml].serialize(cassette))
end
end
Development
After checking out the repo, run bin/setup
to install dependencies. Then, run rake spec
to run the tests. You can also run bin/console
for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install
. To release a new version, update the version number in version.rb
, and then run bundle exec rake release
, which will create a git tag for the version, push git commits and tags, and push the .gem
file to rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/nxt-insurance/nxt_vcr_harness.
License
The gem is available as open source under the terms of the MIT License.