packages/ztd-query-core/tests/Unit/Sql/TransactionStatementParserTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql;
6
7use PHPUnit\Framework\Attributes\CoversNothing;
8use PHPUnit\Framework\TestCase;
9use Tests\Fake\FakeTransactionStatementParser;
10use ZtdQuery\Schema\TableDefinitionRegistry;
11use ZtdQuery\Shadow\ShadowStore;
12use ZtdQuery\Shadow\ShadowTransactions;
13
14#[CoversNothing]
15final class TransactionStatementParserTest extends TestCase
16{
17 public function testParseIsNothingForAStatementThatIsNotATransactionOne(): void
18 {
19 self::assertNull((new FakeTransactionStatementParser())->parse('SELECT 1'));
20 }
21
22 public function testParseReadsAStatementThatOpensATransaction(): void
23 {
24 $store = new ShadowStore();
25 $store->set('order', [['id' => 1]]);
26 $transactions = new ShadowTransactions($store, new TableDefinitionRegistry());
27
28 $statement = (new FakeTransactionStatementParser())->parse('BEGIN');
29
30 self::assertNotNull($statement);
31 $statement->apply($transactions);
32 $store->set('order', []);
33 $transactions->rollBack();
34
35 self::assertSame([['id' => 1]], $store->get('order'));
36 }
37
38 public function testParseReadsAStatementThatDeclaresASavepoint(): void
39 {
40 $store = new ShadowStore();
41 $transactions = new ShadowTransactions($store, new TableDefinitionRegistry());
42 $parser = new FakeTransactionStatementParser();
43
44 $statement = $parser->parse('SAVEPOINT sp1');
45
46 self::assertNotNull($statement);
47 $statement->apply($transactions);
48
49 self::assertSame(0, $transactions->positionOf('SP1'));
50 }
51
52 public function testParseReadsAStatementThatGivesUpASavepoint(): void
53 {
54 $store = new ShadowStore();
55 $transactions = new ShadowTransactions($store, new TableDefinitionRegistry());
56 $parser = new FakeTransactionStatementParser();
57 $parser->parse('SAVEPOINT sp1')?->apply($transactions);
58
59 $statement = $parser->parse('RELEASE sp1');
60
61 self::assertNotNull($statement);
62 $statement->apply($transactions);
63
64 self::assertNull($transactions->positionOf('SP1'));
65 }
66}
67