justintime50/vcr-accessories

Various accessories for your PHP VCR

v0.3.0 2024-09-19 20:31 UTC

This package is auto-updated.

Last update: 2025-03-19 21:35:40 UTC


README

Build Status Coverage Status Licence

Various tools and accessories for your PHP VCR.

When working with VCR solutions, I'm often finding I need a few extra "accessories" to get them working the way I want. This package includes the following:

  • Cassette scrubbing (eg: sensitive data)
  • Expire and warn or error on stale cassettes
  • Setup a cassette directory
  • Setup and teardown VCR tests

Install

# Install in your project
composer require --dev justintime50/vcr-accessories

# Install locally
composer install

Usage

bootstrap.php

use allejo\VCR\VCRCleaner;
use VCR\VCR;
use VCRAccessories\CassetteScrubber;
use VCRAccessories\CassetteSetup;

const CASSETTE_DIR = 'tests/cassettes';
CassetteSetup::setupCassetteDirectory(CASSETTE_DIR);

VCR::configure()->setCassettePath(CASSETTE_DIR)
    ->setStorage('yaml')
    ->setMode('once')
    ->setWhiteList(['vendor/guzzle']);

const REDACTED_STRING = '<REDACTED>';

// SCRUBBERS must be a multidimensional array where the first index of each nested array is the key
// you want to scrub and the second index is what you want it to be replaced with before persisting to disk
define('SCRUBBERS', [
    ['origin', REDACTED_STRING],
]);

VCRCleaner::enable([
    'response' => [
        'bodyScrubbers' => [
            function ($responseBody) {
                $responseBodyJson = json_decode($responseBody, true);
                $responseBodyEncoded = CassetteScrubber::scrubCassette(SCRUBBERS, $responseBodyJson);

                // Re-encode the data so we can properly store it in the cassette
                return json_encode($responseBodyEncoded);
            }
        ],
    ],
]);

Test File

use VCRAccessories\CassetteSetup;

public static function setUpBeforeClass(): void
{
    CassetteSetup::setupVcrTests();
}

public static function tearDownAfterClass(): void
{
    CassetteSetup::teardownVcrTests();
}

public function myTest()
{
    CassetteSetup::setupCassette(
        cassetteName: 'nameOfCassette.yaml', 
        expirationDays: 180, 
        expirationError: true
    );

    // Your test here
}

Development

# Install dependencies
composer install

# Lint
composer lint
composer fix
composer phpstan

# Test
composer test
composer coverage