X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Fcomment%2Ftests%2Fsrc%2FFunctional%2FCommentFieldsTest.php;fp=web%2Fcore%2Fmodules%2Fcomment%2Ftests%2Fsrc%2FFunctional%2FCommentFieldsTest.php;h=2df997334839b347c74e81ffc7eab02daf9c5d0f;hp=0000000000000000000000000000000000000000;hb=9917807b03b64faf00f6a1f29dcb6eafc454efa5;hpb=aea91e65e895364e460983b890e295aa5d5540a5 diff --git a/web/core/modules/comment/tests/src/Functional/CommentFieldsTest.php b/web/core/modules/comment/tests/src/Functional/CommentFieldsTest.php new file mode 100644 index 000000000..2df997334 --- /dev/null +++ b/web/core/modules/comment/tests/src/Functional/CommentFieldsTest.php @@ -0,0 +1,235 @@ +drupalCreateContentType(['type' => 'test_node_type']); + $this->addDefaultCommentField('node', 'test_node_type'); + + // Check that the 'comment_body' field is present on the comment bundle. + $field = FieldConfig::loadByName('comment', 'comment', 'comment_body'); + $this->assertTrue(!empty($field), 'The comment_body field is added when a comment bundle is created'); + + $field->delete(); + + // Check that the 'comment_body' field is not deleted since it is persisted + // even if it has no fields. + $field_storage = FieldStorageConfig::loadByName('comment', 'comment_body'); + $this->assertTrue($field_storage, 'The comment_body field storage was not deleted'); + + // Create a new content type. + $type_name = 'test_node_type_2'; + $this->drupalCreateContentType(['type' => $type_name]); + $this->addDefaultCommentField('node', $type_name); + + // Check that the 'comment_body' field exists and has an instance on the + // new comment bundle. + $field_storage = FieldStorageConfig::loadByName('comment', 'comment_body'); + $this->assertTrue($field_storage, 'The comment_body field exists'); + $field = FieldConfig::loadByName('comment', 'comment', 'comment_body'); + $this->assertTrue(isset($field), format_string('The comment_body field is present for comments on type @type', ['@type' => $type_name])); + + // Test adding a field that defaults to CommentItemInterface::CLOSED. + $this->addDefaultCommentField('node', 'test_node_type', 'who_likes_ponies', CommentItemInterface::CLOSED, 'who_likes_ponies'); + $field = FieldConfig::load('node.test_node_type.who_likes_ponies');; + $this->assertEqual($field->getDefaultValueLiteral()[0]['status'], CommentItemInterface::CLOSED); + } + + /** + * Tests that you can remove a comment field. + */ + public function testCommentFieldDelete() { + $this->drupalCreateContentType(['type' => 'test_node_type']); + $this->addDefaultCommentField('node', 'test_node_type'); + // We want to test the handling of removing the primary comment field, so we + // ensure there is at least one other comment field attached to a node type + // so that comment_entity_load() runs for nodes. + $this->addDefaultCommentField('node', 'test_node_type', 'comment2'); + + // Create a sample node. + $node = $this->drupalCreateNode([ + 'title' => 'Baloney', + 'type' => 'test_node_type', + ]); + + $this->drupalLogin($this->webUser); + + $this->drupalGet('node/' . $node->nid->value); + $elements = $this->cssSelect('.field--type-comment'); + $this->assertEqual(2, count($elements), 'There are two comment fields on the node.'); + + // Delete the first comment field. + FieldStorageConfig::loadByName('node', 'comment')->delete(); + $this->drupalGet('node/' . $node->nid->value); + $elements = $this->cssSelect('.field--type-comment'); + $this->assertEqual(1, count($elements), 'There is one comment field on the node.'); + } + + /** + * Tests link building with non-default comment field names. + */ + public function testCommentFieldLinksNonDefaultName() { + $this->drupalCreateContentType(['type' => 'test_node_type']); + $this->addDefaultCommentField('node', 'test_node_type', 'comment2'); + + $web_user2 = $this->drupalCreateUser([ + 'access comments', + 'post comments', + 'create article content', + 'edit own comments', + 'skip comment approval', + 'access content', + ]); + + // Create a sample node. + $node = $this->drupalCreateNode([ + 'title' => 'Baloney', + 'type' => 'test_node_type', + ]); + + // Go to the node first so that webuser2 see new comments. + $this->drupalLogin($web_user2); + $this->drupalGet($node->urlInfo()); + $this->drupalLogout(); + + // Test that buildCommentedEntityLinks() does not break when the 'comment' + // field does not exist. Requires at least one comment. + $this->drupalLogin($this->webUser); + $this->postComment($node, 'Here is a comment', '', NULL, 'comment2'); + $this->drupalLogout(); + + $this->drupalLogin($web_user2); + + // We want to check the attached drupalSettings of + // \Drupal\comment\CommentLinkBuilder::buildCommentedEntityLinks. Therefore + // we need a node listing, let's use views for that. + $this->container->get('module_installer')->install(['views'], TRUE); + // We also need a router rebuild, as the router is lazily rebuild in the + // module installer. + \Drupal::service('router.builder')->rebuild(); + $this->drupalGet('node'); + + $link_info = $this->getDrupalSettings()['comment']['newCommentsLinks']['node']['comment2']['2']; + $this->assertIdentical($link_info['new_comment_count'], 1); + $this->assertIdentical($link_info['first_new_comment_link'], $node->url('canonical', ['fragment' => 'new'])); + } + + /** + * Tests creating a comment field through the interface. + */ + public function testCommentFieldCreate() { + // Create user who can administer user fields. + $user = $this->drupalCreateUser([ + 'administer user fields', + ]); + $this->drupalLogin($user); + + // Create comment field in account settings. + $edit = [ + 'new_storage_type' => 'comment', + 'label' => 'User comment', + 'field_name' => 'user_comment', + ]; + $this->drupalPostForm('admin/config/people/accounts/fields/add-field', $edit, 'Save and continue'); + + // Try to save the comment field without selecting a comment type. + $edit = []; + $this->drupalPostForm('admin/config/people/accounts/fields/user.user.field_user_comment/storage', $edit, t('Save field settings')); + // We should get an error message. + $this->assertText(t('An illegal choice has been detected. Please contact the site administrator.')); + + // Create a comment type for users. + $bundle = CommentType::create([ + 'id' => 'user_comment_type', + 'label' => 'user_comment_type', + 'description' => '', + 'target_entity_type_id' => 'user', + ]); + $bundle->save(); + + // Select a comment type and try to save again. + $edit = [ + 'settings[comment_type]' => 'user_comment_type', + ]; + $this->drupalPostForm('admin/config/people/accounts/fields/user.user.field_user_comment/storage', $edit, t('Save field settings')); + // We shouldn't get an error message. + $this->assertNoText(t('An illegal choice has been detected. Please contact the site administrator.')); + } + + /** + * Tests that comment module works when installed after a content module. + */ + public function testCommentInstallAfterContentModule() { + // Create a user to do module administration. + $this->adminUser = $this->drupalCreateUser(['access administration pages', 'administer modules']); + $this->drupalLogin($this->adminUser); + + // Drop default comment field added in CommentTestBase::setup(). + FieldStorageConfig::loadByName('node', 'comment')->delete(); + if ($field_storage = FieldStorageConfig::loadByName('node', 'comment_forum')) { + $field_storage->delete(); + } + + // Purge field data now to allow comment module to be uninstalled once the + // field has been deleted. + field_purge_batch(10); + + // Uninstall the comment module. + $edit = []; + $edit['uninstall[comment]'] = TRUE; + $this->drupalPostForm('admin/modules/uninstall', $edit, t('Uninstall')); + $this->drupalPostForm(NULL, [], t('Uninstall')); + $this->rebuildContainer(); + $this->assertFalse($this->container->get('module_handler')->moduleExists('comment'), 'Comment module uninstalled.'); + + // Install core content type module (book). + $edit = []; + $edit['modules[book][enable]'] = 'book'; + $this->drupalPostForm('admin/modules', $edit, t('Install')); + + // Now install the comment module. + $edit = []; + $edit['modules[comment][enable]'] = 'comment'; + $this->drupalPostForm('admin/modules', $edit, t('Install')); + $this->rebuildContainer(); + $this->assertTrue($this->container->get('module_handler')->moduleExists('comment'), 'Comment module enabled.'); + + // Create nodes of each type. + $this->addDefaultCommentField('node', 'book'); + $book_node = $this->drupalCreateNode(['type' => 'book']); + + $this->drupalLogout(); + + // Try to post a comment on each node. A failure will be triggered if the + // comment body is missing on one of these forms, due to postComment() + // asserting that the body is actually posted correctly. + $this->webUser = $this->drupalCreateUser(['access content', 'access comments', 'post comments', 'skip comment approval']); + $this->drupalLogin($this->webUser); + $this->postComment($book_node, $this->randomMachineName(), $this->randomMachineName()); + } + +}