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