packages/ztd-query-mysql/tests/Unit/Sql/Dml/UpdateAssignmentExtractorTest.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\UpdateAssignmentExtractor;
12
13#[CoversClass(UpdateAssignmentExtractor::class)]
14#[UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::class)]
15#[CoversClass(\ZtdQuery\Platform\MySql\Sql\Dml\AssignmentExpression::class)]
16final class UpdateAssignmentExtractorTest extends TestCase
17{
18 /**
19 * @param list<string> $expected
20 */
21 #[DataProvider('providerValues')]
22 public function testValues(string $sql, array $expected): void
23 {
24 self::assertSame($expected, (new UpdateAssignmentExtractor())->values($sql));
25 }
26
27 /**
28 * @return iterable<string, array{string, list<string>}>
29 */
30 public static function providerValues(): iterable
31 {
32 yield 'hex literal' => [
33 "UPDATE data SET payload = X'576F726C64' WHERE id = 1",
34 ["X'576F726C64'"],
35 ];
36 yield 'binary and national literals' => [
37 "UPDATE data SET bits = B'0101', label = N'text'",
38 ["B'0101'", "N'text'"],
39 ];
40 yield 'qualified target column' => [
41 "UPDATE data d SET d.payload = X'00'",
42 ["X'00'"],
43 ];
44 yield 'nested commas and equality' => [
45 "UPDATE data SET value = IF(flag = 1, CONCAT('a', 'b'), 'c'), rank = 2 ORDER BY id LIMIT 1",
46 ["IF(flag = 1, CONCAT('a', 'b'), 'c')", '2'],
47 ];
48 yield 'interval arithmetic' => [
49 'UPDATE tasks SET due_at = created_at + INTERVAL 30 DAY',
50 ['created_at + INTERVAL 30 DAY'],
51 ];
52 yield 'comments' => [
53 "UPDATE data SET payload /* equals */ = X'00' # value\n WHERE id = 1",
54 ["X'00' # value"],
55 ];
56 yield 'not update' => [
57 'SELECT 1',
58 [],
59 ];
60 }
61}
62