diff --git a/core/modules/content_moderation/tests/src/Kernel/ModerationInformationTest.php b/core/modules/content_moderation/tests/src/Kernel/ModerationInformationTest.php index a313bc9c3115b6b3c2efb1d136c4fa98ab4d9fce..98b6693df7076a22d8e0a077c25c55542fef01a9 100644 --- a/core/modules/content_moderation/tests/src/Kernel/ModerationInformationTest.php +++ b/core/modules/content_moderation/tests/src/Kernel/ModerationInformationTest.php @@ -2,8 +2,10 @@ namespace Drupal\Tests\content_moderation\Kernel; +use Drupal\entity_test\Entity\EntityTestMulRevPub; use Drupal\entity_test\Entity\EntityTestRev; use Drupal\KernelTests\KernelTestBase; +use Drupal\language\Entity\ConfigurableLanguage; use Drupal\workflows\Entity\Workflow; /** @@ -15,7 +17,21 @@ class ModerationInformationTest extends KernelTestBase { /** * {@inheritdoc} */ - public static $modules = ['content_moderation', 'entity_test', 'user', 'workflows']; + public static $modules = [ + 'content_moderation', + 'entity_test', + 'user', + 'workflows', + 'language', + 'content_translation', + ]; + + /** + * The moderation information service. + * + * @var \Drupal\content_moderation\ModerationInformationInterface + */ + protected $moderationInformation; /** * {@inheritdoc} @@ -24,8 +40,20 @@ protected function setUp() { parent::setUp(); $this->installEntitySchema('entity_test_rev'); + $this->installEntitySchema('entity_test_mulrevpub'); $this->installEntitySchema('content_moderation_state'); $this->installConfig(['content_moderation']); + + $this->moderationInformation = $this->container->get('content_moderation.moderation_information'); + + ConfigurableLanguage::createFromLangcode('de')->save(); + + $workflow = Workflow::load('editorial'); + $workflow->getTypePlugin()->addEntityTypeAndBundle('entity_test_mulrevpub', 'entity_test_mulrevpub'); + $workflow->getTypePlugin()->addEntityTypeAndBundle('entity_test_rev', 'entity_test_rev'); + $workflow->save(); + + $this->container->get('content_translation.manager')->setEnabled('entity_test_mulrevpub', 'entity_test_mulrevpub', TRUE); } /** @@ -33,10 +61,6 @@ protected function setUp() { * @covers ::getLatestRevisionId */ public function testDefaultAndLatestRevisionId() { - $workflow = Workflow::load('editorial'); - $workflow->getTypePlugin()->addEntityTypeAndBundle('entity_test_rev', 'entity_test_rev'); - $workflow->save(); - $entity_test_rev = EntityTestRev::create([ 'name' => 'Default Revision', 'moderation_state' => 'published', @@ -47,18 +71,85 @@ public function testDefaultAndLatestRevisionId() { $entity_test_rev->moderation_state = 'draft'; $entity_test_rev->save(); - /** @var \Drupal\content_moderation\ModerationInformationInterface $moderation_info */ - $moderation_info = \Drupal::service('content_moderation.moderation_information'); - // Check that moderation information service returns the correct default // revision ID. - $default_revision_id = $moderation_info->getDefaultRevisionId('entity_test_rev', $entity_test_rev->id()); + $default_revision_id = $this->moderationInformation->getDefaultRevisionId('entity_test_rev', $entity_test_rev->id()); $this->assertSame(1, $default_revision_id); // Check that moderation information service returns the correct latest // revision ID. - $latest_revision_id = $moderation_info->getLatestRevisionId('entity_test_rev', $entity_test_rev->id()); + $latest_revision_id = $this->moderationInformation->getLatestRevisionId('entity_test_rev', $entity_test_rev->id()); $this->assertSame(2, $latest_revision_id); } + /** + * @covers ::isDefaultRevisionPublished + * @dataProvider isDefaultRevisionPublishedTestCases + */ + public function testIsDefaultRevisionPublished($initial_state, $final_state, $initial_is_default_published, $final_is_default_published) { + $entity = EntityTestMulRevPub::create([ + 'moderation_state' => $initial_state, + ]); + $entity->save(); + $this->assertEquals($initial_is_default_published, $this->moderationInformation->isDefaultRevisionPublished($entity)); + + $entity->moderation_state = $final_state; + $entity->save(); + $this->assertEquals($final_is_default_published, $this->moderationInformation->isDefaultRevisionPublished($entity)); + } + + /** + * Test cases for ::testIsDefaultRevisionPublished. + */ + public function isDefaultRevisionPublishedTestCases() { + return [ + 'Draft to draft' => [ + 'draft', + 'draft', + FALSE, + FALSE, + ], + 'Draft to published' => [ + 'draft', + 'published', + FALSE, + TRUE, + ], + 'Published to published' => [ + 'published', + 'published', + TRUE, + TRUE, + ], + 'Published to draft' => [ + 'published', + 'draft', + TRUE, + TRUE, + ], + ]; + } + + /** + * @covers ::isDefaultRevisionPublished + */ + public function testIsDefaultRevisionPublishedMultilingual() { + $entity = EntityTestMulRevPub::create([ + 'moderation_state' => 'draft', + ]); + $entity->save(); + $this->assertEquals('draft', $entity->moderation_state->value); + + $translated = $entity->addTranslation('de'); + $translated->moderation_state = 'published'; + $translated->save(); + $this->assertEquals('published', $translated->moderation_state->value); + + // Test a scenario where the default revision exists with the default + // language in a draft state and a non-default language in a published + // state. The method returns TRUE if any of the languages for the default + // revision are in a published state. + $this->assertEquals(TRUE, $this->moderationInformation->isDefaultRevisionPublished($entity)); + } + } diff --git a/core/modules/content_moderation/tests/src/Kernel/ModerationStateFieldItemListTest.php b/core/modules/content_moderation/tests/src/Kernel/ModerationStateFieldItemListTest.php index c4770166408cc93644ed4719fc8776503e0797e2..d1ff5d2da841d8755adec668108f97aabc2ef8cc 100644 --- a/core/modules/content_moderation/tests/src/Kernel/ModerationStateFieldItemListTest.php +++ b/core/modules/content_moderation/tests/src/Kernel/ModerationStateFieldItemListTest.php @@ -130,22 +130,58 @@ public function testNonModeratedEntity() { /** * Tests that moderation state changes also change the related entity state. + * + * @dataProvider moderationStateChangesTestCases */ - public function testModerationStateChanges() { - // Change the moderation state and check that the entity's - // 'isDefaultRevision' flag and the publishing status have also been - // updated. - $this->testNode->moderation_state->value = 'published'; - - $this->assertTrue($this->testNode->isPublished()); - $this->assertTrue($this->testNode->isDefaultRevision()); - + public function testModerationStateChanges($initial_state, $final_state, $first_published, $first_is_default, $second_published, $second_is_default) { + $this->testNode->moderation_state->value = $initial_state; + $this->assertEquals($first_published, $this->testNode->isPublished()); + $this->assertEquals($first_is_default, $this->testNode->isDefaultRevision()); $this->testNode->save(); - // Repeat the checks using an 'unpublished' state. - $this->testNode->moderation_state->value = 'draft'; - $this->assertFalse($this->testNode->isPublished()); - $this->assertFalse($this->testNode->isDefaultRevision()); + $this->testNode->moderation_state->value = $final_state; + $this->assertEquals($second_published, $this->testNode->isPublished()); + $this->assertEquals($second_is_default, $this->testNode->isDefaultRevision()); + } + + /** + * Data provider for ::testModerationStateChanges + */ + public function moderationStateChangesTestCases() { + return [ + 'Draft to draft' => [ + 'draft', + 'draft', + FALSE, + TRUE, + FALSE, + TRUE, + ], + 'Draft to published' => [ + 'draft', + 'published', + FALSE, + TRUE, + TRUE, + TRUE, + ], + 'Published to published' => [ + 'published', + 'published', + TRUE, + TRUE, + TRUE, + TRUE, + ], + 'Published to draft' => [ + 'published', + 'draft', + TRUE, + TRUE, + FALSE, + FALSE, + ], + ]; } /**