File size: 2,913 Bytes
bf8c0ce | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | <?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Tests\Framework\TestCase;
use Piwik\Console;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Tester\ApplicationTester;
/**
* This class is used to workaround a Symfony issue. For tests that need to test interactivity,
* we need to create a memory stream, set it as the input stream, and force symfony to think it
* is truly interactive. The forcing is done by ApplicationTester. Unfortunately, the Application::configureIO
* method will reverse this change if the `posix_isatty` method exists. It will call it on the stream,
* and since the stream will never be an actual tty, the interactivity will be overwritten.
*
* This class gets whether the input is interactive before configureIO is called, and restores
* it after the method is called.
*/
class TestConsole extends Console
{
protected function configureIO(InputInterface $input, OutputInterface $output)
{
$isInteractive = $input->isInteractive();
parent::configureIO($input, $output);
$input->setInteractive($isInteractive);
}
}
/**
* Base class for test cases that test Piwik console commands. Derives from SystemTestCase
* so the entire Piwik environment is set up.
*
* This will create an ApplicationTester instance (provided by Symfony) which should be used to
* test commands like this:
*
* public function testThisAndThat()
* {
* $result = $this->applicationTester->run(array(
* 'command' => 'my-command',
* 'arg1' => 'value1',
* 'arg2' => 'value2',
* '--option' => true,
* '--another-option' => 'value3'
* ));
* $this->assertEquals(0, $result, $this->getCommandDisplayOutputErrorMessage());
*
* // other checks
* }
*
* @since 2.8.0
*/
class ConsoleCommandTestCase extends SystemTestCase
{
/**
* @var ApplicationTester
*/
protected $applicationTester = null;
/**
* @var Console
*/
protected $application;
public function setUp(): void
{
parent::setUp();
$this->application = new TestConsole(self::$fixture->piwikEnvironment);
$this->application->setAutoExit(false);
$this->applicationTester = new ApplicationTester($this->application);
}
protected function getCommandDisplayOutputErrorMessage()
{
return "Command did not behave as expected. Command output: " . $this->applicationTester->getDisplay();
}
protected function getInputStream($input)
{
$stream = fopen('php://memory', 'r+', false);
fputs($stream, $input);
rewind($stream);
return $stream;
}
}
|