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