packages/ztd-query-core/tests/Unit/Shadow/ShadowSavepointTest.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\Schema\ColumnDeclaration;
11use ZtdQuery\Schema\TableDefinition;
12use ZtdQuery\Schema\TableDefinitionRegistry;
13use ZtdQuery\Shadow\ShadowSavepoint;
14use ZtdQuery\Shadow\ShadowStore;
15
16#[CoversClass(ShadowSavepoint::class)]
17#[UsesClass(ShadowStore::class)]
18#[UsesClass(TableDefinition::class)]
19#[UsesClass(TableDefinitionRegistry::class)]
20#[UsesClass(ColumnDeclaration::class)]
21#[UsesClass(\ZtdQuery\Schema\RowSet::class)]
22final class ShadowSavepointTest extends TestCase
23{
24    public function testOfRemembersTheRowsAsTheyWereRatherThanAsTheyBecome(): void
25    {
26        $store = new ShadowStore();
27        $store->set('order', [['id' => 1]]);
28
29        $savepoint = ShadowSavepoint::of(null, $store, null);
30        $store->set('order', [['id' => 2]]);
31        $savepoint->restoreInto($store, null);
32
33        self::assertSame([['id' => 1]], $store->get('order'));
34    }
35
36    public function testOfRemembersWhichTablesThereWere(): void
37    {
38        $store = new ShadowStore();
39        $registry = new TableDefinitionRegistry();
40        $registry->register('order', new TableDefinition(['id'], [], ['id'], [], []));
41
42        $savepoint = ShadowSavepoint::of(null, $store, $registry);
43        $registry->register('extra', new TableDefinition(['id'], [], ['id'], [], []));
44        $savepoint->restoreInto($store, $registry);
45
46        self::assertNull($registry->get('extra'));
47        self::assertNotNull($registry->get('order'));
48    }
49
50    public function testRestoreIntoLeavesTheTablesAloneWhereNothingIsDescribingThem(): void
51    {
52        $store = new ShadowStore();
53        $store->set('order', [['id' => 1]]);
54        $savepoint = ShadowSavepoint::of(null, $store, null);
55        $store->set('order', []);
56
57        $savepoint->restoreInto($store, null);
58
59        self::assertSame([['id' => 1]], $store->get('order'));
60    }
61
62    public function testIsNamedAnswersForTheNameItWasDeclaredUnder(): void
63    {
64        $savepoint = ShadowSavepoint::of('sp1', new ShadowStore(), null);
65
66        self::assertTrue($savepoint->isNamed('sp1'));
67        self::assertFalse($savepoint->isNamed('sp2'));
68    }
69
70    public function testIsNamedIsFalseForTheTransactionItself(): void
71    {
72        self::assertFalse(ShadowSavepoint::of(null, new ShadowStore(), null)->isNamed('sp1'));
73    }
74
75    public function testTheNameIsReadableWithoutBeingGuessedAt(): void
76    {
77        self::assertSame('sp1', ShadowSavepoint::of('sp1', new ShadowStore(), null)->name);
78    }
79}
80