Skip to content

Testing with VCR

Henne Vogelsang edited this page Dec 13, 2023 · 11 revisions

In our CI environment, we don't want to run the OBS backend and therefore we are using VCR to replay previous recorded HTTP sessions between frontend and backend.

Backend::Api Configuration

  • In the test environment HTTP requests to the OBS backend are by default disabled. You can change this by setting the environment variable GLOBAL_WRITE_THROUGH=true before running your spec.
  • In CI HTTP requests to the backend are by default enabled

VCR configuration

  • VCR is configured to only record a cassette once.
  • VCR mocks responses to HTTP requests by comparing the requested request.uri with the URL from cassettes. That means if you have random parts (like project/package names) in the URL requested the cassette will not contain a match and VCR will refuse to change any existing cassette.
  • VCR can be enabled/disabled per example with
      RSpec.describe Package, vcr: false do
        ...
      end
    
  • VCR cassettes are NEVER edited manually please

Backend Commuication

We have a configuration global named global_write_through which controls if data will be sent to backend or not. When set to true, data goes to the backend (therefore a backend is expected to be there up and running). This configuration is controlled in vcr.rb.

Run specs

Using VCR cassettes

With vcr: true set in the spec Class description, simply run the spec as normal:

rspec spec/models/workflow_spec.rb

Using the backend (bypassing VCR)

Make sure vcr: false is set in the spec Class description, then run the spec with the GLOBAL_WRITE_THROUGH prefix to override the one described in vcr.rb:

GLOBAL_WRITE_THROUGH=true rspec spec/models/workflow_spec.rb

Record

New cassette

Set default_cassette_options to :new_episodes instead of :once, then enable vcr: true in the spec file and run:

GLOBAL_WRITE_THROUGH=true rspec spec/models/workflow_spec.rb

With GLOBAL_WRITE_THROUGH enabled it will use the backend, but with vcr: true and :new_episodes it will record everything run by the spec to cassettes.

Update cassette

Same as #New cassette, but this time it will add the new episode recorded to the existing cassette instead.

Flushing the backend

In the process, of developing tests with cassettes, the backend doesn't get flushed between test runs. If cassettes are recorded without flushing the backend, they will contain responses from a backend filled up with previous data.

So, for example, when in your test you use a factory to create a package package1 with a file and run the test, a package with a file is created in the backend. If you modify the test to create a simple package package1 without a file, and run the test, the backend will keep the file attached to this package. And the rest of the code of your test will work as it was the first run, when it probably shouldn't.

To assure this doesn't happen when creating the cassettes, just delete the docker backend container, and wake up it again. This can be done with the following commands:

docker-compose rm -s -f backend
docker-compose up -d backend
Clone this wiki locally