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