packages/sql-faker/tests/Unit/PostgreSql/Generation/Rewrite/Column/ForeignKeyActionRuleTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\SqlFaker\PostgreSql\Generation\Rewrite\Column;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\DataProvider;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use SqlFaker\Generation\Token\ProductionOccurrence;
12use SqlFaker\Generation\Token\TerminalOccurrence;
13use SqlFaker\Generation\Token\TerminalSequence;
14use SqlFaker\PostgreSql\Generation\Rewrite\Column\ForeignKeyActionRule;
15
16#[CoversClass(ForeignKeyActionRule::class)]
17#[UsesClass(ProductionOccurrence::class)]
18#[UsesClass(TerminalOccurrence::class)]
19#[UsesClass(TerminalSequence::class)]
20final class ForeignKeyActionRuleTest extends TestCase
21{
22    #[DataProvider('providerActions')]
23    public function testRewriteOnlyUpdateColumnListsAreRemoved(string $scope, bool $columns): void
24    {
25        $action = new TerminalOccurrence('NULL_P', 10, [0, 1], [$scope, 'key_action']);
26        $column = new TerminalOccurrence('IDENT', 11, [0, 1, 2], [$scope, 'key_action', 'opt_column_list']);
27        $terminals = $columns ? [$action, $column] : [$action];
28        $input = new TerminalSequence($terminals, $terminals, [], [
29            new ProductionOccurrence(0, null, $scope, 0), new ProductionOccurrence(1, 0, 'key_action', 0),
30            new ProductionOccurrence(2, 1, 'opt_column_list', 0),
31        ]);
32        $rule = new ForeignKeyActionRule();
33        $result = $rule->rewrite($input);
34        self::assertSame($scope === 'key_update' ? [$action] : $terminals, $result->terminals);
35        self::assertSame($input->original, $result->original);
36        self::assertSame($result, $rule->rewrite($result));
37    }
38
39    /**
40     * @return iterable<array{string, bool}>
41     */
42    public static function providerActions(): iterable
43    {
44        yield ['key_update', true];
45        yield ['key_delete', true];
46        yield ['key_update', false];
47    }
48}
49