Namespace
Drupal\Tests\entity_clone\Functional
File
-
tests/src/Functional/EntityCloneContentModerationTest.php
View source
<?php
namespace Drupal\Tests\entity_clone\Functional;
use Drupal\content_moderation\Entity\ContentModerationState as ContentModerationStateEntity;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\Url;
use Drupal\language\Entity\ConfigurableLanguage;
use Drupal\node\Entity\Node;
use Drupal\Tests\content_moderation\Traits\ContentModerationTestTrait;
use Drupal\Tests\node\Functional\NodeTestBase;
class EntityCloneContentModerationTest extends NodeTestBase {
use ContentModerationTestTrait;
use StringTranslationTrait;
protected static $modules = [
'entity_clone',
'content_moderation',
'language',
'content_translation',
'block',
];
protected $defaultTheme = 'claro';
protected $permissions = [
'bypass node access',
'administer nodes',
'clone node entity',
'use editorial transition create_new_draft',
'use editorial transition publish',
'use editorial transition archive',
'use editorial transition archived_draft',
'use editorial transition archived_published',
];
protected $adminUser;
protected function setUp() : void {
parent::setUp();
ConfigurableLanguage::createFromLangcode('fr')->save();
\Drupal::service('content_translation.manager')->setEnabled('node', 'page', TRUE);
$workflow = $this->createEditorialWorkflow();
$this->addEntityTypeAndBundleToWorkflow($workflow, 'node', 'page');
$this->adminUser = $this->drupalCreateUser($this->permissions);
$this->drupalLogin($this->adminUser);
}
public function testContentModerationEntityClone() {
$node = Node::create([
'type' => 'page',
'title' => 'My node',
]);
$node->save();
$translation = $node->addTranslation('fr', $node->toArray());
$translation->save();
$node = Node::load($node->id());
$this->assertCount(2, $node->getTranslationLanguages());
$moderation_state = ContentModerationStateEntity::loadFromModeratedEntity($node);
$this->assertFalse($moderation_state->isNew());
$this->assertCount(2, $moderation_state->getTranslationLanguages());
foreach ($moderation_state->getTranslationLanguages() as $language) {
$this->assertEquals('draft', $moderation_state->getTranslation($language->getId())
->get('moderation_state')->value);
}
$moderation_state_id = $moderation_state->id();
$this->drupalGet(Url::fromUserInput('/entity_clone/node/' . $node->id()));
$this->submitForm([], $this->t('Clone'));
$nodes = \Drupal::entityTypeManager()->getStorage('node')
->loadByProperties([
'title' => 'My node - Cloned',
]);
$clone = reset($nodes);
$this->assertInstanceOf(Node::class, $clone, 'Test node cloned found in database.');
$this->assertCount(2, $clone->getTranslationLanguages());
$clone_moderation_state = ContentModerationStateEntity::loadFromModeratedEntity($clone);
$this->assertNotEquals($moderation_state_id, $clone_moderation_state->id());
$this->assertFalse($clone_moderation_state->isNew());
$this->assertCount(2, $clone_moderation_state->getTranslationLanguages());
foreach ($clone_moderation_state->getTranslationLanguages() as $language) {
$this->assertEquals('draft', $clone_moderation_state->getTranslation($language->getId())
->get('moderation_state')->value);
}
$node = Node::create([
'type' => 'page',
'title' => 'My second node',
]);
$node->save();
$node->set('moderation_state', 'published');
$node->setNewRevision();
$node->save();
$translation = $node->addTranslation('fr', $node->toArray());
$translation->save();
$moderation_state = ContentModerationStateEntity::loadFromModeratedEntity($node);
$this->assertFalse($moderation_state->isNew());
$this->assertCount(2, $moderation_state->getTranslationLanguages());
foreach ($moderation_state->getTranslationLanguages() as $language) {
$this->assertEquals('published', $moderation_state->getTranslation($language->getId())
->get('moderation_state')->value);
}
$this->drupalGet(Url::fromUserInput('/entity_clone/node/' . $node->id()));
$this->submitForm([], $this->t('Clone'));
$nodes = \Drupal::entityTypeManager()->getStorage('node')
->loadByProperties([
'title' => 'My second node - Cloned',
]);
$clone = reset($nodes);
$this->assertInstanceOf(Node::class, $clone, 'Test node cloned found in database.');
$this->assertCount(2, $clone->getTranslationLanguages());
$clone_moderation_state = ContentModerationStateEntity::loadFromModeratedEntity($clone);
$this->assertFalse($clone_moderation_state->isNew());
$this->assertCount(2, $clone_moderation_state->getTranslationLanguages());
foreach ($clone_moderation_state->getTranslationLanguages() as $language) {
$this->assertEquals('draft', $clone_moderation_state->getTranslation($language->getId())
->get('moderation_state')->value);
}
$node = Node::create([
'type' => 'page',
'title' => 'My third node',
]);
$node->save();
$translation = $node->addTranslation('fr', $node->toArray());
$translation->save();
$node->set('moderation_state', 'published');
$node->setNewRevision();
$node->save();
$moderation_state = ContentModerationStateEntity::loadFromModeratedEntity($node);
$this->assertFalse($moderation_state->isNew());
$this->assertCount(2, $moderation_state->getTranslationLanguages());
$expected_map = [
'en' => 'published',
'fr' => 'draft',
];
foreach ($moderation_state->getTranslationLanguages() as $language) {
$this->assertEquals($expected_map[$language->getId()], $moderation_state->getTranslation($language->getId())
->get('moderation_state')->value);
}
$this->assertTrue($node->getTranslation('en')
->isPublished());
$this->assertFalse($node->getTranslation('fr')
->isPublished());
$this->drupalGet(Url::fromUserInput('/entity_clone/node/' . $node->id()));
$this->submitForm([], $this->t('Clone'));
$nodes = \Drupal::entityTypeManager()->getStorage('node')
->loadByProperties([
'title' => 'My third node - Cloned',
]);
$clone = reset($nodes);
$this->assertInstanceOf(Node::class, $clone, 'Test node cloned found in database.');
$this->assertCount(2, $clone->getTranslationLanguages());
$this->assertFalse($clone->getTranslation('en')
->isPublished());
$this->assertFalse($clone->getTranslation('fr')
->isPublished());
$clone_moderation_state = ContentModerationStateEntity::loadFromModeratedEntity($clone);
$this->assertFalse($clone_moderation_state->isNew());
$this->assertCount(2, $clone_moderation_state->getTranslationLanguages());
foreach ($clone_moderation_state->getTranslationLanguages() as $language) {
$this->assertEquals('draft', $clone_moderation_state->getTranslation($language->getId())
->get('moderation_state')->value);
}
$node = Node::create([
'type' => 'page',
'title' => 'My fourth node',
]);
$node->save();
$translation = $node->addTranslation('fr', [
'title' => 'My fourth node FR',
] + $node->toArray());
$translation->save();
$node = Node::load($node->id());
$this->assertCount(2, $node->getTranslationLanguages());
$this->drupalGet(Url::fromUserInput('/fr/entity_clone/node/' . $node->id()));
$this->submitForm([], $this->t('Clone'));
$clone = Node::load($node->id() + 1);
$this->assertInstanceOf(Node::class, $clone, 'Test node cloned found in database.');
$this->assertCount(2, $clone->getTranslationLanguages());
$this->assertEquals('My fourth node FR - Cloned', $clone->getTranslation('fr')
->label());
$clone_moderation_state = ContentModerationStateEntity::loadFromModeratedEntity($clone);
$this->assertFalse($clone_moderation_state->isNew());
$this->assertCount(2, $clone_moderation_state->getTranslationLanguages());
foreach ($clone_moderation_state->getTranslationLanguages() as $language) {
$this->assertEquals('draft', $clone_moderation_state->getTranslation($language->getId())
->get('moderation_state')->value);
}
$this->assertTrue($clone_moderation_state->isDefaultTranslation());
$this->assertEquals('en', $clone_moderation_state->language()
->getId());
$node = Node::create([
'type' => 'page',
'title' => 'My fifth node',
'moderation_state' => 'published',
]);
$node->save();
$translation = $node->addTranslation('fr', $node->toArray());
$translation->save();
$node = Node::load($node->id());
$this->assertCount(2, $node->getTranslationLanguages());
$this->assertTrue($node->getTranslation('en')
->isPublished());
$this->assertTrue($node->getTranslation('fr')
->isPublished());
$this->drupalGet(Url::fromUserInput('/entity_clone/node/' . $node->id()));
$this->submitForm([], $this->t('Clone'));
$nodes = \Drupal::entityTypeManager()->getStorage('node')
->loadByProperties([
'title' => 'My fifth node - Cloned',
]);
$clone = reset($nodes);
$this->assertInstanceOf(Node::class, $clone, 'Test node cloned found in database.');
$this->assertCount(2, $clone->getTranslationLanguages());
$this->assertFalse($clone->getTranslation('en')
->isPublished());
$this->assertFalse($clone->getTranslation('fr')
->isPublished());
}
}
Classes