Translated using Weblate (Slovenian)
[phpmyadmin.git] / test / classes / ImportTest.php
blob37d01850d761305b4f95914892610f6724e2ada1
1 <?php
3 declare(strict_types=1);
5 namespace PhpMyAdmin\Tests;
7 use PhpMyAdmin\Html\Generator;
8 use PhpMyAdmin\Import;
9 use PhpMyAdmin\SqlParser\Parser;
10 use PhpMyAdmin\Url;
11 use const PHP_INT_MAX;
12 use function time;
14 /**
15 * Tests for import functions
17 class ImportTest extends AbstractTestCase
19 /** @var Import $import */
20 private $import;
22 /**
23 * Prepares environment for the test.
25 protected function setUp(): void
27 parent::setUp();
28 $GLOBALS['server'] = 0;
29 $GLOBALS['cfg']['ServerDefault'] = '';
30 $this->import = new Import();
33 /**
34 * Test for checkTimeout
36 public function testCheckTimeout(): void
38 global $timestamp, $maximum_time, $timeout_passed;
40 //Reinit values.
41 $timestamp = time();
42 $maximum_time = 0;
43 $timeout_passed = false;
45 $this->assertFalse($this->import->checkTimeout());
47 //Reinit values.
48 $timestamp = time();
49 $maximum_time = 0;
50 $timeout_passed = true;
52 $this->assertFalse($this->import->checkTimeout());
54 //Reinit values.
55 $timestamp = time();
56 $maximum_time = 30;
57 $timeout_passed = true;
59 $this->assertTrue($this->import->checkTimeout());
61 //Reinit values.
62 $timestamp = time() - 15;
63 $maximum_time = 30;
64 $timeout_passed = false;
66 $this->assertFalse($this->import->checkTimeout());
68 //Reinit values.
69 $timestamp = time() - 60;
70 $maximum_time = 30;
71 $timeout_passed = false;
73 $this->assertTrue($this->import->checkTimeout());
76 /**
77 * Test for lookForUse
79 public function testLookForUse(): void
81 $this->assertEquals(
83 null,
84 null,
86 $this->import->lookForUse(null, null, null)
89 $this->assertEquals(
91 'myDb',
92 null,
94 $this->import->lookForUse(null, 'myDb', null)
97 $this->assertEquals(
99 'myDb',
100 true,
102 $this->import->lookForUse(null, 'myDb', true)
105 $this->assertEquals(
107 'myDb',
108 true,
110 $this->import->lookForUse('select 1 from myTable', 'myDb', true)
113 $this->assertEquals(
115 'anotherDb',
116 true,
118 $this->import->lookForUse('use anotherDb', 'myDb', false)
121 $this->assertEquals(
123 'anotherDb',
124 true,
126 $this->import->lookForUse('use anotherDb', 'myDb', true)
129 $this->assertEquals(
131 'anotherDb',
132 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
154 * @return array
156 public function provGetColumnAlphaName(): array
158 return [
160 'A',
164 'Z',
168 'AA',
172 'AZ',
176 'BA',
180 'BB',
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
202 * @return array
204 public function provGetColumnNumberFromName(): array
206 return [
209 'A',
213 'Z',
217 'AA',
221 'AZ',
225 'BA',
229 'BB',
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
250 * @return array
252 public function provGetDecimalPrecision(): array
254 return [
257 '2,1',
261 '6,2',
265 '6,0',
269 '16,2',
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
290 * @return array
292 public function provGetDecimalScale(): array
294 return [
297 '2,1',
301 '6,2',
305 '6,0',
309 '30,20',
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
330 * @return array
332 public function provGetDecimalSize(): array
334 return [
339 '2,1',
341 '2.1',
347 '2,1',
349 '6.2',
355 '3,1',
357 '10.0',
363 '4,2',
365 '30.20',
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
389 * @return array
391 public function provDetectType(): array
393 $data = [
395 Import::NONE,
396 null,
397 'NULL',
400 Import::NONE,
401 Import::NONE,
402 'NULL',
405 Import::INT,
406 Import::INT,
407 'NULL',
410 Import::VARCHAR,
411 Import::VARCHAR,
412 'NULL',
415 Import::VARCHAR,
416 null,
417 null,
420 Import::VARCHAR,
421 Import::INT,
422 null,
425 Import::INT,
426 Import::INT,
427 '10',
430 Import::DECIMAL,
431 Import::DECIMAL,
432 '10.2',
435 Import::DECIMAL,
436 Import::INT,
437 '10.2',
440 Import::VARCHAR,
441 Import::VARCHAR,
442 'test',
445 Import::VARCHAR,
446 Import::INT,
447 'test',
451 if (PHP_INT_MAX > 2147483647) {
452 $data[] = [
453 Import::BIGINT,
454 Import::BIGINT,
455 '2147483648',
457 $data[] = [
458 Import::BIGINT,
459 Import::INT,
460 '2147483648',
462 } else {
463 // To be fixed ?
464 // Can not detect a BIGINT since the value is over PHP_INT_MAX
465 $data[] = [
466 Import::VARCHAR,
467 Import::BIGINT,
468 '2147483648',
470 $data[] = [
471 Import::VARCHAR,
472 Import::INT,
473 '2147483648',
477 return $data;
481 * Test for getMatchedRows.
483 public function testPMAGetMatchedRows(): void
485 $GLOBALS['db'] = 'PMA';
487 $updateQuery = 'UPDATE `table_1` '
488 . 'SET `id` = 20 '
489 . 'WHERE `id` > 10';
490 $simulatedUpdateQuery = 'SELECT `id` FROM `table_1` WHERE `id` > 10 AND (`id` <> 20)';
492 $deleteQuery = 'DELETE FROM `table_1` '
493 . 'WHERE `id` > 10';
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,
511 'parser' => $parser,
512 'statement' => $parser->statements[0],
515 $simulated_data = $this->import->getMatchedRows($analyzed_sql_results);
517 // URL to matched rows.
518 $_url_params = [
519 'db' => 'PMA',
520 'sql_query' => $simulatedQuery,
522 $matched_rows_url = Url::getFromRoute('/sql', $_url_params);
524 $this->assertEquals(
526 'sql_query' => Generator::formatSql(
527 $analyzed_sql_results['query']
529 'matched_rows' => 2,
530 'matched_rows_url' => $matched_rows_url,
532 $simulated_data
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` '
545 . 'WHERE 1';
547 $this->assertTrue($this->import->checkIfRollbackPossible($sqlQuery));
551 * Data provider for testSkipByteOrderMarksFromContents
553 * @return array[]
555 public function providerContentWithByteOrderMarks(): array
557 return [
559 "\xEF\xBB\xBF blabla上海",
560 ' blabla上海',
563 "\xEF\xBB\xBF blabla",
564 ' blabla',
567 "\xEF\xBB\xBF blabla\xEF\xBB\xBF",
568 " blabla\xEF\xBB\xBF",
571 "\xFE\xFF blabla",
572 ' blabla',
575 "\xFE\xFF blabla\xFE\xFF",
576 " blabla\xFE\xFF",
579 "\xFF\xFE blabla",
580 ' blabla',
583 "\xFF\xFE blabla\xFF\xFE",
584 " 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));