packages/ztd-query-core/tests/Unit/Rewrite/SqlRewriterTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite;
6
7use PHPUnit\Framework\Attributes\CoversNothing;
8use PHPUnit\Framework\TestCase;
9use Tests\Fake\FakeSqlRewriter;
10use ZtdQuery\Rewrite\QueryKind;
11use ZtdQuery\Schema\TableDefinitionRegistry;
12use ZtdQuery\Shadow\ShadowStore;
13
14#[CoversNothing]
15final class SqlRewriterTest extends TestCase
16{
17    public function testRewriteAnswersAPlanForTheStatementItWasGiven(): void
18    {
19        $rewriter = new FakeSqlRewriter(new ShadowStore(), new TableDefinitionRegistry());
20
21        self::assertSame(QueryKind::READ, $rewriter->rewrite('SELECT 1')->kind());
22    }
23
24    public function testRewriteAnswersASimulatedWriteForAStatementThatWouldChangeSomething(): void
25    {
26        $rewriter = new FakeSqlRewriter(new ShadowStore(), new TableDefinitionRegistry());
27
28        self::assertSame(
29            QueryKind::WRITE_SIMULATED,
30            $rewriter->rewrite('INSERT INTO users (id) VALUES (1)')->kind(),
31        );
32    }
33
34    public function testRewriteMultipleAnswersOnePlanPerStatementOfABatch(): void
35    {
36        $rewriter = new FakeSqlRewriter(new ShadowStore(), new TableDefinitionRegistry());
37
38        self::assertCount(2, $rewriter->rewriteMultiple('SELECT 1; SELECT 2')->plans());
39    }
40
41    public function testSplitStatementsAnswersTheStatementsABatchIsWrittenAs(): void
42    {
43        $rewriter = new FakeSqlRewriter(new ShadowStore(), new TableDefinitionRegistry());
44
45        self::assertSame(['SELECT 1', 'SELECT 2'], $rewriter->splitStatements('SELECT 1; SELECT 2'));
46    }
47
48    public function testEmptyResultSelectAnswersAStatementThatYieldsNoRows(): void
49    {
50        $rewriter = new FakeSqlRewriter(new ShadowStore(), new TableDefinitionRegistry());
51
52        self::assertNotSame('', $rewriter->emptyResultSelect());
53    }
54
55    public function testTransactionStatementIsNothingForAStatementThatIsNotOne(): void
56    {
57        $rewriter = new FakeSqlRewriter(new ShadowStore(), new TableDefinitionRegistry());
58
59        self::assertNull($rewriter->transactionStatement('SELECT 1'));
60    }
61}
62