Leitgedanken/#pma/test/classes/controllers/TableSearchControllerTest.php
2022-11-21 09:47:28 +01:00

384 lines
11 KiB
PHP

<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Tests for PMA_TableSearch
*
* @package PhpMyAdmin-test
*/
/*
* Include to test.
*/
use PMA\libraries\controllers\table\TableSearchController;
use PMA\libraries\di\Container;
use PMA\libraries\Theme;
use PMA\libraries\TypesMySQL;
require_once 'test/libraries/stubs/ResponseStub.php';
require_once 'test/PMATestCase.php';
/**
* Tests for PMA_TableSearch
*
* @package PhpMyAdmin-test
*/
class TableSearchControllerTest extends PMATestCase
{
/**
* @var PMA\Test\Stubs\Response
*/
private $_response;
/**
* Setup function for test cases
*
* @access protected
* @return void
*/
protected function setUp()
{
/**
* SET these to avoid undefined index error
*/
$_SESSION['PMA_Theme'] = new Theme();
$_POST['zoom_submit'] = 'zoom';
$GLOBALS['server'] = 1;
$GLOBALS['PMA_PHP_SELF'] = 'index.php';
$GLOBALS['pmaThemeImage'] = 'themes/dot.gif';
$GLOBALS['is_ajax_request'] = false;
$GLOBALS['cfgRelation'] = PMA_getRelationsParam();
$GLOBALS['PMA_Types'] = new TypesMySQL();
$GLOBALS['cfg']['Server']['DisableIS'] = false;
$dbi = $this->getMockBuilder('PMA\libraries\DatabaseInterface')
->disableOriginalConstructor()
->getMock();
$columns =array(
array(
'Field' => 'Field1',
'Type' => 'Type1',
'Null' => 'Null1',
'Collation' => 'Collation1',
),
array(
'Field' => 'Field2',
'Type' => 'Type2',
'Null' => 'Null2',
'Collation' => 'Collation2',
)
);
$dbi->expects($this->any())->method('getColumns')
->will($this->returnValue($columns));
$show_create_table = "CREATE TABLE `pma_bookmark` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`dbase` varchar(255) COLLATE utf8_bin NOT NULL DEFAULT '',
`user` varchar(255) COLLATE utf8_bin NOT NULL DEFAULT '',
`label` varchar(255) CHARACTER SET utf8 NOT NULL DEFAULT '',
`query` text COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`),
KEY `foreign_field` (`foreign_db`,`foreign_table`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_bin "
. "COMMENT='Bookmarks'";
$dbi->expects($this->any())->method('fetchValue')
->will($this->returnValue($show_create_table));
$dbi->expects($this->any())->method('escapeString')
->will($this->returnArgument(0));
$GLOBALS['dbi'] = $dbi;
$this->_response = new PMA\Test\Stubs\Response();
$container = Container::getDefaultContainer();
$container->set('db', 'PMA');
$container->set('table', 'PMA_BookMark');
$container->set('dbi', $GLOBALS['dbi']);
$container->set('response', $this->_response);
$container->set('searchType', 'replace');
}
/**
* tearDown function for test cases
*
* @access protected
* @return void
*/
protected function tearDown()
{
}
/**
* Test for replace
*
* @return void
*/
public function testReplace()
{
$tableSearch = new TableSearchController("zoom", null);
$columnIndex = 0;
$find = "Field";
$replaceWith = "Column";
$useRegex = false;
$charSet = "UTF-8";
$tableSearch->replace(
$columnIndex, $find, $replaceWith, $useRegex, $charSet
);
$sql_query = $GLOBALS['sql_query'];
$result = "UPDATE `PMA_BookMark` SET `Field1` = "
. "REPLACE(`Field1`, 'Field', 'Column') "
. "WHERE `Field1` LIKE '%Field%' COLLATE UTF-8_bin";
$this->assertEquals(
$result,
$sql_query
);
}
/**
* Test for buildSqlQuery
*
* @return void
*/
public function testBuildSqlQuery()
{
$_POST['distinct'] = true;
$_POST['zoom_submit'] = true;
$_POST['table'] = "PMA";
$_POST['orderByColumn'] = "name";
$_POST['order'] = "asc";
$_POST['customWhereClause'] = "name='pma'";
$class = new ReflectionClass('PMA\libraries\controllers\table\TableSearchController');
$method = $class->getMethod('_buildSqlQuery');
$method->setAccessible(true);
$tableSearch = new TableSearchController("zoom", null);
$sql = $method->invoke($tableSearch);
$result = "SELECT DISTINCT * FROM `PMA` WHERE name='pma' "
. "ORDER BY `name` asc";
$this->assertEquals(
$result,
$sql
);
unset($_POST['customWhereClause']);
$sql = $method->invoke($tableSearch);
$result = "SELECT DISTINCT * FROM `PMA` ORDER BY `name` asc";
$this->assertEquals(
$result,
$sql
);
$_POST['criteriaValues'] = array(
'value1',
'value2',
'value3',
'value4',
'value5',
'value6',
'value7,value8'
);
$_POST['criteriaColumnNames'] = array(
'name',
'id',
'index',
'index2',
'index3',
'index4',
'index5',
);
$_POST['criteriaColumnTypes'] = array(
'varchar',
'int',
'enum',
'type1',
'type2',
'type3',
'type4'
);
$_POST['criteriaColumnCollations'] = array(
"char1",
"char2",
"char3",
"char4",
"char5",
"char6",
"char7",
);
$_POST['criteriaColumnOperators'] = array(
"!=",
">",
"IS NULL",
"LIKE %...%",
"REGEXP ^...$",
"IN (...)",
"BETWEEN"
);
$sql = $method->invoke($tableSearch);
$result = "SELECT DISTINCT * FROM `PMA` WHERE `name` != 'value1'"
. " AND `id` > value2 AND `index` IS NULL AND `index2` LIKE '%value4%'"
. " AND `index3` REGEXP ^value5$ AND `index4` IN (value6) AND `index5`"
. " BETWEEN value7 AND value8 ORDER BY `name` asc";
$this->assertEquals(
$result,
$sql
);
}
/**
* Tests for getColumnMinMax()
*
* @return void
* @test
*/
public function testGetColumnMinMax()
{
$GLOBALS['dbi']->expects($this->any())->method('fetchSingleRow')
->will($this->returnArgument(0));
$container = Container::getDefaultContainer();
$container->set('dbi', $GLOBALS['dbi']);
$container->factory('PMA\libraries\controllers\table\TableSearchController');
$container->alias(
'TableSearchController', 'PMA\libraries\controllers\table\TableSearchController'
);
$ctrl = $container->get('TableSearchController');
$result = $ctrl->getColumnMinMax('column');
$expected = 'SELECT MIN(`column`) AS `min`, '
. 'MAX(`column`) AS `max` '
. 'FROM `PMA`.`PMA_BookMark`';
$this->assertEquals(
$expected,
$result
);
}
/**
* Tests for _generateWhereClause()
*
* @return void
* @test
*/
public function testGenerateWhereClause()
{
$types = $this->getMockBuilder('PMA\libraries\Types')
->disableOriginalConstructor()
->getMock();
$types->expects($this->any())->method('isUnaryOperator')
->will($this->returnValue(false));
$GLOBALS['PMA_Types'] = $types;
$class = new ReflectionClass('\PMA\libraries\controllers\Table\TableSearchController');
$method = $class->getMethod('_generateWhereClause');
$method->setAccessible(true);
$container = Container::getDefaultContainer();
$container->factory('\PMA\libraries\controllers\Table\TableSearchController');
$container->alias(
'TableSearchController', 'PMA\libraries\controllers\table\TableSearchController'
);
$ctrl = $container->get('TableSearchController');
$_POST['customWhereClause'] = '`table` = \'PMA_BookMark\'';
$result = $method->invoke($ctrl);
$this->assertEquals(
' WHERE `table` = \'PMA_BookMark\'',
$result
);
unset($_POST['customWhereClause']);
$this->assertEquals(
'',
$method->invoke($ctrl)
);
$_POST['criteriaColumnNames'] = array(
'b', 'a'
);
$_POST['criteriaColumnOperators'] = array(
'<=', '='
);
$_POST['criteriaValues'] = array(
'10', '2'
);
$_POST['criteriaColumnTypes'] = array(
'int(11)', 'int(11)'
);
$result = $method->invoke($ctrl);
$this->assertEquals(
' WHERE `b` <= 10 AND `a` = 2',
$result
);
}
/**
* Tests for getDataRowAction()
*
* @return void
* @test
*/
public function testGetDataRowAction()
{
$meta_one = new stdClass();
$meta_one->type = 'int';
$meta_one->length = 11;
$meta_two = new stdClass();
$meta_two->length = 11;
$meta_two->type = 'int';
$fields_meta = array(
$meta_one, $meta_two
);
$GLOBALS['dbi']->expects($this->any())->method('getFieldsMeta')
->will($this->returnValue($fields_meta));
$GLOBALS['dbi']->expects($this->any())->method('fetchAssoc')
->will(
$this->returnCallback(
function () {
static $count = 0;
if ($count == 0) {
$count++;
return array(
'col1' => 1,
'col2' => 2,
);
} else {
return null;
}
}
)
);
$container = Container::getDefaultContainer();
$container->set('dbi', $GLOBALS['dbi']);
$container->factory('\PMA\libraries\controllers\Table\TableSearchController');
$container->alias(
'TableSearchController', 'PMA\libraries\controllers\table\TableSearchController'
);
$ctrl = $container->get('TableSearchController');
$_REQUEST['db'] = 'PMA';
$_REQUEST['table'] = 'PMA_BookMark';
$_REQUEST['where_clause'] = '`col1` = 1';
$expected = array(
'col1' => 1,
'col2' => 2
);
$ctrl->getDataRowAction();
$json = $this->_response->getJSONResult();
$this->assertEquals(
$expected,
$json['row_info']
);
}
}