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