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