module VCR::RSpec::Metadata

@private

Public Instance Methods

configure!() click to toggle source
# File lib/vcr/test_frameworks/rspec.rb, line 8
def configure!
  ::RSpec.configure do |config|
    vcr_cassette_name_for = lambda do |metadata|
      description = if metadata[:description].empty?
                      # we have an "it { is_expected.to be something }" block
                      metadata[:scoped_id]
                    else
                      metadata[:description]
                    end
      example_group = if metadata.key?(:example_group)
                        metadata[:example_group]
                      else
                        metadata[:parent_example_group]
                      end

      if example_group
        [vcr_cassette_name_for[example_group], description].join('/')
      else
        description
      end
    end

    when_tagged_with_vcr = { :vcr => lambda { |v| !!v } }

    config.before(:each, when_tagged_with_vcr) do |ex|
      example = ex.respond_to?(:metadata) ? ex : ex.example

      cassette_name = nil
      options = example.metadata[:vcr]
      options = case options
                when Hash #=> vcr: { cassette_name: 'foo' }
                  options.dup
                when String #=> vcr: 'bar'
                  cassette_name = options.dup
                  {}
                else #=> :vcr or vcr: true
                  {}
                end

      cassette_name ||= options.delete(:cassette_name) ||
                      vcr_cassette_name_for[example.metadata]
      VCR.insert_cassette(cassette_name, options)
    end

    config.after(:each, when_tagged_with_vcr) do |ex|
      example = ex.respond_to?(:metadata) ? ex : ex.example
      VCR.eject_cassette(:skip_no_unused_interactions_assertion => !!example.exception)
    end
  end
end