insertEdit = new InsertEdit($GLOBALS['dbi']); } /** * Teardown all objects */ protected function tearDown(): void { parent::tearDown(); $response = new ReflectionProperty(Response::class, 'instance'); $response->setAccessible(true); $response->setValue(null); $response->setAccessible(false); } /** * Test for getFormParametersForInsertForm */ public function testGetFormParametersForInsertForm(): void { $where_clause = [ 'foo' => 'bar ', '1' => ' test', ]; $_POST['clause_is_unique'] = false; $_POST['sql_query'] = 'SELECT a'; $GLOBALS['goto'] = 'index.php'; $result = $this->insertEdit->getFormParametersForInsertForm( 'dbname', 'tablename', [], $where_clause, 'localhost' ); $this->assertEquals( [ '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 */ public function testGetWhereClauseArray(): void { $this->assertEquals( [], $this->callFunction( $this->insertEdit, InsertEdit::class, 'getWhereClauseArray', [null] ) ); $this->assertEquals( [ 1, 2, 3, ], $this->callFunction( $this->insertEdit, InsertEdit::class, 'getWhereClauseArray', [[1, 2, 3]] ) ); $this->assertEquals( ['clause'], $this->callFunction( $this->insertEdit, InsertEdit::class, 'getWhereClauseArray', ['clause'] ) ); } /** * Test for analyzeWhereClauses */ public function testAnalyzeWhereClause(): void { $clauses = [ 'a=1', 'b="fo\o"', ]; $dbi = $this->getMockBuilder(DatabaseInterface::class) ->disableOriginalConstructor() ->getMock(); $dbi->expects($this->exactly(2)) ->method('query') ->willReturnOnConsecutiveCalls( 'result1', 'result2' ); $dbi->expects($this->exactly(2)) ->method('fetchAssoc') ->willReturnOnConsecutiveCalls( ['assoc1'], ['assoc2'] ); $dbi->expects($this->exactly(2)) ->method('getFieldsMeta') ->willReturnOnConsecutiveCalls( [], [] ); $GLOBALS['dbi'] = $dbi; $this->insertEdit = new InsertEdit($GLOBALS['dbi']); $result = $this->callFunction( $this->insertEdit, InsertEdit::class, 'analyzeWhereClauses', [ $clauses, 'table', 'db', ] ); $this->assertEquals( [ [ 'a=1', 'b="fo\\\\o"', ], [ 'result1', 'result2', ], [ ['assoc1'], ['assoc2'], ], '', ], $result ); } /** * Test for showEmptyResultMessageOrSetUniqueCondition */ public function testShowEmptyResultMessageOrSetUniqueCondition(): void { $temp = new stdClass(); $temp->orgname = 'orgname'; $temp->table = 'table'; $temp->type = 'real'; $temp->primary_key = 1; $meta_arr = [$temp]; $dbi = $this->getMockBuilder(DatabaseInterface::class) ->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->callFunction( $this->insertEdit, InsertEdit::class, 'showEmptyResultMessageOrSetUniqueCondition', [ ['1' => ['1' => 1]], 1, [], 'SELECT', ['1' => 'result1'], ] ); $this->assertTrue($result); // case 2 $GLOBALS['cfg']['ShowSQL'] = false; $responseMock = $this->getMockBuilder(Response::class) ->disableOriginalConstructor() ->setMethods(['addHtml']) ->getMock(); $restoreInstance = Response::getInstance(); $response = new ReflectionProperty(Response::class, 'instance'); $response->setAccessible(true); $response->setValue($responseMock); $result = $this->callFunction( $this->insertEdit, InsertEdit::class, 'showEmptyResultMessageOrSetUniqueCondition', [ [false], 0, ['1'], 'SELECT', ['1' => 'result1'], ] ); $response->setValue($restoreInstance); $this->assertFalse($result); } /** * Test for loadFirstRow */ public function testLoadFirstRow(): void { $GLOBALS['cfg']['InsertRows'] = 2; $dbi = $this->getMockBuilder(DatabaseInterface::class) ->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->callFunction( $this->insertEdit, InsertEdit::class, 'loadFirstRow', ['table', 'db'] ); $this->assertEquals( [ 'result1', [ false, false, ], ], $result ); } /** * Test for urlParamsInEditMode */ public function testUrlParamsInEditMode(): void { $where_clause_array = [ 'foo=1', 'bar=2', ]; $_POST['sql_query'] = 'SELECT 1'; $result = $this->insertEdit->urlParamsInEditMode([1], $where_clause_array); $this->assertEquals( [ '0' => 1, 'where_clause' => 'bar=2', 'sql_query' => 'SELECT 1', ], $result ); } /** * Test for showTypeOrFunction */ public function testShowTypeOrFunction(): void { $GLOBALS['cfg']['ShowFieldTypesInDataEditView'] = true; $GLOBALS['cfg']['ServerDefault'] = 1; $url_params = ['ShowFunctionFields' => 2]; $result = $this->insertEdit->showTypeOrFunction('function', $url_params, false); $this->assertStringContainsString( 'index.php?route=/table/change', $result ); $this->assertStringContainsString( 'ShowFunctionFields=1&ShowFieldTypesInDataEditView=1&goto=index.php%3Froute%3D%2Fsql', $result ); $this->assertStringContainsString( 'Function', $result ); // case 2 $result = $this->insertEdit->showTypeOrFunction('function', $url_params, true); $this->assertStringContainsString( 'index.php?route=/table/change', $result ); $this->assertStringContainsString( 'ShowFunctionFields=0&ShowFieldTypesInDataEditView=1&goto=index.php%3Froute%3D%2Fsql', $result ); $this->assertStringContainsString( 'Function', $result ); // case 3 $result = $this->insertEdit->showTypeOrFunction('type', $url_params, false); $this->assertStringContainsString( 'index.php?route=/table/change', $result ); $this->assertStringContainsString( 'ShowFunctionFields=1&ShowFieldTypesInDataEditView=1&goto=index.php%3Froute%3D%2Fsql', $result ); $this->assertStringContainsString( 'Type', $result ); // case 4 $result = $this->insertEdit->showTypeOrFunction('type', $url_params, true); $this->assertStringContainsString( 'index.php?route=/table/change', $result ); $this->assertStringContainsString( 'ShowFunctionFields=1&ShowFieldTypesInDataEditView=0&goto=index.php%3Froute%3D%2Fsql', $result ); $this->assertStringContainsString( 'Type', $result ); } /** * Test for analyzeTableColumnsArray */ public function testAnalyzeTableColumnsArray(): void { $column = [ 'Field' => '1<2', 'Field_md5' => 'pswd', 'Type' => 'float(10, 1)', ]; $result = $this->callFunction( $this->insertEdit, InsertEdit::class, 'analyzeTableColumnsArray', [ $column, [], 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'], ' text-nowrap' ); $this->assertEquals( $result['Field'], '1<2' ); } /** * Test for getColumnTitle */ public function testGetColumnTitle(): void { $column = []; $column['Field'] = 'f1<'; $column['Field_html'] = 'f1<'; $this->assertEquals( $this->callFunction( $this->insertEdit, InsertEdit::class, 'getColumnTitle', [ $column, [], ] ), 'f1<' ); $comments = []; $comments['f1<'] = 'comment>'; $result = $this->callFunction( $this->insertEdit, InsertEdit::class, 'getColumnTitle', [ $column, $comments, ] ); $this->assertStringContainsString( 'title="comment>"', $result ); $this->assertStringContainsString( 'f1<', $result ); } /** * Test for isColumn */ public function testIsColumn(): void { $column = []; $types = [ '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 = [ '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 = [ '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 */ public function testGetEnumAndTimestampColumns(): void { $column = []; $column['True_Type'] = 'set'; $this->assertEquals( [ 'set', '', false, ], $this->callFunction( $this->insertEdit, InsertEdit::class, 'getEnumSetAndTimestampColumns', [ $column, false, ] ) ); $column['True_Type'] = 'enum'; $this->assertEquals( [ 'enum', '', false, ], $this->callFunction( $this->insertEdit, InsertEdit::class, 'getEnumSetAndTimestampColumns', [ $column, false, ] ) ); $column['True_Type'] = 'timestamp'; $column['Type'] = 'date'; $this->assertEquals( [ 'date', ' text-nowrap', true, ], $this->callFunction( $this->insertEdit, InsertEdit::class, 'getEnumSetAndTimestampColumns', [ $column, false, ] ) ); $column['True_Type'] = 'timestamp'; $column['Type'] = 'date'; $this->assertEquals( [ 'date', ' text-nowrap', false, ], $this->callFunction( $this->insertEdit, InsertEdit::class, 'getEnumSetAndTimestampColumns', [ $column, true, ] ) ); $column['True_Type'] = 'SET'; $column['Type'] = 'num'; $this->assertEquals( [ 'num', ' text-nowrap', false, ], $this->callFunction( $this->insertEdit, InsertEdit::class, 'getEnumSetAndTimestampColumns', [ $column, false, ] ) ); $column['True_Type'] = ''; $column['Type'] = 'num'; $this->assertEquals( [ 'num', ' text-nowrap', false, ], $this->callFunction( $this->insertEdit, InsertEdit::class, 'getEnumSetAndTimestampColumns', [ $column, false, ] ) ); } /** * Test for getFunctionColumn */ public function testGetFunctionColumn(): void { $GLOBALS['cfg']['ProtectBinary'] = 'blob'; $column = []; $column['is_blob'] = true; $this->assertStringContainsString( '