packages/sql-semantics/tests/Unit/Core/Analysis/AnalyzerTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Core\Analysis;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\Medium;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use SqlSemantics\Platform\Sqlite\Dialect as SqliteDialect;
12
13#[CoversClass(\SqlSemantics\Core\Analysis\Analyzer::class)]
14#[UsesClass(\SqlSemantics\Core\Analysis\ValueReader::class)]
15#[UsesClass(\SqlSemantics\Core\AnalysisException::class)]
16#[UsesClass(\SqlSemantics\Facade\Semantics::class)]
17#[UsesClass(\SqlSemantics\Statement\Element::class)]
18#[UsesClass(\SqlSemantics\Statement\Statement::class)]
19#[UsesClass(\SqlSemantics\Statement\Writer::class)]
20#[UsesClass(\SqlSemantics\Statement\Assertion::class)]
21#[UsesClass(\SqlSemantics\Statement\ImmutableGraph::class)]
22#[UsesClass(\SqlSemantics\Core\Ast\DialectParser::class)]
23#[UsesClass(\SqlSemantics\Platform\MySql\Platform::class)]
24#[UsesClass(\SqlSemantics\Platform\PostgreSql\Platform::class)]
25#[UsesClass(\SqlSemantics\Platform\Sqlite\Platform::class)]
26#[Medium]
27final class AnalyzerTest extends TestCase
28{
29    public function testAnalyzeDoesNotNeedTableDeclarations(): void
30    {
31        $analyzer = new \SqlSemantics\Core\Analysis\Analyzer(SqliteDialect::Sqlite);
32        $statement = $analyzer->analyze('DROP TABLE no_such_table');
33        self::assertSame('DROP TABLE no_such_table', $statement->toString());
34        self::assertNotSame($statement, $analyzer->analyze('DROP TABLE no_such_table'));
35    }
36
37    public function testAnalyzeRejectsInvalidSqlWithoutAnIncompleteStatement(): void
38    {
39        $this->expectException(\SqlSemantics\Core\AnalysisException::class);
40        (new \SqlSemantics\Core\Analysis\Analyzer(SqliteDialect::Sqlite))->analyze('SELECT FROM');
41    }
42}
43