packages/ztd-query-core/tests/Unit/Shadow/Mutation/ShadowMutationTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Shadow\Mutation;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use Tests\Contract\MutationContractTest;
10use ZtdQuery\Schema\Key\CandidateKeySet;
11use ZtdQuery\Shadow\Mutation\MutationRowIdentity;
12use ZtdQuery\Shadow\Mutation\Row\DeleteMutation;
13use ZtdQuery\Shadow\Mutation\Row\InsertMutation;
14use ZtdQuery\Shadow\Mutation\Row\UpdateMutation;
15use ZtdQuery\Shadow\Mutation\Table\TruncateMutation;
16use ZtdQuery\Shadow\ShadowStore;
17
18#[CoversClass(InsertMutation::class)]
19#[CoversClass(DeleteMutation::class)]
20#[CoversClass(UpdateMutation::class)]
21#[CoversClass(TruncateMutation::class)]
22#[UsesClass(ShadowStore::class)]
23#[UsesClass(MutationRowIdentity::class)]
24#[UsesClass(CandidateKeySet::class)]
25#[UsesClass(\ZtdQuery\Shadow\Mutation\ConflictSearch::class)]
26#[UsesClass(\ZtdQuery\Shadow\Mutation\RowConstraints::class)]
27#[UsesClass(\ZtdQuery\Shadow\Row\RowMatch::class)]
28#[UsesClass(\ZtdQuery\Schema\RowSet::class)]
29final class ShadowMutationTest extends MutationContractTest
30{
31    public function initialRows(): array
32    {
33        return [
34            ['id' => 1, 'name' => 'Alice', 'email' => 'alice@example.com'],
35            ['id' => 2, 'name' => 'Bob', 'email' => 'bob@example.com'],
36            ['id' => 3, 'name' => 'Charlie', 'email' => 'charlie@example.com'],
37        ];
38    }
39
40    public function insertRows(): array
41    {
42        return [
43            ['id' => 4, 'name' => 'Diana', 'email' => 'diana@example.com'],
44            ['id' => 5, 'name' => 'Eve', 'email' => 'eve@example.com'],
45        ];
46    }
47
48    public function deleteRows(): array
49    {
50        return [
51            ['id' => 1, 'name' => 'Alice', 'email' => 'alice@example.com'],
52        ];
53    }
54
55    public function updateRows(): array
56    {
57        return [
58            ['id' => 2, 'name' => 'Bobby', 'email' => 'bobby@example.com'],
59        ];
60    }
61
62    public function primaryKeys(): array
63    {
64        return ['id'];
65    }
66    public function testApplyWritesWhatTheStatementDidIntoTheShadow(): void
67    {
68        $store = new ShadowStore();
69        $store->set('users', $this->initialRows());
70
71        (new InsertMutation('users'))->apply($store, $this->insertRows());
72
73        self::assertCount(count($this->initialRows()) + count($this->insertRows()), $store->get('users'));
74    }
75
76    public function testTableNameAnswersTheTableTheStatementWrites(): void
77    {
78        self::assertSame('users', (new InsertMutation('users'))->tableName());
79    }
80
81}
82