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