X-Git-Url: http://aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Fcontent_moderation%2Ftests%2Fsrc%2FKernel%2FEntityStateChangeValidationTest.php;h=aeed8486f5b652c425562585cfbd0c6992b9a9a9;hb=af6d1fb995500ae68849458ee10d66abbdcfb252;hp=7c4f97d391e7a541350d880e94fad0b02d2a1ff3;hpb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;p=yaffs-website diff --git a/web/core/modules/content_moderation/tests/src/Kernel/EntityStateChangeValidationTest.php b/web/core/modules/content_moderation/tests/src/Kernel/EntityStateChangeValidationTest.php index 7c4f97d39..aeed8486f 100644 --- a/web/core/modules/content_moderation/tests/src/Kernel/EntityStateChangeValidationTest.php +++ b/web/core/modules/content_moderation/tests/src/Kernel/EntityStateChangeValidationTest.php @@ -96,10 +96,128 @@ class EntityStateChangeValidationTest extends KernelTestBase { $this->assertEquals('Invalid state transition from Draft to Archived', $violations->get(0)->getMessage()); } + /** + * Test validation with an invalid state. + */ + public function testInvalidState() { + $node_type = NodeType::create([ + 'type' => 'example', + ]); + $node_type->save(); + $workflow = Workflow::load('editorial'); + $workflow->getTypePlugin()->addEntityTypeAndBundle('node', 'example'); + $workflow->save(); + + $node = Node::create([ + 'type' => 'example', + 'title' => 'Test title', + ]); + $node->moderation_state->value = 'invalid_state'; + $violations = $node->validate(); + + $this->assertCount(1, $violations); + $this->assertEquals('State invalid_state does not exist on Editorial workflow', $violations->get(0)->getMessage()); + } + + /** + * Test validation with content that has no initial state or an invalid state. + */ + public function testInvalidStateWithoutExisting() { + // Create content without moderation enabled for the content type. + $node_type = NodeType::create([ + 'type' => 'example', + ]); + $node_type->save(); + $node = Node::create([ + 'type' => 'example', + 'title' => 'Test title', + ]); + $node->save(); + + // Enable moderation to test validation on existing content, with no + // explicit state. + $workflow = Workflow::load('editorial'); + $workflow->getTypePlugin()->addState('deleted_state', 'Deleted state'); + $workflow->getTypePlugin()->addEntityTypeAndBundle('node', 'example'); + $workflow->save(); + + // Validate the invalid state. + $node->moderation_state->value = 'invalid_state'; + $violations = $node->validate(); + $this->assertCount(1, $violations); + + // Assign the node to a state we're going to delete. + $node->moderation_state->value = 'deleted_state'; + $node->save(); + + // Delete the state so $node->original contains an invalid state when + // validating. + $workflow->getTypePlugin()->deleteState('deleted_state'); + $workflow->save(); + $node->moderation_state->value = 'draft'; + $violations = $node->validate(); + $this->assertCount(0, $violations); + } + + /** + * Test state transition validation with multiple languages. + */ + public function testInvalidStateMultilingual() { + ConfigurableLanguage::createFromLangcode('fr')->save(); + $node_type = NodeType::create([ + 'type' => 'example', + ]); + $node_type->save(); + + $workflow = Workflow::load('editorial'); + $workflow->getTypePlugin()->addEntityTypeAndBundle('node', 'example'); + $workflow->save(); + + $node = Node::create([ + 'type' => 'example', + 'title' => 'English Published Node', + 'langcode' => 'en', + 'moderation_state' => 'published', + ]); + $node->save(); + + $node_fr = $node->addTranslation('fr', $node->toArray()); + $node_fr->setTitle('French Published Node'); + $node_fr->save(); + $this->assertEquals('published', $node_fr->moderation_state->value); + + // Create a pending revision of the original node. + $node->moderation_state = 'draft'; + $node->setNewRevision(TRUE); + $node->isDefaultRevision(FALSE); + $node->save(); + + // For the pending english revision, there should be a violation from draft + // to archived. + $node->moderation_state = 'archived'; + $violations = $node->validate(); + $this->assertCount(1, $violations); + $this->assertEquals('Invalid state transition from Draft to Archived', $violations->get(0)->getMessage()); + + // From the default french published revision, there should be none. + $node_fr = Node::load($node->id())->getTranslation('fr'); + $this->assertEquals('published', $node_fr->moderation_state->value); + $node_fr->moderation_state = 'archived'; + $violations = $node_fr->validate(); + $this->assertCount(0, $violations); + + // From the latest french revision, there should also be no violation. + $node_fr = Node::load($node->id())->getTranslation('fr'); + $this->assertEquals('published', $node_fr->moderation_state->value); + $node_fr->moderation_state = 'archived'; + $violations = $node_fr->validate(); + $this->assertCount(0, $violations); + } + /** * Tests that content without prior moderation information can be moderated. */ - public function testLegacyContent() { + public function testExistingContentWithNoModeration() { $node_type = NodeType::create([ 'type' => 'example', ]); @@ -133,7 +251,7 @@ class EntityStateChangeValidationTest extends KernelTestBase { /** * Tests that content without prior moderation information can be translated. */ - public function testLegacyMultilingualContent() { + public function testExistingMultilingualContentWithNoModeration() { // Enable French. ConfigurableLanguage::createFromLangcode('fr')->save();