X-Git-Url: https://yaffs.net/gitweb/?a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Fpath%2Ftests%2Fsrc%2FFunctional%2FPathContentModerationTest.php;h=b69a5dbe5b5dd95a32efb9e58356c08274ba8214;hb=1c1cb0980bfa6caf0c24cce671b6bb541dc87583;hp=87f117b9aac6bcfb3dc7ca7273b258dc7717dca5;hpb=9917807b03b64faf00f6a1f29dcb6eafc454efa5;p=yaffs-website diff --git a/web/core/modules/path/tests/src/Functional/PathContentModerationTest.php b/web/core/modules/path/tests/src/Functional/PathContentModerationTest.php index 87f117b9a..b69a5dbe5 100644 --- a/web/core/modules/path/tests/src/Functional/PathContentModerationTest.php +++ b/web/core/modules/path/tests/src/Functional/PathContentModerationTest.php @@ -2,9 +2,9 @@ namespace Drupal\Tests\path\Functional; -use Drupal\node\Entity\NodeType; +use Drupal\language\Entity\ConfigurableLanguage; use Drupal\Tests\BrowserTestBase; -use Drupal\workflows\Entity\Workflow; +use Drupal\Tests\content_moderation\Traits\ContentModerationTestTrait; /** * Tests path aliases with Content Moderation. @@ -14,29 +14,55 @@ use Drupal\workflows\Entity\Workflow; */ class PathContentModerationTest extends BrowserTestBase { + use ContentModerationTestTrait; + /** * Modules to install. * * @var array */ - public static $modules = ['node', 'path', 'content_moderation']; + public static $modules = [ + 'node', + 'path', + 'content_moderation', + 'content_translation', + ]; /** * {@inheritdoc} */ protected function setUp() { parent::setUp(); + ConfigurableLanguage::createFromLangcode('fr')->save(); + $this->rebuildContainer(); // Created a content type. - $node_type = NodeType::create(['name' => 'moderated', 'type' => 'moderated']); - $node_type->save(); + $this->drupalCreateContentType([ + 'name' => 'moderated', + 'type' => 'moderated', + ]); // Set the content type as moderated. - $workflow = Workflow::load('editorial'); + $workflow = $this->createEditorialWorkflow(); $workflow->getTypePlugin()->addEntityTypeAndBundle('node', 'moderated'); $workflow->save(); $this->drupalLogin($this->rootUser); + + // Enable URL language detection and selection. + $edit = ['language_interface[enabled][language-url]' => 1]; + $this->drupalPostForm('admin/config/regional/language/detection', $edit, 'Save settings'); + + // Enable translation for moderated node. + $edit = [ + 'entity_types[node]' => 1, + 'settings[node][moderated][translatable]' => 1, + 'settings[node][moderated][fields][path]' => 1, + 'settings[node][moderated][fields][body]' => 1, + 'settings[node][moderated][settings][language][language_alterable]' => 1, + ]; + $this->drupalPostForm('admin/config/regional/content-language', $edit, 'Save configuration'); + \Drupal::entityTypeManager()->clearCachedDefinitions(); } /** @@ -104,4 +130,104 @@ class PathContentModerationTest extends BrowserTestBase { $this->assertSession()->pageTextNotContains('You can only change the URL alias for the published version of this content.'); } + /** + * Tests that translated and moderated node can get new draft revision. + */ + public function testTranslatedModeratedNodeAlias() { + // Create one node with a random alias. + $default_node = $this->drupalCreateNode([ + 'type' => 'moderated', + 'langcode' => 'en', + 'moderation_state' => 'published', + 'path' => '/' . $this->randomMachineName(), + ]); + + // Add published translation with another alias. + $this->drupalGet('node/' . $default_node->id()); + $this->drupalGet('node/' . $default_node->id() . '/translations'); + $this->clickLink('Add'); + $edit_translation = [ + 'body[0][value]' => $this->randomMachineName(), + 'moderation_state[0][state]' => 'published', + 'path[0][alias]' => '/' . $this->randomMachineName(), + ]; + $this->drupalPostForm(NULL, $edit_translation, 'Save (this translation)'); + // Confirm that the alias works. + $this->drupalGet('fr' . $edit_translation['path[0][alias]']); + $this->assertSession()->pageTextContains($edit_translation['body[0][value]']); + + $default_path = $default_node->path->alias; + $translation_path = 'fr' . $edit_translation['path[0][alias]']; + + $this->assertPathsAreAccessible([$default_path, $translation_path]); + + // Try to create new draft revision for translation with a new path alias. + $edit_new_translation_draft_with_alias = [ + 'moderation_state[0][state]' => 'draft', + 'path[0][alias]' => '/' . $this->randomMachineName(), + ]; + $this->drupalPostForm('fr/node/' . $default_node->id() . '/edit', $edit_new_translation_draft_with_alias, 'Save (this translation)'); + // Confirm the expected error. + $this->assertSession()->pageTextContains('You can only change the URL alias for the published version of this content.'); + + // Create new draft revision for translation without changing path alias. + $edit_new_translation_draft = [ + 'body[0][value]' => $this->randomMachineName(), + 'moderation_state[0][state]' => 'draft', + ]; + $this->drupalPostForm('fr/node/' . $default_node->id() . '/edit', $edit_new_translation_draft, t('Save (this translation)')); + // Confirm that the new draft revision was created. + $this->assertSession()->pageTextNotContains('You can only change the URL alias for the published version of this content.'); + $this->assertSession()->pageTextContains($edit_new_translation_draft['body[0][value]']); + $this->assertPathsAreAccessible([$default_path, $translation_path]); + + // Try to create a new draft revision for translation with path alias from + // the original language's default revision. + $edit_new_translation_draft_with_defaults_alias = [ + 'moderation_state[0][state]' => 'draft', + 'path[0][alias]' => $default_node->path->alias, + ]; + $this->drupalPostForm('fr/node/' . $default_node->id() . '/edit', $edit_new_translation_draft_with_defaults_alias, 'Save (this translation)'); + // Verify the expected error. + $this->assertSession()->pageTextContains('You can only change the URL alias for the published version of this content.'); + + // Try to create new draft revision for translation with deleted (empty) + // path alias. + $edit_new_translation_draft_empty_alias = [ + 'body[0][value]' => $this->randomMachineName(), + 'moderation_state[0][state]' => 'draft', + 'path[0][alias]' => '', + ]; + $this->drupalPostForm('fr/node/' . $default_node->id() . '/edit', $edit_new_translation_draft_empty_alias, 'Save (this translation)'); + // Confirm the expected error. + $this->assertSession()->pageTextContains('You can only change the URL alias for the published version of this content.'); + + // Create new default (published) revision for translation with new path + // alias. + $edit_new_translation = [ + 'body[0][value]' => $this->randomMachineName(), + 'moderation_state[0][state]' => 'published', + 'path[0][alias]' => '/' . $this->randomMachineName(), + ]; + $this->drupalPostForm('fr/node/' . $default_node->id() . '/edit', $edit_new_translation, 'Save (this translation)'); + // Confirm that the new published revision was created. + $this->assertSession()->pageTextNotContains('You can only change the URL alias for the published version of this content.'); + $this->assertSession()->pageTextContains($edit_new_translation['body[0][value]']); + $this->assertSession()->addressEquals('fr' . $edit_new_translation['path[0][alias]']); + $this->assertPathsAreAccessible([$default_path]); + } + + /** + * Helper callback to verify paths are responding with status 200. + * + * @param string[] $paths + * An array of paths to check for. + */ + public function assertPathsAreAccessible(array $paths) { + foreach ($paths as $path) { + $this->drupalGet($path); + $this->assertSession()->statusCodeEquals(200); + } + } + }