createDatabaseInterface(); } public function testGetExport(): void { $plugins = Plugins::getExport(ExportType::Database, false); $isCurl = extension_loaded('curl'); self::assertSame(ExportType::Database, ExportPlugin::$exportType); self::assertFalse(ExportPlugin::$singleTable); $pluginCount = $isCurl ? 15 : 14; self::assertCount($pluginCount, $plugins); self::assertContainsOnlyInstancesOf(ExportPlugin::class, $plugins); } public function testGetImport(): void { ImportSettings::$importType = 'database'; $plugins = Plugins::getImport(); self::assertCount(6, $plugins); self::assertContainsOnlyInstancesOf(ImportPlugin::class, $plugins); } public function testGetSchema(): void { $plugins = Plugins::getSchema(); self::assertCount(4, $plugins); self::assertContainsOnlyInstancesOf(SchemaPlugin::class, $plugins); } #[DataProvider('providerForTestGetDefault')] public function testGetDefault( string $expected, string|int|null $actualConfig, string|null $actualGet, PluginType $pluginType, string $option, bool|null $timeoutPassed, ): void { $_GET = []; $_REQUEST = []; if ($timeoutPassed !== null) { ImportSettings::$timeoutPassed = $timeoutPassed; $_REQUEST[$option] = $actualGet; } elseif ($actualGet !== null) { $_GET[$option] = $actualGet; } Config::getInstance()->settings[$pluginType->value][$option] = $actualConfig; $default = Plugins::getDefault($pluginType, $option); self::assertSame($expected, $default); } /** @return array */ public static function providerForTestGetDefault(): array { return [ ['xml', 'xml', null, PluginType::Export, 'format', null], ['xml', 'sql', 'xml', PluginType::Export, 'format', null], ['xml', null, 'xml', PluginType::Export, 'format', null], ['', null, null, PluginType::Export, 'format', null], [ 'strLatexStructure strTest strLatexContinued', 'strLatexStructure strTest strLatexContinued', null, PluginType::Export, 'latex_structure_continued_caption', null, ], ['xml', 'sql', 'xml', PluginType::Export, 'format', true], ['sql', 'sql', 'xml', PluginType::Export, 'format', false], ['30', 30, null, PluginType::Import, 'skip_queries', null], ]; } public function testGetChoice(): void { $config = new Config(); $dbi = DatabaseInterface::getInstance($config); $relation = new Relation($dbi, $config); $transformations = new Transformations($dbi, $relation); $outputHandler = new OutputHandler(); $exportList = [ new ExportJson($relation, $outputHandler, $transformations, $dbi, $config), new ExportOds($relation, $outputHandler, $transformations, $dbi, $config), new ExportSql($relation, $outputHandler, $transformations, $dbi, $config), new ExportXml($relation, $outputHandler, $transformations, $dbi, $config), ]; $actual = Plugins::getChoice($exportList, 'xml'); $expected = [ ['name' => 'json', 'text' => 'JSON', 'is_selected' => false, 'is_binary' => false], ['name' => 'ods', 'text' => 'OpenDocument Spreadsheet', 'is_selected' => false, 'is_binary' => true], ['name' => 'sql', 'text' => 'SQL', 'is_selected' => false, 'is_binary' => false], ['name' => 'xml', 'text' => 'XML', 'is_selected' => true, 'is_binary' => false], ]; self::assertSame($expected, $actual); } public function testGetPlugin(): void { ContainerBuilder::$container = null; self::assertNull(Plugins::getPlugin('export', 'unknown')); self::assertInstanceOf(ExportSql::class, Plugins::getPlugin('export', 'sql', ExportType::Table, true)); self::assertInstanceOf(ImportSql::class, Plugins::getPlugin('import', 'sql')); self::assertInstanceOf(SchemaPdf::class, Plugins::getPlugin('schema', 'pdf')); } public function testGetOptionsForImport(): void { $dbiDummy = $this->createDbiDummy(); $dbiDummy->addResult('SELECT @@local_infile;', [['1']]); ContainerBuilder::$container = $this->getContainerForGetOptions($this->createDatabaseInterface($dbiDummy)); ImportSettings::$importType = 'table'; $options = Plugins::getOptions(PluginType::Import, Plugins::getImport()); $dbiDummy->assertAllQueriesConsumed(); // phpcs:disable Generic.Files.LineLength.TooLong $expected = <<<'HTML'

