Version 1
[yaffs-website] / web / core / modules / forum / tests / src / Functional / ForumBlockTest.php
diff --git a/web/core/modules/forum/tests/src/Functional/ForumBlockTest.php b/web/core/modules/forum/tests/src/Functional/ForumBlockTest.php
new file mode 100644 (file)
index 0000000..6c412b7
--- /dev/null
@@ -0,0 +1,180 @@
+<?php
+
+namespace Drupal\Tests\forum\Functional;
+
+use Drupal\Core\Datetime\DrupalDateTime;
+use Drupal\comment\Entity\Comment;
+use Drupal\Tests\BrowserTestBase;
+
+/**
+ * Tests the forum blocks.
+ *
+ * @group forum
+ */
+class ForumBlockTest extends BrowserTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = ['forum', 'block'];
+
+  /**
+   * A user with various administrative privileges.
+   */
+  protected $adminUser;
+
+  protected function setUp() {
+    parent::setUp();
+
+    // Create users.
+    $this->adminUser = $this->drupalCreateUser([
+      'access administration pages',
+      'administer blocks',
+      'administer nodes',
+      'create forum content',
+      'post comments',
+      'skip comment approval',
+    ]);
+  }
+
+  /**
+   * Tests the "New forum topics" block.
+   */
+  public function testNewForumTopicsBlock() {
+    $this->drupalLogin($this->adminUser);
+
+    // Enable the new forum topics block.
+    $block = $this->drupalPlaceBlock('forum_new_block');
+    $this->drupalGet('');
+
+    // Create 5 forum topics.
+    $topics = $this->createForumTopics();
+
+
+    $this->assertLink(t('More'), 0, 'New forum topics block has a "more"-link.');
+    $this->assertLinkByHref('forum', 0, 'New forum topics block has a "more"-link.');
+
+    // We expect all 5 forum topics to appear in the "New forum topics" block.
+    foreach ($topics as $topic) {
+      $this->assertLink($topic, 0, format_string('Forum topic @topic found in the "New forum topics" block.', ['@topic' => $topic]));
+    }
+
+    // Configure the new forum topics block to only show 2 topics.
+    $block->getPlugin()->setConfigurationValue('block_count', 2);
+    $block->save();
+
+    $this->drupalGet('');
+    // We expect only the 2 most recent forum topics to appear in the "New forum
+    // topics" block.
+    for ($index = 0; $index < 5; $index++) {
+      if (in_array($index, [3, 4])) {
+        $this->assertLink($topics[$index], 0, format_string('Forum topic @topic found in the "New forum topics" block.', ['@topic' => $topics[$index]]));
+      }
+      else {
+        $this->assertNoText($topics[$index], format_string('Forum topic @topic not found in the "New forum topics" block.', ['@topic' => $topics[$index]]));
+      }
+    }
+  }
+
+  /**
+   * Tests the "Active forum topics" block.
+   */
+  public function testActiveForumTopicsBlock() {
+    $this->drupalLogin($this->adminUser);
+
+    // Create 10 forum topics.
+    $topics = $this->createForumTopics(10);
+
+    // Comment on the first 5 topics.
+    $date = new DrupalDateTime();
+    for ($index = 0; $index < 5; $index++) {
+      // Get the node from the topic title.
+      $node = $this->drupalGetNodeByTitle($topics[$index]);
+      $date->modify('+1 minute');
+      $comment = Comment::create([
+        'entity_id' => $node->id(),
+        'field_name' => 'comment_forum',
+        'entity_type' => 'node',
+        'node_type' => 'node_type_' . $node->bundle(),
+        'subject' => $this->randomString(20),
+        'comment_body' => $this->randomString(256),
+        'created' => $date->getTimestamp(),
+      ]);
+      $comment->save();
+    }
+
+    // Enable the block.
+    $block = $this->drupalPlaceBlock('forum_active_block');
+    $this->drupalGet('');
+    $this->assertLink(t('More'), 0, 'Active forum topics block has a "more"-link.');
+    $this->assertLinkByHref('forum', 0, 'Active forum topics block has a "more"-link.');
+
+    // We expect the first 5 forum topics to appear in the "Active forum topics"
+    // block.
+    $this->drupalGet('<front>');
+    for ($index = 0; $index < 10; $index++) {
+      if ($index < 5) {
+        $this->assertLink($topics[$index], 0, format_string('Forum topic @topic found in the "Active forum topics" block.', ['@topic' => $topics[$index]]));
+      }
+      else {
+        $this->assertNoText($topics[$index], format_string('Forum topic @topic not found in the "Active forum topics" block.', ['@topic' => $topics[$index]]));
+      }
+    }
+
+    // Configure the active forum block to only show 2 topics.
+    $block->getPlugin()->setConfigurationValue('block_count', 2);
+    $block->save();
+
+    $this->drupalGet('');
+
+    // We expect only the 2 forum topics with most recent comments to appear in
+    // the "Active forum topics" block.
+    for ($index = 0; $index < 10; $index++) {
+      if (in_array($index, [3, 4])) {
+        $this->assertLink($topics[$index], 0, 'Forum topic found in the "Active forum topics" block.');
+      }
+      else {
+        $this->assertNoText($topics[$index], 'Forum topic not found in the "Active forum topics" block.');
+      }
+    }
+  }
+
+  /**
+   * Creates a forum topic.
+   *
+   * @return string
+   *   The title of the newly generated topic.
+   */
+  protected function createForumTopics($count = 5) {
+    $topics = [];
+    $date = new DrupalDateTime();
+    $date->modify('-24 hours');
+
+    for ($index = 0; $index < $count; $index++) {
+      // Generate a random subject/body.
+      $title = $this->randomMachineName(20);
+      $body = $this->randomMachineName(200);
+      // Forum posts are ordered by timestamp, so force a unique timestamp by
+      // changing the date.
+      $date->modify('+1 minute');
+
+      $edit = [
+        'title[0][value]' => $title,
+        'body[0][value]' => $body,
+        // Forum posts are ordered by timestamp, so force a unique timestamp by
+        // adding the index.
+        'created[0][value][date]' => $date->format('Y-m-d'),
+        'created[0][value][time]' => $date->format('H:i:s'),
+      ];
+
+      // Create the forum topic, preselecting the forum ID via a URL parameter.
+      $this->drupalPostForm('node/add/forum', $edit, t('Save and publish'), ['query' => ['forum_id' => 1]]);
+      $topics[] = $title;
+    }
+
+    return $topics;
+  }
+
+}