$value) { // Encode according to application/x-www-form-urlencoded // Both names and values needs to be urlencoded, according to // http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1 $post[$key] = urlencode($key) . '=' . urlencode($value); } $post = implode('&', $post); // Perform HTTP request. return $this->curlExec([ CURLOPT_URL => \Drupal::url('comment.new_comments_node_links', [], ['absolute' => TRUE]), CURLOPT_POST => TRUE, CURLOPT_POSTFIELDS => $post, CURLOPT_HTTPHEADER => [ 'Accept: application/json', 'Content-Type: application/x-www-form-urlencoded', ], ]); } /** * Tests new comment marker. */ public function testCommentNewCommentsIndicator() { // Test if the right links are displayed when no comment is present for the // node. $this->drupalLogin($this->adminUser); $this->drupalGet('node'); $this->assertNoLink(t('@count comments', ['@count' => 0])); $this->assertLink(t('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->assertIdentical(0, count($this->xpath('//*[@data-history-node-last-comment-timestamp]')), 'data-history-node-last-comment-timestamp attribute is not set.'); // 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->assertIdentical(1, count($this->xpath('//*[@data-history-node-last-comment-timestamp="' . $comment->getChangedTime() . '"]')), 'data-history-node-last-comment-timestamp attribute is set to the correct value.'); $this->assertIdentical(1, count($this->xpath('//*[@data-history-node-field-name="comment"]')), 'data-history-node-field-name attribute is set to the correct value.'); // 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->assertEqual($settings['history'], ['lastReadTimestamps' => [1 => 0]]); $this->assertEqual($settings['comment'], [ 'newCommentsLinks' => [ 'node' => [ 'comment' => [ 1 => [ 'new_comment_count' => 1, 'first_new_comment_link' => Url::fromRoute('entity.node.canonical', ['node' => 1])->setOptions([ 'fragment' => 'new', ])->toString(), ], ], ], ], ]); // Pretend the data was not present in drupalSettings, i.e. test the // separate request to the server. $response = $this->renderNewCommentsNodeLinks([$this->node->id()]); $this->assertResponse(200); $json = Json::decode($response); $expected = [ $this->node->id() => [ 'new_comment_count' => 1, 'first_new_comment_link' => $this->node->url('canonical', ['fragment' => 'new']), ], ]; $this->assertIdentical($expected, $json); // Failing to specify node IDs for the endpoint should return a 404. $this->renderNewCommentsNodeLinks([]); $this->assertResponse(404); // Accessing the endpoint as the anonymous user should return a 403. $this->drupalLogout(); $this->renderNewCommentsNodeLinks([$this->node->id()]); $this->assertResponse(403); $this->renderNewCommentsNodeLinks([]); $this->assertResponse(403); } }