packages/ztd-query-core/tests/Unit/Shadow/Mutation/Row/MultiDeleteMutationTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Shadow\Mutation\Row;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Shadow\Mutation\Row\MultiDeleteMutation;
11use ZtdQuery\Shadow\Mutation\Row\MultiTableMutationRow;
12use ZtdQuery\Shadow\Mutation\Row\MultiTableMutationTarget;
13use ZtdQuery\Shadow\ShadowStore;
14
15#[UsesClass(ShadowStore::class)]
16#[UsesClass(MultiTableMutationRow::class)]
17#[UsesClass(MultiTableMutationTarget::class)]
18#[CoversClass(MultiDeleteMutation::class)]
19#[UsesClass(\ZtdQuery\Shadow\Row\RowMatch::class)]
20#[UsesClass(\ZtdQuery\Schema\RowSet::class)]
21final class MultiDeleteMutationTest extends TestCase
22{
23 public function testApplyDeletesFromMultipleTables(): void
24 {
25 $store = new ShadowStore();
26 $store->set('users', [
27 ['id' => 1, 'name' => 'Alice'],
28 ['id' => 2, 'name' => 'Bob'],
29 ]);
30 $store->set('profiles', [
31 ['user_id' => 1, 'bio' => 'Alice bio'],
32 ['user_id' => 2, 'bio' => 'Bob bio'],
33 ]);
34
35 $mutation = new MultiDeleteMutation([
36 new MultiTableMutationTarget('users', ['id', 'name'], ['id']),
37 new MultiTableMutationTarget('profiles', ['user_id', 'bio'], ['user_id']),
38 ]);
39
40 $mutation->apply($store, [
41 ['__ztd_multi_0_value_0' => 1, '__ztd_multi_1_value_0' => 1],
42 ]);
43
44 self::assertSame([['id' => 2, 'name' => 'Bob']], $store->get('users'));
45 self::assertSame([['user_id' => 2, 'bio' => 'Bob bio']], $store->get('profiles'));
46 }
47
48 public function testTableNameReturnsPrimaryTable(): void
49 {
50 $mutation = new MultiDeleteMutation([
51 new MultiTableMutationTarget('users', ['id'], ['id']),
52 new MultiTableMutationTarget('profiles', ['user_id'], ['user_id']),
53 ]);
54
55 self::assertSame('users', $mutation->tableName());
56 }
57
58 public function testTableNamesReturnsAllTableNames(): void
59 {
60 $mutation = new MultiDeleteMutation([
61 new MultiTableMutationTarget('users', ['id'], ['id']),
62 new MultiTableMutationTarget('profiles', ['user_id'], ['user_id']),
63 new MultiTableMutationTarget('settings', ['user_id'], ['user_id']),
64 ]);
65
66 self::assertSame(['users', 'profiles', 'settings'], $mutation->tableNames());
67 }
68
69 public function testApplyWithEmptyTablesReturnsEmptyPrimaryTable(): void
70 {
71 $mutation = new MultiDeleteMutation([]);
72
73 self::assertSame('', $mutation->tableName());
74 }
75
76 public function testApplyDeletesMultipleRowsFromMultipleTables(): void
77 {
78 $store = new ShadowStore();
79 $store->set('users', [
80 ['id' => 1, 'name' => 'Alice'],
81 ['id' => 2, 'name' => 'Bob'],
82 ['id' => 3, 'name' => 'Carol'],
83 ]);
84 $store->set('orders', [
85 ['order_id' => 10, 'user_id' => 1],
86 ['order_id' => 20, 'user_id' => 2],
87 ['order_id' => 30, 'user_id' => 3],
88 ]);
89
90 $mutation = new MultiDeleteMutation([
91 new MultiTableMutationTarget('users', ['id', 'name'], ['id']),
92 new MultiTableMutationTarget('orders', ['order_id', 'user_id'], ['user_id']),
93 ]);
94
95 $mutation->apply($store, [
96 ['__ztd_multi_0_value_0' => 1, '__ztd_multi_1_value_0' => 1],
97 ['__ztd_multi_0_value_0' => 3, '__ztd_multi_1_value_0' => 3],
98 ]);
99
100 self::assertSame([['id' => 2, 'name' => 'Bob']], $store->get('users'));
101 self::assertSame([['order_id' => 20, 'user_id' => 2]], $store->get('orders'));
102 }
103}
104