packages/ztd-query-mysql/tests/Unit/Sql/Diagnostic/MySqlReadOnlyDiagnosticStatementTest.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\MySql\Sql\Diagnostic\MySqlReadOnlyDiagnosticStatement;
12
13#[CoversClass(MySqlReadOnlyDiagnosticStatement::class)]
14#[UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::class)]
15#[CoversClass(\ZtdQuery\Platform\MySql\Sql\Diagnostic\DiagnosticKeywords::class)]
16final class MySqlReadOnlyDiagnosticStatementTest extends TestCase
17{
18 #[DataProvider('providerStatement')]
19 public function testIsSafeClassifiesOnlySafeMySqlDiagnostics(string $sql, bool $expected): void
20 {
21 self::assertSame($expected, MySqlReadOnlyDiagnosticStatement::isSafe($sql));
22 }
23
24 /**
25
26 * @return iterable<string, array{string, bool}>
27
28 */
29 public static function providerStatement(): iterable
30 {
31 yield 'explain select' => ['EXPLAIN SELECT * FROM users', true];
32 yield 'explain non-executing update' => ['EXPLAIN UPDATE users SET active = FALSE', true];
33 yield 'explain analyze select' => ['EXPLAIN ANALYZE SELECT * FROM users', true];
34 yield 'executing update' => ['EXPLAIN ANALYZE UPDATE users SET active = FALSE', false];
35 yield 'show' => ['SHOW CREATE TABLE users', true];
36 yield 'describe' => ['DESCRIBE users', true];
37 yield 'postgres spelling is not execution' => ['EXPLAIN ANALYSE UPDATE users SET active = FALSE', true];
38 yield 'multiple statements' => ['SHOW TABLES; DELETE FROM users', false];
39 yield 'ordinary query' => ['SELECT * FROM users', false];
40 yield 'empty explain' => ['EXPLAIN', false];
41 }
42}
43