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