packages/ztd-query-core/tests/Unit/Shadow/ForeignKeyEndsTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Shadow;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Schema\Key\ForeignKeyDefinition;
11use ZtdQuery\Schema\TableDefinition;
12use ZtdQuery\Schema\TableDefinitionRegistry;
13use ZtdQuery\Shadow\ForeignKeyEnds;
14
15#[CoversClass(ForeignKeyEnds::class)]
16#[UsesClass(ForeignKeyDefinition::class)]
17#[UsesClass(TableDefinition::class)]
18#[UsesClass(TableDefinitionRegistry::class)]
19final class ForeignKeyEndsTest extends TestCase
20{
21    public function testReferencedColumnsAnswersTheColumnsTheKeyNames(): void
22    {
23        $ends = new ForeignKeyEnds(new TableDefinitionRegistry());
24        $foreignKey = new ForeignKeyDefinition(['order_id'], 'order', ['id']);
25
26        self::assertSame(['id'], $ends->referencedColumns($foreignKey));
27    }
28
29    public function testReferencedColumnsFallsBackToTheParentsPrimaryKey(): void
30    {
31        $registry = new TableDefinitionRegistry();
32        $registry->register('order', new TableDefinition(['id', 'total'], [], ['id'], [], []));
33        $ends = new ForeignKeyEnds($registry);
34
35        self::assertSame(['id'], $ends->referencedColumns(new ForeignKeyDefinition(['order_id'], 'order', [])));
36    }
37
38    public function testReferencedColumnsIsEmptyWhereTheParentIsUnknown(): void
39    {
40        $ends = new ForeignKeyEnds(new TableDefinitionRegistry());
41
42        self::assertSame([], $ends->referencedColumns(new ForeignKeyDefinition(['order_id'], 'order', [])));
43    }
44
45    public function testAreBalancedWhenBothEndsNameTheSameNumberOfColumns(): void
46    {
47        $ends = new ForeignKeyEnds(new TableDefinitionRegistry());
48
49        self::assertTrue($ends->areBalanced(new ForeignKeyDefinition(['order_id'], 'order', ['id'])));
50    }
51
52    public function testAreBalancedIsFalseWhereTheEndsDisagree(): void
53    {
54        $ends = new ForeignKeyEnds(new TableDefinitionRegistry());
55
56        self::assertFalse($ends->areBalanced(new ForeignKeyDefinition(['shop_id', 'no'], 'order', ['id'])));
57    }
58}
59