Chris@5
|
1 <?php
|
Chris@5
|
2
|
Chris@5
|
3 namespace Drupal\Tests\migrate_plus\Unit\process;
|
Chris@5
|
4
|
Chris@5
|
5 use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException;
|
Chris@5
|
6 use Drupal\Component\Utility\Html;
|
Chris@5
|
7 use Drupal\migrate\MigrateSkipRowException;
|
Chris@5
|
8 use Drupal\migrate_plus\Plugin\migrate\process\DomStrReplace;
|
Chris@5
|
9 use Drupal\Tests\migrate\Unit\process\MigrateProcessTestCase;
|
Chris@5
|
10
|
Chris@5
|
11 /**
|
Chris@5
|
12 * Tests the dom_str_replace process plugin.
|
Chris@5
|
13 *
|
Chris@5
|
14 * @group migrate
|
Chris@5
|
15 * @coversDefaultClass \Drupal\migrate_plus\Plugin\migrate\process\DomStrReplace
|
Chris@5
|
16 */
|
Chris@5
|
17 class DomStrReplaceTest extends MigrateProcessTestCase {
|
Chris@5
|
18
|
Chris@5
|
19 /**
|
Chris@5
|
20 * Example configuration for the dom_str_replace process plugin.
|
Chris@5
|
21 *
|
Chris@5
|
22 * @var array
|
Chris@5
|
23 */
|
Chris@5
|
24 protected $exampleConfiguration = [
|
Chris@5
|
25 'mode' => 'attribute',
|
Chris@5
|
26 'expression' => '//a',
|
Chris@5
|
27 'attribute_options' => [
|
Chris@5
|
28 'name' => 'href',
|
Chris@5
|
29 ],
|
Chris@5
|
30 'search' => 'foo',
|
Chris@5
|
31 'replace' => 'bar',
|
Chris@5
|
32 ];
|
Chris@5
|
33
|
Chris@5
|
34 /**
|
Chris@5
|
35 * @covers ::__construct
|
Chris@5
|
36 *
|
Chris@5
|
37 * @dataProvider providerTestConfigEmpty
|
Chris@5
|
38 */
|
Chris@5
|
39 public function testConfigValidation(array $config_overrides, $message) {
|
Chris@5
|
40 $configuration = $config_overrides + $this->exampleConfiguration;
|
Chris@5
|
41 $value = '<p>A simple paragraph.</p>';
|
Chris@5
|
42 $this->setExpectedException(InvalidPluginDefinitionException::class, $message);
|
Chris@5
|
43 (new DomStrReplace($configuration, 'dom_str_replace', []))
|
Chris@5
|
44 ->transform($value, $this->migrateExecutable, $this->row, 'destinationproperty');
|
Chris@5
|
45 }
|
Chris@5
|
46
|
Chris@5
|
47 /**
|
Chris@5
|
48 * Dataprovider for testConfigValidation().
|
Chris@5
|
49 */
|
Chris@5
|
50 public function providerTestConfigEmpty() {
|
Chris@5
|
51 $cases = [
|
Chris@5
|
52 'expression-null' => [
|
Chris@5
|
53 ['expression' => NULL],
|
Chris@5
|
54 "Configuration option 'expression' is required.",
|
Chris@5
|
55 ],
|
Chris@5
|
56 'mode-null' => [
|
Chris@5
|
57 ['mode' => NULL],
|
Chris@5
|
58 "Configuration option 'mode' is required.",
|
Chris@5
|
59 ],
|
Chris@5
|
60 'mode-invalid' => [
|
Chris@5
|
61 ['mode' => 'invalid'],
|
Chris@5
|
62 'Configuration option "mode" only accepts the following values: attribute.',
|
Chris@5
|
63 ],
|
Chris@5
|
64 'attribute_options-null' => [
|
Chris@5
|
65 ['attribute_options' => NULL],
|
Chris@5
|
66 "Configuration option 'attribute_options' is required.",
|
Chris@5
|
67 ],
|
Chris@5
|
68 'search-null' => [
|
Chris@5
|
69 ['search' => NULL],
|
Chris@5
|
70 "Configuration option 'search' is required.",
|
Chris@5
|
71 ],
|
Chris@5
|
72 'replace-null' => [
|
Chris@5
|
73 ['replace' => NULL],
|
Chris@5
|
74 "Configuration option 'replace' is required.",
|
Chris@5
|
75 ],
|
Chris@5
|
76 ];
|
Chris@5
|
77
|
Chris@5
|
78 return $cases;
|
Chris@5
|
79 }
|
Chris@5
|
80
|
Chris@5
|
81 /**
|
Chris@5
|
82 * @covers ::transform
|
Chris@5
|
83 */
|
Chris@5
|
84 public function testTransformInvalidInput() {
|
Chris@5
|
85 $configuration = [
|
Chris@5
|
86 'expression' => '//a',
|
Chris@5
|
87 'mode' => 'attribute',
|
Chris@5
|
88 'attribute_options' => [
|
Chris@5
|
89 'name' => 'href',
|
Chris@5
|
90 ],
|
Chris@5
|
91 'search' => 'foo',
|
Chris@5
|
92 'replace' => 'bar',
|
Chris@5
|
93 ];
|
Chris@5
|
94 $value = 'string';
|
Chris@5
|
95 $this->setExpectedException(MigrateSkipRowException::class, 'The dom_str_replace plugin in the destinationproperty process pipeline requires a \DOMDocument object. You can use the dom plugin to convert a string to \DOMDocument.');
|
Chris@5
|
96 (new DomStrReplace($configuration, 'dom_str_replace', []))
|
Chris@5
|
97 ->transform($value, $this->migrateExecutable, $this->row, 'destinationproperty');
|
Chris@5
|
98 }
|
Chris@5
|
99
|
Chris@5
|
100 /**
|
Chris@5
|
101 * @covers ::transform
|
Chris@5
|
102 *
|
Chris@5
|
103 * @dataProvider providerTestTransform
|
Chris@5
|
104 */
|
Chris@5
|
105 public function testTransform($input_string, $configuration, $output_string) {
|
Chris@5
|
106 $value = Html::load($input_string);
|
Chris@5
|
107 $document = (new DomStrReplace($configuration, 'dom_str_replace', []))
|
Chris@5
|
108 ->transform($value, $this->migrateExecutable, $this->row, 'destinationproperty');
|
Chris@5
|
109 $this->assertTrue($document instanceof \DOMDocument);
|
Chris@5
|
110 $this->assertEquals($output_string, Html::serialize($document));
|
Chris@5
|
111 }
|
Chris@5
|
112
|
Chris@5
|
113 /**
|
Chris@5
|
114 * Dataprovider for testTransform().
|
Chris@5
|
115 */
|
Chris@5
|
116 public function providerTestTransform() {
|
Chris@5
|
117 $cases = [
|
Chris@5
|
118 'string:case_sensitive' => [
|
Chris@5
|
119 '<a href="/foo/Foo/foo">text</a>',
|
Chris@5
|
120 $this->exampleConfiguration,
|
Chris@5
|
121 '<a href="/bar/Foo/bar">text</a>',
|
Chris@5
|
122 ],
|
Chris@5
|
123 'string:case_insensitive' => [
|
Chris@5
|
124 '<a href="/foo/Foo/foo">text</a>',
|
Chris@5
|
125 [
|
Chris@5
|
126 'case_insensitive' => TRUE,
|
Chris@5
|
127 ] + $this->exampleConfiguration,
|
Chris@5
|
128 '<a href="/bar/bar/bar">text</a>',
|
Chris@5
|
129 ],
|
Chris@5
|
130 'regex' => [
|
Chris@5
|
131 '<a href="/foo/Foo/foo">text</a>',
|
Chris@5
|
132 [
|
Chris@5
|
133 'search' => '/(.)\1/',
|
Chris@5
|
134 'regex' => TRUE,
|
Chris@5
|
135 ] + $this->exampleConfiguration,
|
Chris@5
|
136 '<a href="/fbar/Fbar/fbar">text</a>',
|
Chris@5
|
137 ],
|
Chris@5
|
138 ];
|
Chris@5
|
139
|
Chris@5
|
140 return $cases;
|
Chris@5
|
141 }
|
Chris@5
|
142
|
Chris@5
|
143 }
|