packages/ztd-query-mysql/tests/Unit/Schema/DefinitionBuilderTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Schema;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Platform\MySql\Schema\DefinitionBuilder;
10
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Schema\MySqlColumnTypeMapper::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::class)]
13#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlParser::class)]
14#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\OptionalInsertIntoNormalizer::class)]
15#[CoversClass(DefinitionBuilder::class)]
16final class DefinitionBuilderTest extends TestCase
17{
18    public function testAddColumn(): void
19    {
20        $sql = 'CREATE TABLE t (id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20))';
21        $statement = (new \ZtdQuery\Platform\MySql\Sql\MySqlParser())->parseSingleLogicalStatement($sql);
22        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\CreateStatement::class, $statement);
23        self::assertIsArray($statement->fields);
24        $builder = new DefinitionBuilder();
25        $builder->addColumn($statement->fields[0]);
26        $builder->addColumn($statement->fields[1]);
27        $definition = $builder->build([], null);
28        self::assertSame(['id', 'name'], $definition->columns);
29        self::assertSame(['id' => 'BIGINT', 'name' => 'VARCHAR(20)'], $definition->columnTypes);
30        self::assertSame(['id'], $definition->notNullColumns);
31        self::assertSame(['id'], $definition->primaryKeys);
32        self::assertSame(['id' => \ZtdQuery\Schema\Key\IdentityGenerationStrategy::MaxValue], $definition->identityStrategies);
33    }
34
35    public function testAddColumnOptions(): void
36    {
37        $sql = 'CREATE TABLE t (id INT NOT NULL UNIQUE DEFAULT 7)';
38        $statement = (new \ZtdQuery\Platform\MySql\Sql\MySqlParser())->parseSingleLogicalStatement($sql);
39        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\CreateStatement::class, $statement);
40        self::assertIsArray($statement->fields);
41        $options = $statement->fields[0]->options;
42        self::assertNotNull($options);
43        $builder = new DefinitionBuilder();
44        $builder->addColumnOptions('id', $options);
45        $definition = $builder->build([], null);
46        self::assertSame(['id'], $definition->notNullColumns);
47        self::assertSame(['id_UNIQUE' => ['id']], $definition->uniqueConstraints);
48        self::assertSame(['id' => '7'], $definition->columnDefaults);
49    }
50
51    public function testAddKey(): void
52    {
53        $sql = 'CREATE TABLE t (id INT, code INT, PRIMARY KEY (id, code), UNIQUE KEY uq (code))';
54        $statement = (new \ZtdQuery\Platform\MySql\Sql\MySqlParser())->parseSingleLogicalStatement($sql);
55        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\CreateStatement::class, $statement);
56        self::assertIsArray($statement->fields);
57        $builder = new DefinitionBuilder();
58        $builder->addKey($statement->fields[2]);
59        $builder->addKey($statement->fields[3]);
60        $definition = $builder->build([], null);
61        self::assertSame(['id', 'code'], $definition->primaryKeys);
62        self::assertSame(['uq' => ['code']], $definition->uniqueConstraints);
63    }
64
65    public function testBuild(): void
66    {
67        $foreignKey = new \ZtdQuery\Schema\Key\ForeignKeyDefinition(['pid'], 'p', ['id']);
68        $definition = (new DefinitionBuilder())->build(['fk' => $foreignKey], null);
69        self::assertSame([], $definition->columns);
70        self::assertSame(['fk' => $foreignKey], $definition->foreignKeys);
71        self::assertNull($definition->partitioning);
72    }
73
74}
75