3 declare(strict_types
=1);
5 namespace PhpMyAdmin\Tests
;
7 use PhpMyAdmin\Html\Generator
;
9 use PhpMyAdmin\SqlParser\Parser
;
11 use const PHP_INT_MAX
;
15 * Tests for import functions
17 class ImportTest
extends AbstractTestCase
19 /** @var Import $import */
23 * Prepares environment for the test.
25 protected function setUp(): void
28 $GLOBALS['server'] = 0;
29 $GLOBALS['cfg']['ServerDefault'] = '';
30 $this->import
= new Import();
34 * Test for checkTimeout
36 public function testCheckTimeout(): void
38 global $timestamp, $maximum_time, $timeout_passed;
43 $timeout_passed = false;
45 $this->assertFalse($this->import
->checkTimeout());
50 $timeout_passed = true;
52 $this->assertFalse($this->import
->checkTimeout());
57 $timeout_passed = true;
59 $this->assertTrue($this->import
->checkTimeout());
62 $timestamp = time() - 15;
64 $timeout_passed = false;
66 $this->assertFalse($this->import
->checkTimeout());
69 $timestamp = time() - 60;
71 $timeout_passed = false;
73 $this->assertTrue($this->import
->checkTimeout());
79 public function testLookForUse(): void
86 $this->import
->lookForUse(null, null, null)
94 $this->import
->lookForUse(null, 'myDb', null)
102 $this->import
->lookForUse(null, 'myDb', true)
110 $this->import
->lookForUse('select 1 from myTable', 'myDb', true)
118 $this->import
->lookForUse('use anotherDb', 'myDb', false)
126 $this->import
->lookForUse('use anotherDb', 'myDb', true)
134 $this->import
->lookForUse('use `anotherDb`;', 'myDb', true)
139 * Test for getColumnAlphaName
141 * @param string $expected Expected result of the function
142 * @param int $num The column number
144 * @dataProvider provGetColumnAlphaName
146 public function testGetColumnAlphaName(string $expected, int $num): void
148 $this->assertEquals($expected, $this->import
->getColumnAlphaName($num));
152 * Data provider for testGetColumnAlphaName
156 public function provGetColumnAlphaName(): array
187 * Test for getColumnNumberFromName
189 * @param int $expected Expected result of the function
190 * @param string|null $name column name(i.e. "A", or "BC", etc.)
192 * @dataProvider provGetColumnNumberFromName
194 public function testGetColumnNumberFromName(int $expected, ?
string $name): void
196 $this->assertEquals($expected, $this->import
->getColumnNumberFromName($name));
200 * Data provider for testGetColumnNumberFromName
204 public function provGetColumnNumberFromName(): array
235 * Test for getDecimalPrecision
237 * @param int $expected Expected result of the function
238 * @param string|null $size Size of field
240 * @dataProvider provGetDecimalPrecision
242 public function testGetDecimalPrecision(int $expected, ?
string $size): void
244 $this->assertEquals($expected, $this->import
->getDecimalPrecision($size));
248 * Data provider for testGetDecimalPrecision
252 public function provGetDecimalPrecision(): array
275 * Test for getDecimalScale
277 * @param int $expected Expected result of the function
278 * @param string|null $size Size of field
280 * @dataProvider provGetDecimalScale
282 public function testGetDecimalScale(int $expected, ?
string $size): void
284 $this->assertEquals($expected, $this->import
->getDecimalScale($size));
288 * Data provider for testGetDecimalScale
292 public function provGetDecimalScale(): array
315 * Test for getDecimalSize
317 * @param array $expected Expected result of the function
318 * @param string|null $cell Cell content
320 * @dataProvider provGetDecimalSize
322 public function testGetDecimalSize(array $expected, ?
string $cell): void
324 $this->assertEquals($expected, $this->import
->getDecimalSize($cell));
328 * Data provider for testGetDecimalSize
332 public function provGetDecimalSize(): array
371 * Test for detectType
373 * @param int $expected Expected result of the function
374 * @param int|null $type Last cumulative column type (VARCHAR or INT or
375 * BIGINT or DECIMAL or NONE)
376 * @param string|null $cell String representation of the cell for which a
377 * best-fit type is to be determined
379 * @dataProvider provDetectType
381 public function testDetectType(int $expected, ?
int $type, ?
string $cell): void
383 $this->assertEquals($expected, $this->import
->detectType($type, $cell));
387 * Data provider for testDetectType
391 public function provDetectType(): array
451 if (PHP_INT_MAX
> 2147483647) {
464 // Can not detect a BIGINT since the value is over PHP_INT_MAX
481 * Test for getMatchedRows.
483 public function testPMAGetMatchedRows(): void
485 $GLOBALS['db'] = 'PMA';
487 $updateQuery = 'UPDATE `table_1` '
490 $simulatedUpdateQuery = 'SELECT `id` FROM `table_1` WHERE `id` > 10 AND (`id` <> 20)';
492 $deleteQuery = 'DELETE FROM `table_1` '
494 $simulatedDeleteQuery = 'SELECT * FROM `table_1` WHERE `id` > 10';
496 $this->simulatedQueryTest($updateQuery, $simulatedUpdateQuery);
497 $this->simulatedQueryTest($deleteQuery, $simulatedDeleteQuery);
501 * Tests simulated UPDATE/DELETE query.
503 * @param string $sqlQuery SQL query
504 * @param string $simulatedQuery Simulated query
506 public function simulatedQueryTest(string $sqlQuery, string $simulatedQuery): void
508 $parser = new Parser($sqlQuery);
509 $analyzed_sql_results = [
510 'query' => $sqlQuery,
512 'statement' => $parser->statements
[0],
515 $simulated_data = $this->import
->getMatchedRows($analyzed_sql_results);
517 // URL to matched rows.
520 'sql_query' => $simulatedQuery,
522 $matched_rows_url = Url
::getFromRoute('/sql', $_url_params);
526 'sql_query' => Generator
::formatSql(
527 $analyzed_sql_results['query']
530 'matched_rows_url' => $matched_rows_url,
537 * Test for checkIfRollbackPossible
539 public function testPMACheckIfRollbackPossible(): void
541 $GLOBALS['db'] = 'PMA';
543 $sqlQuery = 'UPDATE `table_1` AS t1, `table_2` t2 '
544 . 'SET `table_1`.`id` = `table_2`.`id` '
547 $this->assertTrue($this->import
->checkIfRollbackPossible($sqlQuery));
551 * Data provider for testSkipByteOrderMarksFromContents
555 public function providerContentWithByteOrderMarks(): array
559 "\xEF\xBB\xBF blabla上海",
563 "\xEF\xBB\xBF blabla",
567 "\xEF\xBB\xBF blabla\xEF\xBB\xBF",
568 " blabla\xEF\xBB\xBF",
575 "\xFE\xFF blabla\xFE\xFF",
583 "\xFF\xFE blabla\xFF\xFE",
587 "\xEF\xBB\xBF\x44\x52\x4F\x50\x20\x54\x41\x42\x4C\x45\x20\x49\x46\x20\x45\x58\x49\x53\x54\x53",
588 'DROP TABLE IF EXISTS',
594 * Test for skipByteOrderMarksFromContents
596 * @param string $input The contents to strip BOM
597 * @param string $cleanContents The contents cleaned
599 * @dataProvider providerContentWithByteOrderMarks
601 public function testSkipByteOrderMarksFromContents(string $input, string $cleanContents): void
603 $this->assertEquals($cleanContents, $this->import
->skipByteOrderMarksFromContents($input));