You are here

public function ContentModerationStateTest::testMultilingualModeration in Drupal 8

Same name and namespace in other branches
  1. 9 core/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php \Drupal\Tests\content_moderation\Kernel\ContentModerationStateTest::testMultilingualModeration()

Tests basic multilingual content moderation through the API.

File

core/modules/content_moderation/tests/src/Kernel/ContentModerationStateTest.php, line 298

Class

ContentModerationStateTest
Tests links between a content entity and a content_moderation_state entity.

Namespace

Drupal\Tests\content_moderation\Kernel

Code

public function testMultilingualModeration() {
  $this
    ->createContentType([
    'type' => 'example',
  ]);
  $workflow = $this
    ->createEditorialWorkflow();
  $this
    ->addEntityTypeAndBundleToWorkflow($workflow, 'node', 'example');
  $english_node = Node::create([
    'type' => 'example',
    'title' => 'Test title',
  ]);

  // Revision 1 (en).
  $english_node
    ->setUnpublished()
    ->save();
  $this
    ->assertEquals('draft', $english_node->moderation_state->value);
  $this
    ->assertFalse($english_node
    ->isPublished());

  // Create a French translation.
  $french_node = $english_node
    ->addTranslation('fr', [
    'title' => 'French title',
  ]);
  $french_node
    ->setUnpublished();

  // Revision 2 (fr).
  $french_node
    ->save();
  $french_node = $this
    ->reloadEntity($english_node)
    ->getTranslation('fr');
  $this
    ->assertEquals('draft', $french_node->moderation_state->value);
  $this
    ->assertFalse($french_node
    ->isPublished());

  // Move English node to create another draft.
  $english_node = $this
    ->reloadEntity($english_node);
  $english_node->moderation_state->value = 'draft';

  // Revision 3 (en, fr).
  $english_node
    ->save();
  $english_node = $this
    ->reloadEntity($english_node);
  $this
    ->assertEquals('draft', $english_node->moderation_state->value);

  // French node should still be in draft.
  $french_node = $this
    ->reloadEntity($english_node)
    ->getTranslation('fr');
  $this
    ->assertEquals('draft', $french_node->moderation_state->value);

  // Publish the French node.
  $french_node->moderation_state->value = 'published';

  // Revision 4 (en, fr).
  $french_node
    ->save();
  $french_node = $this
    ->reloadEntity($french_node)
    ->getTranslation('fr');
  $this
    ->assertTrue($french_node
    ->isPublished());
  $this
    ->assertEquals('published', $french_node->moderation_state->value);
  $this
    ->assertTrue($french_node
    ->isPublished());
  $english_node = $french_node
    ->getTranslation('en');
  $this
    ->assertEquals('draft', $english_node->moderation_state->value);

  // Publish the English node.
  $english_node->moderation_state->value = 'published';

  // Revision 5 (en, fr).
  $english_node
    ->save();
  $english_node = $this
    ->reloadEntity($english_node);
  $this
    ->assertTrue($english_node
    ->isPublished());

  // Move the French node back to draft.
  $french_node = $this
    ->reloadEntity($english_node)
    ->getTranslation('fr');
  $this
    ->assertTrue($french_node
    ->isPublished());
  $french_node->moderation_state->value = 'draft';

  // Revision 6 (en, fr).
  $french_node
    ->save();
  $french_node = $this
    ->reloadEntity($english_node, 6)
    ->getTranslation('fr');
  $this
    ->assertFalse($french_node
    ->isPublished());
  $this
    ->assertTrue($french_node
    ->getTranslation('en')
    ->isPublished());

  // Republish the French node.
  $french_node->moderation_state->value = 'published';

  // Revision 7 (en, fr).
  $french_node
    ->save();
  $french_node = $this
    ->reloadEntity($english_node)
    ->getTranslation('fr');
  $this
    ->assertTrue($french_node
    ->isPublished());

  // Change the EN state without saving the node.
  $content_moderation_state = ContentModerationState::loadFromModeratedEntity($english_node);
  $content_moderation_state
    ->set('moderation_state', 'draft');
  $content_moderation_state
    ->setNewRevision(TRUE);

  // Revision 8 (en, fr).
  $content_moderation_state
    ->save();
  $english_node = $this
    ->reloadEntity($french_node, $french_node
    ->getRevisionId() + 1);
  $this
    ->assertEquals('draft', $english_node->moderation_state->value);
  $french_node = $this
    ->reloadEntity($english_node)
    ->getTranslation('fr');
  $this
    ->assertEquals('published', $french_node->moderation_state->value);

  // This should unpublish the French node.
  $content_moderation_state = ContentModerationState::loadFromModeratedEntity($english_node);
  $content_moderation_state = $content_moderation_state
    ->getTranslation('fr');
  $content_moderation_state
    ->set('moderation_state', 'draft');
  $content_moderation_state
    ->setNewRevision(TRUE);

  // Revision 9 (en, fr).
  $content_moderation_state
    ->save();
  $english_node = $this
    ->reloadEntity($english_node, $english_node
    ->getRevisionId());
  $this
    ->assertEquals('draft', $english_node->moderation_state->value);
  $french_node = $this
    ->reloadEntity($english_node, '9')
    ->getTranslation('fr');
  $this
    ->assertEquals('draft', $french_node->moderation_state->value);

  // Switching the moderation state to an unpublished state should update the
  // entity.
  $this
    ->assertFalse($french_node
    ->isPublished());

  // Check that revision 7 is still the default one for the node.
  $this
    ->assertDefaultRevision($english_node, 7);
}