getMockBuilder('PhpMyAdmin\SqlParser\Utils\Formatter')
->disableOriginalConstructor()
->setMethods(array('getDefaultOptions', 'getDefaultFormats'))
->getMock();
$formatter->expects($this->once())
->method('getDefaultOptions')
->willReturn(array(
'type' => 'text',
'line_ending' => null,
'indentation' => null,
'clause_newline' => null,
'parts_newline' => null,
));
$formatter->expects($this->once())
->method('getDefaultFormats')
->willReturn($default);
$expectedOptions = array(
'type' => 'test-type',
'line_ending' => '
',
'indentation' => ' ',
'clause_newline' => null,
'parts_newline' => 0,
'formats' => $expected,
);
$overridingOptions = array(
'type' => 'test-type',
'line_ending' => '
',
'formats' => $overriding,
);
$reflectionMethod = new \ReflectionMethod($formatter, 'getMergedOptions');
$reflectionMethod->setAccessible(true);
$this->assertEquals($expectedOptions, $reflectionMethod->invoke($formatter, $overridingOptions));
}
public function mergeFormats()
{
// array($default[], $overriding[], $expected[])
return array(
'empty formats' => array(
'default' => array(
array(
'type' => 0,
'flags' => 0,
'html' => '',
'cli' => '',
'function' => '',
),
),
'overriding' => array(
array(
),
),
'expected' => array(
array(
'type' => 0,
'flags' => 0,
'html' => '',
'cli' => '',
'function' => '',
),
),
),
'no flags' => array(
'default' => array(
array(
'type' => 0,
'flags' => 0,
'html' => 'html',
'cli' => 'cli',
),
array(
'type' => 0,
'flags' => 1,
'html' => 'html',
'cli' => 'cli',
),
),
'overriding' => array(
array(
'type' => 0,
'html' => 'new html',
'cli' => 'new cli',
),
),
'expected' => array(
array(
'type' => 0,
'flags' => 0,
'html' => 'new html',
'cli' => 'new cli',
'function' => '',
),
array(
'type' => 0,
'flags' => 1,
'html' => 'html',
'cli' => 'cli',
),
),
),
'with flags' => array(
'default' => array(
array(
'type' => -1,
'flags' => 0,
'html' => 'html',
'cli' => 'cli',
),
array(
'type' => 0,
'flags' => 0,
'html' => 'html',
'cli' => 'cli',
),
array(
'type' => 0,
'flags' => 1,
'html' => 'html',
'cli' => 'cli',
),
),
'overriding' => array(
array(
'type' => 0,
'flags' => 0,
'html' => 'new html',
'cli' => 'new cli',
),
),
'expected' => array(
array(
'type' => -1,
'flags' => 0,
'html' => 'html',
'cli' => 'cli',
),
array(
'type' => 0,
'flags' => 0,
'html' => 'new html',
'cli' => 'new cli',
'function' => '',
),
array(
'type' => 0,
'flags' => 1,
'html' => 'html',
'cli' => 'cli',
),
),
),
'with extra formats' => array(
'default' => array(
array(
'type' => 0,
'flags' => 0,
'html' => 'html',
'cli' => 'cli',
),
),
'overriding' => array(
array(
'type' => 0,
'flags' => 1,
'html' => 'new html',
'cli' => 'new cli',
),
array(
'type' => 1,
'html' => 'new html',
'cli' => 'new cli',
),
array(
'type' => 1,
'flags' => 1,
'html' => 'new html',
'cli' => 'new cli',
),
),
'expected' => array(
array(
'type' => 0,
'flags' => 0,
'html' => 'html',
'cli' => 'cli',
),
array(
'type' => 0,
'flags' => 1,
'html' => 'new html',
'cli' => 'new cli',
'function' => '',
),
array(
'type' => 1,
'flags' => 0,
'html' => 'new html',
'cli' => 'new cli',
'function' => '',
),
array(
'type' => 1,
'flags' => 1,
'html' => 'new html',
'cli' => 'new cli',
'function' => '',
),
),
),
);
}
/**
* @dataProvider formatQueries_new
*/
public function testFormat_new($query, $text, $cli, $html, array $options = array())
{
// Test TEXT format
$this->assertEquals($text, Formatter::format($query, array('type' => 'text') + $options));
// Test CLI format
$this->assertEquals($cli, Formatter::format($query, array('type' => 'cli') + $options));
// Test HTML format
$this->assertEquals($html, Formatter::format($query, array('type' => 'html') + $options));
}
public function formatQueries_new()
{
return array(
'empty' => array(
'query' => '',
'text' => '',
'cli' => "\x1b[0m",
'html' => '',
),
'simply' => array(
'query' => 'select *',
'text' =>
'SELECT' . "\n" .
' *',
'cli' =>
"\x1b[35mSELECT" . "\n" .
" \x1b[39m*" . "\x1b[0m",
'html' =>
'SELECT' . '
' .
' *',
),
'comments' => array(
'query' =>
'select /* Comment */ *' . "\n" .
'from tbl # Comment' . "\n" .
'where 1 -- Comment',
'text' =>
'SELECT' . "\n" .
' /* Comment */ *' . "\n" .
'FROM' . "\n" .
' tbl # Comment' . "\n" .
'WHERE' . "\n" .
' 1 -- Comment',
'cli' =>
"\x1b[35mSELECT" . "\n" .
" \x1b[37m/* Comment */ \x1b[39m*" . "\n" .
"\x1b[35mFROM" . "\n" .
" \x1b[39mtbl \x1b[37m# Comment" . "\n" .
"\x1b[35mWHERE" . "\n" .
" \x1b[92m1 \x1b[37m-- Comment" . "\x1b[0m",
'html' =>
'SELECT' . '
' .
' *' . '
' .
'FROM' . '
' .
' tbl ' . '
' .
'WHERE' . '
' .
' 1 ',
),
'strip comments' => array(
'query' =>
'select /* Comment */ *' . "\n" .
'from tbl # Comment' . "\n" .
'where 1 -- Comment',
'text' =>
'SELECT' . "\n" .
' *' . "\n" .
'FROM' . "\n" .
' tbl' . "\n" .
'WHERE' . "\n" .
' 1',
'cli' =>
"\x1b[35mSELECT" . "\n" .
" \x1b[39m*" . "\n" .
"\x1b[35mFROM" . "\n" .
" \x1b[39mtbl" . "\n" .
"\x1b[35mWHERE" . "\n" .
" \x1b[92m1" . "\x1b[0m",
'html' =>
'SELECT' . '
' .
' *' . '
' .
'FROM' . '
' .
' tbl' . '
' .
'WHERE' . '
' .
' 1',
'options' => array(
'remove_comments' => true,
),
),
);
}
/**
* @dataProvider formatQueries
*/
public function testFormat($query, $expected, $options)
{
$this->assertEquals(
$expected,
Formatter::format($query, $options)
);
}
public function formatQueries()
{
return array(
array( # Covered by 'simply'
'SELECT 1',
'SELECT' . '
' .
' 1',
array('type' => 'html'),
),
array( # Covered by 'comments'
'SELECT /* Comment */ 1' . "\n" .
'FROM tbl # Comment' . "\n" .
'WHERE 1 -- Comment',
'SELECT' . "\n" .
' /* Comment */ 1' . "\n" .
'FROM' . "\n" .
' tbl # Comment' . "\n" .
'WHERE' . "\n" .
' 1 -- Comment',
array('type' => 'text'),
),
array( # Covered by 'comments'
'SELECT 1 # Comment',
'SELECT' . '
' .
' 1 ',
array('type' => 'html'),
),
array( # Covered by 'comments'
'SELECT 1 -- comment',
'SELECT' . '
' .
' 1 ',
array('type' => 'html'),
),
array( # Covered by 'strip comments'
'SELECT 1 -- comment',
'SELECT' . '
' .
' 1',
array('type' => 'html', 'remove_comments' => true),
),
array(
'SELECT HEX("1")',
'SELECT' . '
' .
' HEX("1")',
array('type' => 'html'),
),
array(
'SELECT * FROM foo WHERE bar=1',
'SELECT' . '
' .
' *' . '
' .
'FROM' . '
' .
' foo' . '
' .
'WHERE' . '
' .
' bar = 1',
array('type' => 'html'),
),
array(
'CREATE PROCEDURE SPTEST() BEGIN FROM a SELECT *; END',
'CREATE' . '
' .
'PROCEDURE SPTEST()' . '
' .
'BEGIN' . '
' .
'FROM' . '
' .
' a' . '
' .
'SELECT' . '
' .
' *;' . '
' .
'END',
array('type' => 'html'),
),
array(
'INSERT INTO foo VALUES (0, 0, 0), (1, 1, 1)',
'INSERT' . '
' .
'INTO' . '
' .
' foo' . '
' .
'VALUES' .
'(0, 0, 0),' .
'(1, 1, 1)',
array('type' => 'html'),
),
array(
'SELECT 1',
"\x1b[35mSELECT\n \x1b[92m1\x1b[0m",
array('type' => 'cli'),
),
array(
'SELECT "Text" AS BAR',
"\x1b[35mSELECT\n \x1b[91m\"Text\" \x1b[35mAS \x1b[39mBAR\x1b[0m",
array('type' => 'cli'),
),
array(
'SELECT coditm AS Item, descripcion AS Descripcion, contenedores AS Contenedores, IF(suspendido = 1, Si, NO) AS Suspendido FROM `DW_articulos` WHERE superado = 0',
'SELECT' . '
' .
' coditm AS Item,' . '
' .
' descripcion AS Descripcion,' . '
' .
' contenedores AS Contenedores,' . '
' .
' IF(suspendido = 1, Si, NO) AS Suspendido' . '
' .
'FROM' . '
' .
' `DW_articulos`' . '
' .
'WHERE' . '
' .
' superado = 0',
array('type' => 'html'),
),
array(
'CREATE TABLE IF NOT EXISTS `pma__bookmark` (' . "\n" .
' `id` int(11) NOT NULL auto_increment,' . "\n" .
' `dbase` varchar(255) NOT NULL default "",' . "\n" .
' `user` varchar(255) NOT NULL default "",' . "\n" .
' `label` varchar(255) COLLATE utf8_general_ci NOT NULL default "",' . "\n" .
' `query` text NOT NULL,' . "\n" .
' PRIMARY KEY (`id`)' . "\n",
'CREATE TABLE IF NOT EXISTS `pma__bookmark`(' . '
' .
' `id` INT(11) NOT NULL AUTO_INCREMENT,' . '
' .
' `dbase` VARCHAR(255) NOT NULL DEFAULT "",' . '
' .
' `user` VARCHAR(255) NOT NULL DEFAULT "",' . '
' .
' `label` VARCHAR(255) COLLATE utf8_general_ci NOT NULL DEFAULT "",' . '
' .
' `query` TEXT NOT NULL,' . '
' .
' PRIMARY KEY(`id`)',
array('type' => 'html'),
),
array(
"select 'xss' from `xss` , nxss /*sxss*/",
'SELECT' . '
' .
' \'<s>xss\'' . '
' .
'FROM' . '
' .
' `<s>xss`,' . '
' .
' < s > nxss ',
array('type' => 'html'),
),
array(
"select 'text\x1b[33mcolor-inj' from tbl",
"\x1b[35mSELECT\n \x1b[91m'text\\x1B[33mcolor-inj'\n\x1b[35mFROM\n \x1b[39mtbl\x1b[0m",
array('type' => 'cli'),
),
);
}
}