phpmyadmin/test/classes/Plugins/Export/ExportXmlTest.php
Maurício Meneghini Fauth 2358b9c4f9 Fix missing property type hints
Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
2020-07-22 21:42:22 -03:00

567 lines
15 KiB
PHP

<?php
/**
* tests for PhpMyAdmin\Plugins\Export\ExportXml class
*/
declare(strict_types=1);
namespace PhpMyAdmin\Tests\Plugins\Export;
use PhpMyAdmin\DatabaseInterface;
use PhpMyAdmin\Plugins\Export\ExportXml;
use PhpMyAdmin\Properties\Options\Groups\OptionsPropertyMainGroup;
use PhpMyAdmin\Properties\Options\Groups\OptionsPropertyRootGroup;
use PhpMyAdmin\Properties\Options\Items\BoolPropertyItem;
use PhpMyAdmin\Properties\Options\Items\HiddenPropertyItem;
use PhpMyAdmin\Properties\Plugins\ExportPluginProperties;
use PhpMyAdmin\Table;
use PhpMyAdmin\Tests\AbstractTestCase;
use ReflectionMethod;
use ReflectionProperty;
use function array_shift;
use function ob_get_clean;
use function ob_start;
/**
* tests for PhpMyAdmin\Plugins\Export\ExportXml class
*
* @group medium
*/
class ExportXmlTest extends AbstractTestCase
{
/** @var ExportXml */
protected $object;
/**
* Configures global environment.
*/
protected function setUp(): void
{
parent::setUp();
parent::defineVersionConstants();
$GLOBALS['server'] = 0;
$GLOBALS['output_kanji_conversion'] = false;
$GLOBALS['buffer_needed'] = false;
$GLOBALS['asfile'] = false;
$GLOBALS['save_on_server'] = false;
$GLOBALS['plugin_param'] = [];
$GLOBALS['plugin_param']['export_type'] = 'table';
$GLOBALS['plugin_param']['single_table'] = false;
$GLOBALS['cfgRelation']['relation'] = true;
$GLOBALS['db'] = 'db';
$this->object = new ExportXml();
}
/**
* tearDown for test cases
*/
protected function tearDown(): void
{
parent::tearDown();
unset($this->object);
}
/**
* Test for PhpMyAdmin\Plugins\Export\ExportXml::setProperties
*
* @group medium
*/
public function testSetProperties(): void
{
$method = new ReflectionMethod(ExportXml::class, 'setProperties');
$method->setAccessible(true);
$method->invoke($this->object, null);
$attrProperties = new ReflectionProperty(ExportXml::class, 'properties');
$attrProperties->setAccessible(true);
$properties = $attrProperties->getValue($this->object);
$this->assertInstanceOf(
ExportPluginProperties::class,
$properties
);
$this->assertEquals(
'XML',
$properties->getText()
);
$this->assertEquals(
'xml',
$properties->getExtension()
);
$this->assertEquals(
'text/xml',
$properties->getMimeType()
);
$options = $properties->getOptions();
$this->assertInstanceOf(
OptionsPropertyRootGroup::class,
$options
);
$this->assertEquals(
'Format Specific Options',
$options->getName()
);
$generalOptionsArray = $options->getProperties();
$generalOptions = array_shift($generalOptionsArray);
$this->assertInstanceOf(
OptionsPropertyMainGroup::class,
$generalOptions
);
$this->assertEquals(
'general_opts',
$generalOptions->getName()
);
$generalProperties = $generalOptions->getProperties();
$property = array_shift($generalProperties);
$this->assertInstanceOf(
HiddenPropertyItem::class,
$property
);
$generalOptions = array_shift($generalOptionsArray);
$this->assertInstanceOf(
OptionsPropertyMainGroup::class,
$generalOptions
);
$this->assertEquals(
'structure',
$generalOptions->getName()
);
$generalProperties = $generalOptions->getProperties();
$property = array_shift($generalProperties);
$this->assertInstanceOf(
BoolPropertyItem::class,
$property
);
$property = array_shift($generalProperties);
$this->assertInstanceOf(
BoolPropertyItem::class,
$property
);
$property = array_shift($generalProperties);
$this->assertInstanceOf(
BoolPropertyItem::class,
$property
);
$property = array_shift($generalProperties);
$this->assertInstanceOf(
BoolPropertyItem::class,
$property
);
$property = array_shift($generalProperties);
$this->assertInstanceOf(
BoolPropertyItem::class,
$property
);
$generalOptions = array_shift($generalOptionsArray);
$this->assertInstanceOf(
OptionsPropertyMainGroup::class,
$generalOptions
);
$this->assertEquals(
'data',
$generalOptions->getName()
);
$generalProperties = $generalOptions->getProperties();
$property = array_shift($generalProperties);
$this->assertInstanceOf(
BoolPropertyItem::class,
$property
);
}
/**
* Test for PhpMyAdmin\Plugins\Export\ExportXml::exportHeader
*
* @group medium
*/
public function testExportHeader(): void
{
$GLOBALS['xml_export_functions'] = 1;
$GLOBALS['xml_export_contents'] = 1;
$GLOBALS['output_charset_conversion'] = 1;
$GLOBALS['charset'] = 'iso-8859-1';
$GLOBALS['cfg']['Server']['port'] = 80;
$GLOBALS['cfg']['Server']['host'] = 'localhost';
$GLOBALS['cfg']['Server']['DisableIS'] = false;
$GLOBALS['xml_export_tables'] = 1;
$GLOBALS['xml_export_triggers'] = 1;
$GLOBALS['xml_export_procedures'] = 1;
$GLOBALS['xml_export_functions'] = 1;
$GLOBALS['crlf'] = "\n";
$GLOBALS['db'] = 'd<"b';
$result = [
0 => [
'DEFAULT_COLLATION_NAME' => 'utf8_general_ci',
'DEFAULT_CHARACTER_SET_NAME' => 'utf-8',
],
'table' => [
null,
'"tbl"',
],
];
$dbi = $this->getMockBuilder(DatabaseInterface::class)
->disableOriginalConstructor()
->getMock();
$dbi->expects($this->exactly(3))
->method('fetchResult')
->willReturnOnConsecutiveCalls(
$result,
$result,
false
);
$dbi->expects($this->once())
->method('getTriggers')
->with('d<"b', 'table')
->will(
$this->returnValue(
[
[
'create' => 'crt',
'name' => 'trname',
],
]
)
);
$dbi->expects($this->exactly(2))
->method('getProceduresOrFunctions')
->willReturnOnConsecutiveCalls(
['fn'],
['pr']
);
$dbi->expects($this->exactly(2))
->method('getDefinition')
->willReturnOnConsecutiveCalls(
'fndef',
'prdef'
);
$dbi->expects($this->once())
->method('getTable')
->will($this->returnValue(new Table('table', 'd<"b', $dbi)));
$dbi->expects($this->any())->method('escapeString')
->will($this->returnArgument(0));
$GLOBALS['dbi'] = $dbi;
$GLOBALS['tables'] = [];
$GLOBALS['table'] = 'table';
ob_start();
$this->assertTrue(
$this->object->exportHeader()
);
$result = ob_get_clean();
$this->assertStringContainsString(
'&lt;pma_xml_export version=&quot;1.0&quot; xmlns:pma=&quot;' .
'https://www.phpmyadmin.net/some_doc_url/&quot;&gt;',
$result
);
$this->assertStringContainsString(
'&lt;pma:structure_schemas&gt;' . "\n" .
' &lt;pma:database name=&quot;d&amp;lt;&amp;quot;b&quot; collat' .
'ion=&quot;utf8_general_ci&quot; charset=&quot;utf-8&quot;&gt;' . "\n" .
' &lt;pma:table name=&quot;table&quot;&gt;' . "\n" .
' &amp;quot;tbl&amp;quot;;' . "\n" .
' &lt;/pma:table&gt;' . "\n" .
' &lt;pma:trigger name=&quot;trname&quot;&gt;' . "\n" .
' ' . "\n" .
' &lt;/pma:trigger&gt;' . "\n" .
' &lt;pma:function name=&quot;fn&quot;&gt;' . "\n" .
' fndef' . "\n" .
' &lt;/pma:function&gt;' . "\n" .
' &lt;pma:procedure name=&quot;pr&quot;&gt;' . "\n" .
' prdef' . "\n" .
' &lt;/pma:procedure&gt;' . "\n" .
' &lt;/pma:database&gt;' . "\n" .
' &lt;/pma:structure_schemas&gt;',
$result
);
// case 2 with isView as true and false
unset($GLOBALS['xml_export_contents']);
unset($GLOBALS['xml_export_views']);
unset($GLOBALS['xml_export_tables']);
unset($GLOBALS['xml_export_functions']);
unset($GLOBALS['xml_export_procedures']);
$GLOBALS['output_charset_conversion'] = 0;
$dbi = $this->getMockBuilder(DatabaseInterface::class)
->disableOriginalConstructor()
->getMock();
$result_1 = [
[
'DEFAULT_COLLATION_NAME' => 'utf8_general_ci',
'DEFAULT_CHARACTER_SET_NAME' => 'utf-8',
],
];
$result_2 = [
't1' => [
null,
'"tbl"',
],
];
$result_3 = [
't2' => [
null,
'"tbl"',
],
];
$dbi->expects($this->exactly(5))
->method('fetchResult')
->willReturnOnConsecutiveCalls(
$result_1,
$result_2,
true,
$result_3,
false
);
$dbi->expects($this->any())
->method('getTable')
->will($this->returnValue(new Table('table', 'd<"b', $dbi)));
$GLOBALS['dbi'] = $dbi;
$GLOBALS['tables'] = [
't1',
't2',
];
ob_start();
$this->assertTrue(
$this->object->exportHeader()
);
$result = ob_get_clean();
//echo $result; die;
$this->assertStringContainsString(
'&lt;pma:structure_schemas&gt;' . "\n" .
' &lt;pma:database name=&quot;d&amp;lt;&amp;quot;b&quot; collat' .
'ion=&quot;utf8_general_ci&quot; charset=&quot;utf-8&quot;&gt;' . "\n" .
' &lt;/pma:database&gt;' . "\n" .
' &lt;/pma:structure_schemas&gt;',
$result
);
}
/**
* Test for PhpMyAdmin\Plugins\Export\ExportXml::exportFooter
*/
public function testExportFooter(): void
{
$this->expectOutputString(
'&lt;/pma_xml_export&gt;'
);
$this->assertTrue(
$this->object->exportFooter()
);
}
/**
* Test for PhpMyAdmin\Plugins\Export\ExportXml::exportDBHeader
*/
public function testExportDBHeader(): void
{
$GLOBALS['xml_export_contents'] = true;
ob_start();
$this->assertTrue(
$this->object->exportDBHeader('&db')
);
$result = ob_get_clean();
$this->assertStringContainsString(
'&lt;database name=&quot;&amp;amp;db&quot;&gt;',
$result
);
$GLOBALS['xml_export_contents'] = false;
$this->assertTrue(
$this->object->exportDBHeader('&db')
);
}
/**
* Test for PhpMyAdmin\Plugins\Export\ExportXml::exportDBFooter
*/
public function testExportDBFooter(): void
{
$GLOBALS['xml_export_contents'] = true;
ob_start();
$this->assertTrue(
$this->object->exportDBFooter('&db')
);
$result = ob_get_clean();
$this->assertStringContainsString(
'&lt;/database&gt;',
$result
);
$GLOBALS['xml_export_contents'] = false;
$this->assertTrue(
$this->object->exportDBFooter('&db')
);
}
/**
* Test for PhpMyAdmin\Plugins\Export\ExportXml::exportDBCreate
*/
public function testExportDBCreate(): void
{
$this->assertTrue(
$this->object->exportDBCreate('testDB', 'database')
);
}
/**
* Test for PhpMyAdmin\Plugins\Export\ExportXml::exportData
*/
public function testExportData(): void
{
$GLOBALS['xml_export_contents'] = true;
$GLOBALS['asfile'] = true;
$GLOBALS['output_charset_conversion'] = false;
$dbi = $this->getMockBuilder(DatabaseInterface::class)
->disableOriginalConstructor()
->getMock();
$_table = $this->getMockBuilder(Table::class)
->disableOriginalConstructor()
->getMock();
$_table->expects($this->once())
->method('isMerge')
->will($this->returnValue(false));
$dbi->expects($this->any())
->method('getTable')
->will($this->returnValue($_table));
$dbi->expects($this->once())
->method('getTable')
->will($this->returnValue($_table));
$dbi->expects($this->once())
->method('query')
->with('SELECT', DatabaseInterface::CONNECT_USER, DatabaseInterface::QUERY_UNBUFFERED)
->will($this->returnValue(true));
$dbi->expects($this->once())
->method('numFields')
->with(true)
->will($this->returnValue(3));
$dbi->expects($this->at(3))
->method('fieldName')
->will($this->returnValue('fName1'));
$dbi->expects($this->at(4))
->method('fieldName')
->will($this->returnValue('fNa"me2'));
$dbi->expects($this->at(5))
->method('fieldName')
->will($this->returnValue('fNa\\me3'));
$dbi->expects($this->at(6))
->method('fetchRow')
->with(true)
->will($this->returnValue([null, '<a>']));
$GLOBALS['dbi'] = $dbi;
ob_start();
$this->assertTrue(
$this->object->exportData(
'db',
'ta<ble',
"\n",
'example.com',
'SELECT'
)
);
$result = ob_get_clean();
$this->assertStringContainsString(
'<!-- Table ta&lt;ble -->',
$result
);
$this->assertStringContainsString(
'<table name="ta&lt;ble">',
$result
);
$this->assertStringContainsString(
'<column name="fName1">NULL</column>',
$result
);
$this->assertStringContainsString(
'<column name="fNa&quot;me2">&lt;a&gt;' .
'</column>',
$result
);
$this->assertStringContainsString(
'<column name="fName3">NULL</column>',
$result
);
$this->assertStringContainsString(
'</table>',
$result
);
}
}