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