insertEdit = new InsertEdit($GLOBALS['dbi']); } /** * Call protected functions by setting visibility to public. * * @param string $name method name * @param array $params parameters for the invocation * @param InsertEdit $object InsertEdit instance object * * @return mixed the output from the protected method. */ private function callProtectedMethod( $name, array $params = [], InsertEdit $object = null ) { $class = new ReflectionClass(InsertEdit::class); $method = $class->getMethod($name); $method->setAccessible(true); return $method->invokeArgs( $object !== null ? $object : $this->insertEdit, $params ); } /** * Test for getFormParametersForInsertForm * * @return void */ public function testGetFormParametersForInsertForm() { $where_clause = array('foo' => 'bar ', '1' => ' test'); $_POST['clause_is_unique'] = false; $_POST['sql_query'] = 'SELECT a'; $GLOBALS['goto'] = 'index.php'; $result = $this->insertEdit->getFormParametersForInsertForm( 'dbname', 'tablename', array(), $where_clause, 'localhost' ); $this->assertEquals( array( 'db' => 'dbname', 'table' => 'tablename', 'goto' => 'index.php', 'err_url' => 'localhost', 'sql_query' => 'SELECT a', 'where_clause[foo]' => 'bar', 'where_clause[1]' => 'test', 'clause_is_unique' => false ), $result ); } /** * Test for getWhereClauseArray * * @return void */ public function testGetWhereClauseArray() { $this->assertEquals( array(), $this->callProtectedMethod('getWhereClauseArray', [null]) ); $this->assertEquals( array(1, 2, 3), $this->callProtectedMethod('getWhereClauseArray', [[1, 2, 3]]) ); $this->assertEquals( array('clause'), $this->callProtectedMethod('getWhereClauseArray', ['clause']) ); } /** * Test for analyzeWhereClauses * * @return void */ public function testAnalyzeWhereClause() { $clauses = array('a=1', 'b="fo\o"'); $dbi = $this->getMockBuilder('PhpMyAdmin\DatabaseInterface') ->disableOriginalConstructor() ->getMock(); $dbi->expects($this->exactly(2)) ->method('query') ->willReturnOnConsecutiveCalls( 'result1', 'result2' ); $dbi->expects($this->exactly(2)) ->method('fetchAssoc') ->willReturnOnConsecutiveCalls( array('assoc1'), array('assoc2') ); $dbi->expects($this->exactly(2)) ->method('getFieldsMeta') ->willReturnOnConsecutiveCalls( array(), array() ); $GLOBALS['dbi'] = $dbi; $this->insertEdit = new InsertEdit($GLOBALS['dbi']); $result = $this->callProtectedMethod('analyzeWhereClauses', [ $clauses, 'table', 'db' ]); $this->assertEquals( array( array('a=1', 'b="fo\\\\o"'), array('result1', 'result2'), array( array('assoc1'), array('assoc2') ), '' ), $result ); } /** * Test for showEmptyResultMessageOrSetUniqueCondition * * @return void */ public function testShowEmptyResultMessageOrSetUniqueCondition() { $temp = new stdClass; $temp->orgname = 'orgname'; $temp->table = 'table'; $temp->type = 'real'; $temp->primary_key = 1; $meta_arr = array($temp); $dbi = $this->getMockBuilder('PhpMyAdmin\DatabaseInterface') ->disableOriginalConstructor() ->getMock(); $dbi->expects($this->at(0)) ->method('getFieldsMeta') ->with('result1') ->will($this->returnValue($meta_arr)); $GLOBALS['dbi'] = $dbi; $this->insertEdit = new InsertEdit($GLOBALS['dbi']); $result = $this->callProtectedMethod('showEmptyResultMessageOrSetUniqueCondition', [ array('1' => array('1' => 1)), 1, array(), 'SELECT', array('1' => 'result1') ]); $this->assertTrue($result); // case 2 $GLOBALS['cfg']['ShowSQL'] = false; $responseMock = $this->getMockBuilder('PhpMyAdmin\Response') ->disableOriginalConstructor() ->setMethods(array('addHtml')) ->getMock(); $restoreInstance = Response::getInstance(); $response = new ReflectionProperty('PhpMyAdmin\Response', '_instance'); $response->setAccessible(true); $response->setValue($responseMock); $result = $this->callProtectedMethod('showEmptyResultMessageOrSetUniqueCondition', [ array(false), 0, array('1'), 'SELECT', array('1' => 'result1') ]); $response->setValue($restoreInstance); $this->assertFalse($result); } /** * Test for loadFirstRow * * @return void */ public function testLoadFirstRow() { $GLOBALS['cfg']['InsertRows'] = 2; $dbi = $this->getMockBuilder('PhpMyAdmin\DatabaseInterface') ->disableOriginalConstructor() ->getMock(); $dbi->expects($this->at(0)) ->method('query') ->with( 'SELECT * FROM `db`.`table` LIMIT 1;', DatabaseInterface::CONNECT_USER, DatabaseInterface::QUERY_STORE ) ->will($this->returnValue('result1')); $GLOBALS['dbi'] = $dbi; $this->insertEdit = new InsertEdit($GLOBALS['dbi']); $result = $this->callProtectedMethod('loadFirstRow', ['table', 'db']); $this->assertEquals( array('result1', array(false, false)), $result ); } /** * Test for urlParamsInEditMode * * @return void */ public function testUrlParamsInEditMode() { $where_clause_array = array('foo=1', 'bar=2'); $_POST['sql_query'] = 'SELECT 1'; $result = $this->insertEdit->urlParamsInEditMode(array(1), $where_clause_array, ''); $this->assertEquals( array( '0' => 1, 'where_clause' => 'bar=2', 'sql_query' => 'SELECT 1' ), $result ); } /** * Test for showTypeOrFunction * * @return void */ public function testShowTypeOrFunction() { $GLOBALS['cfg']['ShowFieldTypesInDataEditView'] = true; $GLOBALS['cfg']['ServerDefault'] = 1; $url_params = array('ShowFunctionFields' => 2); $result = $this->insertEdit->showTypeOrFunction('function', $url_params, false); $this->assertEquals( ' : ' . 'Function', $result ); // case 2 $result = $this->insertEdit->showTypeOrFunction('function', $url_params, true); $this->assertEquals( 'Function', $result ); // case 3 $result = $this->insertEdit->showTypeOrFunction('type', $url_params, false); $this->assertEquals( ' : ' . 'Type', $result ); // case 4 $result = $this->insertEdit->showTypeOrFunction('type', $url_params, true); $this->assertEquals( 'Type', $result ); } /** * Test for analyzeTableColumnsArray * * @return void */ public function testAnalyzeTableColumnsArray() { $column = array( 'Field' => '1<2', 'Field_md5' => 'pswd', 'Type' => 'float(10, 1)' ); $result = $this->callProtectedMethod('analyzeTableColumnsArray', [ $column, array(), false ]); $this->assertEquals( $result['Field_html'], '1<2' ); $this->assertEquals( $result['Field_md5'], '4342210df36bf2ff2c4e2a997a6d4089' ); $this->assertEquals( $result['True_Type'], 'float' ); $this->assertEquals( $result['len'], 100 ); $this->assertEquals( $result['Field_title'], '1<2' ); $this->assertEquals( $result['is_binary'], false ); $this->assertEquals( $result['is_blob'], false ); $this->assertEquals( $result['is_char'], false ); $this->assertEquals( $result['pma_type'], 'float(10, 1)' ); $this->assertEquals( $result['wrap'], ' nowrap' ); $this->assertEquals( $result['Field'], '1<2' ); } /** * Test for getColumnTitle * * @return void */ public function testGetColumnTitle() { $column = array(); $column['Field'] = 'f1<'; $column['Field_html'] = 'f1<'; $this->assertEquals( $this->callProtectedMethod('getColumnTitle', [ $column, array() ]), 'f1<' ); $comments = array(); $comments['f1<'] = 'comment>'; $result = $this->callProtectedMethod('getColumnTitle', [ $column, $comments ]); $this->assertContains( 'title="comment>"', $result ); $this->assertContains( 'f1<', $result ); } /** * Test for isColumn * * @return void */ public function testIsColumn() { $column = array(); $types = array('binary', 'varbinary'); $column['Type'] = 'binaryfoo'; $this->assertTrue($this->insertEdit->isColumn($column, $types)); $column['Type'] = 'Binaryfoo'; $this->assertTrue($this->insertEdit->isColumn($column, $types)); $column['Type'] = 'varbinaryfoo'; $this->assertTrue($this->insertEdit->isColumn($column, $types)); $column['Type'] = 'barbinaryfoo'; $this->assertFalse($this->insertEdit->isColumn($column, $types)); $types = array('char', 'varchar'); $column['Type'] = 'char(10)'; $this->assertTrue($this->insertEdit->isColumn($column, $types)); $column['Type'] = 'VarChar(20)'; $this->assertTrue($this->insertEdit->isColumn($column, $types)); $column['Type'] = 'foochar'; $this->assertFalse($this->insertEdit->isColumn($column, $types)); $types = array('blob', 'tinyblob', 'mediumblob', 'longblob'); $column['Type'] = 'blob'; $this->assertTrue($this->insertEdit->isColumn($column, $types)); $column['Type'] = 'bloB'; $this->assertTrue($this->insertEdit->isColumn($column, $types)); $column['Type'] = 'mediumBloB'; $this->assertTrue($this->insertEdit->isColumn($column, $types)); $column['Type'] = 'tinyblobabc'; $this->assertTrue($this->insertEdit->isColumn($column, $types)); $column['Type'] = 'longblob'; $this->assertTrue($this->insertEdit->isColumn($column, $types)); $column['Type'] = 'foolongblobbar'; $this->assertFalse($this->insertEdit->isColumn($column, $types)); } /** * Test for getEnumSetAndTimestampColumns * * @return void */ public function testGetEnumAndTimestampColumns() { $column = array(); $column['True_Type'] = 'set'; $this->assertEquals( array('set', '', false), $this->callProtectedMethod('getEnumSetAndTimestampColumns', [ $column, false ]) ); $column['True_Type'] = 'enum'; $this->assertEquals( array('enum', '', false), $this->callProtectedMethod('getEnumSetAndTimestampColumns', [ $column, false ]) ); $column['True_Type'] = 'timestamp'; $column['Type'] = 'date'; $this->assertEquals( array('date', ' nowrap', true), $this->callProtectedMethod('getEnumSetAndTimestampColumns', [ $column, false ]) ); $column['True_Type'] = 'timestamp'; $column['Type'] = 'date'; $this->assertEquals( array('date', ' nowrap', false), $this->callProtectedMethod('getEnumSetAndTimestampColumns', [ $column, true ]) ); $column['True_Type'] = 'SET'; $column['Type'] = 'num'; $this->assertEquals( array('num', ' nowrap', false), $this->callProtectedMethod('getEnumSetAndTimestampColumns', [ $column, false ]) ); $column['True_Type'] = ''; $column['Type'] = 'num'; $this->assertEquals( array('num', ' nowrap', false), $this->callProtectedMethod('getEnumSetAndTimestampColumns', [ $column, false ]) ); } /** * Test for getFunctionColumn * * @return void */ public function testGetFunctionColumn() { $GLOBALS['cfg']['ProtectBinary'] = 'blob'; $column = array(); $column['is_blob'] = true; $this->assertContains( 'Binary', $this->callProtectedMethod('getFunctionColumn', [ $column, false, '', '', array(), 0, 0, 0, false, false, array() ]) ); $GLOBALS['cfg']['ProtectBinary'] = 'all'; $column['is_binary'] = true; $this->assertContains( 'Binary', $this->callProtectedMethod('getFunctionColumn', [ $column, true, '', '', array(), 0, 0, 0, false, false, array() ]) ); $GLOBALS['cfg']['ProtectBinary'] = 'noblob'; $column['is_blob'] = false; $this->assertContains( 'Binary', $this->callProtectedMethod('getFunctionColumn', [ $column, true, '', '', array(), 0, 0, 0, false, false, array() ]) ); $GLOBALS['cfg']['ProtectBinary'] = false; $column['True_Type'] = 'enum'; $this->assertContains( '--', $this->callProtectedMethod('getFunctionColumn', [ $column, true, '', '', array(), 0, 0, 0, false, false, array() ]) ); $column['True_Type'] = 'set'; $this->assertContains( '--', $this->callProtectedMethod('getFunctionColumn', [ $column, true, '', '', array(), 0, 0, 0, false, false, array() ]) ); $column['True_Type'] = ''; $column['pma_type'] = 'int'; $this->assertContains( '--', $this->callProtectedMethod('getFunctionColumn', [ $column, true, '', '', array('int'), 0, 0, 0, false, false, array() ]) ); $column['Field'] = 'num'; $this->assertContains( '