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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
<?php
declare(strict_types=1);
namespace Doctrine\DBAL\Tests\Tools\Console;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Tools\Console\Command\RunSqlCommand;
use Doctrine\DBAL\Tools\Console\ConnectionProvider\SingleConnectionProvider;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use RuntimeException;
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Tester\CommandTester;
use function method_exists;
use function str_replace;
class RunSqlCommandTest extends TestCase
{
private CommandTester $commandTester;
private RunSqlCommand $command;
private Connection&MockObject $connectionMock;
protected function setUp(): void
{
$this->connectionMock = $this->createMock(Connection::class);
$this->command = new RunSqlCommand(new SingleConnectionProvider($this->connectionMock));
if (method_exists(Application::class, 'addCommand')) {
// @phpstan-ignore method.notFound (This method will be added in Symfony 7.4)
(new Application())->addCommand($this->command);
} else {
(new Application())->add($this->command);
}
$this->commandTester = new CommandTester($this->command);
}
public function testMissingSqlArgument(): void
{
$this->expectException(RuntimeException::class);
$this->expectExceptionMessage('Argument "sql" is required in order to execute this command correctly.');
$this->commandTester->execute([
'command' => $this->command->getName(),
'sql' => null,
]);
}
public function testSelectStatementsPrintsResult(): void
{
$this->expectConnectionFetchAllAssociative();
$exitCode = $this->commandTester->execute([
'command' => $this->command->getName(),
'sql' => 'SELECT 1',
]);
self::assertSame(0, $exitCode);
self::assertStringEqualsFile(
__DIR__ . '/Fixtures/select-1.txt',
str_replace("\r\n", "\n", $this->commandTester->getDisplay()),
);
}
public function testSelectWithEmptyResultSet(): void
{
$this->connectionMock
->expects(self::once())
->method('fetchAllAssociative')
->with('SELECT foo FROM bar')
->willReturn([]);
$this->connectionMock
->expects(self::never())
->method('executeStatement');
$exitCode = $this->commandTester->execute([
'command' => $this->command->getName(),
'sql' => 'SELECT foo FROM bar',
]);
self::assertSame(0, $exitCode);
self::assertStringContainsString(
'[OK] The query yielded an empty result set.',
$this->commandTester->getDisplay(),
);
}
public function testUpdateStatementsPrintsAffectedLines(): void
{
$this->expectConnectionExecuteStatement();
$this->commandTester->execute([
'command' => $this->command->getName(),
'sql' => 'UPDATE foo SET bar = 42',
]);
self::assertStringContainsString('[OK] 42 rows affected.', $this->commandTester->getDisplay(true));
}
private function expectConnectionExecuteStatement(): void
{
$this->connectionMock
->expects(self::once())
->method('executeStatement')
->willReturn(42);
$this->connectionMock
->expects(self::never())
->method('fetchAllAssociative');
}
private function expectConnectionFetchAllAssociative(): void
{
$this->connectionMock
->expects(self::once())
->method('fetchAllAssociative')
->willReturn([[1]]);
$this->connectionMock
->expects(self::never())
->method('executeStatement');
}
public function testStatementsWithFetchResultPrintsResult(): void
{
$this->expectConnectionFetchAllAssociative();
$this->commandTester->execute([
'command' => $this->command->getName(),
'sql' => '"WITH bar as (SELECT 1) SELECT * FROM bar',
'--force-fetch' => true,
]);
self::assertStringEqualsFile(
__DIR__ . '/Fixtures/select-1.txt',
str_replace("\r\n", "\n", $this->commandTester->getDisplay()),
);
}
}
|