packages/ztd-query-mysql/tests/Unit/Rewrite/LoadData/InputFormatTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite\LoadData;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Platform\MySql\Rewrite\LoadData\InputFormat;
10
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Rewrite\LoadData\ColumnMapping::class)]
13#[CoversClass(InputFormat::class)]
14final class InputFormatTest extends TestCase
15{
16    public function testFromStatementDefaults(): void
17    {
18        $sql = "LOAD DATA INFILE 'input.csv' INTO TABLE t";
19        $statement = (new \PhpMyAdmin\SqlParser\Parser($sql))->statements[0];
20        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\LoadStatement::class, $statement);
21        $format = InputFormat::fromStatement($statement, $sql);
22        self::assertSame("\t", $format->fieldTerminator);
23        self::assertSame('', $format->enclosure);
24        self::assertSame('\\', $format->escape);
25        self::assertSame('', $format->linePrefix);
26        self::assertSame("\n", $format->lineTerminator);
27    }
28
29    public function testFromStatementCustomSeparators(): void
30    {
31        $sql = 'LOAD DATA INFILE \'input.csv\' INTO TABLE t FIELDS TERMINATED BY \',\' ENCLOSED BY \'"\' ESCAPED BY \'!\' LINES STARTING BY \'#\' TERMINATED BY \';\'';
32        $statement = (new \PhpMyAdmin\SqlParser\Parser($sql))->statements[0];
33        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\LoadStatement::class, $statement);
34        $format = InputFormat::fromStatement($statement, $sql);
35        self::assertSame(',', $format->fieldTerminator);
36        self::assertSame('"', $format->enclosure);
37        self::assertSame('!', $format->escape);
38        self::assertSame('#', $format->linePrefix);
39        self::assertSame(';', $format->lineTerminator);
40    }
41
42    public function testFromStatementRejectsFixedRows(): void
43    {
44        $sql = "LOAD DATA INFILE 'input.csv' INTO TABLE t FIELDS TERMINATED BY ''";
45        $statement = (new \PhpMyAdmin\SqlParser\Parser($sql))->statements[0];
46        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\LoadStatement::class, $statement);
47        $this->expectException(\ZtdQuery\Exception\UnsupportedSqlException::class);
48        InputFormat::fromStatement($statement, $sql);
49    }
50
51}
52