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