packages/ztd-query-sqlite/tests/Unit/Shadow/Mutation/Table/Alter/DropColumnResolverTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Shadow\Mutation\Table\Alter;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Platform\Sqlite\Shadow\Mutation\Table\Alter\DropColumnResolver;
11use ZtdQuery\Platform\Sqlite\Shadow\Mutation\Table\AlterTableMutation;
12use ZtdQuery\Schema\Key\ForeignKeyDefinition;
13use ZtdQuery\Schema\TableDefinition;
14use ZtdQuery\Schema\TableDefinitionRegistry;
15use ZtdQuery\Shadow\ShadowStore;
16
17#[CoversClass(DropColumnResolver::class)]
18#[UsesClass(AlterTableMutation::class)]
19#[UsesClass(\ZtdQuery\Platform\Sqlite\Shadow\Mutation\Table\Alter\AlteredTableProjection::class)]
20#[UsesClass(\ZtdQuery\Platform\Sqlite\Shadow\Mutation\Table\Alter\ColumnDefinitionEditor::class)]
21#[UsesClass(\ZtdQuery\Platform\Sqlite\Shadow\Resolution\MutationTableLookup::class)]
22#[UsesClass(\ZtdQuery\Platform\Sqlite\Sql\Alter\AlterOperationParser::class)]
23#[UsesClass(\ZtdQuery\Platform\Sqlite\Sql\SqliteIdentifierQuoter::class)]
24#[UsesClass(\ZtdQuery\Platform\Sqlite\Sql\SqliteLexerProfile::class)]
25final class DropColumnResolverTest extends TestCase
26{
27 public function testResolveAlterDropColumnProjectsRemainingRows(): void
28 {
29 $registry = new TableDefinitionRegistry();
30 $definition = new TableDefinition(['id', 'name'], ['id' => 'INTEGER', 'name' => 'TEXT'], ['id'], ['id'], []);
31 $registry->register('users', $definition);
32 $store = new ShadowStore();
33 $store->set('users', [['id' => 1, 'name' => 'Alice']]);
34 $mutation = (new DropColumnResolver($registry))->resolveAlterDropColumn('ALTER TABLE users DROP COLUMN NAME', 'users', 'NAME');
35 self::assertInstanceOf(AlterTableMutation::class, $mutation);
36 self::assertSame('SELECT "id" FROM "users"', $mutation->resultSelect());
37 $mutation->apply($store, [['id' => 1]]);
38 self::assertSame(['id'], $registry->get('users')?->columns);
39 self::assertSame([['id' => 1]], $store->get('users'));
40 }
41
42 public function testResolveAlterDropColumnRejectsMissingColumn(): void
43 {
44 $registry = new TableDefinitionRegistry();
45 $definition = new TableDefinition(['id', 'name'], ['id' => 'INTEGER', 'name' => 'TEXT'], ['id'], ['id'], []);
46 $registry->register('users', $definition);
47 $store = new ShadowStore();
48 $store->set('users', [['id' => 1, 'name' => 'Alice']]);
49 $this->expectException(\ZtdQuery\Exception\ColumnNotFoundException::class);
50 (new DropColumnResolver($registry))->resolveAlterDropColumn('ALTER TABLE users DROP COLUMN missing', 'users', 'missing');
51 }
52
53 public function testDefinitionWithoutColumnRemovesAllDependentMetadata(): void
54 {
55 $definition = new TableDefinition(
56 ['id', 'parent'],
57 ['id' => 'INTEGER', 'parent' => 'INTEGER'],
58 ['id'],
59 ['parent'],
60 ['parent_key' => ['parent'], 'composite' => ['id', 'parent']],
61 ['parent' => new \ZtdQuery\Schema\ColumnDeclaration(\ZtdQuery\Schema\ColumnTypeFamily::INTEGER, 'INTEGER')],
62 ['parent' => '0'],
63 ['parent' => \ZtdQuery\Schema\Key\IdentityGenerationStrategy::MaxValue],
64 ['parent' => '(id * 2)'],
65 ['fk' => new ForeignKeyDefinition(['parent'], 'other', ['id'])],
66 );
67 $result = (new DropColumnResolver(new TableDefinitionRegistry()))->definitionWithoutColumn($definition, 'parent');
68 self::assertSame(['id'], $result->columns);
69 self::assertSame(['id' => 'INTEGER'], $result->columnTypes);
70 self::assertSame(['id'], $result->primaryKeys);
71 self::assertSame([], $result->notNullColumns);
72 self::assertSame(['composite' => ['id']], $result->uniqueConstraints);
73 self::assertSame([], $result->typedColumns);
74 self::assertSame([], $result->columnDefaults);
75 self::assertSame([], $result->identityStrategies);
76 self::assertSame([], $result->generatedExpressions);
77 self::assertSame([], $result->foreignKeys);
78 }
79
80}
81