Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\path\Functional;
|
Chris@0
|
4
|
Chris@17
|
5 use Drupal\language\Entity\ConfigurableLanguage;
|
Chris@0
|
6 use Drupal\Tests\BrowserTestBase;
|
Chris@17
|
7 use Drupal\Tests\content_moderation\Traits\ContentModerationTestTrait;
|
Chris@0
|
8
|
Chris@0
|
9 /**
|
Chris@0
|
10 * Tests path aliases with Content Moderation.
|
Chris@0
|
11 *
|
Chris@0
|
12 * @group content_moderation
|
Chris@0
|
13 * @group path
|
Chris@0
|
14 */
|
Chris@0
|
15 class PathContentModerationTest extends BrowserTestBase {
|
Chris@0
|
16
|
Chris@17
|
17 use ContentModerationTestTrait;
|
Chris@17
|
18
|
Chris@0
|
19 /**
|
Chris@0
|
20 * Modules to install.
|
Chris@0
|
21 *
|
Chris@0
|
22 * @var array
|
Chris@0
|
23 */
|
Chris@17
|
24 public static $modules = [
|
Chris@17
|
25 'node',
|
Chris@17
|
26 'path',
|
Chris@17
|
27 'content_moderation',
|
Chris@17
|
28 'content_translation',
|
Chris@17
|
29 ];
|
Chris@0
|
30
|
Chris@0
|
31 /**
|
Chris@0
|
32 * {@inheritdoc}
|
Chris@0
|
33 */
|
Chris@0
|
34 protected function setUp() {
|
Chris@0
|
35 parent::setUp();
|
Chris@17
|
36 ConfigurableLanguage::createFromLangcode('fr')->save();
|
Chris@17
|
37 $this->rebuildContainer();
|
Chris@0
|
38
|
Chris@0
|
39 // Created a content type.
|
Chris@17
|
40 $this->drupalCreateContentType([
|
Chris@17
|
41 'name' => 'moderated',
|
Chris@17
|
42 'type' => 'moderated',
|
Chris@17
|
43 ]);
|
Chris@0
|
44
|
Chris@0
|
45 // Set the content type as moderated.
|
Chris@17
|
46 $workflow = $this->createEditorialWorkflow();
|
Chris@0
|
47 $workflow->getTypePlugin()->addEntityTypeAndBundle('node', 'moderated');
|
Chris@0
|
48 $workflow->save();
|
Chris@0
|
49
|
Chris@0
|
50 $this->drupalLogin($this->rootUser);
|
Chris@17
|
51
|
Chris@17
|
52 // Enable URL language detection and selection.
|
Chris@17
|
53 $edit = ['language_interface[enabled][language-url]' => 1];
|
Chris@17
|
54 $this->drupalPostForm('admin/config/regional/language/detection', $edit, 'Save settings');
|
Chris@17
|
55
|
Chris@17
|
56 // Enable translation for moderated node.
|
Chris@17
|
57 $edit = [
|
Chris@17
|
58 'entity_types[node]' => 1,
|
Chris@17
|
59 'settings[node][moderated][translatable]' => 1,
|
Chris@17
|
60 'settings[node][moderated][fields][path]' => 1,
|
Chris@17
|
61 'settings[node][moderated][fields][body]' => 1,
|
Chris@17
|
62 'settings[node][moderated][settings][language][language_alterable]' => 1,
|
Chris@17
|
63 ];
|
Chris@17
|
64 $this->drupalPostForm('admin/config/regional/content-language', $edit, 'Save configuration');
|
Chris@17
|
65 \Drupal::entityTypeManager()->clearCachedDefinitions();
|
Chris@0
|
66 }
|
Chris@0
|
67
|
Chris@0
|
68 /**
|
Chris@0
|
69 * Tests node path aliases on a moderated content type.
|
Chris@0
|
70 */
|
Chris@0
|
71 public function testNodePathAlias() {
|
Chris@0
|
72 // Create some moderated content with a path alias.
|
Chris@0
|
73 $this->drupalGet('node/add/moderated');
|
Chris@0
|
74 $this->assertSession()->fieldValueEquals('path[0][alias]', '');
|
Chris@0
|
75 $this->drupalPostForm(NULL, [
|
Chris@0
|
76 'title[0][value]' => 'moderated content',
|
Chris@0
|
77 'path[0][alias]' => '/moderated-content',
|
Chris@0
|
78 'moderation_state[0][state]' => 'published',
|
Chris@0
|
79 ], t('Save'));
|
Chris@0
|
80 $node = $this->getNodeByTitle('moderated content');
|
Chris@0
|
81
|
Chris@0
|
82 // Add a pending revision with the same alias.
|
Chris@0
|
83 $this->drupalGet('node/' . $node->id() . '/edit');
|
Chris@0
|
84 $this->assertSession()->fieldValueEquals('path[0][alias]', '/moderated-content');
|
Chris@0
|
85 $this->drupalPostForm(NULL, [
|
Chris@0
|
86 'title[0][value]' => 'pending revision',
|
Chris@0
|
87 'path[0][alias]' => '/moderated-content',
|
Chris@0
|
88 'moderation_state[0][state]' => 'draft',
|
Chris@0
|
89 ], t('Save'));
|
Chris@0
|
90 $this->assertSession()->pageTextNotContains('You can only change the URL alias for the published version of this content.');
|
Chris@0
|
91
|
Chris@0
|
92 // Create some moderated content with no path alias.
|
Chris@0
|
93 $this->drupalGet('node/add/moderated');
|
Chris@0
|
94 $this->assertSession()->fieldValueEquals('path[0][alias]', '');
|
Chris@0
|
95 $this->drupalPostForm(NULL, [
|
Chris@0
|
96 'title[0][value]' => 'moderated content 2',
|
Chris@0
|
97 'path[0][alias]' => '',
|
Chris@0
|
98 'moderation_state[0][state]' => 'published',
|
Chris@0
|
99 ], t('Save'));
|
Chris@0
|
100 $node = $this->getNodeByTitle('moderated content 2');
|
Chris@0
|
101
|
Chris@0
|
102 // Add a pending revision with a new alias.
|
Chris@0
|
103 $this->drupalGet('node/' . $node->id() . '/edit');
|
Chris@0
|
104 $this->assertSession()->fieldValueEquals('path[0][alias]', '');
|
Chris@0
|
105 $this->drupalPostForm(NULL, [
|
Chris@0
|
106 'title[0][value]' => 'pending revision',
|
Chris@0
|
107 'path[0][alias]' => '/pending-revision',
|
Chris@0
|
108 'moderation_state[0][state]' => 'draft',
|
Chris@0
|
109 ], t('Save'));
|
Chris@0
|
110 $this->assertSession()->pageTextContains('You can only change the URL alias for the published version of this content.');
|
Chris@0
|
111
|
Chris@0
|
112 // Create some moderated content with no path alias.
|
Chris@0
|
113 $this->drupalGet('node/add/moderated');
|
Chris@0
|
114 $this->assertSession()->fieldValueEquals('path[0][alias]', '');
|
Chris@0
|
115 $this->drupalPostForm(NULL, [
|
Chris@0
|
116 'title[0][value]' => 'moderated content 3',
|
Chris@0
|
117 'path[0][alias]' => '',
|
Chris@0
|
118 'moderation_state[0][state]' => 'published',
|
Chris@0
|
119 ], t('Save'));
|
Chris@0
|
120 $node = $this->getNodeByTitle('moderated content 3');
|
Chris@0
|
121
|
Chris@0
|
122 // Add a pending revision with no path alias.
|
Chris@0
|
123 $this->drupalGet('node/' . $node->id() . '/edit');
|
Chris@0
|
124 $this->assertSession()->fieldValueEquals('path[0][alias]', '');
|
Chris@0
|
125 $this->drupalPostForm(NULL, [
|
Chris@0
|
126 'title[0][value]' => 'pending revision',
|
Chris@0
|
127 'path[0][alias]' => '',
|
Chris@0
|
128 'moderation_state[0][state]' => 'draft',
|
Chris@0
|
129 ], t('Save'));
|
Chris@0
|
130 $this->assertSession()->pageTextNotContains('You can only change the URL alias for the published version of this content.');
|
Chris@0
|
131 }
|
Chris@0
|
132
|
Chris@17
|
133 /**
|
Chris@17
|
134 * Tests that translated and moderated node can get new draft revision.
|
Chris@17
|
135 */
|
Chris@17
|
136 public function testTranslatedModeratedNodeAlias() {
|
Chris@17
|
137 // Create one node with a random alias.
|
Chris@17
|
138 $default_node = $this->drupalCreateNode([
|
Chris@17
|
139 'type' => 'moderated',
|
Chris@17
|
140 'langcode' => 'en',
|
Chris@17
|
141 'moderation_state' => 'published',
|
Chris@17
|
142 'path' => '/' . $this->randomMachineName(),
|
Chris@17
|
143 ]);
|
Chris@17
|
144
|
Chris@17
|
145 // Add published translation with another alias.
|
Chris@17
|
146 $this->drupalGet('node/' . $default_node->id());
|
Chris@17
|
147 $this->drupalGet('node/' . $default_node->id() . '/translations');
|
Chris@17
|
148 $this->clickLink('Add');
|
Chris@17
|
149 $edit_translation = [
|
Chris@17
|
150 'body[0][value]' => $this->randomMachineName(),
|
Chris@17
|
151 'moderation_state[0][state]' => 'published',
|
Chris@17
|
152 'path[0][alias]' => '/' . $this->randomMachineName(),
|
Chris@17
|
153 ];
|
Chris@17
|
154 $this->drupalPostForm(NULL, $edit_translation, 'Save (this translation)');
|
Chris@17
|
155 // Confirm that the alias works.
|
Chris@17
|
156 $this->drupalGet('fr' . $edit_translation['path[0][alias]']);
|
Chris@17
|
157 $this->assertSession()->pageTextContains($edit_translation['body[0][value]']);
|
Chris@17
|
158
|
Chris@17
|
159 $default_path = $default_node->path->alias;
|
Chris@17
|
160 $translation_path = 'fr' . $edit_translation['path[0][alias]'];
|
Chris@17
|
161
|
Chris@17
|
162 $this->assertPathsAreAccessible([$default_path, $translation_path]);
|
Chris@17
|
163
|
Chris@17
|
164 // Try to create new draft revision for translation with a new path alias.
|
Chris@17
|
165 $edit_new_translation_draft_with_alias = [
|
Chris@17
|
166 'moderation_state[0][state]' => 'draft',
|
Chris@17
|
167 'path[0][alias]' => '/' . $this->randomMachineName(),
|
Chris@17
|
168 ];
|
Chris@17
|
169 $this->drupalPostForm('fr/node/' . $default_node->id() . '/edit', $edit_new_translation_draft_with_alias, 'Save (this translation)');
|
Chris@17
|
170 // Confirm the expected error.
|
Chris@17
|
171 $this->assertSession()->pageTextContains('You can only change the URL alias for the published version of this content.');
|
Chris@17
|
172
|
Chris@17
|
173 // Create new draft revision for translation without changing path alias.
|
Chris@17
|
174 $edit_new_translation_draft = [
|
Chris@17
|
175 'body[0][value]' => $this->randomMachineName(),
|
Chris@17
|
176 'moderation_state[0][state]' => 'draft',
|
Chris@17
|
177 ];
|
Chris@17
|
178 $this->drupalPostForm('fr/node/' . $default_node->id() . '/edit', $edit_new_translation_draft, t('Save (this translation)'));
|
Chris@17
|
179 // Confirm that the new draft revision was created.
|
Chris@17
|
180 $this->assertSession()->pageTextNotContains('You can only change the URL alias for the published version of this content.');
|
Chris@17
|
181 $this->assertSession()->pageTextContains($edit_new_translation_draft['body[0][value]']);
|
Chris@17
|
182 $this->assertPathsAreAccessible([$default_path, $translation_path]);
|
Chris@17
|
183
|
Chris@17
|
184 // Try to create a new draft revision for translation with path alias from
|
Chris@17
|
185 // the original language's default revision.
|
Chris@17
|
186 $edit_new_translation_draft_with_defaults_alias = [
|
Chris@17
|
187 'moderation_state[0][state]' => 'draft',
|
Chris@17
|
188 'path[0][alias]' => $default_node->path->alias,
|
Chris@17
|
189 ];
|
Chris@17
|
190 $this->drupalPostForm('fr/node/' . $default_node->id() . '/edit', $edit_new_translation_draft_with_defaults_alias, 'Save (this translation)');
|
Chris@17
|
191 // Verify the expected error.
|
Chris@17
|
192 $this->assertSession()->pageTextContains('You can only change the URL alias for the published version of this content.');
|
Chris@17
|
193
|
Chris@17
|
194 // Try to create new draft revision for translation with deleted (empty)
|
Chris@17
|
195 // path alias.
|
Chris@17
|
196 $edit_new_translation_draft_empty_alias = [
|
Chris@17
|
197 'body[0][value]' => $this->randomMachineName(),
|
Chris@17
|
198 'moderation_state[0][state]' => 'draft',
|
Chris@17
|
199 'path[0][alias]' => '',
|
Chris@17
|
200 ];
|
Chris@17
|
201 $this->drupalPostForm('fr/node/' . $default_node->id() . '/edit', $edit_new_translation_draft_empty_alias, 'Save (this translation)');
|
Chris@17
|
202 // Confirm the expected error.
|
Chris@17
|
203 $this->assertSession()->pageTextContains('You can only change the URL alias for the published version of this content.');
|
Chris@17
|
204
|
Chris@17
|
205 // Create new default (published) revision for translation with new path
|
Chris@17
|
206 // alias.
|
Chris@17
|
207 $edit_new_translation = [
|
Chris@17
|
208 'body[0][value]' => $this->randomMachineName(),
|
Chris@17
|
209 'moderation_state[0][state]' => 'published',
|
Chris@17
|
210 'path[0][alias]' => '/' . $this->randomMachineName(),
|
Chris@17
|
211 ];
|
Chris@17
|
212 $this->drupalPostForm('fr/node/' . $default_node->id() . '/edit', $edit_new_translation, 'Save (this translation)');
|
Chris@17
|
213 // Confirm that the new published revision was created.
|
Chris@17
|
214 $this->assertSession()->pageTextNotContains('You can only change the URL alias for the published version of this content.');
|
Chris@17
|
215 $this->assertSession()->pageTextContains($edit_new_translation['body[0][value]']);
|
Chris@17
|
216 $this->assertSession()->addressEquals('fr' . $edit_new_translation['path[0][alias]']);
|
Chris@17
|
217 $this->assertPathsAreAccessible([$default_path]);
|
Chris@17
|
218 }
|
Chris@17
|
219
|
Chris@17
|
220 /**
|
Chris@17
|
221 * Helper callback to verify paths are responding with status 200.
|
Chris@17
|
222 *
|
Chris@17
|
223 * @param string[] $paths
|
Chris@17
|
224 * An array of paths to check for.
|
Chris@17
|
225 */
|
Chris@17
|
226 public function assertPathsAreAccessible(array $paths) {
|
Chris@17
|
227 foreach ($paths as $path) {
|
Chris@17
|
228 $this->drupalGet($path);
|
Chris@17
|
229 $this->assertSession()->statusCodeEquals(200);
|
Chris@17
|
230 }
|
Chris@17
|
231 }
|
Chris@17
|
232
|
Chris@0
|
233 }
|