namespace Drupal\Tests\path\Functional;
-use Drupal\node\Entity\NodeType;
+use Drupal\language\Entity\ConfigurableLanguage;
use Drupal\Tests\BrowserTestBase;
use Drupal\Tests\content_moderation\Traits\ContentModerationTestTrait;
*
* @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 = $this->createEditorialWorkflow();
$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();
}
/**
$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);
+ }
+ }
+
}