--- /dev/null
+<?php
+
+namespace Drupal\Tests\comment\Functional;
+
+use Drupal\comment\Plugin\Field\FieldType\CommentItemInterface;
+use Drupal\comment\Tests\CommentTestTrait;
+use Drupal\language\Entity\ConfigurableLanguage;
+use Drupal\Tests\content_translation\Functional\ContentTranslationUITestBase;
+
+/**
+ * Tests the Comment Translation UI.
+ *
+ * @group comment
+ */
+class CommentTranslationUITest extends ContentTranslationUITestBase {
+
+ use CommentTestTrait;
+
+ /**
+ * The subject of the test comment.
+ */
+ protected $subject;
+
+ /**
+ * An administrative user with permission to administer comments.
+ *
+ * @var \Drupal\user\UserInterface
+ */
+ protected $adminUser;
+
+ /**
+ * {inheritdoc}
+ */
+ protected $defaultCacheContexts = [
+ 'languages:language_interface',
+ 'session',
+ 'theme',
+ 'timezone',
+ 'url.query_args:_wrapper_format',
+ 'url.query_args.pagers:0',
+ 'user.permissions',
+ 'user.roles',
+ ];
+
+ /**
+ * Modules to install.
+ *
+ * @var array
+ */
+ public static $modules = ['language', 'content_translation', 'node', 'comment'];
+
+ protected function setUp() {
+ $this->entityTypeId = 'comment';
+ $this->nodeBundle = 'article';
+ $this->bundle = 'comment_article';
+ $this->testLanguageSelector = FALSE;
+ $this->subject = $this->randomMachineName();
+ parent::setUp();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setupBundle() {
+ parent::setupBundle();
+ $this->drupalCreateContentType(['type' => $this->nodeBundle, 'name' => $this->nodeBundle]);
+ // Add a comment field to the article content type.
+ $this->addDefaultCommentField('node', 'article', 'comment_article', CommentItemInterface::OPEN, 'comment_article');
+ // Create a page content type.
+ $this->drupalCreateContentType(['type' => 'page', 'name' => 'page']);
+ // Add a comment field to the page content type - this one won't be
+ // translatable.
+ $this->addDefaultCommentField('node', 'page', 'comment');
+ // Mark this bundle as translatable.
+ $this->container->get('content_translation.manager')->setEnabled('comment', 'comment_article', TRUE);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getTranslatorPermissions() {
+ return array_merge(parent::getTranslatorPermissions(), ['post comments', 'administer comments', 'access comments']);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function createEntity($values, $langcode, $comment_type = 'comment_article') {
+ if ($comment_type == 'comment_article') {
+ // This is the article node type, with the 'comment_article' field.
+ $node_type = 'article';
+ $field_name = 'comment_article';
+ }
+ else {
+ // This is the page node type with the non-translatable 'comment' field.
+ $node_type = 'page';
+ $field_name = 'comment';
+ }
+ $node = $this->drupalCreateNode([
+ 'type' => $node_type,
+ $field_name => [
+ ['status' => CommentItemInterface::OPEN]
+ ],
+ ]);
+ $values['entity_id'] = $node->id();
+ $values['entity_type'] = 'node';
+ $values['field_name'] = $field_name;
+ $values['uid'] = $node->getOwnerId();
+ return parent::createEntity($values, $langcode, $comment_type);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getNewEntityValues($langcode) {
+ // Comment subject is not translatable hence we use a fixed value.
+ return [
+ 'subject' => [['value' => $this->subject]],
+ 'comment_body' => [['value' => $this->randomMachineName(16)]],
+ ] + parent::getNewEntityValues($langcode);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doTestPublishedStatus() {
+ $entity_manager = \Drupal::entityManager();
+ $storage = $entity_manager->getStorage($this->entityTypeId);
+
+ $storage->resetCache();
+ $entity = $storage->load($this->entityId);
+
+ // Unpublish translations.
+ foreach ($this->langcodes as $index => $langcode) {
+ if ($index > 0) {
+ $edit = ['status' => 0];
+ $url = $entity->urlInfo('edit-form', ['language' => ConfigurableLanguage::load($langcode)]);
+ $this->drupalPostForm($url, $edit, $this->getFormSubmitAction($entity, $langcode));
+ $storage->resetCache();
+ $entity = $storage->load($this->entityId);
+ $this->assertFalse($this->manager->getTranslationMetadata($entity->getTranslation($langcode))->isPublished(), 'The translation has been correctly unpublished.');
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doTestAuthoringInfo() {
+ $storage = $this->container->get('entity_type.manager')
+ ->getStorage($this->entityTypeId);
+ $storage->resetCache([$this->entityId]);
+ $entity = $storage->load($this->entityId);
+ $languages = $this->container->get('language_manager')->getLanguages();
+ $values = [];
+
+ // Post different authoring information for each translation.
+ foreach ($this->langcodes as $langcode) {
+ $url = $entity->urlInfo('edit-form', ['language' => $languages[$langcode]]);
+ $user = $this->drupalCreateUser();
+ $values[$langcode] = [
+ 'uid' => $user->id(),
+ 'created' => REQUEST_TIME - mt_rand(0, 1000),
+ ];
+ $edit = [
+ 'uid' => $user->getUsername() . ' (' . $user->id() . ')',
+ 'date[date]' => format_date($values[$langcode]['created'], 'custom', 'Y-m-d'),
+ 'date[time]' => format_date($values[$langcode]['created'], 'custom', 'H:i:s'),
+ ];
+ $this->drupalPostForm($url, $edit, $this->getFormSubmitAction($entity, $langcode));
+ }
+
+ $storage->resetCache([$this->entityId]);
+ $entity = $storage->load($this->entityId);
+ foreach ($this->langcodes as $langcode) {
+ $metadata = $this->manager->getTranslationMetadata($entity->getTranslation($langcode));
+ $this->assertEqual($metadata->getAuthor()->id(), $values[$langcode]['uid'], 'Translation author correctly stored.');
+ $this->assertEqual($metadata->getCreatedTime(), $values[$langcode]['created'], 'Translation date correctly stored.');
+ }
+ }
+
+ /**
+ * Tests translate link on comment content admin page.
+ */
+ public function testTranslateLinkCommentAdminPage() {
+ $this->adminUser = $this->drupalCreateUser(array_merge(parent::getTranslatorPermissions(), ['access administration pages', 'administer comments', 'skip comment approval']));
+ $this->drupalLogin($this->adminUser);
+
+ $cid_translatable = $this->createEntity([], $this->langcodes[0]);
+ $cid_untranslatable = $this->createEntity([], $this->langcodes[0], 'comment');
+
+ // Verify translation links.
+ $this->drupalGet('admin/content/comment');
+ $this->assertResponse(200);
+ $this->assertLinkByHref('comment/' . $cid_translatable . '/translations');
+ $this->assertNoLinkByHref('comment/' . $cid_untranslatable . '/translations');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doTestTranslationEdit() {
+ $storage = $this->container->get('entity_type.manager')
+ ->getStorage($this->entityTypeId);
+ $storage->resetCache([$this->entityId]);
+ $entity = $storage->load($this->entityId);
+ $languages = $this->container->get('language_manager')->getLanguages();
+
+ foreach ($this->langcodes as $langcode) {
+ // We only want to test the title for non-english translations.
+ if ($langcode != 'en') {
+ $options = ['language' => $languages[$langcode]];
+ $url = $entity->urlInfo('edit-form', $options);
+ $this->drupalGet($url);
+
+ $title = t('Edit @type @title [%language translation]', [
+ '@type' => $this->entityTypeId,
+ '@title' => $entity->getTranslation($langcode)->label(),
+ '%language' => $languages[$langcode]->getName(),
+ ]);
+ $this->assertRaw($title);
+ }
+ }
+ }
+
+}