|
18 | 18 | use PhpMyAdmin\Tests\Stubs\ResponseRenderer; |
19 | 19 | use PHPUnit\Framework\Attributes\AllowMockObjectsWithoutExpectations; |
20 | 20 | use PHPUnit\Framework\Attributes\CoversClass; |
| 21 | +use PHPUnit\Framework\Attributes\DataProvider; |
21 | 22 | use PHPUnit\Framework\Attributes\Medium; |
22 | 23 |
|
23 | 24 | use function __; |
@@ -200,6 +201,118 @@ public function testDoImportLDISetting(): void |
200 | 201 | self::assertTrue(ImportSettings::$finished); |
201 | 202 | } |
202 | 203 |
|
| 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 | + |
203 | 316 | private function getImportLdi(DatabaseInterface|null $dbi = null, Config|null $config = null): ImportLdi |
204 | 317 | { |
205 | 318 | $dbiObject = $dbi ?? $this->createDatabaseInterface(); |
|
0 commit comments