diff --git a/core/modules/comment/src/Tests/Views/CommentKernelTestBase.php b/core/modules/comment/src/Tests/Views/CommentKernelTestBase.php
new file mode 100644
index 0000000..56fd2cd
--- /dev/null
+++ b/core/modules/comment/src/Tests/Views/CommentKernelTestBase.php
@@ -0,0 +1,83 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\comment\Tests\Views\CommentKernelTestBase.
+ */
+
+namespace Drupal\comment\Tests\Views;
+
+use Drupal\user\Entity\Role;
+use Drupal\views\Tests\ViewKernelTestBase;
+use Drupal\views\Tests\ViewTestData;
+
+/**
+ * Provides a common test base for comment views tests.
+ */
+abstract class CommentKernelTestBase extends ViewKernelTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['comment_test_views', 'user', 'comment'];
+
+  /**
+   * Admin user.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  protected $adminUser;
+
+  /**
+   * The entity storage for comments.
+   *
+   * @var \Drupal\comment\CommentStorage
+   */
+  protected $commentStorage;
+
+  /**
+   * The entity storage for users.
+   *
+   * @var \Drupal\user\UserStorage
+   */
+  protected $userStorage;
+
+  protected function setUp($import_test_views = TRUE) {
+    parent::setUp($import_test_views);
+
+    ViewTestData::createTestViews(get_class($this), ['comment_test_views']);
+
+    $this->installEntitySchema('user');
+    $this->installEntitySchema('comment');
+    $this->installConfig(['user']);
+
+    $entity_manager = $this->container->get('entity.manager');
+    $this->commentStorage = $entity_manager->getStorage('comment');
+    $this->userStorage = $entity_manager->getStorage('user');
+
+    // Insert a row for the anonymous user.
+    $this->userStorage
+      ->create([
+        'uid' => 0,
+        'name' => '',
+        'status' => 0,
+      ])
+      ->save();
+
+    $admin_role = Role::create(['id' => 'admin']);
+    $admin_role->grantPermission('administer comments');
+    $admin_role->save();
+
+    /* @var \Drupal\user\RoleInterface $anonymous_role */
+    $anonymous_role = Role::load(Role::ANONYMOUS_ID);
+    $anonymous_role->grantPermission('access comments');
+    $anonymous_role->save();
+
+    $this->adminUser = $this->userStorage->create(['name' => $this->randomMachineName()]);
+    $this->adminUser->addRole('admin');
+    $this->adminUser->save();
+  }
+
+}
diff --git a/core/modules/comment/src/Tests/Views/CommentLinksTest.php b/core/modules/comment/src/Tests/Views/CommentLinksTest.php
new file mode 100644
index 0000000..136dfb8
--- /dev/null
+++ b/core/modules/comment/src/Tests/Views/CommentLinksTest.php
@@ -0,0 +1,180 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\comment\Tests\Views\CommentLinksTest.
+ */
+
+namespace Drupal\comment\Tests\Views;
+
+use Drupal\comment\CommentInterface;
+use Drupal\comment\CommentManagerInterface;
+use Drupal\Core\Session\AnonymousUserSession;
+use Drupal\Core\Url;
+use Drupal\entity_test\Entity\EntityTest;
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\views\Views;
+
+/**
+ * Tests the comment link field handlers.
+ *
+ * @group comment
+ */
+class CommentLinksTest extends CommentKernelTestBase {
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = ['test_comment'];
+
+  /**
+   * Test the comment approve link.
+   */
+  public function testLinkApprove() {
+
+    // Create an unapproved comment.
+    $comment = $this->commentStorage->create([
+      'uid' => $this->adminUser->id(),
+      'entity_type' => 'entity_test',
+      'comment_type' => 'entity_test',
+      'status' => 0,
+    ]);
+    $comment->save();
+
+    $view = Views::getView('test_comment');
+    $view->setDisplay();
+
+    $view->displayHandlers->get('default')->overrideOption('fields',  [
+      'approve_comment' => [
+        'table' => 'comment',
+        'field' => 'approve_comment',
+        'id' => 'approve_comment',
+        'plugin_id' => 'comment_link_approve',
+      ],
+    ]);
+    $view->save();
+
+    /* @var \Drupal\Core\Session\AccountSwitcherInterface $account_switcher */
+    $account_switcher = \Drupal::service('account_switcher');
+    $account_switcher->switchTo($this->adminUser);
+
+    $view->preview();
+
+    // Check if I can see the comment approve link on an unapproved comment.
+    $approve_comment = $view->style_plugin->getField(0, 'approve_comment');
+    $options = ['query' => ['destination' => '/']];
+    $url = Url::fromRoute('comment.approve', ['comment' => $comment->id()], $options);
+    $this->assertEqual(\Drupal::l('Approve', $url), (string) $approve_comment, 'Found a comment approve link for an unapproved comment.');
+
+    // Approve the comment.
+    $comment->setPublished(CommentInterface::PUBLISHED);
+    $comment->save();
+    $view = Views::getView('test_comment');
+    $view->preview();
+
+    // Check if I can see the comment approve link on an approved comment.
+    $approve_comment = $view->style_plugin->getField(1, 'approve_comment');
+    $this->assertFalse((string) $approve_comment, "Didn't find a comment approve link for an already approved comment.");
+
+    // Check if I can see the comment approve link on an approved comment as an
+    // anonymous user.
+    $account_switcher->switchTo(new AnonymousUserSession());
+    // Set the comment as unpublished again.
+    $comment->setPublished(CommentInterface::NOT_PUBLISHED);
+    $comment->save();
+
+    $view = Views::getView('test_comment');
+    $view->preview();
+    $replyto_comment = $view->style_plugin->getField(0, 'approve_comment');
+    $this->assertFalse((string) $replyto_comment, "I can't approve the comment as an anonymous user.");
+  }
+
+  /**
+   * Test the comment reply link.
+   */
+  public function testLinkReply() {
+    $this->enableModules(['field', 'entity_test']);
+    $this->installEntitySchema('entity_test');
+    $this->installSchema('comment', ['comment_entity_statistics']);
+    $this->installConfig(['field']);
+
+    $field_storage_comment = FieldStorageConfig::create([
+      'field_name' => 'comment',
+      'type' => 'comment',
+      'entity_type' => 'entity_test',
+    ]);
+    $field_storage_comment->save();
+    // Create a comment field which allows threading.
+    $field_comment = FieldConfig::create([
+      'field_name' => 'comment',
+      'entity_type' => 'entity_test',
+      'bundle' => 'entity_test',
+      'settings' => [
+        'default_mode' => CommentManagerInterface::COMMENT_MODE_THREADED,
+      ],
+    ]);
+    $field_comment->save();
+
+    $host = EntityTest::create(['name' => $this->randomString()]);
+    $host->save();
+    // Attach an unapproved comment to the test entity.
+    $comment = $this->commentStorage->create([
+      'uid' => $this->adminUser->id(),
+      'entity_type' => 'entity_test',
+      'entity_id' => $host->id(),
+      'comment_type' => 'entity_test',
+      'field_name' => $field_storage_comment->getName(),
+      'status' => 0,
+    ]);
+    $comment->save();
+
+    $view = Views::getView('test_comment');
+    $view->setDisplay();
+
+    $view->displayHandlers->get('default')->overrideOption('fields',  [
+      'replyto_comment' => [
+        'table' => 'comment',
+        'field' => 'replyto_comment',
+        'id' => 'replyto_comment',
+        'plugin_id' => 'comment_link_reply',
+        'entity_type' => 'comment',
+      ],
+    ]);
+    $view->save();
+
+    /* @var \Drupal\Core\Session\AccountSwitcherInterface $account_switcher */
+    $account_switcher = \Drupal::service('account_switcher');
+    $account_switcher->switchTo($this->adminUser);
+    $view->preview();
+
+    // Check if I can see the reply link on an unapproved comment.
+    $replyto_comment = $view->style_plugin->getField(0, 'replyto_comment');
+    $this->assertFalse((string) $replyto_comment, "I can't reply to an unapproved comment.");
+
+    // Approve the comment.
+    $comment->setPublished(CommentInterface::PUBLISHED);
+    $comment->save();
+    $view = Views::getView('test_comment');
+    $view->preview();
+
+    // Check if I can see the reply link on an approved comment.
+    $replyto_comment = $view->style_plugin->getField(0, 'replyto_comment');
+    $url = Url::fromRoute('comment.reply', [
+      'entity_type' => 'entity_test',
+      'entity' => $host->id(),
+      'field_name' => 'comment',
+      'pid' => $comment->id(),
+    ]);
+    $this->assertEqual(\Drupal::l('Reply', $url), (string) $replyto_comment, 'Found the comment reply link as an admin user.');
+
+    // Check if I can see the reply link as an anonymous user.
+    $account_switcher->switchTo(new AnonymousUserSession());
+    $view = Views::getView('test_comment');
+    $view->preview();
+    $replyto_comment = $view->style_plugin->getField(0, 'replyto_comment');
+    $this->assertFalse((string) $replyto_comment, "Didn't find the comment reply link as an anonymous user.");
+  }
+}
diff --git a/core/modules/comment/tests/modules/comment_test_views/test_views/views.view.test_comment.yml b/core/modules/comment/tests/modules/comment_test_views/test_views/views.view.test_comment.yml
new file mode 100644
index 0000000..4b3b1b4
--- /dev/null
+++ b/core/modules/comment/tests/modules/comment_test_views/test_views/views.view.test_comment.yml
@@ -0,0 +1,43 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - comment
+    - entity_test
+    - user
+id: test_comment
+label: test_comment
+module: views
+description: ''
+tag: ''
+base_table: comment_field_data
+base_field: cid
+core: 8.x
+display:
+  default:
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: 0
+    display_options:
+      defaults:
+        fields: false
+        pager: false
+        sorts: false
+      row:
+        type: fields
+      fields:
+        subject:
+          id: subject
+          table: comment_field_data
+          field: subject
+          label: ''
+          type: string
+          plugin_id: field
+          entity_type: comment
+          entity_field: subject
+      pager:
+        options:
+          offset: 0
+        type: none
+      sorts: {  }
