packages/ztd-query-core/tests/Unit/Shadow/CascadedChildrenTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Shadow;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Shadow\CascadedChildren;
11use ZtdQuery\Shadow\Row\RowChange;
12
13#[CoversClass(CascadedChildren::class)]
14#[UsesClass(RowChange::class)]
15#[UsesClass(\ZtdQuery\Schema\RowSet::class)]
16final class CascadedChildrenTest extends TestCase
17{
18 public function testRowsAnswersWhatTheCascadeWasGivenWhereItReachedNothing(): void
19 {
20 self::assertSame([['id' => 1]], (new CascadedChildren([['id' => 1]]))->rows());
21 }
22
23 public function testReplaceWritesTheRowAndRecordsWhatItWas(): void
24 {
25 $children = new CascadedChildren([['id' => 1], ['id' => 2]]);
26
27 $children->replace(1, ['id' => 9]);
28
29 self::assertSame(
30 [[['id' => 1], ['id' => 9]], [[['id' => 2], ['id' => 9]]]],
31 [
32 $children->rows(),
33 [[$children->updated()[0]->before, $children->updated()[0]->after]],
34 ],
35 );
36 }
37
38 public function testRemoveDropsThoseRowsAndKeepsTheRestInOrder(): void
39 {
40 $children = new CascadedChildren([['id' => 1], ['id' => 2], ['id' => 3]]);
41
42 $children->remove([0, 2]);
43
44 self::assertSame(
45 [[['id' => 2]], [['id' => 1], ['id' => 3]]],
46 [$children->rows(), $children->deleted()],
47 );
48 }
49
50 public function testDeletedAnswersNothingWhereNoRowWent(): void
51 {
52 self::assertSame([], (new CascadedChildren([['id' => 1]]))->deleted());
53 }
54
55 public function testUpdatedAnswersNothingWhereNoRowChanged(): void
56 {
57 self::assertSame([], (new CascadedChildren([['id' => 1]]))->updated());
58 }
59
60 public function testAreUnchangedSaysWhetherTheCascadeReachedTheTableAtAll(): void
61 {
62 $reached = new CascadedChildren([['id' => 1]]);
63 $reached->remove([0]);
64
65 self::assertSame([true, false], [(new CascadedChildren([['id' => 1]]))->areUnchanged(), $reached->areUnchanged()]);
66 }
67}
68