databases = new class { /** * @param mixed $name name * @return bool */ public function exists($name) { return true; } }; $indexes = [ [ 'Schema' => 'Schema1', 'Key_name' => 'Key_name1', 'Column_name' => 'Column_name1', ], [ 'Schema' => 'Schema2', 'Key_name' => 'Key_name2', 'Column_name' => 'Column_name2', ], [ 'Schema' => 'Schema3', 'Key_name' => 'Key_name3', 'Column_name' => 'Column_name3', ], ]; $dbi = $this->getMockBuilder('PhpMyAdmin\DatabaseInterface') ->disableOriginalConstructor() ->getMock(); $dbi->expects($this->any())->method('getTableIndexes') ->will($this->returnValue($indexes)); $GLOBALS['dbi'] = $dbi; $container = Container::getDefaultContainer(); $container->set('db', 'db'); $container->set('table', 'table'); $container->set('dbi', $GLOBALS['dbi']); $this->_response = new ResponseStub(); $container->set('PhpMyAdmin\Response', $this->_response); $container->alias('response', 'PhpMyAdmin\Response'); } /** * Tests for getDropdownValueForTableAction() * * Case one: this case is for the situation when the target * table is a view. * * @return void * @test */ public function testGetDropdownValueForTableActionIsView() { $viewColumns = [ 'viewCol', 'viewCol2', 'viewCol3' ]; $tableMock = $this->getMockBuilder('PhpMyAdmin\Table') ->disableOriginalConstructor() ->getMock(); // Test the situation when the table is a view $tableMock->expects($this->any())->method('isView') ->will($this->returnValue(true)); $tableMock->expects($this->any())->method('getColumns') ->will($this->returnValue($viewColumns)); $GLOBALS['dbi']->expects($this->any())->method('getTable') ->will($this->returnValue($tableMock)); $container = Container::getDefaultContainer(); $container->set('dbi', $GLOBALS['dbi']); $container->factory('PhpMyAdmin\Controllers\Table\TableRelationController'); $container->alias( 'TableRelationController', 'PhpMyAdmin\Controllers\Table\TableRelationController' ); /** * @var PhpMyAdmin\Controllers\Table\TableRelationController */ $ctrl = $container->get('TableRelationController'); $ctrl->getDropdownValueForTableAction(); $json = $this->_response->getJSONResult(); $this->assertEquals( $viewColumns, $json['columns'] ); } /** * Tests for getDropdownValueForTableAction() * * Case one: this case is for the situation when the target * table is not a view (real tabletable). * * @return void * @test */ public function testGetDropdownValueForTableActionNotView() { $indexedColumns = [ 'primaryTableCol' ]; $tableMock = $this->getMockBuilder('PhpMyAdmin\Table') ->disableOriginalConstructor() ->getMock(); // Test the situation when the table is a view $tableMock->expects($this->any())->method('isView') ->will($this->returnValue(false)); $tableMock->expects($this->any())->method('getIndexedColumns') ->will($this->returnValue($indexedColumns)); $GLOBALS['dbi']->expects($this->any())->method('getTable') ->will($this->returnValue($tableMock)); $container = Container::getDefaultContainer(); $container->set('dbi', $GLOBALS['dbi']); $container->factory('PhpMyAdmin\Controllers\Table\TableRelationController'); $container->alias( 'TableRelationController', 'PhpMyAdmin\Controllers\Table\TableRelationController' ); $ctrl = $container->get('TableRelationController'); $ctrl->getDropdownValueForTableAction(); $json = $this->_response->getJSONResult(); $this->assertEquals( $indexedColumns, $json['columns'] ); } /** * Tests for getDropdownValueForDbAction() * * Case one: foreign * * @return void * @test */ public function testGetDropdownValueForDbActionOne() { $GLOBALS['dbi']->expects($this->any()) ->method('fetchArray') ->will( $this->returnCallback( function () { static $count = 0; if ($count == 0) { $count++; return ['Engine' => 'InnoDB', 'Name' => 'table',]; } return null; } ) ); $container = Container::getDefaultContainer(); $container->set('dbi', $GLOBALS['dbi']); $container->factory('PhpMyAdmin\Controllers\Table\TableRelationController'); $container->alias( 'TableRelationController', 'PhpMyAdmin\Controllers\Table\TableRelationController' ); $ctrl = $container->get( 'TableRelationController', ['tbl_storage_engine' => 'INNODB'] ); $_REQUEST['foreign'] = 'true'; $ctrl->getDropdownValueForDbAction(); $json = $this->_response->getJSONResult(); $this->assertEquals( ['table'], $json['tables'] ); } /** * Tests for getDropdownValueForDbAction() * * Case two: not foreign * * @return void * @test */ public function testGetDropdownValueForDbActionTwo() { $GLOBALS['dbi']->expects($this->any()) ->method('fetchArray') ->will( $this->returnCallback( function () { static $count = 0; if ($count == 0) { $count++; return ['table']; } return null; } ) ); $container = Container::getDefaultContainer(); $container->set('dbi', $GLOBALS['dbi']); $container->factory('PhpMyAdmin\Controllers\Table\TableRelationController'); $container->alias( 'TableRelationController', 'PhpMyAdmin\Controllers\Table\TableRelationController' ); $ctrl = $container->get( 'TableRelationController', ['tbl_storage_engine' => 'INNODB',] ); $_REQUEST['foreign'] = 'false'; $ctrl->getDropdownValueForDbAction(); $json = $this->_response->getJSONResult(); $this->assertEquals( ['table'], $json['tables'] ); } }