Commit 0d1e6dd0 authored by catch's avatar catch
Browse files

Issue #3001124 by yongt9412, huzooka, amateescu, Berdir: Unable to create new...

Issue #3001124 by yongt9412, huzooka, amateescu, Berdir: Unable to create new draft for content translation even if the path alias does not change
parent b2a4a900
......@@ -48,10 +48,16 @@ public function validate($value, Constraint $constraint) {
if ($entity && !$entity->isNew() && !$entity->isDefaultRevision()) {
/** @var \Drupal\Core\Entity\ContentEntityInterface $original */
$original = $this->entityTypeManager->getStorage($entity->getEntityTypeId())->loadUnchanged($entity->id());
if ($value->alias != $original->path->alias) {
$entity_langcode = $entity->language()->getId();
// Only add the violation if the current translation does not have the
// same path alias.
if ($original->hasTranslation($entity_langcode)) {
if ($value->alias != $original->getTranslation($entity_langcode)->path->alias) {
$this->context->addViolation($constraint->message);
}
}
}
}
}
......@@ -2,7 +2,7 @@
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;
......@@ -21,17 +21,26 @@ class PathContentModerationTest extends BrowserTestBase {
*
* @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();
......@@ -39,6 +48,21 @@ protected function setUp() {
$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();
}
/**
......@@ -106,4 +130,104 @@ public function testNodePathAlias() {
$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);
}
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment