Leitgedanken/#pma/test/libraries/rte/PMA_RTN_getQueryFromRequest_test.php
2022-11-21 09:47:28 +01:00

291 lines
13 KiB
PHP

<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* Test for generating CREATE [PROCEDURE|FUNCTION] query from HTTP request
*
* @package PhpMyAdmin-test
*/
/*
* Needed for backquote() and PMA_RTN_getQueryFromRequest()
*/
use PMA\libraries\TypesMySQL;
/*
* Include to test.
*/
require_once 'libraries/rte/rte_routines.lib.php';
/**
* Test for generating CREATE [PROCEDURE|FUNCTION] query from HTTP request
*
* @package PhpMyAdmin-test
*/
class PMA_RTN_GetQueryFromRequest_Test extends PHPUnit_Framework_TestCase
{
/**
* Test for PMA_RTN_getQueryFromRequest
*
* @param array $request Request
* @param string $query Query
* @param int $num_err Error number
*
* @return void
*
* @dataProvider provider
*/
public function testgetQueryFromRequest($request, $query, $num_err)
{
global $_REQUEST, $errors, $cfg;
$cfg['ShowFunctionFields'] = false;
$GLOBALS['PMA_Types'] = new TypesMySQL();
$errors = array();
PMA_RTN_setGlobals();
$old_dbi = isset($GLOBALS['dbi']) ? $GLOBALS['dbi'] : null;
$dbi = $this->getMockBuilder('PMA\libraries\DatabaseInterface')
->disableOriginalConstructor()
->getMock();
$dbi->expects($this->any())
->method('escapeString')
->will(
$this->returnValueMap(
array(
array('foo', null, 'foo'),
array("foo's bar", null, "foo\'s bar"),
array('', null, '')
)
)
);
$GLOBALS['dbi'] = $dbi;
unset($_REQUEST);
$_REQUEST = $request;
$this->assertEquals($query, PMA_RTN_getQueryFromRequest());
$this->assertEquals($num_err, count($errors));
// reset
$GLOBALS['dbi'] = $old_dbi;
}
/**
* Data provider for testgetQueryFromRequest
*
* @return array
*/
public function provider()
{
return array(
// Testing success
array(
array(
'item_name' => 'p r o c',
'item_returnlength' => '',
'item_returnopts_num' => '',
'item_returnopts_text' => '',
'item_definition' => 'SELECT 0;',
'item_comment' => 'foo',
'item_definer' => 'me@home',
'item_type' => 'PROCEDURE',
'item_num_params' => '0',
'item_param_dir' => '',
'item_param_name' => '',
'item_param_type' => '',
'item_param_length' => '',
'item_param_opts_num' => '',
'item_param_opts_text' => '',
'item_returntype' => '',
'item_isdeterministic' => '',
'item_securitytype' => 'INVOKER',
'item_sqldataaccess' => 'NO SQL'
),
'CREATE DEFINER=`me`@`home` PROCEDURE `p r o c`() COMMENT \'foo\' '
. 'DETERMINISTIC NO SQL SQL SECURITY INVOKER SELECT 0;',
0
),
array(
array(
'item_name' => 'pr``oc',
'item_returnlength' => '',
'item_returnopts_num' => '',
'item_returnopts_text' => '',
'item_definition' => 'SELECT \'foobar\';',
'item_comment' => '',
'item_definer' => 'someuser@somehost',
'item_type' => 'PROCEDURE',
'item_num_params' => '2',
'item_param_dir' => array('IN', 'INOUT'),
'item_param_name' => array('pa`ram', 'par 2'),
'item_param_type' => array('INT', 'ENUM'),
'item_param_length' => array('10', '\'a\', \'b\''),
'item_param_opts_num' => array('ZEROFILL', ''),
'item_param_opts_text' => array('utf8', 'latin1'),
'item_returntype' => '',
'item_securitytype' => 'DEFINER',
'item_sqldataaccess' => 'foobar'
),
'CREATE DEFINER=`someuser`@`somehost` PROCEDURE `pr````oc`'
. '(IN `pa``ram` INT(10) ZEROFILL, INOUT `par 2` ENUM(\'a\', \'b\')'
. ' CHARSET latin1) NOT DETERMINISTIC SQL SECURITY DEFINER SELECT '
. '\'foobar\';',
0
),
array(
array(
'item_name' => 'func\\',
'item_returnlength' => '5,5',
'item_returnopts_num' => 'UNSIGNED ZEROFILL',
'item_returnopts_text' => '',
'item_definition' => 'SELECT \'foobar\';',
'item_comment' => 'foo\'s bar',
'item_definer' => '',
'item_type' => 'FUNCTION',
'item_num_params' => '1',
'item_param_dir' => '',
'item_param_name' => array('pa`ram'),
'item_param_type' => array('VARCHAR'),
'item_param_length' => array('45'),
'item_param_opts_num' => array(''),
'item_param_opts_text' => array('latin1'),
'item_returntype' => 'DECIMAL',
'item_isdeterministic' => 'ON',
'item_securitytype' => 'DEFINER',
'item_sqldataaccess' => 'READ SQL DATA'
),
'CREATE FUNCTION `func\\`(`pa``ram` VARCHAR(45) CHARSET latin1) '
. 'RETURNS DECIMAL(5,5) UNSIGNED ZEROFILL COMMENT \'foo\\\'s bar\' '
. 'DETERMINISTIC SQL SECURITY DEFINER SELECT \'foobar\';',
0
),
array(
array(
'item_name' => 'func',
'item_returnlength' => '20',
'item_returnopts_num' => '',
'item_returnopts_text' => 'utf8',
'item_definition' => 'SELECT 0;',
'item_comment' => '',
'item_definer' => '',
'item_type' => 'FUNCTION',
'item_num_params' => '1',
'item_returntype' => 'VARCHAR',
'item_securitytype' => 'DEFINER',
'item_sqldataaccess' => 'READ SQL DATA'
),
'CREATE FUNCTION `func`() RETURNS VARCHAR(20) CHARSET utf8 NOT '
. 'DETERMINISTIC SQL SECURITY DEFINER SELECT 0;',
0
),
// Testing failures
array(
array(
),
'CREATE () NOT DETERMINISTIC ', // invalid query
3
),
array(
array(
'item_name' => 'proc',
'item_returnlength' => '',
'item_returnopts_num' => '',
'item_returnopts_text' => '',
'item_definition' => 'SELECT 0;',
'item_comment' => 'foo',
'item_definer' => 'mehome', // invalid definer format
'item_type' => 'PROCEDURE',
'item_num_params' => '0',
'item_param_dir' => '',
'item_param_name' => '',
'item_param_type' => '',
'item_param_length' => '',
'item_param_opts_num' => '',
'item_param_opts_text' => '',
'item_returntype' => '',
'item_isdeterministic' => '',
'item_securitytype' => 'INVOKER',
'item_sqldataaccess' => 'NO SQL'
),
'CREATE PROCEDURE `proc`() COMMENT \'foo\' DETERMINISTIC '
. 'NO SQL SQL SECURITY INVOKER SELECT 0;', // valid query
1
),
array(
array(
'item_name' => 'proc',
'item_returnlength' => '',
'item_returnopts_num' => '',
'item_returnopts_text' => '',
'item_definition' => 'SELECT 0;',
'item_comment' => '',
'item_definer' => '',
'item_type' => 'PROCEDURE',
'item_num_params' => '2',
'item_param_dir' => array('FAIL', 'INOUT'), // invalid direction
'item_param_name' => array('pa`ram', 'goo'),
'item_param_type' => array('INT', 'ENUM'),
'item_param_length' => array('10', ''), // missing ENUM values
'item_param_opts_num' => array('ZEROFILL', ''),
'item_param_opts_text' => array('utf8', 'latin1'),
'item_returntype' => '',
'item_securitytype' => 'DEFINER',
'item_sqldataaccess' => 'foobar' // invalid, will just be ignored without throwing errors
),
'CREATE PROCEDURE `proc`((10) ZEROFILL, '
. 'INOUT `goo` ENUM CHARSET latin1) NOT DETERMINISTIC '
. 'SQL SECURITY DEFINER SELECT 0;', // invalid query
2
),
array(
array(
'item_name' => 'func',
'item_returnlength' => '', // missing length for VARCHAR
'item_returnopts_num' => '',
'item_returnopts_text' => 'utf8',
'item_definition' => 'SELECT 0;',
'item_comment' => '',
'item_definer' => '',
'item_type' => 'FUNCTION',
'item_num_params' => '2',
'item_param_dir' => array('IN'),
'item_param_name' => array(''), // missing name
'item_param_type' => array('INT'),
'item_param_length' => array('10'),
'item_param_opts_num' => array('ZEROFILL'),
'item_param_opts_text' => array('latin1'),
'item_returntype' => 'VARCHAR',
'item_securitytype' => 'DEFINER',
'item_sqldataaccess' => ''
),
'CREATE FUNCTION `func`() RETURNS VARCHAR CHARSET utf8 NOT '
. 'DETERMINISTIC SQL SECURITY DEFINER SELECT 0;', // invalid query
2
),
array(
array(
'item_name' => 'func',
'item_returnlength' => '',
'item_returnopts_num' => '',
'item_returnopts_text' => '',
'item_definition' => 'SELECT 0;',
'item_comment' => '',
'item_definer' => '',
'item_type' => 'FUNCTION',
'item_num_params' => '0',
'item_returntype' => 'FAIL', // invalid return type
'item_securitytype' => 'DEFINER',
'item_sqldataaccess' => ''
),
'CREATE FUNCTION `func`() NOT DETERMINISTIC SQL '
. 'SECURITY DEFINER SELECT 0;', // invalid query
1
),
);
}
}