packages/ztd-query-sqlite/tests/Unit/Shadow/Mutation/Table/Alter/ColumnDefinitionEditorTest.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\TestCase;
9use stdClass;
10use ZtdQuery\Platform\Sqlite\Shadow\Mutation\Table\Alter\ColumnDefinitionEditor;
11use ZtdQuery\Schema\Key\ForeignKeyDefinition;
12use ZtdQuery\Schema\Key\ReferentialAction;
13
14#[CoversClass(ColumnDefinitionEditor::class)]
15final class ColumnDefinitionEditorTest extends TestCase
16{
17    public function testWithoutColumnRemovesAllMatchesAndReindexes(): void
18    {
19        self::assertSame(['b', 'c'], ColumnDefinitionEditor::withoutColumn([3 => 'a', 4 => 'b', 5 => 'a', 8 => 'c'], 'a'));
20        self::assertSame(['a'], ColumnDefinitionEditor::withoutColumn(['a'], 'A'));
21    }
22
23    public function testWithoutMapKeyPreservesOtherValuesAndOrder(): void
24    {
25        $value = new stdClass();
26        self::assertSame(['a' => $value, 'c' => 3], ColumnDefinitionEditor::withoutMapKey(['a' => $value, 'b' => 2, 'c' => 3], 'b'));
27    }
28
29    public function testRenamedColumnsPreservesOrderAndUntouchedNames(): void
30    {
31        self::assertSame(['new', 'keep', 'new'], ColumnDefinitionEditor::renamedColumns(['old', 'keep', 'old'], 'old', 'new'));
32    }
33
34    public function testRenamedForeignKeyPreservesReferencedRelationAndActions(): void
35    {
36        $original = new ForeignKeyDefinition(['tenant', 'parent'], 'other', ['tenant', 'id'], ReferentialAction::Cascade, ReferentialAction::SetDefault);
37        $renamed = ColumnDefinitionEditor::renamedForeignKey($original, 'parent', 'parent_id');
38        self::assertSame(['tenant', 'parent_id'], $renamed->columns);
39        self::assertSame('other', $renamed->referencedTable);
40        self::assertSame(['tenant', 'id'], $renamed->referencedColumns);
41        self::assertSame(ReferentialAction::Cascade, $renamed->onDelete);
42        self::assertSame(ReferentialAction::SetDefault, $renamed->onUpdate);
43        self::assertSame(['tenant', 'parent'], $original->columns);
44    }
45
46    public function testRenamedMapKeyPreservesValuesAndInsertionOrder(): void
47    {
48        $value = new stdClass();
49        self::assertSame(['new' => $value, 'keep' => 2], ColumnDefinitionEditor::renamedMapKey(['old' => $value, 'keep' => 2], 'old', 'new'));
50    }
51
52}
53