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