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