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