getMockBuilder(DatabaseInterface::class) ->disableOriginalConstructor() ->getMock(); $dbi->types = new Types($dbi); $GLOBALS['dbi'] = $dbi; // set expectations $dbi->expects($this->any()) ->method('selectDb') ->will($this->returnValue(true)); $dbi->expects($this->any()) ->method('getColumns') ->will( $this->returnValue( [ 'id' => ['Type' => 'integer'], 'col1' => ['Type' => 'varchar(100)'], 'col2' => ['Type' => 'DATETIME'], ] ) ); $dbi->expects($this->any()) ->method('getColumnNames') ->will($this->returnValue(['id', 'col1', 'col2'])); $map = [ [ 'PMA_db', 'PMA_table1', DatabaseInterface::CONNECT_USER, [], ], [ 'PMA_db', 'PMA_table', DatabaseInterface::CONNECT_USER, [ [ 'Key_name' => 'PRIMARY', 'Column_name' => 'id', ], ], ], [ 'PMA_db', 'PMA_table2', DatabaseInterface::CONNECT_USER, [ [ 'Key_name' => 'PRIMARY', 'Column_name' => 'id', ], [ 'Key_name' => 'PRIMARY', 'Column_name' => 'col1', ], ], ], ]; $dbi->expects($this->any()) ->method('getTableIndexes') ->will($this->returnValueMap($map)); $dbi->expects($this->any()) ->method('tryQuery') ->will($this->returnValue(true)); $dbi->expects($this->any()) ->method('fetchResult') ->will($this->returnValue([0])); $this->normalization = new Normalization($dbi, new Relation($dbi), new Transformations(), new Template()); } /** * Test for getHtmlForColumnsList */ public function testGetHtmlForColumnsList(): void { $db = 'PMA_db'; $table = 'PMA_table'; self::assertStringContainsString( '', $this->normalization->getHtmlForColumnsList($table, $db) ); self::assertSame( 'col1 [ varchar(100) ]
', $this->normalization->getHtmlForColumnsList($table, $db, 'String', 'checkbox') ); } /** * Test for getHtmlForCreateNewColumn */ public function testGetHtmlForCreateNewColumn(): void { $GLOBALS['cfg']['BrowseMIME'] = true; $GLOBALS['cfg']['MaxRows'] = 25; $GLOBALS['col_priv'] = false; $GLOBALS['cfg']['Server']['DisableIS'] = false; $GLOBALS['dbi'] = $this->dbi; $db = 'testdb'; $table = 'mytable'; $numFields = 1; $normalization = new Normalization( $this->dbi, new Relation($this->dbi), new Transformations(), new Template() ); $result = $normalization->getHtmlForCreateNewColumn($numFields, $db, $table); self::assertStringContainsString('normalization->getHtmlFor1NFStep1($db, $table, $normalizedTo); self::assertStringContainsString("

" . __('First step of normalization (1NF)') . '

', $result); self::assertStringContainsString("
' . __('Step 1.'), $result); self::assertStringContainsString('normalization->getHtmlForColumnsList( $db, $table, _pgettext('string types', 'String') ), $result); } /** * Test for getHtmlContentsFor1NFStep2 */ public function testGetHtmlContentsFor1NFStep2(): void { $db = 'PMA_db'; $table = 'PMA_table1'; $result = $this->normalization->getHtmlContentsFor1NFStep2($db, $table); self::assertIsArray($result); self::assertArrayHasKey('legendText', $result); self::assertArrayHasKey('headText', $result); self::assertArrayHasKey('subText', $result); self::assertArrayHasKey('hasPrimaryKey', $result); self::assertArrayHasKey('extra', $result); self::assertStringContainsString('', $result['subText']); self::assertStringContainsString('', $result['extra']); self::assertSame('0', $result['hasPrimaryKey']); self::assertStringContainsString(__('Step 1.') . 2, $result['legendText']); $result1 = $this->normalization->getHtmlContentsFor1NFStep2($db, 'PMA_table'); self::assertSame('1', $result1['hasPrimaryKey']); } /** * Test for getHtmlContentsFor1NFStep4 */ public function testGetHtmlContentsFor1NFStep4(): void { $db = 'PMA_db'; $table = 'PMA_table'; $result = $this->normalization->getHtmlContentsFor1NFStep4($db, $table); self::assertIsArray($result); self::assertArrayHasKey('legendText', $result); self::assertArrayHasKey('headText', $result); self::assertArrayHasKey('subText', $result); self::assertArrayHasKey('extra', $result); self::assertStringContainsString(__('Step 1.') . 4, $result['legendText']); self::assertStringContainsString( $this->normalization->getHtmlForColumnsList($db, $table, 'all', 'checkbox'), $result['extra'] ); self::assertStringContainsString( 'normalization->getHtmlContentsFor1NFStep3($db, $table); self::assertIsArray($result); self::assertArrayHasKey('legendText', $result); self::assertArrayHasKey('headText', $result); self::assertArrayHasKey('subText', $result); self::assertArrayHasKey('extra', $result); self::assertArrayHasKey('primary_key', $result); self::assertStringContainsString(__('Step 1.') . 3, $result['legendText']); self::assertStringContainsString( $this->normalization->getHtmlForColumnsList($db, $table, 'all', 'checkbox'), $result['extra'] ); self::assertStringContainsString( 'normalization->getHtmlFor2NFstep1($db, $table); self::assertIsArray($result); self::assertArrayHasKey('legendText', $result); self::assertArrayHasKey('headText', $result); self::assertArrayHasKey('subText', $result); self::assertArrayHasKey('extra', $result); self::assertArrayHasKey('primary_key', $result); self::assertStringContainsString(__('Step 2.') . 1, $result['legendText']); self::assertSame('id', $result['primary_key']); $result1 = $this->normalization->getHtmlFor2NFstep1($db, 'PMA_table2'); self::assertSame('id, col1', $result1['primary_key']); self::assertStringContainsString(' ['col2']]; $result = $this->normalization->getHtmlForNewTables2NF($partialDependencies, $table); self::assertStringContainsString('id = 'PMA_table'; $tablesName->col1 = 'PMA_table1'; $partialDependencies = ['id' => ['col2']]; $result = $this->normalization->createNewTablesFor2NF($partialDependencies, $tablesName, $table, $db); self::assertIsArray($result); self::assertArrayHasKey('legendText', $result); self::assertArrayHasKey('headText', $result); self::assertArrayHasKey('queryError', $result); $partialDependencies = [ 'id' => ['col2'], 'col1' => ['col2'], ]; $result1 = $this->normalization->createNewTablesFor2NF($partialDependencies, $tablesName, $table, $db); self::assertArrayHasKey('extra', $result1); self::assertSame(__('End of step'), $result1['legendText']); self::assertSame('', $result1['extra']); } /** * Test for getHtmlForNewTables3NF */ public function testGetHtmlForNewTables3NF(): void { $tables = ['PMA_table' => ['col1']]; $db = 'PMA_db'; $dependencies = new stdClass(); $dependencies->col1 = ['col2']; $result = $this->normalization->getHtmlForNewTables3NF($dependencies, $tables, $db); self::assertEquals([ 'html' => '', 'success' => true, 'newTables' => [], ], $result); $tables = [ 'PMA_table' => [ 'col1', 'PMA_table', ], ]; // phpcs:ignore Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps $dependencies->PMA_table = [ 'col4', 'col5', ]; $result1 = $this->normalization->getHtmlForNewTables3NF($dependencies, $tables, $db); self::assertIsArray($result1); self::assertStringContainsString(' [ 'PMA_table' => [ 'pk' => 'col1', 'nonpk' => 'col2', ], 'table2' => [ 'pk' => 'id', 'nonpk' => 'col4, col5', ], ], ], $result1['newTables']); } /** * Test for createNewTablesFor3NF */ public function testCreateNewTablesFor3NF(): void { $db = 'PMA_db'; $newTables = [ 'PMA_table' => [ 'PMA_table' => [ 'pk' => 'id', 'nonpk' => 'col1, col2', ], 'table1' => [ 'pk' => 'col2', 'nonpk' => 'col3, col4', ], ], ]; $result = $this->normalization->createNewTablesFor3NF($newTables, $db); self::assertIsArray($result); self::assertArrayHasKey('legendText', $result); self::assertArrayHasKey('headText', $result); self::assertArrayHasKey('queryError', $result); $newTables1 = []; $result1 = $this->normalization->createNewTablesFor3NF($newTables1, $db); self::assertArrayHasKey('queryError', $result1); self::assertSame(__('End of step'), $result1['legendText']); self::assertFalse($result1['queryError']); } /** * Test for moveRepeatingGroup */ public function testMoveRepeatingGroup(): void { $repeatingColumns = 'col1, col2'; $primaryColumns = 'id,col1'; $newTable = 'PMA_newTable'; $newColumn = 'PMA_newCol'; $table = 'PMA_table'; $db = 'PMA_db'; $result = $this->normalization->moveRepeatingGroup( $repeatingColumns, $primaryColumns, $newTable, $newColumn, $table, $db ); self::assertIsArray($result); self::assertArrayHasKey('queryError', $result); self::assertArrayHasKey('message', $result); self::assertInstanceOf(Message::class, $result['message']); } /** * Test for getHtmlFor3NFstep1 */ public function testGetHtmlFor3NFstep1(): void { $db = 'PMA_db'; $tables = ['PMA_table']; $result = $this->normalization->getHtmlFor3NFstep1($db, $tables); self::assertIsArray($result); self::assertArrayHasKey('legendText', $result); self::assertArrayHasKey('headText', $result); self::assertArrayHasKey('subText', $result); self::assertArrayHasKey('extra', $result); self::assertStringContainsString(__('Step 3.') . 1, $result['legendText']); self::assertStringContainsString('normalization->getHtmlFor3NFstep1($db, ['PMA_table2']); self::assertSame('', $result1['subText']); } /** * Test for getHtmlForNormalizeTable */ public function testgetHtmlForNormalizeTable(): void { $result = $this->normalization->getHtmlForNormalizeTable(); self::assertStringContainsString('
', $result); self::assertStringContainsString('type="radio" name="normalizeTo"', $result); self::assertStringContainsString('id="normalizeToRadio1" value="1nf" checked>', $result); self::assertStringContainsString('id="normalizeToRadio2" value="2nf">', $result); self::assertStringContainsString('id="normalizeToRadio3" value="3nf">', $result); } /** * Test for findPartialDependencies */ public function testFindPartialDependencies(): void { $table = 'PMA_table2'; $db = 'PMA_db'; $result = $this->normalization->findPartialDependencies($table, $db); self::assertStringContainsString('
callFunction( $this->normalization, Normalization::class, 'getAllCombinationPartialKeys', [$primaryKey] ); self::assertSame([ '', 'id', 'col1', 'col1,id', 'col2', 'col2,id', 'col2,col1', ], $result); } }