packages/ztd-query-mysql/tests/Unit/Shadow/Mutation/Table/Alter/PrimaryKeyAlterationTest.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 ZtdQuery\Platform\MySql\Shadow\Mutation\Table\Alter\PrimaryKeyAlteration;
10
11#[CoversClass(PrimaryKeyAlteration::class)]
12final class PrimaryKeyAlterationTest extends TestCase
13{
14    public function testApplyAddPrimaryKey(): void
15    {
16        $create = (new \PhpMyAdmin\SqlParser\Parser('CREATE TABLE t (id INT, code INT)'))->statements[0];
17        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\CreateStatement::class, $create);
18        $alter = (new \PhpMyAdmin\SqlParser\Parser('ALTER TABLE t ADD PRIMARY KEY (`id`, `code`)'))->statements[0];
19        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\AlterStatement::class, $alter);
20        self::assertNotNull($alter->altered);
21        $op = $alter->altered[0];
22        (new PrimaryKeyAlteration())->applyAddPrimaryKey($create, $op);
23        self::assertIsArray($create->fields);
24        self::assertCount(3, $create->fields);
25        self::assertNotNull($create->fields[2]->key);
26        self::assertSame('PRIMARY KEY', $create->fields[2]->key->type);
27        self::assertSame([['name' => 'id'], ['name' => 'code']], $create->fields[2]->key->columns);
28    }
29
30    public function testApplyDropPrimaryKey(): void
31    {
32        $create = (new \PhpMyAdmin\SqlParser\Parser('CREATE TABLE t (id INT PRIMARY KEY, code INT, PRIMARY KEY (code))'))->statements[0];
33        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\CreateStatement::class, $create);
34        (new PrimaryKeyAlteration())->applyDropPrimaryKey($create);
35        self::assertIsArray($create->fields);
36        self::assertCount(2, $create->fields);
37        self::assertNotNull($create->fields[0]->options);
38        self::assertFalse($create->fields[0]->options->has('PRIMARY KEY'));
39    }
40
41}
42