Security update for Core, with self-updated composer
[yaffs-website] / web / core / modules / comment / tests / src / Functional / CommentLinksTest.php
diff --git a/web/core/modules/comment/tests/src/Functional/CommentLinksTest.php b/web/core/modules/comment/tests/src/Functional/CommentLinksTest.php
new file mode 100644 (file)
index 0000000..3d79d96
--- /dev/null
@@ -0,0 +1,146 @@
+<?php
+
+namespace Drupal\Tests\comment\Functional;
+
+use Drupal\comment\Plugin\Field\FieldType\CommentItemInterface;
+use Drupal\Core\Language\LanguageInterface;
+use Drupal\comment\CommentInterface;
+use Drupal\user\RoleInterface;
+use Drupal\comment\Entity\Comment;
+
+/**
+ * Basic comment links tests to ensure markup present.
+ *
+ * @group comment
+ */
+class CommentLinksTest extends CommentTestBase {
+
+  /**
+   * Comment being tested.
+   *
+   * @var \Drupal\comment\CommentInterface
+   */
+  protected $comment;
+
+  /**
+   * Seen comments, array of comment IDs.
+   *
+   * @var array
+   */
+  protected $seen = [];
+
+  /**
+   * Use the main node listing to test rendering on teasers.
+   *
+   * @var array
+   *
+   * @todo Remove this dependency.
+   */
+  public static $modules = ['views'];
+
+  /**
+   * Tests that comment links are output and can be hidden.
+   */
+  public function testCommentLinks() {
+    // Bartik theme alters comment links, so use a different theme.
+    \Drupal::service('theme_handler')->install(['stark']);
+    $this->config('system.theme')
+      ->set('default', 'stark')
+      ->save();
+
+    // Remove additional user permissions from $this->webUser added by setUp(),
+    // since this test is limited to anonymous and authenticated roles only.
+    $roles = $this->webUser->getRoles();
+    entity_delete_multiple('user_role', [reset($roles)]);
+
+    // Create a comment via CRUD API functionality, since
+    // $this->postComment() relies on actual user permissions.
+    $comment = Comment::create([
+      'cid' => NULL,
+      'entity_id' => $this->node->id(),
+      'entity_type' => 'node',
+      'field_name' => 'comment',
+      'pid' => 0,
+      'uid' => 0,
+      'status' => CommentInterface::PUBLISHED,
+      'subject' => $this->randomMachineName(),
+      'hostname' => '127.0.0.1',
+      'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
+      'comment_body' => [['value' => $this->randomMachineName()]],
+    ]);
+    $comment->save();
+    $this->comment = $comment;
+
+    // Change comment settings.
+    $this->setCommentSettings('form_location', CommentItemInterface::FORM_BELOW, 'Set comment form location');
+    $this->setCommentAnonymous(TRUE);
+    $this->node->comment = CommentItemInterface::OPEN;
+    $this->node->save();
+
+    // Change user permissions.
+    $perms = [
+      'access comments' => 1,
+      'post comments' => 1,
+      'skip comment approval' => 1,
+      'edit own comments' => 1,
+    ];
+    user_role_change_permissions(RoleInterface::ANONYMOUS_ID, $perms);
+
+    $nid = $this->node->id();
+
+    // Assert basic link is output, actual functionality is unit-tested in
+    // \Drupal\comment\Tests\CommentLinkBuilderTest.
+    foreach (['node', "node/$nid"] as $path) {
+      $this->drupalGet($path);
+
+      // In teaser view, a link containing the comment count is always
+      // expected.
+      if ($path == 'node') {
+        $this->assertLink(t('1 comment'));
+      }
+      $this->assertLink('Add new comment');
+    }
+
+    // Change weight to make links go before comment body.
+    entity_get_display('comment', 'comment', 'default')
+      ->setComponent('links', ['weight' => -100])
+      ->save();
+    $this->drupalGet($this->node->urlInfo());
+    $element = $this->cssSelect('article.js-comment > div');
+    // Get last child element.
+    $element = end($element);
+    $this->assertIdentical($element->getTagName(), 'div', 'Last element is comment body.');
+
+    // Change weight to make links go after comment body.
+    entity_get_display('comment', 'comment', 'default')
+      ->setComponent('links', ['weight' => 100])
+      ->save();
+    $this->drupalGet($this->node->urlInfo());
+    $element = $this->cssSelect('article.js-comment > div');
+    // Get last child element.
+    $element = end($element);
+    $this->assertNotEmpty($element->find('css', 'ul.links'), 'Last element is comment links.');
+
+    // Make sure we can hide node links.
+    entity_get_display('node', $this->node->bundle(), 'default')
+      ->removeComponent('links')
+      ->save();
+    $this->drupalGet($this->node->urlInfo());
+    $this->assertNoLink('1 comment');
+    $this->assertNoLink('Add new comment');
+
+    // Visit the full node, make sure there are links for the comment.
+    $this->drupalGet('node/' . $this->node->id());
+    $this->assertText($comment->getSubject());
+    $this->assertLink('Reply');
+
+    // Make sure we can hide comment links.
+    entity_get_display('comment', 'comment', 'default')
+      ->removeComponent('links')
+      ->save();
+    $this->drupalGet('node/' . $this->node->id());
+    $this->assertText($comment->getSubject());
+    $this->assertNoLink('Reply');
+  }
+
+}