phpmyadmin/test/classes/Database/SearchTest.php
Maurício Meneghini Fauth e1f9ae00cd Add a trailing comma in multi-line arrays
Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
2019-06-14 14:09:26 -03:00

217 lines
5.9 KiB
PHP

<?php
/**
* Tests for PhpMyAdmin\Database\Search
*
* @package PhpMyAdmin-test
*/
declare(strict_types=1);
namespace PhpMyAdmin\Tests\Database;
use PhpMyAdmin\Database\Search;
use PhpMyAdmin\Template;
use PhpMyAdmin\Tests\PmaTestCase;
use PhpMyAdmin\Theme;
use ReflectionClass;
/**
* Tests for database search.
*
* @package PhpMyAdmin-test
*/
class SearchTest extends PmaTestCase
{
/**
* @access protected
*/
protected $object;
/**
* Sets up the fixture, for example, opens a network connection.
* This method is called before a test is executed.
*
* @access protected
* @return void
*/
protected function setUp(): void
{
$GLOBALS['server'] = 0;
$GLOBALS['db'] = 'pma';
//mock DBI
$dbi = $this->getMockBuilder('PhpMyAdmin\DatabaseInterface')
->disableOriginalConstructor()
->getMock();
$dbi->expects($this->any())
->method('getColumns')
->with('pma', 'table1')
->will($this->returnValue([
['Field' => 'column1'],
['Field' => 'column2'],
]));
$dbi->expects($this->any())
->method('escapeString')
->will($this->returnArgument(0));
$GLOBALS['dbi'] = $dbi;
$this->object = new Search($dbi, 'pma_test', new Template());
}
/**
* Tears down the fixture, for example, closes a network connection.
* This method is called after a test is executed.
*
* @access protected
* @return void
*/
protected function tearDown(): void
{
unset($this->object);
}
/**
* Call protected functions by setting visibility to public.
*
* @param string $name method name
* @param array $params parameters for the invocation
*
* @return mixed the output from the protected method.
*/
private function callProtectedFunction($name, $params)
{
$class = new ReflectionClass(Search::class);
$method = $class->getMethod($name);
$method->setAccessible(true);
return $method->invokeArgs($this->object, $params);
}
/**
* Test for generating where clause for different search types
*
* @param string $type type
* @param string $expected expected result
*
* @return void
*
* @dataProvider searchTypes
*/
public function testGetWhereClause($type, $expected): void
{
$_POST['criteriaSearchType'] = $type;
$_POST['criteriaSearchString'] = 'search string';
$this->object = new Search($GLOBALS['dbi'], 'pma_test', new Template());
$this->assertEquals(
$expected,
$this->callProtectedFunction(
'getWhereClause',
['table1']
)
);
}
/**
* Data provider for testGetWhereClause
*
* @return array
*/
public function searchTypes()
{
return [
[
'1',
" WHERE (CONVERT(`column1` USING utf8) LIKE '%search%' OR CONVERT(`column2` USING utf8) LIKE '%search%') OR (CONVERT(`column1` USING utf8) LIKE '%string%' OR CONVERT(`column2` USING utf8) LIKE '%string%')",
],
[
'2',
" WHERE (CONVERT(`column1` USING utf8) LIKE '%search%' OR CONVERT(`column2` USING utf8) LIKE '%search%') AND (CONVERT(`column1` USING utf8) LIKE '%string%' OR CONVERT(`column2` USING utf8) LIKE '%string%')",
],
[
'3',
" WHERE (CONVERT(`column1` USING utf8) LIKE '%search string%' OR CONVERT(`column2` USING utf8) LIKE '%search string%')",
],
[
'4',
" WHERE (CONVERT(`column1` USING utf8) LIKE 'search string' OR CONVERT(`column2` USING utf8) LIKE 'search string')",
],
[
'5',
" WHERE (CONVERT(`column1` USING utf8) REGEXP 'search string' OR CONVERT(`column2` USING utf8) REGEXP 'search string')",
],
];
}
/**
* Test for _getSearchSqls
*
* @return void
*/
public function testGetSearchSqls()
{
$this->assertEquals(
[
'select_columns' => 'SELECT * FROM `pma`.`table1` WHERE FALSE',
'select_count' => 'SELECT COUNT(*) AS `count` FROM `pma`.`table1` ' .
'WHERE FALSE',
'delete' => 'DELETE FROM `pma`.`table1` WHERE FALSE',
],
$this->callProtectedFunction(
'getSearchSqls',
['table1']
)
);
}
/**
* Test for getSearchResults
*
* @return void
*/
public function testGetSearchResults()
{
$this->assertStringContainsString(
'Search results for "<em></em>" :',
$this->object->getSearchResults()
);
}
/**
* Test for getSelectionForm
*
* @return void
*/
public function testGetMainHtml()
{
$main = $this->object->getMainHtml();
// test selection form
$this->assertStringContainsString('<form', $main);
$this->assertStringContainsString('<a id="togglesearchformlink">', $main);
$this->assertStringContainsString('criteriaSearchType', $main);
// test result divs
$this->assertStringContainsString(
'<div id="table-info"',
$main
);
$this->assertStringContainsString(
'<a id="table-link"',
$main
);
$this->assertStringContainsString(
'<div id="browse-results"',
$main
);
$this->assertStringContainsString(
'<div id="sqlqueryform"',
$main
);
$this->assertStringContainsString(
'<a id="togglequerybox"',
$main
);
}
}