Skip to content

Commit 6131a91

Browse files
committed
Add test suite for character set support and baseline
Signed-off-by: Ergin Ekmekçiu <317109199+st0rmsetter@users.noreply.github.com>
1 parent da6cc21 commit 6131a91

2 files changed

Lines changed: 113 additions & 8 deletions

File tree

‎psalm-baseline.xml‎

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6039,9 +6039,6 @@
60396039
<MixedArgument>
60406040
<code><![CDATA[ImportSettings::$importFile]]></code>
60416041
</MixedArgument>
6042-
<PossiblyUnusedReturnValue>
6043-
<code><![CDATA[string[]]]></code>
6044-
</PossiblyUnusedReturnValue>
60456042
</file>
60466043
<file src="src/Plugins/Import/ImportMediawiki.php">
60476044
<InvalidNullableReturnType>
@@ -6246,11 +6243,6 @@
62466243
<code><![CDATA[UploadSession]]></code>
62476244
</UnusedClass>
62486245
</file>
6249-
<file src="src/Plugins/ImportPlugin.php">
6250-
<PossiblyUnusedReturnValue>
6251-
<code><![CDATA[string[]]]></code>
6252-
</PossiblyUnusedReturnValue>
6253-
</file>
62546246
<file src="src/Plugins/Schema/Dia/DiaRelationSchema.php">
62556247
<MixedArgumentTypeCoercion>
62566248
<code><![CDATA[$masterField]]></code>

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

Lines changed: 113 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,118 @@ 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+
'KOI8-R' => ['koi8-r', 'koi8r'],
236+
'Windows-1250' => ['windows-1250', 'cp1250'],
237+
'Windows-1251' => ['windows-1251', 'cp1251'],
238+
'Windows-1252' => ['windows-1252', 'latin1'],
239+
'Windows-1256' => ['windows-1256', 'cp1256'],
240+
'Windows-1257' => ['windows-1257', 'cp1257'],
241+
'TIS-620' => ['tis-620', 'tis620'],
242+
'Shift_JIS' => ['SHIFT_JIS', 'sjis'],
243+
'SJIS' => ['SJIS', 'sjis'],
244+
'SJIS-win' => ['SJIS-win', 'cp932'],
245+
'Big5' => ['big5', 'big5'],
246+
'GB2312' => ['gb2312', 'gb2312'],
247+
'euc-jp' => ['euc-jp', 'ujis'],
248+
'ks_c_5601-1987' => ['ks_c_5601-1987', 'euckr'],
249+
];
250+
}
251+
252+
public function testDoImportWithUtf16OnMariaDb(): void
253+
{
254+
ImportSettings::$sqlQueryDisabled = false;
255+
ImportSettings::$charsetConversion = true;
256+
ImportSettings::$charsetOfFile = 'utf-16';
257+
258+
$dbi = $this->createMock(DatabaseInterface::class);
259+
$dbi->method('quoteString')
260+
->willReturnCallback(static fn (string $string): string => "'" . $string . "'");
261+
262+
$dbi->method('isMariaDB')->willReturn(true);
263+
264+
$importHandle = new File(ImportSettings::$importFile);
265+
$importHandle->open();
266+
267+
$this->getImportLdi($dbi)->doImport($importHandle);
268+
269+
self::assertStringContainsString('CHARACTER SET utf16', Current::$sqlQuery);
270+
}
271+
272+
public function testDoImportWithUtf16OnMySql(): void
273+
{
274+
ImportSettings::$sqlQueryDisabled = false;
275+
ImportSettings::$charsetConversion = true;
276+
ImportSettings::$charsetOfFile = 'utf-16';
277+
278+
$dbi = $this->createMock(DatabaseInterface::class);
279+
$dbi->method('quoteString')
280+
->willReturnCallback(static fn (string $string): string => "'" . $string . "'");
281+
$dbi->method('isMariaDB')->willReturn(false);
282+
283+
$importHandle = new File(ImportSettings::$importFile);
284+
$importHandle->open();
285+
286+
$importLdi = $this->getImportLdi($dbi);
287+
$result = $importLdi->doImport($importHandle);
288+
289+
self::assertSame([], $result);
290+
self::assertTrue(Import::$hasError);
291+
self::assertInstanceOf(Message::class, Current::$message);
292+
self::assertStringContainsString(
293+
__('The selected character set is not supported by the database system!'),
294+
Current::$message->__toString(),
295+
);
296+
}
297+
298+
public function testDoImportWithUnsupportedCharsetDoesNotAddCharacterSet(): void
299+
{
300+
ImportSettings::$sqlQueryDisabled = false;
301+
ImportSettings::$charsetConversion = true;
302+
ImportSettings::$charsetOfFile = 'iso-8859-3';
303+
304+
$dbi = $this->createMock(DatabaseInterface::class);
305+
$dbi->method('quoteString')
306+
->willReturnCallback(static fn (string $string): string => "'" . $string . "'");
307+
308+
$importHandle = new File(ImportSettings::$importFile);
309+
$importHandle->open();
310+
311+
$this->getImportLdi($dbi)->doImport($importHandle);
312+
313+
self::assertStringNotContainsString('CHARACTER SET', Current::$sqlQuery);
314+
}
315+
203316
private function getImportLdi(DatabaseInterface|null $dbi = null, Config|null $config = null): ImportLdi
204317
{
205318
$dbiObject = $dbi ?? $this->createDatabaseInterface();

0 commit comments

Comments
 (0)