getExportHtmlword();
$method = new ReflectionMethod(ExportHtmlword::class, 'setProperties');
$method->invoke($exportHtmlword, null);
$attrProperties = new ReflectionProperty(ExportHtmlword::class, 'properties');
$properties = $attrProperties->getValue($exportHtmlword);
self::assertInstanceOf(ExportPluginProperties::class, $properties);
self::assertSame(
'Microsoft Word 2000',
$properties->getText(),
);
self::assertSame(
'doc',
$properties->getExtension(),
);
self::assertSame(
'application/vnd.ms-word',
$properties->getMimeType(),
);
self::assertTrue(
$properties->getForceFile(),
);
$options = $properties->getOptions();
self::assertInstanceOf(OptionsPropertyRootGroup::class, $options);
self::assertSame(
'Format Specific Options',
$options->getName(),
);
$generalOptionsArray = $options->getProperties();
$generalOptions = $generalOptionsArray->current();
$generalOptionsArray->next();
self::assertInstanceOf(OptionsPropertyMainGroup::class, $generalOptions);
self::assertSame(
'htmlword_dump_what',
$generalOptions->getName(),
);
self::assertSame(
'Dump table',
$generalOptions->getText(),
);
$generalProperties = $generalOptions->getProperties();
$property = $generalProperties->current();
self::assertInstanceOf(RadioPropertyItem::class, $property);
self::assertSame(
'htmlword_structure_or_data',
$property->getName(),
);
self::assertSame(
['structure' => __('structure'), 'data' => __('data'), 'structure_and_data' => __('structure and data')],
$property->getValues(),
);
$generalOptions = $generalOptionsArray->current();
self::assertInstanceOf(OptionsPropertyMainGroup::class, $generalOptions);
self::assertSame(
'htmlword_dump_data_options',
$generalOptions->getName(),
);
self::assertSame(
'Data dump options',
$generalOptions->getText(),
);
$generalProperties = $generalOptions->getProperties();
$property = $generalProperties->current();
$generalProperties->next();
self::assertInstanceOf(TextPropertyItem::class, $property);
self::assertSame(
'htmlword_null',
$property->getName(),
);
self::assertSame(
'Replace NULL with:',
$property->getText(),
);
$property = $generalProperties->current();
self::assertInstanceOf(BoolPropertyItem::class, $property);
self::assertSame(
'htmlword_columns',
$property->getName(),
);
self::assertSame(
'Put columns names in the first row',
$property->getText(),
);
}
public function testExportHeader(): void
{
$exportHtmlword = $this->getExportHtmlword();
ob_start();
$exportHtmlword->exportHeader();
$result = ob_get_clean();
$expected = '
';
self::assertSame($expected, $result);
// case 2
Current::$charset = 'ISO-8859-1';
ob_start();
$exportHtmlword->exportHeader();
$result = ob_get_clean();
$expected = '
';
self::assertSame($expected, $result);
}
public function testExportFooter(): void
{
$exportHtmlword = $this->getExportHtmlword();
ob_start();
$exportHtmlword->exportFooter();
$result = ob_get_clean();
self::assertSame('', $result);
}
public function testExportDBHeader(): void
{
$exportHtmlword = $this->getExportHtmlword();
ob_start();
$exportHtmlword->exportDBHeader('d"b');
$result = ob_get_clean();
self::assertSame('Database d"b
', $result);
}
public function testExportDBFooter(): void
{
$exportHtmlword = $this->getExportHtmlword();
$this->expectNotToPerformAssertions();
$exportHtmlword->exportDBFooter('testDB');
}
public function testExportDBCreate(): void
{
$exportHtmlword = $this->getExportHtmlword();
$this->expectNotToPerformAssertions();
$exportHtmlword->exportDBCreate('testDB');
}
public function testExportData(): void
{
$exportHtmlword = $this->getExportHtmlword();
// case 1
OutputHandler::$asFile = true;
$request = ServerRequestFactory::create()->createServerRequest('POST', 'https://example.com/')
->withParsedBody(['htmlword_columns' => 'On']);
$exportHtmlword->setExportOptions($request, new SettingsExport());
ob_start();
$exportHtmlword->exportData('test_db', 'test_table', 'SELECT * FROM `test_db`.`test_table`;');
$result = ob_get_clean();
self::assertSame(
'Dumping data for table test_table
'
. ''
. '| id | '
. 'name | '
. 'datetimefield | '
. '
'
. '| 1 | abcd | 2011-01-20 02:00:02 | '
. '
'
. '| 2 | foo | 2010-01-20 02:00:02 | '
. '
'
. '| 3 | Abcd | 2012-01-20 02:00:02 | '
. '
',
$result,
);
}
public function testGetTableDefStandIn(): void
{
$keys = [['Non_unique' => 0, 'Column_name' => 'name1'], ['Non_unique' => 1, 'Column_name' => 'name2']];
$dbi = $this->createMock(DatabaseInterface::class);
$dbi->expects(self::once())
->method('getTableIndexes')
->with('database', 'view')
->willReturn($keys);
$column = new Column('column', '', null, false, '', null, '', '', '');
$dbi->expects(self::once())
->method('getColumns')
->with('database', 'view')
->willReturn([$column]);
$exportHtmlword = $this->getExportHtmlword($dbi);
self::assertSame(
'' .
'| Column | ' .
'Type | ' .
'Null | ' .
'Default |
' .
'| column | ' .
' | No | | ' .
'
',
$exportHtmlword->getTableDefStandIn('database', 'view'),
);
}
public function testGetTableDef(): void
{
$keys = [['Non_unique' => 0, 'Column_name' => 'name1'], ['Non_unique' => 1, 'Column_name' => 'name2']];
// case 1
$dbi = $this->createMock(DatabaseInterface::class);
$dbi->expects(self::exactly(2))
->method('fetchResult')
->willReturn(
[],
['fieldname' => ['values' => 'test-', 'transformation' => 'testfoo', 'mimetype' => 'test<']],
);
$dbi->expects(self::once())
->method('getTableIndexes')
->with('database', 't1')
->willReturn($keys);
$column = new Column('fieldname', '', null, false, '', null, '', '', '');
$dbi->expects(self::exactly(2))
->method('getColumns')
->with('database', 't1')
->willReturn([$column]);
$exportHtmlword = $this->getExportHtmlword($dbi);
$relationParameters = RelationParameters::fromArray([
RelationParameters::REL_WORK => true,
RelationParameters::COMM_WORK => true,
RelationParameters::MIME_WORK => true,
RelationParameters::DATABASE => 'database',
RelationParameters::RELATION => 'rel',
RelationParameters::COLUMN_INFO => 'col',
]);
(new ReflectionProperty(Relation::class, 'cache'))->setValue(null, $relationParameters);
$request = ServerRequestFactory::create()->createServerRequest('POST', 'https://example.com/')
->withParsedBody(['htmlword_relation' => 'On', 'htmlword_mime' => 'On', 'htmlword_comments' => 'On']);
$exportHtmlword->setExportOptions($request, new SettingsExport());
$result = $exportHtmlword->getTableDef('database', 't1');
self::assertSame(
'' .
'| Column | ' .
'Type | ' .
'Null | ' .
'Default | ' .
'Comments | ' .
'Media type |
' .
'| fieldname | | ' .
'No | | ' .
' | Test< |
',
$result,
);
// case 2
$dbi = $this->createMock(DatabaseInterface::class);
$dbi->expects(self::exactly(2))
->method('fetchResult')
->willReturn(
['fieldname' => ['foreign_table' => 'ftable', 'foreign_field' => 'ffield']],
['field' => ['values' => 'test-', 'transformation' => 'testfoo', 'mimetype' => 'test<']],
);
$dbi->expects(self::once())
->method('getTableIndexes')
->with('database', 't1')
->willReturn($keys);
$column = new Column('fieldname', '', null, false, '', null, '', '', '');
$dbi->expects(self::exactly(2))
->method('getColumns')
->with('database', 't1')
->willReturn([$column]);
$exportHtmlword = $this->getExportHtmlword($dbi);
$exportHtmlword->setExportOptions($request, new SettingsExport());
$relationParameters = RelationParameters::fromArray([
RelationParameters::REL_WORK => true,
RelationParameters::COMM_WORK => true,
RelationParameters::MIME_WORK => true,
RelationParameters::DATABASE => 'database',
RelationParameters::RELATION => 'rel',
RelationParameters::COLUMN_INFO => 'col',
]);
(new ReflectionProperty(Relation::class, 'cache'))->setValue(null, $relationParameters);
$result = $exportHtmlword->getTableDef('database', 't1');
self::assertStringContainsString('ftable (ffield) | ', $result);
self::assertStringContainsString(' | | ', $result);
// case 3
$dbi = $this->createMock(DatabaseInterface::class);
$dbi->expects(self::once())
->method('getTableIndexes')
->with('database', 't1')
->willReturn($keys);
$column = new Column('fieldname', '', null, false, '', null, '', '', '');
$dbi->expects(self::once())
->method('getColumns')
->with('database', 't1')
->willReturn([$column]);
$dbi->expects(self::never())
->method('tryQuery');
$relationParameters = RelationParameters::fromArray([
RelationParameters::DATABASE => 'database',
RelationParameters::RELATION => 'rel',
RelationParameters::COLUMN_INFO => 'col',
]);
(new ReflectionProperty(Relation::class, 'cache'))->setValue(null, $relationParameters);
$request = ServerRequestFactory::create()->createServerRequest('POST', 'https://example.com/')
->withParsedBody(['htmlword_relation' => 'On', 'htmlword_mime' => 'On']);
$exportHtmlword = $this->getExportHtmlword($dbi);
$exportHtmlword->setExportOptions($request, new SettingsExport());
$result = $exportHtmlword->getTableDef('database', 't1');
self::assertSame(
'' .
'| Column | ' .
'Type | ' .
'Null | ' .
'Default |
' .
'| fieldname | | ' .
'No | | ' .
'
',
$result,
);
}
public function testGetTriggers(): void
{
$triggers = [
new Trigger(
TriggerName::from('tna"me'),
Timing::Before,
Event::Update,
TableName::from('table'),
'def',
'test_user@localhost',
),
];
$exportHtmlword = $this->getExportHtmlword();
$method = new ReflectionMethod(ExportHtmlword::class, 'getTriggers');
$result = $method->invoke($exportHtmlword, $triggers);
self::assertStringContainsString(
'tna"me | ' .
'BEFORE | ' .
'UPDATE | ' .
'def | ',
$result,
);
}
public function testExportStructure(): void
{
Config::getInstance()->selectedServer['DisableIS'] = true;
$dbiDummy = $this->createDbiDummy();
$exportHtmlword = $this->getExportHtmlword($this->createDatabaseInterface($dbiDummy));
ob_start();
$dbiDummy->addSelectDb('test_db');
$exportHtmlword->exportStructure('test_db', 'test_table', 'create_table');
$dbiDummy->assertAllSelectsConsumed();
$result = ob_get_clean();
self::assertSame(
'Table structure for table test_table
'
. ''
. '| Column | Type | '
. 'Null | Default |
'
. '| id | '
. 'int(11) | No | NULL |
'
. '| name | varchar(20) | '
. 'No | NULL |
'
. '| datetimefield | datetime | '
. 'No | NULL |
',
$result,
);
ob_start();
$exportHtmlword->exportStructure('test_db', 'test_table', 'triggers');
$result = ob_get_clean();
self::assertSame(
'Triggers test_table
'
. '| Name | '
. 'Time | Event | '
. 'Definition |
|---|
'
. '| test_trigger | AFTER | '
. 'INSERT | BEGIN END |
',
$result,
);
ob_start();
$dbiDummy->addSelectDb('test_db');
$exportHtmlword->exportStructure('test_db', 'test_table', 'create_view');
$dbiDummy->assertAllSelectsConsumed();
$result = ob_get_clean();
self::assertSame(
'Structure for view test_table
'
. ''
. '| Column | Type | '
. 'Null | Default'
. ' |
| id | '
. 'int(11) | No | NULL |
'
. '| name | varchar(20) | '
. 'No | NULL |
'
. '| datetimefield | datetime | '
. 'No | NULL |
',
$result,
);
ob_start();
$exportHtmlword->exportStructure('test_db', 'test_table', 'stand_in');
$result = ob_get_clean();
self::assertSame(
'Stand-in structure for view test_table
'
. ''
. '| Column | Type | '
. 'Null | Default | '
. '
'
. '| id | int(11) | '
. 'No | NULL |
'
. '| name | varchar(20) | No | '
. 'NULL |
'
. '| datetimefield | datetime | '
. 'No | NULL |
',
$result,
);
}
public function testFormatOneColumnDefinition(): void
{
$method = new ReflectionMethod(ExportHtmlword::class, 'formatOneColumnDefinition');
$column = new Column('field', 'set(abc)enum123', null, true, 'PRI', null, '', '', '');
$uniqueKeys = ['field'];
$exportHtmlword = $this->getExportHtmlword();
self::assertSame(
'| ' .
'field | set(abc) | ' .
'Yes | NULL | ',
$method->invoke($exportHtmlword, $column, $uniqueKeys),
);
$column = new Column('fields', '', null, false, 'COMP', 'def', '', '', '');
$uniqueKeys = ['field'];
self::assertSame(
'
| fields | ' .
' | No | ' .
'def | ',
$method->invoke($exportHtmlword, $column, $uniqueKeys),
);
}
public function testExportTableCallsExportStructureMethod(): void
{
$dbi = $this->createStub(DatabaseInterface::class);
$exportHtmlword = $this->getExportHtmlword($dbi);
$request = ServerRequestFactory::create()->createServerRequest('POST', 'https://example.com/')
->withParsedBody(['htmlword_structure_or_data' => 'structure']);
$exportHtmlword->setExportOptions($request, new SettingsExport());
$export = new Export($dbi, new OutputHandler());
ob_start();
$export->exportTable(
'test_db',
'test_table',
$exportHtmlword,
null,
'',
'',
'',
[],
);
$output = ob_get_clean();
self::assertStringContainsString('Table structure for table test_table
', $output);
}
private function getExportHtmlword(DatabaseInterface|null $dbi = null): ExportHtmlword
{
$dbi ??= $this->createDatabaseInterface();
$config = new Config();
$relation = new Relation($dbi, $config);
return new ExportHtmlword($relation, new OutputHandler(), new Transformations($dbi, $relation), $dbi, $config);
}
}