import = new Import(); } /** * Test for checkTimeout * * @return void */ function testCheckTimeout() { global $timestamp, $maximum_time, $timeout_passed; //Reinit values. $timestamp = time(); $maximum_time = 0; $timeout_passed = false; $this->assertFalse($this->import->checkTimeout()); //Reinit values. $timestamp = time(); $maximum_time = 0; $timeout_passed = true; $this->assertFalse($this->import->checkTimeout()); //Reinit values. $timestamp = time(); $maximum_time = 30; $timeout_passed = true; $this->assertTrue($this->import->checkTimeout()); //Reinit values. $timestamp = time()-15; $maximum_time = 30; $timeout_passed = false; $this->assertFalse($this->import->checkTimeout()); //Reinit values. $timestamp = time()-60; $maximum_time = 30; $timeout_passed = false; $this->assertTrue($this->import->checkTimeout()); } /** * Test for lookForUse * * @return void */ function testLookForUse() { $this->assertEquals( array(null, null), $this->import->lookForUse(null, null, null) ); $this->assertEquals( array('myDb', null), $this->import->lookForUse(null, 'myDb', null) ); $this->assertEquals( array('myDb', true), $this->import->lookForUse(null, 'myDb', true) ); $this->assertEquals( array('myDb', true), $this->import->lookForUse('select 1 from myTable', 'myDb', true) ); $this->assertEquals( array('anotherDb', true), $this->import->lookForUse('use anotherDb', 'myDb', false) ); $this->assertEquals( array('anotherDb', true), $this->import->lookForUse('use anotherDb', 'myDb', true) ); $this->assertEquals( array('anotherDb', true), $this->import->lookForUse('use `anotherDb`;', 'myDb', true) ); } /** * Test for getColumnAlphaName * * @param string $expected Expected result of the function * @param int $num The column number * * @return void * * @dataProvider provGetColumnAlphaName */ function testGetColumnAlphaName($expected, $num) { $this->assertEquals($expected, $this->import->getColumnAlphaName($num)); } /** * Data provider for testGetColumnAlphaName * * @return array */ function provGetColumnAlphaName() { return array( array('A', 1), array('Z', 0), array('AA', 27), array('AZ', 52), array('BA', 53), array('BB', 54), ); } /** * Test for getColumnNumberFromName * * @param int $expected Expected result of the function * @param string|null $name column name(i.e. "A", or "BC", etc.) * * @return void * * @dataProvider provGetColumnNumberFromName */ function testGetColumnNumberFromName($expected, $name) { $this->assertEquals($expected, $this->import->getColumnNumberFromName($name)); } /** * Data provider for testGetColumnNumberFromName * * @return array */ function provGetColumnNumberFromName() { return array( array(1, 'A'), array(26, 'Z'), array(27, 'AA'), array(52, 'AZ'), array(53, 'BA'), array(54, 'BB'), ); } /** * Test for getDecimalPrecision * * @param int $expected Expected result of the function * @param string|null $size Size of field * * @return void * * @dataProvider provGetDecimalPrecision */ function testGetDecimalPrecision($expected, $size) { $this->assertEquals($expected, $this->import->getDecimalPrecision($size)); } /** * Data provider for testGetDecimalPrecision * * @return array */ function provGetDecimalPrecision() { return array( array(2, '2,1'), array(6, '6,2'), array(6, '6,0'), array(16, '16,2'), ); } /** * Test for getDecimalScale * * @param int $expected Expected result of the function * @param string|null $size Size of field * * @return void * * @dataProvider provGetDecimalScale */ function testGetDecimalScale($expected, $size) { $this->assertEquals($expected, $this->import->getDecimalScale($size)); } /** * Data provider for testGetDecimalScale * * @return array */ function provGetDecimalScale() { return array( array(1, '2,1'), array(2, '6,2'), array(0, '6,0'), array(20, '30,20'), ); } /** * Test for getDecimalSize * * @param array $expected Expected result of the function * @param string|null $cell Cell content * * @return void * * @dataProvider provGetDecimalSize */ function testGetDecimalSize($expected, $cell) { $this->assertEquals($expected, $this->import->getDecimalSize($cell)); } /** * Data provider for testGetDecimalSize * * @return array */ function provGetDecimalSize() { return array( array(array(2, 1, '2,1'), '2.1'), array(array(2, 1, '2,1'), '6.2'), array(array(3, 1, '3,1'), '10.0'), array(array(4, 2, '4,2'), '30.20'), ); } /** * Test for detectType * * @param int $expected Expected result of the function * @param int|null $type Last cumulative column type (VARCHAR or INT or * BIGINT or DECIMAL or NONE) * @param string|null $cell String representation of the cell for which a * best-fit type is to be determined * * @return void * * @dataProvider provDetectType */ function testDetectType($expected, $type, $cell) { $this->assertEquals($expected, $this->import->detectType($type, $cell)); } /** * Data provider for testDetectType * * @return array */ function provDetectType() { return array( array(Import::NONE, null, 'NULL'), array(Import::NONE, Import::NONE, 'NULL'), array(Import::INT, Import::INT, 'NULL'), array(Import::VARCHAR, Import::VARCHAR, 'NULL'), array(Import::VARCHAR, null, null), array(Import::VARCHAR, Import::INT, null), array(Import::INT, Import::INT, '10'), array(Import::DECIMAL, Import::DECIMAL, '10.2'), array(Import::DECIMAL, Import::INT, '10.2'), array(Import::BIGINT, Import::BIGINT, '2147483648'), array(Import::BIGINT, Import::INT, '2147483648'), array(Import::VARCHAR, Import::VARCHAR, 'test'), array(Import::VARCHAR, Import::INT, 'test'), ); } /** * Test for getMatchedRows. * * @return void */ function testPMAGetMatchedRows() { $GLOBALS['db'] = 'PMA'; //mock DBI $dbi = $this->getMockBuilder('PhpMyAdmin\DatabaseInterface') ->disableOriginalConstructor() ->getMock(); $update_query = 'UPDATE `table_1` ' . 'SET `id` = 20 ' . 'WHERE `id` > 10'; $simulated_update_query = 'SELECT `id` FROM `table_1` WHERE `id` > 10 AND (`id` <> 20)'; $delete_query = 'DELETE FROM `table_1` ' . 'WHERE `id` > 10'; $simulated_delete_query = 'SELECT * FROM `table_1` WHERE `id` > 10'; $dbi->expects($this->any()) ->method('numRows') ->with(array()) ->will($this->returnValue(2)); $dbi->expects($this->any()) ->method('selectDb') ->with('PMA') ->will($this->returnValue(true)); $dbi->expects($this->at(1)) ->method('tryQuery') ->with($simulated_update_query) ->will($this->returnValue(array())); $dbi->expects($this->at(4)) ->method('tryQuery') ->with($simulated_delete_query) ->will($this->returnValue(array())); $GLOBALS['dbi'] = $dbi; $this->simulatedQueryTest($update_query, $simulated_update_query); $this->simulatedQueryTest($delete_query, $simulated_delete_query); } /** * Tests simulated UPDATE/DELETE query. * * @param string $sql_query SQL query * @param string $simulated_query Simulated query * * @return void */ function simulatedQueryTest($sql_query, $simulated_query) { $parser = new Parser($sql_query); $analyzed_sql_results = array( 'query' => $sql_query, 'parser' => $parser, 'statement' => $parser->statements[0], ); $simulated_data = $this->import->getMatchedRows($analyzed_sql_results); // URL to matched rows. $_url_params = array( 'db' => 'PMA', 'sql_query' => $simulated_query ); $matched_rows_url = 'sql.php' . Url::getCommon($_url_params); $this->assertEquals( array( 'sql_query' => Util::formatSql( $analyzed_sql_results['query'] ), 'matched_rows' => 2, 'matched_rows_url' => $matched_rows_url ), $simulated_data ); } /** * Test for checkIfRollbackPossible * * @return void */ function testPMACheckIfRollbackPossible() { $GLOBALS['db'] = 'PMA'; //mock DBI $dbi = $this->getMockBuilder('PhpMyAdmin\DatabaseInterface') ->disableOriginalConstructor() ->getMock(); // List of Transactional Engines. $transactional_engines = array( 'INNODB', 'FALCON', 'NDB', 'INFINIDB', 'TOKUDB', 'XTRADB', 'SEQUENCE', 'BDB' ); $check_query = 'SELECT `ENGINE` FROM `information_schema`.`tables` ' . 'WHERE `table_name` = "%s" ' . 'AND `table_schema` = "%s" ' . 'AND UPPER(`engine`) IN ("' . implode('", "', $transactional_engines) . '")'; $check_table_query = 'SELECT * FROM `%s`.`%s` ' . 'LIMIT 1'; $dbi->expects($this->at(0)) ->method('tryQuery') ->with(sprintf($check_table_query, 'PMA', 'table_1')) ->will($this->returnValue(array('table'))); $dbi->expects($this->at(1)) ->method('tryQuery') ->with(sprintf($check_query, 'table_1', 'PMA')) ->will($this->returnValue(true)); $dbi->expects($this->at(2)) ->method('numRows') ->will($this->returnValue(1)); $dbi->expects($this->at(3)) ->method('tryQuery') ->with(sprintf($check_table_query, 'PMA', 'table_2')) ->will($this->returnValue(array('table'))); $dbi->expects($this->at(4)) ->method('tryQuery') ->with(sprintf($check_query, 'table_2', 'PMA')) ->will($this->returnValue(true)); $dbi->expects($this->at(5)) ->method('numRows') ->will($this->returnValue(1)); $GLOBALS['dbi'] = $dbi; $sql_query = 'UPDATE `table_1` AS t1, `table_2` t2 ' . 'SET `table_1`.`id` = `table_2`.`id` ' . 'WHERE 1'; $this->assertEquals(true, $this->import->checkIfRollbackPossible($sql_query)); } }