Skip to content

Commit

Permalink
Merge pull request #987 from kevinnio/use-vcr-to-record-http-interact…
Browse files Browse the repository at this point in the history
…ions

Use php-vcr to record http interactions through all the test suite
  • Loading branch information
c9s committed Feb 28, 2019
2 parents 34ebc30 + 2ad2ce2 commit 221fc6f
Show file tree
Hide file tree
Showing 21 changed files with 410 additions and 90 deletions.
16 changes: 15 additions & 1 deletion src/PhpBrew/Testing/CommandTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@

namespace PhpBrew\Testing;

use CLIFramework\Testing\CommandTestCase as BaseCommandTestCase;
use PhpBrew\Console;
use GetOptionKit\Option;
use PhpBrew\Testing\VCRAdapter;
use CLIFramework\Testing\CommandTestCase as BaseCommandTestCase;

abstract class CommandTestCase extends BaseCommandTestCase
{
Expand All @@ -16,6 +17,11 @@ abstract class CommandTestCase extends BaseCommandTestCase

public $primaryVersion = '5.5.37';

/**
* You need to set this to true in each subclass you want to use VCR in.
*/
public $usesVCR = false;

public function getPrimaryVersion()
{
/*
Expand Down Expand Up @@ -53,6 +59,10 @@ public function setUp()
$option->setValue(true);
$options->set('no-progress', $option);
}

if ($this->usesVCR) {
VCRAdapter::enableVCR($this);
}
}

/*
Expand All @@ -68,6 +78,10 @@ public function tearDown()
if ($this->previousPhpBrewHome !== null) {
// putenv('PHPBREW_HOME=' . $this->previousPhpBrewHome);
}

if ($this->usesVCR) {
VCRAdapter::disableVCR();
}
}

public function assertCommandSuccess($args)
Expand Down
27 changes: 27 additions & 0 deletions src/PhpBrew/Testing/VCRAdapter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace PhpBrew\Testing;

use VCR\VCR;

class VCRAdapter
{
public static function enableVCR($testInstance)
{
VCR::turnOn();
VCR::insertCassette(self::getVCRCassetteName($testInstance));
}

public static function disableVCR()
{
VCR::eject();
VCR::turnOff();
}

protected static function getVCRCassetteName($testInstance)
{
$classname_parts = explode('\\', get_class($testInstance));

return join(array_slice($classname_parts, -2, 2), '/');
}
}
2 changes: 2 additions & 0 deletions tests/PhpBrew/Command/AppCommandTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
use PhpBrew\Testing\CommandTestCase;

/**
* @large
* @group command
* @group noVCR
*/
class AppCommandTest extends CommandTestCase
{
Expand Down
1 change: 1 addition & 0 deletions tests/PhpBrew/Command/DownloadCommandTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
/**
* @large
* @group command
* @group noVCR
*/
class DownloadCommandTest extends CommandTestCase
{
Expand Down
1 change: 0 additions & 1 deletion tests/PhpBrew/Command/EnvCommandTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
use PhpBrew\Testing\CommandTestCase;

/**
* @large
* @group command
*/
class EnvCommandTest extends CommandTestCase
Expand Down
5 changes: 4 additions & 1 deletion tests/PhpBrew/Command/InstallCommandTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,19 @@
/**
* The install command tests are heavy.
*
* Don't catch the exceptions, the system command exception
* Don't catch the exceptions, the system command exception
* will show up the error message.
*
* Build output will be shown when assertion failed.
*
* @large
* @group command
* @group noVCR
*/
class InstallCommandTest extends CommandTestCase
{
public $usesVCR = false;

/**
* @group install
*/
Expand Down
2 changes: 2 additions & 0 deletions tests/PhpBrew/Command/KnownCommandTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
*/
class KnownCommandTest extends CommandTestCase
{
public $usesVCR = true;

/**
* @outputBuffering enabled
* @group mayignore
Expand Down
2 changes: 2 additions & 0 deletions tests/PhpBrew/Command/UpdateCommandTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
*/
class UpdateCommandTest extends CommandTestCase
{
public $usesVCR = true;

/**
* @outputBuffering enabled
*/
Expand Down
15 changes: 14 additions & 1 deletion tests/PhpBrew/Downloader/DownloaderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@
namespace PhpBrew\Downloader;


use PhpBrew\Config;
use CLIFramework\Logger;
use GetOptionKit\OptionResult;
use PhpBrew\Config;
use PhpBrew\Testing\VCRAdapter;
use \PHPUnit\Framework\TestCase;

/**
Expand All @@ -25,13 +26,25 @@ public function setUp()
{
$this->logger = Logger::getInstance();
$this->logger->setQuiet();

VCRAdapter::enableVCR($this);
}

public function tearDown() {
VCRAdapter::disableVCR();
}

/**
* @group noVCR
*/
public function testDownloadByWgetCommand()
{
$this->_test('PhpBrew\Downloader\WgetCommandDownloader');
}

/**
* @group noVCR
*/
public function testDownloadByCurlCommand()
{
$this->_test('PhpBrew\Downloader\CurlCommandDownloader');
Expand Down
19 changes: 11 additions & 8 deletions tests/PhpBrew/Extension/ExtensionInstallerTest.php
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
<?php
namespace PhpBrew\Extension;
use PhpBrew\Utils;
use PhpBrew\Config;
use PhpBrew\Extension;
use PhpBrew\Extension\ExtensionManager;
use PhpBrew\Extension\ExtensionFactory;
use PhpBrew\Extension\PeclExtensionInstaller;
use PhpBrew\Extension\ExtensionDownloader;
use PhpBrew\Testing\CommandTestCase;
use PhpBrew\Utils;
use \PHPUnit\Framework\TestCase;
use CLIFramework\Logger;;
use GetOptionKit\OptionResult;
use PhpBrew\Testing\VCRAdapter;
use \PHPUnit\Framework\TestCase;
use PhpBrew\Testing\CommandTestCase;
use PhpBrew\Extension\ExtensionFactory;
use PhpBrew\Extension\ExtensionManager;
use PhpBrew\Extension\ExtensionDownloader;
use PhpBrew\Extension\Provider\PeclProvider;
use PhpBrew\Extension\PeclExtensionInstaller;

/**
* NOTE: This depends on an existing installed php build. we need to ensure
Expand All @@ -29,6 +29,9 @@ public function setUp() {
$this->runCommand("phpbrew use php-{$versionName}");
}

/**
* @group noVCR
*/
public function testPackageUrl()
{
$logger = new Logger;
Expand Down
9 changes: 9 additions & 0 deletions tests/PhpBrew/Extension/ExtensionManagerTest.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
<?php
namespace PhpBrew\Extension;

use PhpBrew\Buildable;
use CLIFramework\Logger;
use PhpBrew\Testing\VCRAdapter;

/**
* ExtensionManagerTest
Expand All @@ -18,6 +20,13 @@ public function setUp()
$logger = new Logger();
$logger->setQuiet();
$this->manager = new ExtensionManager($logger);

VCRAdapter::enableVCR($this);
}

public function tearDown()
{
VCRAdapter::disableVCR();
}

public function testCleanExtension()
Expand Down
18 changes: 15 additions & 3 deletions tests/PhpBrew/Extension/ExtensionTest.php
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
<?php
namespace PhpBrew\Extension;
use PhpBrew\Extension\ExtensionFactory;

use PhpBrew\Testing\VCRAdapter;
use \PHPUnit\Framework\TestCase;
use PhpBrew\Extension\Extension;
use PhpBrew\Extension\M4Extension;
use PhpBrew\Extension\PeclExtension;
use PhpBrew\Extension\Extension;
use \PHPUnit\Framework\TestCase;
use PhpBrew\Extension\ExtensionFactory;

/**
* ExtensionTest
Expand All @@ -14,6 +16,16 @@
*/
class ExtensionTest extends \PHPUnit\Framework\TestCase
{
public function setUp()
{
VCRAdapter::enableVCR($this);
}

public function tearDown()
{
VCRAdapter::disableVCR();
}

/**
* We use getenv to get the path of extension directory because in data provider method
* the path member is not setup yet.
Expand Down
15 changes: 1 addition & 14 deletions tests/PhpBrew/Extension/KnownCommandTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

namespace PhpBrew\Extension;

use VCR\VCR;
use CLIFramework\Logger;
use GetOptionKit\OptionResult;
use PhpBrew\Extension\Provider\BitbucketProvider;
Expand All @@ -12,19 +11,7 @@

class KnownCommandTest extends CommandTestCase {

public function setUp() {
parent::setUp();

VCR::turnOn();
VCR::insertCassette('KnownCommandTest');
}

public function tearDown() {
parent::tearDown();

VCR::eject();
VCR::turnOff();
}
public $usesVCR = true;

public function testPeclPackage() {

Expand Down
1 change: 1 addition & 0 deletions tests/PhpBrew/VariantBuilderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

/**
* @small
* @group macosIncompatible
*/
class VariantBuilderTest extends \PHPUnit\Framework\TestCase
{
Expand Down
4 changes: 2 additions & 2 deletions tests/bootstrap.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
require __DIR__ . '/../vendor/autoload.php';

VCR::configure()
->setCassettePath(__DIR__.'/fixtures/vcr_cassettes')
->enableLibraryHooks(array('curl'))
->setCassettePath('tests/fixtures/vcr_cassettes')
->enableLibraryHooks(array('curl', 'stream_wrapper'))
->setStorage('json');
27 changes: 27 additions & 0 deletions tests/fixtures/vcr_cassettes/Downloader/DownloaderTest
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
[{
"request": {
"method": "GET",
"url": "http:\/\/httpbin.org\/",
"headers": {
"Host": "httpbin.org"
}
},
"response": {
"status": {
"http_version": "1.1",
"code": "200",
"message": "OK"
},
"headers": {
"Connection": "keep-alive",
"Server": "gunicorn\/19.9.0",
"Date": "Mon, 05 Nov 2018 03:56:04 GMT",
"Content-Type": "text\/html; charset=utf-8",
"Content-Length": "10122",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Credentials": "true",
"Via": "1.1 vegur"
},
"body": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <title>httpbin.org<\/title>\n <link href=\"https:\/\/fonts.googleapis.com\/css?family=Open+Sans:400,700|Source+Code+Pro:300,600|Titillium+Web:400,600,700\"\n rel=\"stylesheet\">\n <link rel=\"stylesheet\" type=\"text\/css\" href=\"\/flasgger_static\/swagger-ui.css\">\n <link rel=\"icon\" type=\"image\/png\" href=\"\/static\/favicon.ico\" sizes=\"64x64 32x32 16x16\" \/>\n <style>\n html {\n box-sizing: border-box;\n overflow: -moz-scrollbars-vertical;\n overflow-y: scroll;\n }\n\n *,\n *:before,\n *:after {\n box-sizing: inherit;\n }\n\n body {\n margin: 0;\n background: #fafafa;\n }\n <\/style>\n<\/head>\n\n<body>\n <a href=\"https:\/\/github.com\/requests\/httpbin\" class=\"github-corner\" aria-label=\"View source on Github\">\n <svg width=\"80\" height=\"80\" viewBox=\"0 0 250 250\" style=\"fill:#151513; color:#fff; position: absolute; top: 0; border: 0; right: 0;\"\n aria-hidden=\"true\">\n <path d=\"M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z\"><\/path>\n <path d=\"M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2\"\n fill=\"currentColor\" style=\"transform-origin: 130px 106px;\" class=\"octo-arm\"><\/path>\n <path d=\"M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z\"\n fill=\"currentColor\" class=\"octo-body\"><\/path>\n <\/svg>\n <\/a>\n <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" style=\"position:absolute;width:0;height:0\">\n <defs>\n <symbol viewBox=\"0 0 20 20\" id=\"unlocked\">\n <path d=\"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z\"><\/path>\n <\/symbol>\n\n <symbol viewBox=\"0 0 20 20\" id=\"locked\">\n <path d=\"M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z\"\n \/>\n <\/symbol>\n\n <symbol viewBox=\"0 0 20 20\" id=\"close\">\n <path d=\"M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z\"\n \/>\n <\/symbol>\n\n <symbol viewBox=\"0 0 20 20\" id=\"large-arrow\">\n <path d=\"M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z\"\n \/>\n <\/symbol>\n\n <symbol viewBox=\"0 0 20 20\" id=\"large-arrow-down\">\n <path d=\"M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z\"\n \/>\n <\/symbol>\n\n\n <symbol viewBox=\"0 0 24 24\" id=\"jump-to\">\n <path d=\"M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z\" \/>\n <\/symbol>\n\n <symbol viewBox=\"0 0 24 24\" id=\"expand\">\n <path d=\"M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z\" \/>\n <\/symbol>\n\n <\/defs>\n <\/svg>\n\n\n <div id=\"swagger-ui\">\n <div data-reactroot=\"\" class=\"swagger-ui\">\n <div>\n <div class=\"information-container wrapper\">\n <section class=\"block col-12\">\n <div class=\"info\">\n <hgroup class=\"main\">\n <h2 class=\"title\">httpbin.org\n <small>\n <pre class=\"version\">0.9.2<\/pre>\n <\/small>\n <\/h2>\n <pre class=\"base-url\">[ Base URL: httpbin.org\/ ]<\/pre>\n <\/hgroup>\n <div class=\"description\">\n <div class=\"markdown\">\n <p>A simple HTTP Request &amp; Response Service.\n <br>\n <br>\n <b>Run locally: <\/b>\n <code>$ docker run -p 80:80 kennethreitz\/httpbin<\/code>\n <\/p>\n <\/div>\n <\/div>\n <div>\n <div>\n <a href=\"https:\/\/kennethreitz.org\" target=\"_blank\">the developer - Website<\/a>\n <\/div>\n <a href=\"mailto:me@kennethreitz.org\">Send email to the developer<\/a>\n <\/div>\n <\/div>\n <!-- ADDS THE LOADER SPINNER -->\n <div class=\"loading-container\">\n <div class=\"loading\"><\/div>\n <\/div>\n\n <\/section>\n <\/div>\n <\/div>\n <\/div>\n <\/div>\n\n\n <div class='swagger-ui'>\n <div class=\"wrapper\">\n <section class=\"clear\">\n <span style=\"float: right;\">\n [Powered by\n <a target=\"_blank\" href=\"https:\/\/github.com\/rochacbruno\/flasgger\">Flasgger<\/a>]\n <br>\n <\/span>\n <\/section>\n <\/div>\n <\/div>\n\n\n\n <script src=\"\/flasgger_static\/swagger-ui-bundle.js\"> <\/script>\n <script src=\"\/flasgger_static\/swagger-ui-standalone-preset.js\"> <\/script>\n <script src='\/flasgger_static\/%20lib\/jquery.min.js' type='text\/javascript'><\/script>\n <script>\n\n window.onload = function () {\n \n\n fetch(\"\/spec.json\")\n .then(function (response) {\n response.json()\n .then(function (json) {\n var current_protocol = window.location.protocol.slice(0, -1);\n if (json.schemes[0] != current_protocol) {\n \/\/ Switches scheme to the current in use\n var other_protocol = json.schemes[0];\n json.schemes[0] = current_protocol;\n json.schemes[1] = other_protocol;\n\n }\n json.host = window.location.host; \/\/ sets the current host\n\n const ui = SwaggerUIBundle({\n spec: json,\n validatorUrl: null,\n dom_id: '#swagger-ui',\n deepLinking: true,\n jsonEditor: true,\n docExpansion: \"none\",\n apisSorter: \"alpha\",\n \/\/operationsSorter: \"alpha\",\n presets: [\n SwaggerUIBundle.presets.apis,\n \/\/ yay ES6 modules \u2198\n Array.isArray(SwaggerUIStandalonePreset) ? SwaggerUIStandalonePreset : SwaggerUIStandalonePreset.default\n ],\n plugins: [\n SwaggerUIBundle.plugins.DownloadUrl\n ],\n \n \/\/ layout: \"StandaloneLayout\" \/\/ uncomment to enable the green top header\n })\n\n window.ui = ui\n\n \/\/ uncomment to rename the top brand if layout is enabled\n \/\/ $(\".topbar-wrapper .link span\").replaceWith(\"<span>httpbin<\/span>\");\n })\n })\n}\n <\/script> \n\n<script type=\"text\/javascript\">\n var _gauges = _gauges || [];\n (function() {\n var t = document.createElement('script');\n t.type = 'text\/javascript';\n t.async = true;\n t.id = 'gauges-tracker';\n t.setAttribute('data-site-id', '58cb2e71c88d9043ac01d000');\n t.setAttribute('data-track-path', 'https:\/\/track.gaug.es\/track.gif');\n t.src = 'https:\/\/d36ee2fcip1434.cloudfront.net\/track.js';\n var s = document.getElementsByTagName('script')[0];\n s.parentNode.insertBefore(t, s);\n })();\n<\/script> <div class='swagger-ui'>\n <div class=\"wrapper\">\n <section class=\"block col-12 block-desktop col-12-desktop\">\n <div>\n\n <h2>Other Utilities<\/h2>\n\n <ul>\n <li>\n <a href=\"\/forms\/post\">HTML form<\/a> that posts to \/post \/forms\/post<\/li>\n <\/ul>\n\n <br \/>\n <br \/>\n <\/div>\n <\/section>\n <\/div>\n<\/div>\n<\/body>\n\n<\/html>"
}
}]
27 changes: 27 additions & 0 deletions tests/fixtures/vcr_cassettes/Extension/ExtensionManagerTest
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
[{
"request": {
"method": "GET",
"url": "http:\/\/pecl.php.net\/channel.xml",
"headers": {
"Host": "pecl.php.net"
}
},
"response": {
"status": {
"http_version": "1.1",
"code": "200",
"message": "OK"
},
"headers": {
"Date": "Mon, 05 Nov 2018 03:56:05 GMT",
"Server": "Apache\/2.4.25 (Debian)",
"Last-Modified": "Tue, 31 Mar 2015 07:20:08 GMT",
"Content-Length": "653",
"ETag": "\"28d-512906da9fa00\"",
"Vary": "Accept-Encoding",
"Strict-Transport-Security": "max-age=31536000",
"Content-Type": "application\/xml"
},
"body": "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n<channel version=\"1.0\" xmlns=\"http:\/\/pear.php.net\/channel-1.0\" xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\" xsi:schemaLocation=\"http:\/\/pear.php.net\/channel-1.0\nhttp:\/\/pear.php.net\/dtd\/channel-1.0.xsd\">\n <name>pecl.php.net<\/name>\n <suggestedalias>pecl<\/suggestedalias>\n <summary>PHP Extension Community Library<\/summary>\n <validatepackage version=\"1.0\">PEAR_Validator_PECL<\/validatepackage>\n <servers>\n <primary>\n <rest>\n <baseurl type=\"REST1.0\">https:\/\/pecl.php.net\/rest\/<\/baseurl>\n <baseurl type=\"REST1.1\">https:\/\/pecl.php.net\/rest\/<\/baseurl>\n <\/rest>\n <\/primary>\n <\/servers>\n<\/channel>\n"
}
}]

0 comments on commit 221fc6f

Please sign in to comment.