function CommentNewIndicatorTest::testCommentNewCommentsIndicator

Same name and namespace in other branches
  1. 9 core/modules/comment/tests/src/Functional/CommentNewIndicatorTest.php \Drupal\Tests\comment\Functional\CommentNewIndicatorTest::testCommentNewCommentsIndicator()
  2. 8.9.x core/modules/comment/tests/src/Functional/CommentNewIndicatorTest.php \Drupal\Tests\comment\Functional\CommentNewIndicatorTest::testCommentNewCommentsIndicator()
  3. 11.x core/modules/comment/tests/src/Functional/CommentNewIndicatorTest.php \Drupal\Tests\comment\Functional\CommentNewIndicatorTest::testCommentNewCommentsIndicator()

Tests new comment marker.

File

core/modules/comment/tests/src/Functional/CommentNewIndicatorTest.php, line 60

Class

CommentNewIndicatorTest
Tests the 'new' indicator posted on comments.

Namespace

Drupal\Tests\comment\Functional

Code

public function testCommentNewCommentsIndicator() : void {
  // Test if the right links are displayed when no comment is present for the
  // node.
  $this->drupalLogin($this->adminUser);
  $this->drupalGet('node');
  $this->assertSession()
    ->linkNotExists('0 comments');
  $this->assertSession()
    ->linkExists('Read more');
  // Verify the data-history-node-last-comment-timestamp attribute, which is
  // used by the drupal.node-new-comments-link library to determine whether
  // a "x new comments" link might be necessary or not. We do this in
  // JavaScript to prevent breaking the render cache.
  $this->assertSession()
    ->elementNotExists('xpath', '//*[@data-history-node-last-comment-timestamp]');
  // Create a new comment. This helper function may be run with different
  // comment settings so use $comment->save() to avoid complex setup.
  /** @var \Drupal\comment\CommentInterface $comment */
  $comment = Comment::create([
    'cid' => NULL,
    'entity_id' => $this->node
      ->id(),
    'entity_type' => 'node',
    'field_name' => 'comment',
    'pid' => 0,
    'uid' => $this->loggedInUser
      ->id(),
    'status' => CommentInterface::PUBLISHED,
    'subject' => $this->randomMachineName(),
    'hostname' => '127.0.0.1',
    'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED,
    'comment_body' => [
      LanguageInterface::LANGCODE_NOT_SPECIFIED => [
        $this->randomMachineName(),
      ],
    ],
  ]);
  $comment->save();
  $this->drupalLogout();
  // Log in with 'web user' and check comment links.
  $this->drupalLogin($this->webUser);
  $this->drupalGet('node');
  // Verify the data-history-node-last-comment-timestamp attribute. Given its
  // value, the drupal.node-new-comments-link library would determine that the
  // node received a comment after the user last viewed it, and hence it would
  // perform an HTTP request to render the "new comments" node link.
  $this->assertSession()
    ->elementsCount('xpath', '//*[@data-history-node-last-comment-timestamp="' . $comment->getChangedTime() . '"]', 1);
  $this->assertSession()
    ->elementsCount('xpath', '//*[@data-history-node-field-name="comment"]', 1);
  // The data will be pre-seeded on this particular page in drupalSettings, to
  // avoid the need for the client to make a separate request to the server.
  $settings = $this->getDrupalSettings();
  $this->assertEquals([
    'lastReadTimestamps' => [
      1 => 0,
    ],
  ], $settings['history']);
  $this->assertEquals([
    'newCommentsLinks' => [
      'node' => [
        'comment' => [
          1 => [
            'new_comment_count' => 1,
            'first_new_comment_link' => Url::fromRoute('entity.node.canonical', [
              'node' => 1,
            ])->setOptions([
              'fragment' => 'new',
            ])
              ->toString(),
          ],
        ],
      ],
    ],
  ], $settings['comment']);
  // Pretend the data was not present in drupalSettings, i.e. test the
  // separate request to the server.
  $response = $this->renderNewCommentsNodeLinks([
    $this->node
      ->id(),
  ]);
  $this->assertSame(200, $response->getStatusCode());
  $json = Json::decode($response->getBody());
  $expected = [
    $this->node
      ->id() => [
      'new_comment_count' => 1,
      'first_new_comment_link' => $this->node
        ->toUrl('canonical', [
        'fragment' => 'new',
      ])
        ->toString(),
    ],
  ];
  $this->assertSame($expected, $json);
  // Failing to specify node IDs for the endpoint should return a 404.
  $response = $this->renderNewCommentsNodeLinks([]);
  $this->assertSame(404, $response->getStatusCode());
  // Accessing the endpoint as the anonymous user should return a 403.
  $this->drupalLogout();
  $response = $this->renderNewCommentsNodeLinks([
    $this->node
      ->id(),
  ]);
  $this->assertSame(403, $response->getStatusCode());
  $response = $this->renderNewCommentsNodeLinks([]);
  $this->assertSame(403, $response->getStatusCode());
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.