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
|
<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Tests\Framework\TestCase;
use Piwik\Console;
use Symfony\Component\Console\Application;
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;
}
}
|