Welcome to mirror list, hosted at ThFree Co, Russian Federation.

ConsoleCommandTestCase.php « TestCase « Framework « PHPUnit « tests - github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: d0f60d1e098a969d9fdd61fdd2a06f215c182956 (plain)
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;
    }
}