Skip to content

Commit b596fb3

Browse files
committed
Add test suite for character set support
Signed-off-by: st0rmsetter <317109199+st0rmsetter@users.noreply.github.com>
1 parent 38bbf10 commit b596fb3

2 files changed

Lines changed: 105 additions & 1 deletion

File tree

‎src/Plugins/Import/ImportLdi.php‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ private function setLdiLocalOptionConfig(): void
248248
$this->config->settings['Import']['ldi_local_option'] = true;
249249
}
250250

251-
private function getDBCharset(string $charset): ?string
251+
private function getDBCharset(string $charset): string|null
252252
{
253253
if ($charset === 'utf-16' && $this->dbi->isMariaDB()) {
254254
return 'utf16';

‎tests/unit/Plugins/Import/ImportLdiTest.php‎

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use PhpMyAdmin\Tests\Stubs\ResponseRenderer;
1919
use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations;
2020
use PHPUnit\Framework\Attributes\CoversClass;
21+
use PHPUnit\Framework\Attributes\DataProvider;
2122
use PHPUnit\Framework\Attributes\Medium;
2223

2324
use function __;
@@ -200,6 +201,109 @@ public function testDoImportLDISetting(): void
200201
self::assertTrue(ImportSettings::$finished);
201202
}
202203

204+
#[DataProvider('charsetMappingProvider')]
205+
public function testDoImportWithCharsetConversion(
206+
string $charsetOfFile,
207+
string $expectedCharset,
208+
): void {
209+
ImportSettings::$sqlQueryDisabled = false;
210+
ImportSettings::$charsetConversion = true;
211+
ImportSettings::$charsetOfFile = $charsetOfFile;
212+
213+
$dbi = $this->createMock(DatabaseInterface::class);
214+
$dbi->method('quoteString')
215+
->willReturnCallback(static fn (string $string): string => "'" . $string . "'");
216+
217+
$importHandle = new File(ImportSettings::$importFile);
218+
$importHandle->open();
219+
220+
$this->getImportLdi($dbi)->doImport($importHandle);
221+
222+
self::assertStringContainsString('CHARACTER SET ' . $expectedCharset, Current::$sqlQuery);
223+
}
224+
225+
/** @return array<string, array{string, string}> */
226+
public static function charsetMappingProvider(): array
227+
{
228+
return [
229+
'ISO-8859-1' => ['iso-8859-1', 'latin1'],
230+
'ISO-8859-2' => ['iso-8859-2', 'latin2'],
231+
'ISO-8859-7' => ['iso-8859-7', 'greek'],
232+
'ISO-8859-8' => ['iso-8859-8', 'hebrew'],
233+
'ISO-8859-9' => ['iso-8859-9', 'latin5'],
234+
'ISO-8859-13' => ['iso-8859-13', 'latin7'],
235+
'UTF-8' => ['utf-8', 'utf8mb4'],
236+
'KOI8-R' => ['koi8-r', 'koi8r'],
237+
'Windows-1250' => ['windows-1250', 'cp1250'],
238+
'Windows-1251' => ['windows-1251', 'cp1251'],
239+
'Windows-1252' => ['windows-1252', 'latin1'],
240+
'Windows-1256' => ['windows-1256', 'cp1256'],
241+
'Windows-1257' => ['windows-1257', 'cp1257'],
242+
'TIS-620' => ['tis-620', 'tis620'],
243+
'Shift_JIS' => ['SHIFT_JIS', 'sjis'],
244+
'Big5' => ['big5', 'big5'],
245+
'GB2312' => ['gb2312', 'gb2312'],
246+
];
247+
}
248+
249+
public function testDoImportWithUtf16OnMariaDb(): void
250+
{
251+
ImportSettings::$sqlQueryDisabled = false;
252+
ImportSettings::$charsetConversion = true;
253+
ImportSettings::$charsetOfFile = 'utf-16';
254+
255+
$dbi = $this->createMock(DatabaseInterface::class);
256+
$dbi->method('quoteString')
257+
->willReturnCallback(static fn (string $string): string => "'" . $string . "'");
258+
259+
$dbi->method('isMariaDB')->willReturn(true);
260+
261+
$importHandle = new File(ImportSettings::$importFile);
262+
$importHandle->open();
263+
264+
$this->getImportLdi($dbi)->doImport($importHandle);
265+
266+
self::assertStringContainsString('CHARACTER SET utf16', Current::$sqlQuery);
267+
}
268+
269+
public function testDoImportWithUtf16OnMySql(): void
270+
{
271+
ImportSettings::$sqlQueryDisabled = false;
272+
ImportSettings::$charsetConversion = true;
273+
ImportSettings::$charsetOfFile = 'utf-16';
274+
275+
$dbi = $this->createMock(DatabaseInterface::class);
276+
$dbi->method('quoteString')
277+
->willReturnCallback(static fn (string $string): string => "'" . $string . "'");
278+
279+
$dbi->method('isMariaDB')->willReturn(false);
280+
281+
$importHandle = new File(ImportSettings::$importFile);
282+
$importHandle->open();
283+
284+
$this->getImportLdi($dbi)->doImport($importHandle);
285+
286+
self::assertStringNotContainsString('CHARACTER SET utf16', Current::$sqlQuery);
287+
}
288+
289+
public function testDoImportWithUnsupportedCharsetDoesNotAddCharacterSet(): void
290+
{
291+
ImportSettings::$sqlQueryDisabled = false;
292+
ImportSettings::$charsetConversion = true;
293+
ImportSettings::$charsetOfFile = 'iso-8859-3';
294+
295+
$dbi = $this->createMock(DatabaseInterface::class);
296+
$dbi->method('quoteString')
297+
->willReturnCallback(static fn (string $string): string => "'" . $string . "'");
298+
299+
$importHandle = new File(ImportSettings::$importFile);
300+
$importHandle->open();
301+
302+
$this->getImportLdi($dbi)->doImport($importHandle);
303+
304+
self::assertStringNotContainsString('CHARACTER SET', Current::$sqlQuery);
305+
}
306+
203307
private function getImportLdi(DatabaseInterface|null $dbi = null, Config|null $config = null): ImportLdi
204308
{
205309
$dbiObject = $dbi ?? $this->createDatabaseInterface();

0 commit comments

Comments
 (0)