silverstripe-framework/tests/php/Cli/Command/NavigateCommandTest.php

100 lines
3.5 KiB
PHP

<?php
namespace SilverStripe\Cli\Tests\Command;
use PHPUnit\Framework\Attributes\DataProvider;
use SilverStripe\Cli\Command\NavigateCommand;
use SilverStripe\Cli\Tests\Command\NavigateCommandTest\TestController;
use SilverStripe\Control\Director;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\PolyExecution\PolyOutput;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
class NavigateCommandTest extends SapphireTest
{
protected $usesDatabase = true;
public static function provideExecute(): array
{
return [
[
'path' => 'missing-route',
'getVars' => [],
'expectedExitCode' => 2,
'expectedOutput' => '',
],
[
'path' => 'test-controller',
'getVars' => [],
'expectedExitCode' => 0,
'expectedOutput' => 'This is the index for TestController.' . PHP_EOL,
],
[
'path' => 'test-controller/actionOne',
'getVars' => [],
'expectedExitCode' => 0,
'expectedOutput' => 'This is action one!' . PHP_EOL,
],
[
'path' => 'test-controller/errorResponse',
'getVars' => [],
'expectedExitCode' => 1,
'expectedOutput' => '',
],
[
'path' => 'test-controller/missing-action',
'getVars' => [],
'expectedExitCode' => 2,
'expectedOutput' => '',
],
[
'path' => 'test-controller',
'getVars' => [
'var1=1',
'var2=abcd',
'var3=',
'var4[]=a',
'var4[]=b',
'var4[]=c',
],
'expectedExitCode' => 0,
'expectedOutput' => 'This is the index for TestController. var1=1 var2=abcd var4=a,b,c' . PHP_EOL,
],
[
'path' => 'test-controller',
'getVars' => [
'var1=1&var2=abcd&var3=&var4[]=a&var4[]=b&var4[]=c',
],
'expectedExitCode' => 0,
'expectedOutput' => 'This is the index for TestController. var1=1 var2=abcd var4=a,b,c' . PHP_EOL,
],
];
}
#[DataProvider('provideExecute')]
public function testExecute(string $path, array $getVars, int $expectedExitCode, string $expectedOutput): void
{
// Intentionally override existing rules
Director::config()->set('rules', ['test-controller' => TestController::class]);
$navigateCommand = new NavigateCommand();
$inputParams = [
'path' => $path,
'get-vars' => $getVars,
];
$input = new ArrayInput($inputParams, $navigateCommand->getDefinition());
$input->setInteractive(false);
$buffer = new BufferedOutput();
$output = new PolyOutput(PolyOutput::FORMAT_ANSI, decorated: false, wrappedOutput: $buffer);
$exitCode = $navigateCommand->run($input, $output);
// Don't asset specific output for failed or invalid responses
// The response body for those is handled outside of the navigate command's control
if ($expectedExitCode === 0) {
$this->assertSame($expectedOutput, $buffer->fetch());
}
$this->assertSame($expectedExitCode, $exitCode);
}
}