packages/ztd-query-sqlite/tests/Unit/Sql/Diagnostic/SqliteReadOnlyDiagnosticStatementTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql\Diagnostic;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\DataProvider;
9use PHPUnit\Framework\Attributes\UsesClass;
10use PHPUnit\Framework\TestCase;
11use ZtdQuery\Platform\Sqlite\Sql\Diagnostic\SqliteReadOnlyDiagnosticStatement;
12
13#[CoversClass(SqliteReadOnlyDiagnosticStatement::class)]
14#[UsesClass(\ZtdQuery\Platform\Sqlite\Sql\SqliteLexerProfile::class)]
15final class SqliteReadOnlyDiagnosticStatementTest extends TestCase
16{
17    #[DataProvider('providerStatement')]
18    public function testIsSafeClassifiesOnlySafeSqliteDiagnostics(string $sql, bool $expected): void
19    {
20        self::assertSame($expected, SqliteReadOnlyDiagnosticStatement::isSafe($sql));
21    }
22
23    /**
24     * @return iterable<string, array{string, bool}>
25     */
26    public static function providerStatement(): iterable
27    {
28        yield 'explain select' => ['EXPLAIN SELECT * FROM users', true];
29        yield 'query plan' => ['EXPLAIN QUERY PLAN SELECT * FROM users', true];
30        yield 'query plan minimum token boundary' => ['EXPLAIN QUERY PLAN SELECT', true];
31        yield 'query without plan' => ['EXPLAIN QUERY SELECT * FROM users', false];
32        yield 'plan without statement' => ['EXPLAIN QUERY PLAN', false];
33        yield 'unsupported analyze form' => ['EXPLAIN ANALYZE DELETE FROM users', false];
34        yield 'unsupported analyse spelling' => ['EXPLAIN ANALYSE SELECT * FROM users', false];
35        yield 'mysql show' => ['SHOW TABLES', false];
36        yield 'mysql describe' => ['DESCRIBE users', false];
37        yield 'multiple statements' => ['EXPLAIN SELECT 1; DELETE FROM users', false];
38        yield 'empty explain' => ['EXPLAIN', false];
39    }
40}
41