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