CSV

CSV using LOAD DATA

ESRI Shape File

This format has no options

MediaWiki Table

This format has no options

OpenDocument Spreadsheet

SQL

  • Documentation
  • Documentation

XML

This format has no options

HTML; // phpcs:enable self::assertSame($expected, $options); } public function testGetOptionsForExport(): void { ContainerBuilder::$container = $this->getContainerForGetOptions($this->createDatabaseInterface()); $options = Plugins::getOptions(PluginType::Export, Plugins::getExport(ExportType::Table, true)); // phpcs:disable Generic.Files.LineLength.TooLong $expected = <<<'HTML'

CodeGen

CSV

CSV for MS Excel

JSON

LaTeX

Dump table
Object creation options
  • Documentation
  • Documentation
  • Documentation
Data dump options
  • Documentation
  • Documentation
  • Documentation

MediaWiki Table

Dump table

Microsoft Word 2000

Dump table
Data dump options

OpenDocument Spreadsheet

OpenDocument Text

Dump table
Object creation options
Data dump options

PDF

Dump table

PHP array

This format has no options

SQL

  • Documentation
  • Documentation
  • Documentation
Object creation options
  • Add statements:
Data creation options
  • Instead of INSERT statements, use:
    • Documentation
    • Documentation
  • Syntax to use when inserting data:

Texy! text

Dump table
Data dump options

TOON

YAML

This format has no options

HTML; // phpcs:enable self::assertSame($expected, $options); } public function testGetOptionsForSchema(): void { ContainerBuilder::$container = $this->getContainerForGetOptions($this->createDatabaseInterface()); $options = Plugins::getOptions(PluginType::Schema, Plugins::getSchema()); // phpcs:disable Generic.Files.LineLength.TooLong $expected = <<<'HTML'

Dia

EPS

PDF

SVG

HTML; // phpcs:enable self::assertSame($expected, $options); } private function getContainerForGetOptions(DatabaseInterface $dbi): ContainerInterface { return new class ($dbi) implements ContainerInterface { public function __construct(private readonly DatabaseInterface $dbi) { } /** @psalm-suppress MethodSignatureMismatch */ public function get(string $id): mixed { $config = new Config(); $relation = new Relation($this->dbi, $config); return match ($id) { DatabaseInterface::class => $this->dbi, Config::class => $config, Import::class => new Import($this->dbi, new ResponseRenderer(), $config), Relation::class => $relation, Transformations::class => new Transformations($this->dbi, $relation), OutputHandler::class => new OutputHandler(), default => null, }; } public function has(string $id): bool { return true; } }; } public function testValidatePluginNameOrUseDefaultForExport(): void { $config = new Config(); $dbi = DatabaseInterface::getInstance($config); $relation = new Relation($dbi, $config); $transformations = new Transformations($dbi, $relation); $outputHandler = new OutputHandler(); $exportList = [ new ExportJson($relation, $outputHandler, $transformations, $dbi, $config), new ExportOds($relation, $outputHandler, $transformations, $dbi, $config), new ExportSql($relation, $outputHandler, $transformations, $dbi, $config), new ExportXml($relation, $outputHandler, $transformations, $dbi, $config), ]; $actual = Plugins::validatePluginNameOrUseDefault($exportList, 'xml'); self::assertSame('xml', $actual); $actual = Plugins::validatePluginNameOrUseDefault($exportList, 'lmx'); self::assertSame('sql', $actual); } public function testValidatePluginNameOrUseDefaultForImport(): void { $config = new Config(); $dbi = DatabaseInterface::getInstance($config); $importList = [ new ImportOds(new Import($dbi, new ResponseRenderer(), $config), $dbi, $config), new ImportSql(new Import($dbi, new ResponseRenderer(), $config), $dbi, $config), new ImportXml(new Import($dbi, new ResponseRenderer(), $config), $dbi, $config), ]; $actual = Plugins::validatePluginNameOrUseDefault($importList, 'xml'); self::assertSame('xml', $actual); $actual = Plugins::validatePluginNameOrUseDefault($importList, 'lmx'); self::assertSame('sql', $actual); } }