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