diff --git a/tests/data/simple_xml_current_url1.xml b/tests/data/xml_current_url1.xml similarity index 100% rename from tests/data/simple_xml_current_url1.xml rename to tests/data/xml_current_url1.xml diff --git a/tests/data/simple_xml_current_url2.xml b/tests/data/xml_current_url2.xml similarity index 100% rename from tests/data/simple_xml_current_url2.xml rename to tests/data/xml_current_url2.xml diff --git a/tests/data/simple_xml_reduce_single_value.xml b/tests/data/xml_reduce_single_value.xml similarity index 100% rename from tests/data/simple_xml_reduce_single_value.xml rename to tests/data/xml_reduce_single_value.xml diff --git a/tests/src/Kernel/Plugin/migrate_plus/data_parser/BaseXmlTest.php b/tests/src/Kernel/Plugin/migrate_plus/data_parser/BaseXmlTest.php new file mode 100644 index 0000000000000000000000000000000000000000..4e23038dd6376f8b13c63df20482787a4f0e825c --- /dev/null +++ b/tests/src/Kernel/Plugin/migrate_plus/data_parser/BaseXmlTest.php @@ -0,0 +1,174 @@ +<?php + +declare(strict_types = 1); + +namespace Drupal\Tests\migrate_plus\Kernel\Plugin\migrate_plus\data_parser; + +use Drupal\KernelTests\KernelTestBase; +use Drupal\migrate_plus\DataParserPluginInterface; +use Drupal\migrate_plus\DataParserPluginManager; + +/** + * Test of the data_parser SimpleXml migrate_plus plugin. + * + * @group migrate_plus + */ +abstract class BaseXmlTest extends KernelTestBase { + + /** + * {@inheritdoc} + */ + protected static $modules = ['migrate', 'migrate_plus']; + + /** + * Path for the xml file. + */ + protected ?string $path; + + /** + * The plugin manager. + */ + protected ?DataParserPluginManager $pluginManager = NULL; + + /** + * The plugin configuration. + */ + protected ?array $configuration; + + /** + * The expected result. + */ + protected ?array $expected; + + /** + * {@inheritdoc} + */ + protected function setUp(): void { + parent::setUp(); + $this->path = $this->container->get('module_handler') + ->getModule('migrate_plus')->getPath(); + $this->pluginManager = $this->container + ->get('plugin.manager.migrate_plus.data_parser'); + $this->configuration = [ + 'plugin' => 'url', + 'data_fetcher_plugin' => 'file', + 'data_parser_plugin' => 'simple_xml', + 'destination' => 'node', + 'urls' => [], + 'ids' => ['id' => ['type' => 'integer']], + 'fields' => [ + [ + 'name' => 'id', + 'label' => 'Id', + 'selector' => '@id', + ], + [ + 'name' => 'values', + 'label' => 'Values', + 'selector' => 'values', + ], + ], + 'item_selector' => '/items/item', + ]; + $this->expected = [ + [ + 'Value 1', + 'Value 2', + ], + [ + 'Value 1 (single)', + ], + ]; + } + + /** + * Tests current URL of parsed XML item. + */ + public function testCurrentUrl(): void { + $urls = [ + $this->path . '/tests/data/xml_current_url1.xml', + $this->path . '/tests/data/xml_current_url2.xml', + ]; + $this->configuration['urls'] = $urls; + $parser = $this->getParser(); + + // First 2 items available in the first URL. + $parser->rewind(); + $this->assertEquals($urls[0], $parser->currentUrl()); + $parser->next(); + $this->assertEquals($urls[0], $parser->currentUrl()); + + // Third item available in the second URL. + $parser->next(); + $this->assertEquals($urls[1], $parser->currentUrl()); + } + + /** + * Tests reducing single values. + */ + public function testReduceSingleValue(): void { + $url = $this->path . '/tests/data/xml_reduce_single_value.xml'; + $this->configuration['urls'][0] = $url; + $this->assertResults($this->expected, $this->getParser()); + } + + /** + * Tests retrieving single value from element with attributes. + */ + public function testSingleValueWithAttributes() { + $urls = [ + $this->path . '/tests/data/xml_data_parser.xml', + ]; + $this->configuration['urls'] = $urls; + $this->configuration['item_selector'] = '/persons/person'; + $this->configuration['fields'] = [ + [ + 'name' => 'id', + 'label' => 'Id', + 'selector' => 'id', + ], + [ + 'name' => 'child', + 'label' => 'child', + 'selector' => 'children/child', + ], + ]; + + $names = []; + foreach ($this->getParser() as $item) { + $names[] = (string) $item['child']->name; + } + + $expected_names = ['Elizabeth Junior', 'George Junior', 'Lucy']; + $this->assertEquals($expected_names, $names); + } + + /** + * Parses and asserts the results match expectations. + * + * @param array|string $expected + * The expected results. + * @param \Traversable $parser + * An iterable data result to parse. + */ + protected function assertResults($expected, \Traversable $parser): void { + $data = []; + foreach ($parser as $item) { + $values = []; + foreach ($item['values'] as $value) { + $values[] = (string) $value; + } + $data[] = $values; + } + $this->assertEquals($expected, $data); + } + + /** + * Returns a parse object with active configuration. + * + * @return \Drupal\migrate_plus\DataParserPluginInterface + * Data parser object. + */ + abstract protected function getParser(): DataParserPluginInterface; + +} diff --git a/tests/src/Kernel/Plugin/migrate_plus/data_parser/SimpleXmlTest.php b/tests/src/Kernel/Plugin/migrate_plus/data_parser/SimpleXmlTest.php index dfa9039fc0d2101f1fded62f7d4829bd1c840ad9..282a0cd6995eb62545b1d24f7183744670f77770 100644 --- a/tests/src/Kernel/Plugin/migrate_plus/data_parser/SimpleXmlTest.php +++ b/tests/src/Kernel/Plugin/migrate_plus/data_parser/SimpleXmlTest.php @@ -4,146 +4,40 @@ declare(strict_types = 1); namespace Drupal\Tests\migrate_plus\Kernel\Plugin\migrate_plus\data_parser; -use Drupal\KernelTests\KernelTestBase; use Drupal\migrate\MigrateException; -use Drupal\migrate_plus\DataParserPluginManager; +use Drupal\migrate_plus\DataParserPluginInterface; /** * Test of the data_parser SimpleXml migrate_plus plugin. * * @group migrate_plus */ -final class SimpleXmlTest extends KernelTestBase { +class SimpleXmlTest extends BaseXmlTest { /** - * {@inheritdoc} - */ - protected static $modules = ['migrate', 'migrate_plus']; - - /** - * Path for the xml file. - */ - protected ?string $path; - - /** - * The plugin manager. - */ - protected ?DataParserPluginManager $pluginManager = NULL; - - /** - * The plugin configuration. - */ - protected ?array $configuration; - - /** - * The expected result. - */ - protected ?array $expected; - - /** - * {@inheritdoc} - */ - protected function setUp(): void { - parent::setUp(); - $this->path = $this->container->get('module_handler') - ->getModule('migrate_plus')->getPath(); - $this->pluginManager = $this->container - ->get('plugin.manager.migrate_plus.data_parser'); - $this->configuration = [ - 'plugin' => 'url', - 'data_fetcher_plugin' => 'file', - 'data_parser_plugin' => 'simple_xml', - 'destination' => 'node', - 'urls' => [], - 'ids' => ['id' => ['type' => 'integer']], - 'fields' => [ - [ - 'name' => 'id', - 'label' => 'Id', - 'selector' => '@id', - ], - [ - 'name' => 'values', - 'label' => 'Values', - 'selector' => 'values', - ], - ], - 'item_selector' => '/items/item', - ]; - $this->expected = [ - [ - 'Value 1', - 'Value 2', - ], - [ - 'Value 1 (single)', - ], - ]; - } - - /** - * Tests current URL of parsed XML item. - */ - public function testCurrentUrl(): void { - $urls = [ - $this->path . '/tests/data/simple_xml_current_url1.xml', - $this->path . '/tests/data/simple_xml_current_url2.xml', - ]; - $this->configuration['urls'] = $urls; - /** @var \Drupal\migrate_plus\DataParserPluginInterface $parser */ - $parser = $this->pluginManager->createInstance('simple_xml', $this->configuration); - - // First 2 items available in the first URL. - $parser->rewind(); - $this->assertEquals($urls[0], $parser->currentUrl()); - $parser->next(); - $this->assertEquals($urls[0], $parser->currentUrl()); - - // Third item available in the second URL. - $parser->next(); - $this->assertEquals($urls[1], $parser->currentUrl()); - } - - /** - * Tests reducing single values. - */ - public function testReduceSingleValue(): void { - $url = $this->path . '/tests/data/simple_xml_reduce_single_value.xml'; - $this->configuration['urls'][0] = $url; - $parser = $this->pluginManager->createInstance('simple_xml', $this->configuration); - $this->assertResults($this->expected, $parser); - } - - /** - * Test reading non standard conforming XML. + * Test reading non-standard conforming XML. * * XML file with lots of different white spaces before the starting tag. */ public function testReadNonStandardXmlWhitespace(): void { $url = $this->path . '/tests/data/simple_xml_invalid_multi_whitespace.xml'; $this->configuration['urls'][0] = $url; - - $parser = $this->pluginManager->createInstance('simple_xml', $this->configuration); - $this->assertResults($this->expected, $parser); + $this->assertResults($this->expected, $this->getParser()); } /** - * Test reading non standard conforming XML . + * Test reading non-standard conforming XML . * * XML file with one empty line before the starting tag. */ public function testReadNonStandardXml2(): void { $url = $this->path . '/tests/data/simple_xml_invalid_single_line.xml'; $this->configuration['urls'][0] = $url; - - $parser = $this->pluginManager->createInstance('simple_xml', $this->configuration); - $this->assertResults($this->expected, $parser); + $this->assertResults($this->expected, $this->getParser()); } /** * Test reading broken XML (missing closing tag). - * - * @throws \Drupal\Migrate\MigrateException */ public function testReadBrokenXmlMissingTag(): void { $url = $this->path . '/tests/data/simple_xml_broken_missing_tag.xml'; @@ -151,14 +45,11 @@ final class SimpleXmlTest extends KernelTestBase { $this->expectException(MigrateException::class); // Newer versions of libxml mark it as an error 76, older ones as 73. $this->expectExceptionMessageMatches('/^Fatal Error 7[0-9]/'); - $parser = $this->pluginManager->createInstance('simple_xml', $this->configuration); - $parser->next(); + $this->getParser()->next(); } /** * Test reading broken XML (tag mismatch). - * - * @throws \Drupal\Migrate\MigrateException */ public function testReadBrokenXmlTagMismatch(): void { $url = $this->path . '/tests/data/simple_xml_broken_tag_mismatch.xml'; @@ -166,15 +57,11 @@ final class SimpleXmlTest extends KernelTestBase { $this->expectException(MigrateException::class); $this->expectExceptionMessageMatches('/^Fatal Error 76/'); - - $parser = $this->pluginManager->createInstance('simple_xml', $this->configuration); - $parser->next(); + $this->getParser()->next(); } /** * Test reading non XML. - * - * @throws \Drupal\Migrate\MigrateException */ public function testReadNonXml(): void { $url = $this->path . '/tests/data/simple_xml_non_xml.xml'; @@ -182,43 +69,26 @@ final class SimpleXmlTest extends KernelTestBase { $this->expectException(MigrateException::class); $this->expectExceptionMessageMatches('/^Fatal Error 46/'); - $parser = $this->pluginManager->createInstance('simple_xml', $this->configuration); - $parser->next(); + $this->getParser()->next(); } /** * Tests reading non-existing XML. - * - * @throws \Drupal\Migrate\MigrateException */ public function testReadNonExistingXml(): void { - $url = $this->path . '/tests/data/simple_xml_non_existing.xml'; + $url = $this->path . '/tests/data/xml_non_existing.xml'; $this->configuration['urls'][0] = $url; $this->expectException(MigrateException::class); $this->expectExceptionMessage('file parser plugin: could not retrieve data from'); - $parser = $this->pluginManager->createInstance('simple_xml', $this->configuration); - $parser->next(); + $this->getParser()->next(); } /** - * Parses and asserts the results match expectations. - * - * @param array|string $expected - * The expected results. - * @param \Traversable $parser - * An iterable data result to parse. + * {@inheritdoc} */ - protected function assertResults($expected, \Traversable $parser): void { - $data = []; - foreach ($parser as $item) { - $values = []; - foreach ($item['values'] as $value) { - $values[] = (string) $value; - } - $data[] = $values; - } - $this->assertEquals($expected, $data); + protected function getParser(): DataParserPluginInterface { + return $this->pluginManager->createInstance('simple_xml', $this->configuration); } } diff --git a/tests/src/Kernel/Plugin/migrate_plus/data_parser/XmlTest.php b/tests/src/Kernel/Plugin/migrate_plus/data_parser/XmlTest.php index 18fc1f980cc6a6665199a803d57487c19537efe9..63319a06643ea460ed3961de8ba7a03ab1010161 100644 --- a/tests/src/Kernel/Plugin/migrate_plus/data_parser/XmlTest.php +++ b/tests/src/Kernel/Plugin/migrate_plus/data_parser/XmlTest.php @@ -4,62 +4,20 @@ declare(strict_types = 1); namespace Drupal\Tests\migrate_plus\Kernel\Plugin\migrate_plus\data_parser; -use Drupal\KernelTests\KernelTestBase; +use Drupal\migrate_plus\DataParserPluginInterface; /** * Test of the data_parser Xml migrate_plus plugin. * * @group migrate_plus */ -final class XmlTest extends KernelTestBase { - - protected static $modules = ['migrate', 'migrate_plus']; +final class XmlTest extends BaseXmlTest { /** - * Tests retrieving single value from element with attributes. - * - * @throws \Drupal\Component\Plugin\Exception\PluginException - * @throws \Exception + * {@inheritdoc} */ - public function testSingleValue(): void { - $path = $this->container - ->get('module_handler') - ->getModule('migrate_plus') - ->getPath(); - $fileUrl = $path . '/tests/data/xml_data_parser.xml'; - $conf = [ - 'plugin' => 'url', - 'data_fetcher_plugin' => 'file', - 'data_parser_plugin' => 'xml', - 'destination' => 'node', - 'urls' => [$fileUrl], - 'ids' => ['id' => ['type' => 'integer']], - 'fields' => [ - [ - 'name' => 'id', - 'label' => 'Id', - 'selector' => 'id', - ], - [ - 'name' => 'child', - 'label' => 'child', - 'selector' => 'children/child', - ], - ], - 'item_selector' => '/persons/person', - ]; - - /** @var \Drupal\migrate_plus\DataParserPluginManager $plugin_manager */ - $plugin_manager = $this->container->get('plugin.manager.migrate_plus.data_parser'); - $parser = $plugin_manager->createInstance('xml', $conf); - - $names = []; - foreach ($parser as $item) { - $names[] = (string) $item['child']->name; - } - - $expectedNames = ['Elizabeth Junior', 'George Junior', 'Lucy']; - $this->assertEquals($expectedNames, $names); + protected function getParser(): DataParserPluginInterface { + return $this->pluginManager->createInstance('xml', $this->configuration); } }