packages/ztd-query-core/tests/Unit/Shadow/Mutation/Row/MultiTableMutationTargetTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Shadow\Mutation\Row;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Shadow\Mutation\Row\MultiTableMutationTarget;
10
11#[CoversClass(MultiTableMutationTarget::class)]
12final class MultiTableMutationTargetTest extends TestCase
13{
14 public function testTableNameColumnsAndPrimaryKeysAreWhatTheTargetWasWrittenAs(): void
15 {
16 $target = new MultiTableMutationTarget('users', ['id', 'name'], [3 => 'id']);
17
18 self::assertSame('users', $target->tableName());
19 self::assertSame(['id', 'name'], $target->columns());
20 self::assertSame(['id'], $target->primaryKeys());
21 self::assertSame(['id'], $target->matchColumns());
22 }
23
24 public function testUsesAllColumnsForMatchingWithoutPrimaryKey(): void
25 {
26 $target = new MultiTableMutationTarget('logs', [2 => 'message', 4 => 'created_at'], []);
27
28 self::assertSame(['message', 'created_at'], $target->columns());
29 self::assertSame(['message', 'created_at'], $target->matchColumns());
30 }
31
32 public function testMatchColumnsAreTheKeyColumnsWhereTheTableDeclaresOne(): void
33 {
34 $target = new MultiTableMutationTarget('users', ['id', 'name'], ['id']);
35
36 self::assertSame(['id'], $target->matchColumns());
37 }
38
39 public function testMatchColumnsFallBackToEveryColumnWhereTheTableDeclaresNoKey(): void
40 {
41 $target = new MultiTableMutationTarget('users', ['id', 'name'], []);
42
43 self::assertSame(['id', 'name'], $target->matchColumns());
44 }
45
46 public function testColumnsAreTheColumnsTheStatementWrites(): void
47 {
48 $target = new MultiTableMutationTarget('users', ['id', 'name'], ['id']);
49
50 self::assertSame(['id', 'name'], $target->columns());
51 }
52 public function testPrimaryKeysAnswersTheColumnsThatIdentifyOneOfItsRows(): void
53 {
54 $target = new MultiTableMutationTarget('users', ['id', 'name'], ['id']);
55
56 self::assertSame(['id'], $target->primaryKeys());
57 }
58
59 public function testPrimaryKeysIsNothingWhereTheTableDeclaresNoKey(): void
60 {
61 $target = new MultiTableMutationTarget('logs', ['message'], []);
62
63 self::assertSame([], $target->primaryKeys());
64 }
65
66}
67