X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Fcontent_moderation%2Ftests%2Fsrc%2FFunctional%2FModerationFormTest.php;fp=web%2Fcore%2Fmodules%2Fcontent_moderation%2Ftests%2Fsrc%2FFunctional%2FModerationFormTest.php;h=3882c764f191193c197e0213246cc9bbf45e6e9e;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hp=0000000000000000000000000000000000000000;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad;p=yaffs-website diff --git a/web/core/modules/content_moderation/tests/src/Functional/ModerationFormTest.php b/web/core/modules/content_moderation/tests/src/Functional/ModerationFormTest.php new file mode 100644 index 000000000..3882c764f --- /dev/null +++ b/web/core/modules/content_moderation/tests/src/Functional/ModerationFormTest.php @@ -0,0 +1,208 @@ +drupalLogin($this->adminUser); + $this->createContentTypeFromUi('Moderated content', 'moderated_content', TRUE); + $this->grantUserPermissionToCreateContentOfType($this->adminUser, 'moderated_content'); + } + + /** + * Tests the moderation form that shows on the latest version page. + * + * The latest version page only shows if there is a forward revision. There + * is only a forward revision if a draft revision is created on a node where + * the default revision is not a published moderation state. + * + * @see \Drupal\content_moderation\EntityOperations + * @see \Drupal\Tests\content_moderation\Functional\ModerationStateBlockTest::testCustomBlockModeration + */ + public function testModerationForm() { + // Create new moderated content in draft. + $this->drupalPostForm('node/add/moderated_content', [ + 'title[0][value]' => 'Some moderated content', + 'body[0][value]' => 'First version of the content.', + ], t('Save and Create New Draft')); + + $node = $this->drupalGetNodeByTitle('Some moderated content'); + $canonical_path = sprintf('node/%d', $node->id()); + $edit_path = sprintf('node/%d/edit', $node->id()); + $latest_version_path = sprintf('node/%d/latest', $node->id()); + + $this->assertTrue($this->adminUser->hasPermission('edit any moderated_content content')); + + // The canonical view should have a moderation form, because it is not the + // live revision. + $this->drupalGet($canonical_path); + $this->assertResponse(200); + $this->assertField('edit-new-state', 'The node view page has a moderation form.'); + + // The latest version page should not show, because there is no forward + // revision. + $this->drupalGet($latest_version_path); + $this->assertResponse(403); + + // Update the draft. + $this->drupalPostForm($edit_path, [ + 'body[0][value]' => 'Second version of the content.', + ], t('Save and Create New Draft')); + + // The canonical view should have a moderation form, because it is not the + // live revision. + $this->drupalGet($canonical_path); + $this->assertResponse(200); + $this->assertField('edit-new-state', 'The node view page has a moderation form.'); + + // The latest version page should not show, because there is still no + // forward revision. + $this->drupalGet($latest_version_path); + $this->assertResponse(403); + + // Publish the draft. + $this->drupalPostForm($edit_path, [ + 'body[0][value]' => 'Third version of the content.', + ], t('Save and Publish')); + + // The published view should not have a moderation form, because it is the + // live revision. + $this->drupalGet($canonical_path); + $this->assertResponse(200); + $this->assertNoField('edit-new-state', 'The node view page has no moderation form.'); + + // The latest version page should not show, because there is still no + // forward revision. + $this->drupalGet($latest_version_path); + $this->assertResponse(403); + + // Make a forward revision. + $this->drupalPostForm($edit_path, [ + 'body[0][value]' => 'Fourth version of the content.', + ], t('Save and Create New Draft')); + + // The published view should not have a moderation form, because it is the + // live revision. + $this->drupalGet($canonical_path); + $this->assertResponse(200); + $this->assertNoField('edit-new-state', 'The node view page has no moderation form.'); + + // The latest version page should show the moderation form and have "Draft" + // status, because the forward revision is in "Draft". + $this->drupalGet($latest_version_path); + $this->assertResponse(200); + $this->assertField('edit-new-state', 'The latest-version page has a moderation form.'); + $this->assertText('Draft', 'Correct status found on the latest-version page.'); + + // Submit the moderation form to change status to published. + $this->drupalPostForm($latest_version_path, [ + 'new_state' => 'published', + ], t('Apply')); + + // The latest version page should not show, because there is no + // forward revision. + $this->drupalGet($latest_version_path); + $this->assertResponse(403); + } + + /** + * Test moderation non-bundle entity type. + */ + public function testNonBundleModerationForm() { + $this->drupalLogin($this->rootUser); + $workflow = Workflow::load('editorial'); + $workflow->getTypePlugin()->addEntityTypeAndBundle('entity_test_mulrevpub', 'entity_test_mulrevpub'); + $workflow->save(); + + // Create new moderated content in draft. + $this->drupalPostForm('entity_test_mulrevpub/add', [], t('Save and Create New Draft')); + + // The latest version page should not show, because there is no forward + // revision. + $this->drupalGet('/entity_test_mulrevpub/manage/1/latest'); + $this->assertResponse(403); + + // Update the draft. + $this->drupalPostForm('entity_test_mulrevpub/manage/1/edit', [], t('Save and Create New Draft')); + + // The latest version page should not show, because there is still no + // forward revision. + $this->drupalGet('/entity_test_mulrevpub/manage/1/latest'); + $this->assertResponse(403); + + // Publish the draft. + $this->drupalPostForm('entity_test_mulrevpub/manage/1/edit', [], t('Save and Publish')); + + // The published view should not have a moderation form, because it is the + // default revision. + $this->drupalGet('entity_test_mulrevpub/manage/1'); + $this->assertResponse(200); + $this->assertNoText('Status', 'The node view page has no moderation form.'); + + // The latest version page should not show, because there is still no + // forward revision. + $this->drupalGet('entity_test_mulrevpub/manage/1/latest'); + $this->assertResponse(403); + + // Make a forward revision. + $this->drupalPostForm('entity_test_mulrevpub/manage/1/edit', [], t('Save and Create New Draft')); + + // The published view should not have a moderation form, because it is the + // default revision. + $this->drupalGet('entity_test_mulrevpub/manage/1'); + $this->assertResponse(200); + $this->assertNoText('Status', 'The node view page has no moderation form.'); + + // The latest version page should show the moderation form and have "Draft" + // status, because the forward revision is in "Draft". + $this->drupalGet('entity_test_mulrevpub/manage/1/latest'); + $this->assertResponse(200); + $this->assertText('Status', 'Form text found on the latest-version page.'); + $this->assertText('Draft', 'Correct status found on the latest-version page.'); + + // Submit the moderation form to change status to published. + $this->drupalPostForm('entity_test_mulrevpub/manage/1/latest', [ + 'new_state' => 'published', + ], t('Apply')); + + // The latest version page should not show, because there is no + // forward revision. + $this->drupalGet('entity_test_mulrevpub/manage/1/latest'); + $this->assertResponse(403); + } + + /** + * Tests the revision author is updated when the moderation form is used. + */ + public function testModerationFormSetsRevisionAuthor() { + // Create new moderated content in published. + $node = $this->createNode(['type' => 'moderated_content', 'moderation_state' => 'published']); + // Make a forward revision. + $node->title = $this->randomMachineName(); + $node->moderation_state->value = 'draft'; + $node->save(); + + $another_user = $this->drupalCreateUser($this->permissions); + $this->grantUserPermissionToCreateContentOfType($another_user, 'moderated_content'); + $this->drupalLogin($another_user); + $this->drupalPostForm(sprintf('node/%d/latest', $node->id()), [ + 'new_state' => 'published', + ], t('Apply')); + + $this->drupalGet(sprintf('node/%d/revisions', $node->id())); + $this->assertText('by ' . $another_user->getAccountName()); + } + +}