packages/ztd-query-mysql/tests/Unit/Sql/Dml/DmlWhereClauseExtractorTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql\Dml;
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\Dml\DmlWhereClauseExtractor;
12
13#[CoversClass(DmlWhereClauseExtractor::class)]
14#[UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::class)]
15final class DmlWhereClauseExtractorTest extends TestCase
16{
17    #[DataProvider('providerExtract')]
18    public function testExtract(string $sql, ?string $expected): void
19    {
20        self::assertSame($expected, (new DmlWhereClauseExtractor())->extract($sql));
21    }
22
23    /**
24
25     * @return iterable<string, array{string, string|null}>
26
27     */
28    public static function providerExtract(): iterable
29    {
30        yield 'searched case' => [
31            'UPDATE t SET score = 0 WHERE CASE WHEN score > 80 THEN 1 ELSE 0 END = 1',
32            'CASE WHEN score > 80 THEN 1 ELSE 0 END = 1',
33        ];
34        yield 'nested subquery' => [
35            'DELETE FROM t WHERE id IN (SELECT id FROM source WHERE active = 1) ORDER BY id LIMIT 2',
36            'id IN (SELECT id FROM source WHERE active = 1)',
37        ];
38        yield 'quoted and commented keywords' => [
39            "UPDATE t SET note = 'WHERE' /* WHERE */ WHERE id = 1 # ORDER BY\n LIMIT 1",
40            'id = 1 # ORDER BY',
41        ];
42        yield 'without where' => [
43            'DELETE FROM t ORDER BY id LIMIT 1',
44            null,
45        ];
46    }
47}
48