|
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,109 @@ 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 | + '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 | + |
203 | 307 | private function getImportLdi(DatabaseInterface|null $dbi = null, Config|null $config = null): ImportLdi |
204 | 308 | { |
205 | 309 | $dbiObject = $dbi ?? $this->createDatabaseInterface(); |
|
0 commit comments