packages/ztd-query-sqlite/tests/Unit/Sql/Alter/AlterOperationParserTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql\Alter;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Platform\Sqlite\Sql\Alter\AlterOperationParser;
11use ZtdQuery\Platform\Sqlite\Sql\SqliteLexerProfile;
12use ZtdQuery\Sql\SqlTokenStream;
13
14#[CoversClass(AlterOperationParser::class)]
15#[UsesClass(SqliteLexerProfile::class)]
16final class AlterOperationParserTest extends TestCase
17{
18 public function testAlterOperationDecodesSupportedChanges(): void
19 {
20 $parser = new AlterOperationParser();
21 self::assertSame(['kind' => 'add', 'clause' => 'name TEXT'], $parser->alterOperation('ALTER TABLE users ADD COLUMN name TEXT;'));
22 self::assertSame(['kind' => 'drop', 'clause' => 'name'], $parser->alterOperation('ALTER TABLE users DROP COLUMN name'));
23 self::assertSame(['kind' => 'rename_table', 'clause' => 'people'], $parser->alterOperation('ALTER TABLE users RENAME TO people'));
24 self::assertSame(['kind' => 'rename_column', 'clause' => 'name TO label'], $parser->alterOperation('ALTER TABLE users RENAME COLUMN name TO label'));
25 self::assertNull($parser->alterOperation('ALTER TABLE users DROP name'));
26 self::assertNull($parser->alterOperation('ALTER TABLE users'));
27 self::assertNull($parser->alterOperation('ALTER TABLE'));
28 }
29
30 public function testAlterClauseExcludesTrailingSemicolon(): void
31 {
32 $sql = 'ALTER TABLE users ADD name TEXT;';
33 $parser = new AlterOperationParser();
34 self::assertSame(['kind' => 'add', 'clause' => 'name TEXT'], $parser->alterClause($sql, SqlTokenStream::tokenize($sql, SqliteLexerProfile::create())->significantTokens(), 'add', 4));
35 self::assertNull($parser->alterClause($sql, [], 'add', 0));
36 }
37
38 public function testSingleIdentifierRequiresNoTrailingSyntax(): void
39 {
40 $parser = new AlterOperationParser();
41 self::assertSame('full name', $parser->singleIdentifier('"full name"'));
42 self::assertNull($parser->singleIdentifier('name extra'));
43 self::assertNull($parser->singleIdentifier(''));
44 }
45
46 public function testRenamedIdentifiersRequiresTwoNamesAndTo(): void
47 {
48 $parser = new AlterOperationParser();
49 self::assertSame(['old name', 'new name'], $parser->renamedIdentifiers('"old name" TO "new name"'));
50 self::assertNull($parser->renamedIdentifiers('old TO'));
51 self::assertNull($parser->renamedIdentifiers('old FROM new'));
52 self::assertNull($parser->renamedIdentifiers('old TO new extra'));
53 self::assertNull($parser->renamedIdentifiers(''));
54 }
55
56}
57