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