View source
<?php
namespace Drupal\Tests\comment\Functional;
use Drupal\comment\CommentInterface;
use Drupal\comment\Entity\Comment;
use Drupal\comment\Entity\CommentType;
use Drupal\comment\Plugin\Field\FieldType\CommentItemInterface;
use Drupal\comment\Tests\CommentTestTrait;
use Drupal\entity_test\Entity\EntityTest;
use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\Tests\BrowserTestBase;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Tests\field_ui\Traits\FieldUiTestTrait;
use Drupal\user\RoleInterface;
class CommentNonNodeTest extends BrowserTestBase {
use FieldUiTestTrait;
use CommentTestTrait;
protected static $modules = [
'comment',
'user',
'field_ui',
'entity_test',
'block',
];
protected $defaultTheme = 'stark';
protected $adminUser;
protected $entity;
protected function setUp() : void {
parent::setUp();
$this
->drupalPlaceBlock('system_breadcrumb_block');
$this
->drupalPlaceBlock('page_title_block');
entity_test_create_bundle('entity_test', 'Entity Test', 'entity_test');
CommentType::create([
'id' => 'comment',
'label' => 'Comment settings',
'description' => 'Comment settings',
'target_entity_type_id' => 'entity_test',
])
->save();
$this
->addDefaultCommentField('entity_test', 'entity_test');
$bundles = \Drupal::service('entity_type.bundle.info')
->getBundleInfo('comment');
$this
->assertEquals('Comment settings', $bundles['comment']['label']);
$this->adminUser = $this
->drupalCreateUser([
'administer comments',
'skip comment approval',
'post comments',
'access comments',
'view test entity',
'administer entity_test content',
]);
user_role_grant_permissions(RoleInterface::ANONYMOUS_ID, [
'access comments',
'post comments',
'skip comment approval',
]);
user_role_grant_permissions(RoleInterface::AUTHENTICATED_ID, [
'access comments',
'post comments',
'skip comment approval',
]);
$random_label = $this
->randomMachineName();
$data = [
'type' => 'entity_test',
'name' => $random_label,
];
$this->entity = EntityTest::create($data);
$this->entity
->save();
}
public function postComment(?EntityInterface $entity, $comment, $subject = '', $contact = NULL) {
$edit = [];
$edit['comment_body[0][value]'] = $comment;
$field = FieldConfig::loadByName('entity_test', 'entity_test', 'comment');
$preview_mode = $field
->getSetting('preview');
if ($entity !== NULL) {
$this
->drupalGet('comment/reply/entity_test/' . $entity
->id() . '/comment');
}
$display_repository = $this->container
->get('entity_display.repository');
if ($display_repository
->getFormDisplay('comment', 'comment')
->getComponent('subject')) {
$edit['subject[0][value]'] = $subject;
}
else {
$this
->assertSession()
->fieldValueNotEquals('subject[0][value]', '');
}
if ($contact !== NULL && is_array($contact)) {
$edit += $contact;
}
switch ($preview_mode) {
case DRUPAL_REQUIRED:
$this
->assertSession()
->buttonNotExists('Save');
$this
->submitForm($edit, 'Preview');
case DRUPAL_OPTIONAL:
$this
->assertSession()
->buttonExists('Preview');
$this
->assertSession()
->buttonExists('Save');
$this
->submitForm($edit, 'Save');
break;
case DRUPAL_DISABLED:
$this
->assertSession()
->buttonNotExists('Preview');
$this
->assertSession()
->buttonExists('Save');
$this
->submitForm($edit, 'Save');
break;
}
$match = [];
preg_match('/#comment-([0-9]+)/', $this
->getURL(), $match);
if ($contact !== TRUE) {
if ($subject) {
$this
->assertSession()
->pageTextContains($subject);
}
$this
->assertSession()
->pageTextContains($comment);
$this
->assertArrayHasKey(1, $match);
}
return Comment::load($match[1]);
}
public function commentExists(CommentInterface $comment = NULL, $reply = FALSE) {
if ($comment) {
$regex = '/' . ($reply ? '<div class="indented">(.*?)' : '');
$regex .= '<article(.*?)id="comment-' . $comment
->id() . '"(.*?)';
$regex .= $comment
->getSubject() . '(.*?)';
$regex .= $comment->comment_body->value . '(.*?)';
$regex .= '/s';
return (bool) preg_match($regex, $this
->getSession()
->getPage()
->getContent());
}
else {
return FALSE;
}
}
public function commentContactInfoAvailable() {
return (bool) preg_match('/(input).*?(name="name").*?(input).*?(name="mail").*?(input).*?(name="homepage")/s', $this
->getSession()
->getPage()
->getContent());
}
public function performCommentOperation($comment, $operation, $approval = FALSE) {
$edit = [];
$edit['operation'] = $operation;
$edit['comments[' . $comment
->id() . ']'] = TRUE;
$this
->drupalGet('admin/content/comment' . ($approval ? '/approval' : ''));
$this
->submitForm($edit, 'Update');
if ($operation == 'delete') {
$this
->submitForm([], 'Delete');
$this
->assertSession()
->pageTextContains('Deleted 1 comment.');
}
else {
$this
->assertSession()
->pageTextContains('The update has been performed.');
}
}
public function getUnapprovedComment($subject) {
$this
->drupalGet('admin/content/comment/approval');
preg_match('/href="(.*?)#comment-([^"]+)"(.*?)>(' . $subject . ')/', $this
->getSession()
->getPage()
->getContent(), $match);
return $match[2];
}
public function testCommentFunctionality() {
$limited_user = $this
->drupalCreateUser([
'administer entity_test fields',
]);
$this
->drupalLogin($limited_user);
$this
->drupalGet('entity_test/structure/entity_test/fields');
$this
->assertSession()
->pageTextContains('Comments');
$this
->assertSession()
->linkByHrefExists('entity_test/structure/entity_test/fields/entity_test.entity_test.comment');
$this
->drupalGet('entity_test/structure/entity_test/fields/entity_test.entity_test.comment');
$this
->assertSession()
->statusCodeEquals(200);
$this
->assertSession()
->fieldNotExists('edit-default-value-input-comment-und-0-status-0');
$this
->drupalGet('entity_test/structure/entity_test/fields/entity_test.entity_test.comment/storage');
$this
->assertSession()
->statusCodeEquals(200);
$this
->assertSession()
->fieldNotExists('cardinality_number');
$this
->assertSession()
->fieldNotExists('cardinality');
$this
->drupalLogin($this->adminUser);
$this
->drupalGet('comment/reply/entity_test/' . $this->entity
->id() . '/comment');
$xpath = '//nav[@aria-labelledby="system-breadcrumb"]/ol/li[last()]/a';
$this
->assertEquals($this->entity
->label(), current($this
->xpath($xpath))
->getText(), 'Last breadcrumb item is equal to node title on comment reply page.');
$comment1 = $this
->postComment($this->entity, $this
->randomMachineName(), $this
->randomMachineName());
$this
->assertTrue($this
->commentExists($comment1), 'Comment on test entity exists.');
$this
->drupalGet('comment/reply/entity_test/' . $this->entity
->id() . '/comment/' . $comment1
->id());
$xpath = '//nav[@aria-labelledby="system-breadcrumb"]/ol/li[last()]/a';
$this
->assertEquals($comment1
->getSubject(), current($this
->xpath($xpath))
->getText(), 'Last breadcrumb item is equal to comment title on comment reply page.');
$this
->drupalGet('comment/' . $comment1
->id() . '/edit');
$xpath = '//nav[@aria-labelledby="system-breadcrumb"]/ol/li[last()]/a';
$this
->assertEquals($comment1
->getSubject(), current($this
->xpath($xpath))
->getText(), 'Last breadcrumb item is equal to comment subject on edit page.');
$this
->drupalGet('comment/' . $comment1
->id() . '/delete');
$xpath = '//nav[@aria-labelledby="system-breadcrumb"]/ol/li[last()]/a';
$this
->assertEquals($comment1
->getSubject(), current($this
->xpath($xpath))
->getText(), 'Last breadcrumb item is equal to comment subject on delete confirm page.');
$this
->drupalGet('comment/reply/entity_test/' . $this->entity
->id() . '/comment/' . $comment1
->id());
$comment1_2 = $this
->postComment(NULL, $this
->randomMachineName(), $this
->randomMachineName());
$this
->assertTrue($this
->commentExists($comment1_2, TRUE), 'Comment #1_2. Reply found.');
$this
->assertEquals('01.00/', $comment1_2
->getThread());
$this
->drupalGet('comment/reply/entity_test/' . $this->entity
->id() . '/comment/' . $comment1_2
->id());
$comment1_2_3 = $this
->postComment(NULL, $this
->randomMachineName(), $this
->randomMachineName());
$this
->assertTrue($this
->commentExists($comment1_2_3, TRUE), 'Comment #1_2_3. Reply found.');
$this
->assertEquals('01.00.00/', $comment1_2_3
->getThread());
$this
->performCommentOperation($comment1, 'unpublish');
$this
->drupalGet('admin/content/comment/approval');
$this
->assertSession()
->responseContains('comments[' . $comment1
->id() . ']');
$this
->performCommentOperation($comment1, 'publish', TRUE);
$this
->drupalGet('admin/content/comment');
$this
->assertSession()
->responseContains('comments[' . $comment1
->id() . ']');
$this
->performCommentOperation($comment1, 'delete');
$this
->drupalGet('admin/content/comment');
$this
->assertSession()
->responseNotContains('comments[' . $comment1
->id() . ']');
$comment1 = $this
->postComment($this->entity, $this
->randomMachineName(), $this
->randomMachineName());
$this
->assertTrue($this
->commentExists($comment1), 'Comment on test entity exists.');
$this
->drupalGet('admin/content/comment');
$this
->assertSession()
->responseContains('comments[' . $comment1
->id() . ']');
$this
->assertSession()
->pageTextContains($this->entity
->label());
$limited_user = $this
->drupalCreateUser([
'administer comments',
]);
$this
->drupalLogin($limited_user);
$this
->drupalGet('admin/content/comment');
$this
->assertSession()
->pageTextNotContains($this->entity
->label());
$this
->drupalLogout();
user_role_change_permissions(RoleInterface::ANONYMOUS_ID, [
'access comments' => FALSE,
'post comments' => FALSE,
'skip comment approval' => FALSE,
'view test entity' => TRUE,
]);
$this
->drupalGet('entity-test/' . $this->entity
->id());
$this
->assertSession()
->responseNotMatches('@<h2[^>]*>Comments</h2>@');
$this
->assertSession()
->linkNotExists('Add new comment', 'Link to add comment was found.');
$this
->drupalGet('comment/reply/entity_test/' . $this->entity
->id() . '/comment');
$this
->assertSession()
->statusCodeEquals(403);
$this
->assertSession()
->fieldNotExists('subject[0][value]');
$this
->assertSession()
->fieldNotExists('comment_body[0][value]');
user_role_change_permissions(RoleInterface::ANONYMOUS_ID, [
'access comments' => TRUE,
'post comments' => FALSE,
'view test entity' => TRUE,
'skip comment approval' => FALSE,
]);
$this
->drupalGet('entity_test/' . $this->entity
->id());
$this
->assertSession()
->responseMatches('@<h2[^>]*>Comments</h2>@');
$this
->assertSession()
->linkExists('Log in', 0, 'Link to login was found.');
$this
->assertSession()
->linkExists('register', 0, 'Link to register was found.');
$this
->assertSession()
->fieldNotExists('subject[0][value]');
$this
->assertSession()
->fieldNotExists('comment_body[0][value]');
user_role_change_permissions(RoleInterface::ANONYMOUS_ID, [
'access comments' => FALSE,
'post comments' => TRUE,
'skip comment approval' => TRUE,
'view test entity' => TRUE,
]);
$this
->drupalGet('entity_test/' . $this->entity
->id());
$this
->assertSession()
->responseNotMatches('@<h2[^>]*>Comments</h2>@');
$this
->assertSession()
->fieldValueEquals('subject[0][value]', '');
$this
->assertSession()
->fieldValueEquals('comment_body[0][value]', '');
$this
->drupalGet('comment/reply/entity_test/' . $this->entity
->id() . '/comment/' . $comment1
->id());
$this
->assertSession()
->statusCodeEquals(403);
$this
->assertSession()
->pageTextNotContains($comment1
->getSubject());
$limited_user = $this
->drupalCreateUser([
'administer entity_test fields',
'view test entity',
'administer entity_test content',
'administer comments',
]);
$this
->drupalLogin($limited_user);
$this
->drupalGet('entity_test/structure/entity_test/fields/entity_test.entity_test.comment');
$this
->assertSession()
->checkboxNotChecked('edit-default-value-input-comment-0-status-0');
$this
->assertSession()
->checkboxNotChecked('edit-default-value-input-comment-0-status-1');
$this
->assertSession()
->checkboxChecked('edit-default-value-input-comment-0-status-2');
$edit = [
'default_value_input[comment][0][status]' => CommentItemInterface::CLOSED,
'settings[anonymous]' => CommentInterface::ANONYMOUS_MAY_CONTACT,
];
$this
->submitForm($edit, 'Save settings');
$this
->drupalGet('entity_test/structure/entity_test/fields/entity_test.entity_test.comment');
$this
->assertSession()
->checkboxNotChecked('edit-default-value-input-comment-0-status-0');
$this
->assertSession()
->checkboxChecked('edit-default-value-input-comment-0-status-1');
$this
->assertSession()
->checkboxNotChecked('edit-default-value-input-comment-0-status-2');
$this
->assertSession()
->fieldValueEquals('settings[anonymous]', CommentInterface::ANONYMOUS_MAY_CONTACT);
$bundle = CommentType::create([
'id' => 'foobar',
'label' => 'Foobar',
'description' => '',
'target_entity_type_id' => 'entity_test',
]);
$bundle
->save();
$storage_edit = [
'settings[comment_type]' => 'foobar',
];
$this
->fieldUIAddNewField('entity_test/structure/entity_test', 'foobar', 'Foobar', 'comment', $storage_edit);
$this
->fieldUIAddNewField('entity_test/structure/entity_test', 'barfoo', 'BarFoo', 'comment', $storage_edit);
$field_storage = FieldStorageConfig::load('entity_test.field_barfoo');
$this
->assertInstanceOf(FieldStorageConfig::class, $field_storage);
$this
->assertEquals('foobar', $field_storage
->getSetting('comment_type'));
$this
->assertEquals(1, $field_storage
->getCardinality());
$random_label = $this
->randomMachineName();
$data = [
'bundle' => 'entity_test',
'name' => $random_label,
];
$new_entity = EntityTest::create($data);
$new_entity
->save();
$this
->drupalGet('entity_test/manage/' . $new_entity
->id() . '/edit');
$this
->assertSession()
->checkboxNotChecked('edit-field-foobar-0-status-1');
$this
->assertSession()
->checkboxChecked('edit-field-foobar-0-status-2');
$this
->assertSession()
->fieldNotExists('edit-field-foobar-0-status-0');
$this
->drupalGet('comment/reply/entity_test/comment/' . $new_entity
->id());
$this
->assertSession()
->fieldNotExists('subject[0][value]');
$this
->assertSession()
->fieldNotExists('comment_body[0][value]');
$limited_user = $this
->drupalCreateUser([
'administer entity_test fields',
'post comments',
'administer comment fields',
'administer comment types',
'view test entity',
]);
$this
->drupalLogin($limited_user);
$this
->drupalGet('comment/reply/entity_test/' . $this->entity
->id() . '/comment');
$this
->assertSession()
->fieldValueEquals('comment_body[0][value]', '');
$this
->fieldUIDeleteField('admin/structure/comment/manage/comment', 'comment.comment.comment_body', 'Comment', 'Comment settings');
$this
->drupalGet('comment/reply/entity_test/' . $this->entity
->id() . '/comment');
$this
->assertSession()
->fieldNotExists('comment_body[0][value]');
$edit = [
'subject[0][value]' => '',
];
$this
->submitForm($edit, 'Save');
}
public function testsNonIntegerIdEntities() {
entity_test_create_bundle('entity_test', 'Entity Test', 'entity_test_string_id');
$limited_user = $this
->drupalCreateUser([
'administer entity_test_string_id fields',
'administer comment types',
]);
$this
->drupalLogin($limited_user);
$this
->drupalGet('entity_test_string_id/structure/entity_test/fields/add-field');
$this
->assertSession()
->optionNotExists('edit-new-storage-type', 'comment');
$this
->assertSession()
->optionExists('edit-new-storage-type', 'boolean');
$this
->drupalGet('admin/structure/comment/types/add');
$this
->assertSession()
->optionNotExists('edit-target-entity-type-id', 'entity_test_string_id');
$this
->assertSession()
->responseNotContains('Test entity with string_id');
entity_test_create_bundle('entity_test', 'Entity Test', 'entity_test_no_id');
$this
->drupalLogin($this
->drupalCreateUser([
'administer entity_test_no_id fields',
]));
$this
->drupalGet('entity_test_no_id/structure/entity_test/fields/add-field');
$this
->assertSession()
->optionNotExists('edit-new-storage-type', 'comment');
$this
->assertSession()
->optionExists('edit-new-storage-type', 'boolean');
}
}