packages/ztd-query-postgres/tests/Unit/Schema/Key/DefinitionEntryTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Schema\Key;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9
10#[CoversClass(\ZtdQuery\Platform\Postgres\Schema\Key\DefinitionEntry::class)]
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Schema\Key\DefinitionTokens::class)]
13final class DefinitionEntryTest extends TestCase
14{
15 public function testParseEntry(): void
16 {
17 $sql = 'FOREIGN KEY (parent_id) REFERENCES parents (id) ON DELETE CASCADE';
18 $stream = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create());
19 $tokens = $stream->significantTokens();
20
21 self::assertEquals(['name' => 'fk_parent', 'foreignKey' => new \ZtdQuery\Schema\Key\ForeignKeyDefinition(columns: ['parent_id'], referencedTable: 'parents', referencedColumns: ['id'], onDelete: \ZtdQuery\Schema\Key\ReferentialAction::Cascade, onUpdate: \ZtdQuery\Schema\Key\ReferentialAction::NoAction)], (new \ZtdQuery\Platform\Postgres\Schema\Key\DefinitionEntry())->parseEntry($stream, 'fk_parent', null));
22 }
23
24 public function testForeignKeyColumns(): void
25 {
26 $sql = 'FOREIGN KEY (parent_id) REFERENCES parents (id) ON DELETE CASCADE';
27 $stream = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create());
28 $tokens = $stream->significantTokens();
29
30 self::assertSame(['parent_id'], (new \ZtdQuery\Platform\Postgres\Schema\Key\DefinitionEntry())->foreignKeyColumns($stream, $tokens, 5));
31 }
32
33 public function testReferencedRelation(): void
34 {
35 $sql = 'FOREIGN KEY (parent_id) REFERENCES parents (id) ON DELETE CASCADE';
36 $stream = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create());
37 $tokens = $stream->significantTokens();
38
39 self::assertSame(['table' => 'parents', 'columns' => ['id']], (new \ZtdQuery\Platform\Postgres\Schema\Key\DefinitionEntry())->referencedRelation($stream, $tokens, 6));
40 }
41
42 public function testIdentifierList(): void
43 {
44 $sql = 'FOREIGN KEY (parent_id) REFERENCES parents (id) ON DELETE CASCADE';
45 $stream = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create());
46 $tokens = $stream->significantTokens();
47
48 self::assertSame(['parent_id'], (new \ZtdQuery\Platform\Postgres\Schema\Key\DefinitionEntry())->identifierList($stream, $tokens, 2));
49 }
50
51 public function testAction(): void
52 {
53 $sql = 'FOREIGN KEY (parent_id) REFERENCES parents (id) ON DELETE CASCADE';
54 $stream = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create());
55 $tokens = $stream->significantTokens();
56
57 self::assertSame(\ZtdQuery\Schema\Key\ReferentialAction::Cascade, (new \ZtdQuery\Platform\Postgres\Schema\Key\DefinitionEntry())->action($tokens, 'DELETE'));
58 }
59}
60