annotate core/modules/path/tests/src/Functional/PathContentModerationTest.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
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 }