Security update for Core, with self-updated composer
[yaffs-website] / web / core / modules / comment / tests / src / Functional / Views / CommentFieldFilterTest.php
diff --git a/web/core/modules/comment/tests/src/Functional/Views/CommentFieldFilterTest.php b/web/core/modules/comment/tests/src/Functional/Views/CommentFieldFilterTest.php
new file mode 100644 (file)
index 0000000..dabacc3
--- /dev/null
@@ -0,0 +1,120 @@
+<?php
+
+namespace Drupal\Tests\comment\Functional\Views;
+
+use Drupal\language\Entity\ConfigurableLanguage;
+use Drupal\comment\Entity\Comment;
+
+/**
+ * Tests comment field filters with translations.
+ *
+ * @group comment
+ */
+class CommentFieldFilterTest extends CommentTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['language'];
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = ['test_field_filters'];
+
+  /**
+   * List of comment titles by language.
+   *
+   * @var array
+   */
+  public $commentTitles = [];
+
+  protected function setUp($import_test_views = TRUE) {
+    parent::setUp($import_test_views);
+    $this->drupalLogin($this->drupalCreateUser(['access comments']));
+
+    // Add two new languages.
+    ConfigurableLanguage::createFromLangcode('fr')->save();
+    ConfigurableLanguage::createFromLangcode('es')->save();
+
+    // Set up comment titles.
+    $this->commentTitles = [
+      'en' => 'Food in Paris',
+      'es' => 'Comida en Paris',
+      'fr' => 'Nouriture en Paris',
+    ];
+
+    // Create a new comment. Using the one created earlier will not work,
+    // as it predates the language set-up.
+    $comment = [
+      'uid' => $this->loggedInUser->id(),
+      'entity_id' => $this->nodeUserCommented->id(),
+      'entity_type' => 'node',
+      'field_name' => 'comment',
+      'cid' => '',
+      'pid' => '',
+      'node_type' => '',
+    ];
+    $this->comment = Comment::create($comment);
+
+    // Add field values and translate the comment.
+    $this->comment->subject->value = $this->commentTitles['en'];
+    $this->comment->comment_body->value = $this->commentTitles['en'];
+    $this->comment->langcode = 'en';
+    $this->comment->save();
+    foreach (['es', 'fr'] as $langcode) {
+      $translation = $this->comment->addTranslation($langcode, []);
+      $translation->comment_body->value = $this->commentTitles[$langcode];
+      $translation->subject->value = $this->commentTitles[$langcode];
+    }
+    $this->comment->save();
+  }
+
+  /**
+   * Tests body and title filters.
+   */
+  public function testFilters() {
+    // Test the title filter page, which filters for title contains 'Comida'.
+    // Should show just the Spanish translation, once.
+    $this->assertPageCounts('test-title-filter', ['es' => 1, 'fr' => 0, 'en' => 0], 'Comida title filter');
+
+    // Test the body filter page, which filters for body contains 'Comida'.
+    // Should show just the Spanish translation, once.
+    $this->assertPageCounts('test-body-filter', ['es' => 1, 'fr' => 0, 'en' => 0], 'Comida body filter');
+
+    // Test the title Paris filter page, which filters for title contains
+    // 'Paris'. Should show each translation once.
+    $this->assertPageCounts('test-title-paris', ['es' => 1, 'fr' => 1, 'en' => 1], 'Paris title filter');
+
+    // Test the body Paris filter page, which filters for body contains
+    // 'Paris'. Should show each translation once.
+    $this->assertPageCounts('test-body-paris', ['es' => 1, 'fr' => 1, 'en' => 1], 'Paris body filter');
+  }
+
+  /**
+   * Asserts that the given comment translation counts are correct.
+   *
+   * @param string $path
+   *   Path of the page to test.
+   * @param array $counts
+   *   Array whose keys are languages, and values are the number of times
+   *   that translation should be shown on the given page.
+   * @param string $message
+   *   Message suffix to display.
+   */
+  protected function assertPageCounts($path, $counts, $message) {
+    // Get the text of the page.
+    $this->drupalGet($path);
+    $text = $this->getTextContent();
+
+    // Check the counts. Note that the title and body are both shown on the
+    // page, and they are the same. So the title/body string should appear on
+    // the page twice as many times as the input count.
+    foreach ($counts as $langcode => $count) {
+      $this->assertEqual(substr_count($text, $this->commentTitles[$langcode]), 2 * $count, 'Translation ' . $langcode . ' has count ' . $count . ' with ' . $message);
+    }
+  }
+
+}