Update core 8.3.0
This commit is contained in:
parent
da7a7918f8
commit
cd7a898e66
6144 changed files with 132297 additions and 87747 deletions
180
web/core/modules/forum/tests/src/Functional/ForumBlockTest.php
Normal file
180
web/core/modules/forum/tests/src/Functional/ForumBlockTest.php
Normal file
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\forum\Functional;
|
||||
|
||||
use Drupal\Tests\BrowserTestBase;
|
||||
|
||||
/**
|
||||
* Tests the forum index listing.
|
||||
*
|
||||
* @group forum
|
||||
*/
|
||||
class ForumIndexTest extends BrowserTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['taxonomy', 'comment', 'forum'];
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
// Create a test user.
|
||||
$web_user = $this->drupalCreateUser(['create forum content', 'edit own forum content', 'edit any forum content', 'administer nodes', 'administer forums']);
|
||||
$this->drupalLogin($web_user);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests the forum index for published and unpublished nodes.
|
||||
*/
|
||||
public function testForumIndexStatus() {
|
||||
// The forum ID to use.
|
||||
$tid = 1;
|
||||
|
||||
// Create a test node.
|
||||
$title = $this->randomMachineName(20);
|
||||
$edit = [
|
||||
'title[0][value]' => $title,
|
||||
'body[0][value]' => $this->randomMachineName(200),
|
||||
];
|
||||
|
||||
// Create the forum topic, preselecting the forum ID via a URL parameter.
|
||||
$this->drupalGet("forum/$tid");
|
||||
$this->clickLink(t('Add new @node_type', ['@node_type' => 'Forum topic']));
|
||||
$this->assertUrl('node/add/forum', ['query' => ['forum_id' => $tid]]);
|
||||
$this->drupalPostForm(NULL, $edit, t('Save and publish'));
|
||||
|
||||
// Check that the node exists in the database.
|
||||
$node = $this->drupalGetNodeByTitle($title);
|
||||
$this->assertTrue(!empty($node), 'New forum node found in database.');
|
||||
|
||||
// Create a child forum.
|
||||
$edit = [
|
||||
'name[0][value]' => $this->randomMachineName(20),
|
||||
'description[0][value]' => $this->randomMachineName(200),
|
||||
'parent[0]' => $tid,
|
||||
];
|
||||
$this->drupalPostForm('admin/structure/forum/add/forum', $edit, t('Save'));
|
||||
$tid_child = $tid + 1;
|
||||
|
||||
// Verify that the node appears on the index.
|
||||
$this->drupalGet('forum/' . $tid);
|
||||
$this->assertText($title, 'Published forum topic appears on index.');
|
||||
$this->assertCacheTag('node_list');
|
||||
$this->assertCacheTag('config:node.type.forum');
|
||||
$this->assertCacheTag('comment_list');
|
||||
$this->assertCacheTag('node:' . $node->id());
|
||||
$this->assertCacheTag('taxonomy_term:' . $tid);
|
||||
$this->assertCacheTag('taxonomy_term:' . $tid_child);
|
||||
|
||||
|
||||
// Unpublish the node.
|
||||
$this->drupalPostForm('node/' . $node->id() . '/edit', [], t('Save and unpublish'));
|
||||
$this->drupalGet('node/' . $node->id());
|
||||
$this->assertText(t('Access denied'), 'Unpublished node is no longer accessible.');
|
||||
|
||||
// Verify that the node no longer appears on the index.
|
||||
$this->drupalGet('forum/' . $tid);
|
||||
$this->assertNoText($title, 'Unpublished forum topic no longer appears on index.');
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,86 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\forum\Functional;
|
||||
|
||||
use Drupal\Tests\BrowserTestBase;
|
||||
use Drupal\node\Entity\NodeType;
|
||||
|
||||
/**
|
||||
* Tests forum block view for private node access.
|
||||
*
|
||||
* @group forum
|
||||
*/
|
||||
class ForumNodeAccessTest extends BrowserTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['node', 'comment', 'forum', 'taxonomy', 'tracker', 'node_access_test', 'block'];
|
||||
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
node_access_rebuild();
|
||||
node_access_test_add_field(NodeType::load('forum'));
|
||||
\Drupal::state()->set('node_access_test.private', TRUE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates some users and creates a public node and a private node.
|
||||
*
|
||||
* Adds both active forum topics and new forum topics blocks to the sidebar.
|
||||
* Tests to ensure private node/public node access is respected on blocks.
|
||||
*/
|
||||
public function testForumNodeAccess() {
|
||||
// Create some users.
|
||||
$access_user = $this->drupalCreateUser(['node test view']);
|
||||
$no_access_user = $this->drupalCreateUser();
|
||||
$admin_user = $this->drupalCreateUser(['access administration pages', 'administer modules', 'administer blocks', 'create forum content']);
|
||||
|
||||
$this->drupalLogin($admin_user);
|
||||
|
||||
// Create a private node.
|
||||
$private_node_title = $this->randomMachineName(20);
|
||||
$edit = [
|
||||
'title[0][value]' => $private_node_title,
|
||||
'body[0][value]' => $this->randomMachineName(200),
|
||||
'private[0][value]' => TRUE,
|
||||
];
|
||||
$this->drupalPostForm('node/add/forum', $edit, t('Save'), ['query' => ['forum_id' => 1]]);
|
||||
$private_node = $this->drupalGetNodeByTitle($private_node_title);
|
||||
$this->assertTrue(!empty($private_node), 'New private forum node found in database.');
|
||||
|
||||
// Create a public node.
|
||||
$public_node_title = $this->randomMachineName(20);
|
||||
$edit = [
|
||||
'title[0][value]' => $public_node_title,
|
||||
'body[0][value]' => $this->randomMachineName(200),
|
||||
];
|
||||
$this->drupalPostForm('node/add/forum', $edit, t('Save'), ['query' => ['forum_id' => 1]]);
|
||||
$public_node = $this->drupalGetNodeByTitle($public_node_title);
|
||||
$this->assertTrue(!empty($public_node), 'New public forum node found in database.');
|
||||
|
||||
|
||||
// Enable the new and active forum blocks.
|
||||
$this->drupalPlaceBlock('forum_active_block');
|
||||
$this->drupalPlaceBlock('forum_new_block');
|
||||
|
||||
// Test for $access_user.
|
||||
$this->drupalLogin($access_user);
|
||||
$this->drupalGet('');
|
||||
|
||||
// Ensure private node and public node are found.
|
||||
$this->assertText($private_node->getTitle(), 'Private node found in block by $access_user');
|
||||
$this->assertText($public_node->getTitle(), 'Public node found in block by $access_user');
|
||||
|
||||
// Test for $no_access_user.
|
||||
$this->drupalLogin($no_access_user);
|
||||
$this->drupalGet('');
|
||||
|
||||
// Ensure private node is not found but public is found.
|
||||
$this->assertNoText($private_node->getTitle(), 'Private node not found in block by $no_access_user');
|
||||
$this->assertText($public_node->getTitle(), 'Public node found in block by $no_access_user');
|
||||
}
|
||||
|
||||
}
|
689
web/core/modules/forum/tests/src/Functional/ForumTest.php
Normal file
689
web/core/modules/forum/tests/src/Functional/ForumTest.php
Normal file
|
@ -0,0 +1,689 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\forum\Functional;
|
||||
|
||||
use Drupal\Core\Entity\Entity\EntityFormDisplay;
|
||||
use Drupal\Core\Entity\Entity\EntityViewDisplay;
|
||||
use Drupal\Core\Entity\EntityInterface;
|
||||
use Drupal\Core\Link;
|
||||
use Drupal\Core\Url;
|
||||
use Drupal\taxonomy\Entity\Vocabulary;
|
||||
use Drupal\Tests\BrowserTestBase;
|
||||
|
||||
/**
|
||||
* Tests for forum.module.
|
||||
*
|
||||
* Create, view, edit, delete, and change forum entries and verify its
|
||||
* consistency in the database.
|
||||
*
|
||||
* @group forum
|
||||
*/
|
||||
class ForumTest extends BrowserTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['taxonomy', 'comment', 'forum', 'node', 'block', 'menu_ui', 'help'];
|
||||
|
||||
/**
|
||||
* A user with various administrative privileges.
|
||||
*/
|
||||
protected $adminUser;
|
||||
|
||||
/**
|
||||
* A user that can create forum topics and edit its own topics.
|
||||
*/
|
||||
protected $editOwnTopicsUser;
|
||||
|
||||
/**
|
||||
* A user that can create, edit, and delete forum topics.
|
||||
*/
|
||||
protected $editAnyTopicsUser;
|
||||
|
||||
/**
|
||||
* A user with no special privileges.
|
||||
*/
|
||||
protected $webUser;
|
||||
|
||||
/**
|
||||
* An administrative user who can bypass comment approval.
|
||||
*/
|
||||
protected $postCommentUser;
|
||||
|
||||
/**
|
||||
* An array representing a forum container.
|
||||
*/
|
||||
protected $forumContainer;
|
||||
|
||||
/**
|
||||
* An array representing a forum.
|
||||
*/
|
||||
protected $forum;
|
||||
|
||||
/**
|
||||
* An array representing a root forum.
|
||||
*/
|
||||
protected $rootForum;
|
||||
|
||||
/**
|
||||
* An array of forum topic node IDs.
|
||||
*/
|
||||
protected $nids;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function setUp() {
|
||||
parent::setUp();
|
||||
$this->drupalPlaceBlock('system_breadcrumb_block');
|
||||
$this->drupalPlaceBlock('page_title_block');
|
||||
|
||||
// Create users.
|
||||
$this->adminUser = $this->drupalCreateUser([
|
||||
'access administration pages',
|
||||
'administer modules',
|
||||
'administer blocks',
|
||||
'administer forums',
|
||||
'administer menu',
|
||||
'administer taxonomy',
|
||||
'create forum content',
|
||||
'access comments',
|
||||
]);
|
||||
$this->editAnyTopicsUser = $this->drupalCreateUser([
|
||||
'access administration pages',
|
||||
'create forum content',
|
||||
'edit any forum content',
|
||||
'delete any forum content',
|
||||
]);
|
||||
$this->editOwnTopicsUser = $this->drupalCreateUser([
|
||||
'create forum content',
|
||||
'edit own forum content',
|
||||
'delete own forum content',
|
||||
]);
|
||||
$this->webUser = $this->drupalCreateUser();
|
||||
$this->postCommentUser = $this->drupalCreateUser([
|
||||
'administer content types',
|
||||
'create forum content',
|
||||
'post comments',
|
||||
'skip comment approval',
|
||||
'access comments',
|
||||
]);
|
||||
$this->drupalPlaceBlock('help_block', ['region' => 'help']);
|
||||
$this->drupalPlaceBlock('local_actions_block');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests forum functionality through the admin and user interfaces.
|
||||
*/
|
||||
public function testForum() {
|
||||
//Check that the basic forum install creates a default forum topic
|
||||
$this->drupalGet('/forum');
|
||||
// Look for the "General discussion" default forum
|
||||
$this->assertRaw(Link::createFromRoute(t('General discussion'), 'forum.page', ['taxonomy_term' => 1])->toString(), "Found the default forum at the /forum listing");
|
||||
// Check the presence of expected cache tags.
|
||||
$this->assertCacheTag('config:forum.settings');
|
||||
|
||||
$this->drupalGet(Url::fromRoute('forum.page', ['taxonomy_term' => 1]));
|
||||
$this->assertCacheTag('config:forum.settings');
|
||||
|
||||
// Do the admin tests.
|
||||
$this->doAdminTests($this->adminUser);
|
||||
|
||||
// Check display order.
|
||||
$display = EntityViewDisplay::load('node.forum.default');
|
||||
$body = $display->getComponent('body');
|
||||
$comment = $display->getComponent('comment_forum');
|
||||
$taxonomy = $display->getComponent('taxonomy_forums');
|
||||
|
||||
// Assert field order is body » taxonomy » comments.
|
||||
$this->assertTrue($taxonomy['weight'] < $body['weight']);
|
||||
$this->assertTrue($body['weight'] < $comment['weight']);
|
||||
|
||||
// Check form order.
|
||||
$display = EntityFormDisplay::load('node.forum.default');
|
||||
$body = $display->getComponent('body');
|
||||
$comment = $display->getComponent('comment_forum');
|
||||
$taxonomy = $display->getComponent('taxonomy_forums');
|
||||
|
||||
// Assert category comes before body in order.
|
||||
$this->assertTrue($taxonomy['weight'] < $body['weight']);
|
||||
|
||||
$this->generateForumTopics();
|
||||
|
||||
// Log in an unprivileged user to view the forum topics and generate an
|
||||
// active forum topics list.
|
||||
$this->drupalLogin($this->webUser);
|
||||
// Verify that this user is shown a message that they may not post content.
|
||||
$this->drupalGet('forum/' . $this->forum['tid']);
|
||||
$this->assertText(t('You are not allowed to post new content in the forum'), "Authenticated user without permission to post forum content is shown message in local tasks to that effect.");
|
||||
|
||||
// Log in, and do basic tests for a user with permission to edit any forum
|
||||
// content.
|
||||
$this->doBasicTests($this->editAnyTopicsUser, TRUE);
|
||||
// Create a forum node authored by this user.
|
||||
$any_topics_user_node = $this->createForumTopic($this->forum, FALSE);
|
||||
|
||||
// Log in, and do basic tests for a user with permission to edit only its
|
||||
// own forum content.
|
||||
$this->doBasicTests($this->editOwnTopicsUser, FALSE);
|
||||
// Create a forum node authored by this user.
|
||||
$own_topics_user_node = $this->createForumTopic($this->forum, FALSE);
|
||||
// Verify that this user cannot edit forum content authored by another user.
|
||||
$this->verifyForums($any_topics_user_node, FALSE, 403);
|
||||
|
||||
// Verify that this user is shown a local task to add new forum content.
|
||||
$this->drupalGet('forum');
|
||||
$this->assertLink(t('Add new Forum topic'));
|
||||
$this->drupalGet('forum/' . $this->forum['tid']);
|
||||
$this->assertLink(t('Add new Forum topic'));
|
||||
|
||||
// Log in a user with permission to edit any forum content.
|
||||
$this->drupalLogin($this->editAnyTopicsUser);
|
||||
// Verify that this user can edit forum content authored by another user.
|
||||
$this->verifyForums($own_topics_user_node, TRUE);
|
||||
|
||||
// Verify the topic and post counts on the forum page.
|
||||
$this->drupalGet('forum');
|
||||
|
||||
// Verify row for testing forum.
|
||||
$forum_arg = [':forum' => 'forum-list-' . $this->forum['tid']];
|
||||
|
||||
// Topics cell contains number of topics and number of unread topics.
|
||||
$xpath = $this->buildXPathQuery('//tr[@id=:forum]//td[@class="forum__topics"]', $forum_arg);
|
||||
$topics = $this->xpath($xpath);
|
||||
$topics = trim($topics[0]->getText());
|
||||
// The extracted text contains the number of topics (6) and new posts
|
||||
// (also 6) in this table cell.
|
||||
$this->assertEquals('6 6 new posts in forum ' . $this->forum['name'], $topics, 'Number of topics found.');
|
||||
|
||||
// Verify the number of unread topics.
|
||||
$elements = $this->xpath('//tr[@id=:forum]//td[@class="forum__topics"]//a', $forum_arg);
|
||||
$this->assertStringStartsWith('6 new posts', $elements[0]->getText(), 'Number of unread topics found.');
|
||||
// Verify that the forum name is in the unread topics text.
|
||||
$elements = $this->xpath('//tr[@id=:forum]//em[@class="placeholder"]', $forum_arg);
|
||||
$this->assertContains($this->forum['name'], $elements[0]->getText(), 'Forum name found in unread topics text.');
|
||||
|
||||
// Verify total number of posts in forum.
|
||||
$elements = $this->xpath('//tr[@id=:forum]//td[@class="forum__posts"]', $forum_arg);
|
||||
$this->assertEquals('6', $elements[0]->getText(), 'Number of posts found.');
|
||||
|
||||
// Test loading multiple forum nodes on the front page.
|
||||
$this->drupalLogin($this->drupalCreateUser(['administer content types', 'create forum content', 'post comments']));
|
||||
$this->drupalPostForm('admin/structure/types/manage/forum', ['options[promote]' => 'promote'], t('Save content type'));
|
||||
$this->createForumTopic($this->forum, FALSE);
|
||||
$this->createForumTopic($this->forum, FALSE);
|
||||
$this->drupalGet('node');
|
||||
|
||||
// Test adding a comment to a forum topic.
|
||||
$node = $this->createForumTopic($this->forum, FALSE);
|
||||
$edit = [];
|
||||
$edit['comment_body[0][value]'] = $this->randomMachineName();
|
||||
$this->drupalPostForm('node/' . $node->id(), $edit, t('Save'));
|
||||
$this->assertResponse(200);
|
||||
|
||||
// Test editing a forum topic that has a comment.
|
||||
$this->drupalLogin($this->editAnyTopicsUser);
|
||||
$this->drupalGet('forum/' . $this->forum['tid']);
|
||||
$this->drupalPostForm('node/' . $node->id() . '/edit', [], t('Save'));
|
||||
$this->assertResponse(200);
|
||||
|
||||
// Test the root forum page title change.
|
||||
$this->drupalGet('forum');
|
||||
$this->assertCacheTag('config:taxonomy.vocabulary.' . $this->forum['vid']);
|
||||
$this->assertTitle(t('Forums | Drupal'));
|
||||
$vocabulary = Vocabulary::load($this->forum['vid']);
|
||||
$vocabulary->set('name', 'Discussions');
|
||||
$vocabulary->save();
|
||||
$this->drupalGet('forum');
|
||||
$this->assertTitle(t('Discussions | Drupal'));
|
||||
|
||||
// Test anonymous action link.
|
||||
$this->drupalLogout();
|
||||
$this->drupalGet('forum/' . $this->forum['tid']);
|
||||
$this->assertLink(t('Log in to post new content in the forum.'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests that forum nodes can't be added without a parent.
|
||||
*
|
||||
* Verifies that forum nodes are not created without choosing "forum" from the
|
||||
* select list.
|
||||
*/
|
||||
public function testAddOrphanTopic() {
|
||||
// Must remove forum topics to test creating orphan topics.
|
||||
$vid = $this->config('forum.settings')->get('vocabulary');
|
||||
$tids = \Drupal::entityQuery('taxonomy_term')
|
||||
->condition('vid', $vid)
|
||||
->execute();
|
||||
entity_delete_multiple('taxonomy_term', $tids);
|
||||
|
||||
// Create an orphan forum item.
|
||||
$edit = [];
|
||||
$edit['title[0][value]'] = $this->randomMachineName(10);
|
||||
$edit['body[0][value]'] = $this->randomMachineName(120);
|
||||
$this->drupalLogin($this->adminUser);
|
||||
$this->drupalPostForm('node/add/forum', $edit, t('Save'));
|
||||
|
||||
$nid_count = db_query('SELECT COUNT(nid) FROM {node}')->fetchField();
|
||||
$this->assertEqual(0, $nid_count, 'A forum node was not created when missing a forum vocabulary.');
|
||||
|
||||
// Reset the defaults for future tests.
|
||||
\Drupal::service('module_installer')->install(['forum']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs admin tests on the admin user.
|
||||
*
|
||||
* @param object $user
|
||||
* The logged-in user.
|
||||
*/
|
||||
private function doAdminTests($user) {
|
||||
// Log in the user.
|
||||
$this->drupalLogin($user);
|
||||
|
||||
// Add forum to the Tools menu.
|
||||
$edit = [];
|
||||
$this->drupalPostForm('admin/structure/menu/manage/tools', $edit, t('Save'));
|
||||
$this->assertResponse(200);
|
||||
|
||||
// Edit forum taxonomy.
|
||||
// Restoration of the settings fails and causes subsequent tests to fail.
|
||||
$this->editForumVocabulary();
|
||||
// Create forum container.
|
||||
$this->forumContainer = $this->createForum('container');
|
||||
// Verify "edit container" link exists and functions correctly.
|
||||
$this->drupalGet('admin/structure/forum');
|
||||
// Verify help text is shown.
|
||||
$this->assertText(t('Forums contain forum topics. Use containers to group related forums'));
|
||||
// Verify action links are there.
|
||||
$this->assertLink('Add forum');
|
||||
$this->assertLink('Add container');
|
||||
$this->clickLink('edit container');
|
||||
$this->assertRaw('Edit container', 'Followed the link to edit the container');
|
||||
// Create forum inside the forum container.
|
||||
$this->forum = $this->createForum('forum', $this->forumContainer['tid']);
|
||||
// Verify the "edit forum" link exists and functions correctly.
|
||||
$this->drupalGet('admin/structure/forum');
|
||||
$this->clickLink('edit forum');
|
||||
$this->assertRaw('Edit forum', 'Followed the link to edit the forum');
|
||||
// Navigate back to forum structure page.
|
||||
$this->drupalGet('admin/structure/forum');
|
||||
// Create second forum in container, destined to be deleted below.
|
||||
$delete_forum = $this->createForum('forum', $this->forumContainer['tid']);
|
||||
// Save forum overview.
|
||||
$this->drupalPostForm('admin/structure/forum/', [], t('Save'));
|
||||
$this->assertRaw(t('The configuration options have been saved.'));
|
||||
// Delete this second forum.
|
||||
$this->deleteForum($delete_forum['tid']);
|
||||
// Create forum at the top (root) level.
|
||||
$this->rootForum = $this->createForum('forum');
|
||||
|
||||
// Test vocabulary form alterations.
|
||||
$this->drupalGet('admin/structure/taxonomy/manage/forums');
|
||||
$this->assertSession()->buttonExists('Save');
|
||||
$this->assertSession()->buttonNotExists('Delete');
|
||||
|
||||
// Test term edit form alterations.
|
||||
$this->drupalGet('taxonomy/term/' . $this->forumContainer['tid'] . '/edit');
|
||||
// Test parent field been hidden by forum module.
|
||||
$this->assertNoField('parent[]', 'Parent field not found.');
|
||||
|
||||
// Create a default vocabulary named "Tags".
|
||||
$description = 'Use tags to group articles on similar topics into categories.';
|
||||
$help = 'Enter a comma-separated list of words to describe your content.';
|
||||
$vocabulary = Vocabulary::create([
|
||||
'name' => 'Tags',
|
||||
'description' => $description,
|
||||
'vid' => 'tags',
|
||||
'langcode' => \Drupal::languageManager()->getDefaultLanguage()->getId(),
|
||||
'help' => $help,
|
||||
]);
|
||||
$vocabulary->save();
|
||||
// Test tags vocabulary form is not affected.
|
||||
$this->drupalGet('admin/structure/taxonomy/manage/tags');
|
||||
$this->assertSession()->buttonExists('Save');
|
||||
$this->assertLink(t('Delete'));
|
||||
// Test tags vocabulary term form is not affected.
|
||||
$this->drupalGet('admin/structure/taxonomy/manage/tags/add');
|
||||
$this->assertField('parent[]', 'Parent field found.');
|
||||
// Test relations widget exists.
|
||||
$relations_widget = $this->xpath("//details[@id='edit-relations']");
|
||||
$this->assertTrue(isset($relations_widget[0]), 'Relations widget element found.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Edits the forum taxonomy.
|
||||
*/
|
||||
public function editForumVocabulary() {
|
||||
// Backup forum taxonomy.
|
||||
$vid = $this->config('forum.settings')->get('vocabulary');
|
||||
$original_vocabulary = Vocabulary::load($vid);
|
||||
|
||||
// Generate a random name and description.
|
||||
$edit = [
|
||||
'name' => $this->randomMachineName(10),
|
||||
'description' => $this->randomMachineName(100),
|
||||
];
|
||||
|
||||
// Edit the vocabulary.
|
||||
$this->drupalPostForm('admin/structure/taxonomy/manage/' . $original_vocabulary->id(), $edit, t('Save'));
|
||||
$this->assertResponse(200);
|
||||
$this->assertRaw(t('Updated vocabulary %name.', ['%name' => $edit['name']]), 'Vocabulary was edited');
|
||||
|
||||
// Grab the newly edited vocabulary.
|
||||
$current_vocabulary = Vocabulary::load($vid);
|
||||
|
||||
// Make sure we actually edited the vocabulary properly.
|
||||
$this->assertEqual($current_vocabulary->label(), $edit['name'], 'The name was updated');
|
||||
$this->assertEqual($current_vocabulary->getDescription(), $edit['description'], 'The description was updated');
|
||||
|
||||
// Restore the original vocabulary's name and description.
|
||||
$current_vocabulary->set('name', $original_vocabulary->label());
|
||||
$current_vocabulary->set('description', $original_vocabulary->getDescription());
|
||||
$current_vocabulary->save();
|
||||
// Reload vocabulary to make sure changes are saved.
|
||||
$current_vocabulary = Vocabulary::load($vid);
|
||||
$this->assertEqual($current_vocabulary->label(), $original_vocabulary->label(), 'The original vocabulary settings were restored');
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a forum container or a forum.
|
||||
*
|
||||
* @param string $type
|
||||
* The forum type (forum container or forum).
|
||||
* @param int $parent
|
||||
* The forum parent. This defaults to 0, indicating a root forum.
|
||||
*
|
||||
* @return \Drupal\Core\Database\StatementInterface
|
||||
* The created taxonomy term data.
|
||||
*/
|
||||
public function createForum($type, $parent = 0) {
|
||||
// Generate a random name/description.
|
||||
$name = $this->randomMachineName(10);
|
||||
$description = $this->randomMachineName(100);
|
||||
|
||||
$edit = [
|
||||
'name[0][value]' => $name,
|
||||
'description[0][value]' => $description,
|
||||
'parent[0]' => $parent,
|
||||
'weight' => '0',
|
||||
];
|
||||
|
||||
// Create forum.
|
||||
$this->drupalPostForm('admin/structure/forum/add/' . $type, $edit, t('Save'));
|
||||
$this->assertResponse(200);
|
||||
$type = ($type == 'container') ? 'forum container' : 'forum';
|
||||
$this->assertText(
|
||||
t(
|
||||
'Created new @type @term.',
|
||||
['@term' => $name, '@type' => t($type)]
|
||||
),
|
||||
format_string('@type was created', ['@type' => ucfirst($type)])
|
||||
);
|
||||
|
||||
// Verify that the creation message contains a link to a term.
|
||||
$view_link = $this->xpath('//div[@class="messages"]//a[contains(@href, :href)]', [':href' => 'term/']);
|
||||
$this->assert(isset($view_link), 'The message area contains a link to a term');
|
||||
|
||||
// Verify forum.
|
||||
$term = db_query("SELECT * FROM {taxonomy_term_field_data} t WHERE t.vid = :vid AND t.name = :name AND t.description__value = :desc AND t.default_langcode = 1", [':vid' => $this->config('forum.settings')->get('vocabulary'), ':name' => $name, ':desc' => $description])->fetchAssoc();
|
||||
$this->assertTrue(!empty($term), 'The ' . $type . ' exists in the database');
|
||||
|
||||
// Verify forum hierarchy.
|
||||
$tid = $term['tid'];
|
||||
$parent_tid = db_query("SELECT t.parent FROM {taxonomy_term_hierarchy} t WHERE t.tid = :tid", [':tid' => $tid])->fetchField();
|
||||
$this->assertTrue($parent == $parent_tid, 'The ' . $type . ' is linked to its container');
|
||||
|
||||
$forum = $this->container->get('entity.manager')->getStorage('taxonomy_term')->load($tid);
|
||||
$this->assertEqual(($type == 'forum container'), (bool) $forum->forum_container->value);
|
||||
return $term;
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes a forum.
|
||||
*
|
||||
* @param int $tid
|
||||
* The forum ID.
|
||||
*/
|
||||
public function deleteForum($tid) {
|
||||
// Delete the forum.
|
||||
$this->drupalGet('admin/structure/forum/edit/forum/' . $tid);
|
||||
$this->clickLink(t('Delete'));
|
||||
$this->assertText('Are you sure you want to delete the forum');
|
||||
$this->assertNoText('Add forum');
|
||||
$this->assertNoText('Add forum container');
|
||||
$this->drupalPostForm(NULL, [], t('Delete'));
|
||||
|
||||
// Assert that the forum no longer exists.
|
||||
$this->drupalGet('forum/' . $tid);
|
||||
$this->assertResponse(404, 'The forum was not found');
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs basic tests on the indicated user.
|
||||
*
|
||||
* @param \Drupal\Core\Session\AccountInterface $user
|
||||
* The logged in user.
|
||||
* @param bool $admin
|
||||
* User has 'access administration pages' privilege.
|
||||
*/
|
||||
private function doBasicTests($user, $admin) {
|
||||
// Log in the user.
|
||||
$this->drupalLogin($user);
|
||||
// Attempt to create forum topic under a container.
|
||||
$this->createForumTopic($this->forumContainer, TRUE);
|
||||
// Create forum node.
|
||||
$node = $this->createForumTopic($this->forum, FALSE);
|
||||
// Verify the user has access to all the forum nodes.
|
||||
$this->verifyForums($node, $admin);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests a forum with a new post displays properly.
|
||||
*/
|
||||
public function testForumWithNewPost() {
|
||||
// Log in as the first user.
|
||||
$this->drupalLogin($this->adminUser);
|
||||
// Create a forum container.
|
||||
$this->forumContainer = $this->createForum('container');
|
||||
// Create a forum.
|
||||
$this->forum = $this->createForum('forum');
|
||||
// Create a topic.
|
||||
$node = $this->createForumTopic($this->forum, FALSE);
|
||||
|
||||
// Log in as a second user.
|
||||
$this->drupalLogin($this->postCommentUser);
|
||||
// Post a reply to the topic.
|
||||
$edit = [];
|
||||
$edit['subject[0][value]'] = $this->randomMachineName();
|
||||
$edit['comment_body[0][value]'] = $this->randomMachineName();
|
||||
$this->drupalPostForm('node/' . $node->id(), $edit, t('Save'));
|
||||
$this->assertResponse(200);
|
||||
|
||||
// Test replying to a comment.
|
||||
$this->clickLink('Reply');
|
||||
$this->assertResponse(200);
|
||||
$this->assertFieldByName('comment_body[0][value]');
|
||||
|
||||
// Log in as the first user.
|
||||
$this->drupalLogin($this->adminUser);
|
||||
// Check that forum renders properly.
|
||||
$this->drupalGet("forum/{$this->forum['tid']}");
|
||||
$this->assertResponse(200);
|
||||
|
||||
// Verify there is no unintentional HTML tag escaping.
|
||||
$this->assertNoEscaped('<', '');
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a forum topic.
|
||||
*
|
||||
* @param array $forum
|
||||
* A forum array.
|
||||
* @param bool $container
|
||||
* TRUE if $forum is a container; FALSE otherwise.
|
||||
*
|
||||
* @return object
|
||||
* The created topic node.
|
||||
*/
|
||||
public function createForumTopic($forum, $container = FALSE) {
|
||||
// Generate a random subject/body.
|
||||
$title = $this->randomMachineName(20);
|
||||
$body = $this->randomMachineName(200);
|
||||
|
||||
$edit = [
|
||||
'title[0][value]' => $title,
|
||||
'body[0][value]' => $body,
|
||||
];
|
||||
$tid = $forum['tid'];
|
||||
|
||||
// Create the forum topic, preselecting the forum ID via a URL parameter.
|
||||
$this->drupalPostForm('node/add/forum', $edit, t('Save'), ['query' => ['forum_id' => $tid]]);
|
||||
|
||||
$type = t('Forum topic');
|
||||
if ($container) {
|
||||
$this->assertNoText(t('@type @title has been created.', ['@type' => $type, '@title' => $title]), 'Forum topic was not created');
|
||||
$this->assertRaw(t('The item %title is a forum container, not a forum.', ['%title' => $forum['name']]), 'Error message was shown');
|
||||
return;
|
||||
}
|
||||
else {
|
||||
$this->assertText(t('@type @title has been created.', ['@type' => $type, '@title' => $title]), 'Forum topic was created');
|
||||
$this->assertNoRaw(t('The item %title is a forum container, not a forum.', ['%title' => $forum['name']]), 'No error message was shown');
|
||||
|
||||
// Verify that the creation message contains a link to a term.
|
||||
$view_link = $this->xpath('//div[@class="messages"]//a[contains(@href, :href)]', [':href' => 'term/']);
|
||||
$this->assert(isset($view_link), 'The message area contains a link to a term');
|
||||
}
|
||||
|
||||
// Retrieve node object, ensure that the topic was created and in the proper forum.
|
||||
$node = $this->drupalGetNodeByTitle($title);
|
||||
$this->assertTrue($node != NULL, format_string('Node @title was loaded', ['@title' => $title]));
|
||||
$this->assertEqual($node->taxonomy_forums->target_id, $tid, 'Saved forum topic was in the expected forum');
|
||||
|
||||
// View forum topic.
|
||||
$this->drupalGet('node/' . $node->id());
|
||||
$this->assertRaw($title, 'Subject was found');
|
||||
$this->assertRaw($body, 'Body was found');
|
||||
|
||||
return $node;
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies that the logged in user has access to a forum node.
|
||||
*
|
||||
* @param \Drupal\Core\Entity\EntityInterface $node
|
||||
* The node being checked.
|
||||
* @param bool $admin
|
||||
* Boolean to indicate whether the user can 'access administration pages'.
|
||||
* @param int $response
|
||||
* The expected HTTP response code.
|
||||
*/
|
||||
private function verifyForums(EntityInterface $node, $admin, $response = 200) {
|
||||
$response2 = ($admin) ? 200 : 403;
|
||||
|
||||
// View forum help node.
|
||||
$this->drupalGet('admin/help/forum');
|
||||
$this->assertResponse($response2);
|
||||
if ($response2 == 200) {
|
||||
$this->assertTitle(t('Forum | Drupal'), 'Forum help title was displayed');
|
||||
$this->assertText(t('Forum'), 'Forum help node was displayed');
|
||||
}
|
||||
|
||||
// View forum container page.
|
||||
$this->verifyForumView($this->forumContainer);
|
||||
// View forum page.
|
||||
$this->verifyForumView($this->forum, $this->forumContainer);
|
||||
// View root forum page.
|
||||
$this->verifyForumView($this->rootForum);
|
||||
|
||||
// View forum node.
|
||||
$this->drupalGet('node/' . $node->id());
|
||||
$this->assertResponse(200);
|
||||
$this->assertTitle($node->label() . ' | Drupal', 'Forum node was displayed');
|
||||
$breadcrumb_build = [
|
||||
Link::createFromRoute(t('Home'), '<front>'),
|
||||
Link::createFromRoute(t('Forums'), 'forum.index'),
|
||||
Link::createFromRoute($this->forumContainer['name'], 'forum.page', ['taxonomy_term' => $this->forumContainer['tid']]),
|
||||
Link::createFromRoute($this->forum['name'], 'forum.page', ['taxonomy_term' => $this->forum['tid']]),
|
||||
];
|
||||
$breadcrumb = [
|
||||
'#theme' => 'breadcrumb',
|
||||
'#links' => $breadcrumb_build,
|
||||
];
|
||||
$this->assertRaw(\Drupal::service('renderer')->renderRoot($breadcrumb), 'Breadcrumbs were displayed');
|
||||
|
||||
// View forum edit node.
|
||||
$this->drupalGet('node/' . $node->id() . '/edit');
|
||||
$this->assertResponse($response);
|
||||
if ($response == 200) {
|
||||
$this->assertTitle('Edit Forum topic ' . $node->label() . ' | Drupal', 'Forum edit node was displayed');
|
||||
}
|
||||
|
||||
if ($response == 200) {
|
||||
// Edit forum node (including moving it to another forum).
|
||||
$edit = [];
|
||||
$edit['title[0][value]'] = 'node/' . $node->id();
|
||||
$edit['body[0][value]'] = $this->randomMachineName(256);
|
||||
// Assume the topic is initially associated with $forum.
|
||||
$edit['taxonomy_forums'] = $this->rootForum['tid'];
|
||||
$edit['shadow'] = TRUE;
|
||||
$this->drupalPostForm('node/' . $node->id() . '/edit', $edit, t('Save'));
|
||||
$this->assertText(t('Forum topic @title has been updated.', ['@title' => $edit['title[0][value]']]), 'Forum node was edited');
|
||||
|
||||
// Verify topic was moved to a different forum.
|
||||
$forum_tid = db_query("SELECT tid FROM {forum} WHERE nid = :nid AND vid = :vid", [
|
||||
':nid' => $node->id(),
|
||||
':vid' => $node->getRevisionId(),
|
||||
])->fetchField();
|
||||
$this->assertTrue($forum_tid == $this->rootForum['tid'], 'The forum topic is linked to a different forum');
|
||||
|
||||
// Delete forum node.
|
||||
$this->drupalPostForm('node/' . $node->id() . '/delete', [], t('Delete'));
|
||||
$this->assertResponse($response);
|
||||
$this->assertRaw(t('Forum topic %title has been deleted.', ['%title' => $edit['title[0][value]']]), 'Forum node was deleted');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies the display of a forum page.
|
||||
*
|
||||
* @param array $forum
|
||||
* A row from the taxonomy_term_data table in an array.
|
||||
* @param array $parent
|
||||
* (optional) An array representing the forum's parent.
|
||||
*/
|
||||
private function verifyForumView($forum, $parent = NULL) {
|
||||
// View forum page.
|
||||
$this->drupalGet('forum/' . $forum['tid']);
|
||||
$this->assertResponse(200);
|
||||
$this->assertTitle($forum['name'] . ' | Drupal');
|
||||
|
||||
$breadcrumb_build = [
|
||||
Link::createFromRoute(t('Home'), '<front>'),
|
||||
Link::createFromRoute(t('Forums'), 'forum.index'),
|
||||
];
|
||||
if (isset($parent)) {
|
||||
$breadcrumb_build[] = Link::createFromRoute($parent['name'], 'forum.page', ['taxonomy_term' => $parent['tid']]);
|
||||
}
|
||||
|
||||
$breadcrumb = [
|
||||
'#theme' => 'breadcrumb',
|
||||
'#links' => $breadcrumb_build,
|
||||
];
|
||||
$this->assertRaw(\Drupal::service('renderer')->renderRoot($breadcrumb), 'Breadcrumbs were displayed');
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates forum topics.
|
||||
*/
|
||||
private function generateForumTopics() {
|
||||
$this->nids = [];
|
||||
for ($i = 0; $i < 5; $i++) {
|
||||
$node = $this->createForumTopic($this->forum, FALSE);
|
||||
$this->nids[] = $node->id();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,150 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\Tests\forum\Functional;
|
||||
|
||||
use Drupal\comment\CommentInterface;
|
||||
use Drupal\field\Entity\FieldStorageConfig;
|
||||
use Drupal\node\Entity\NodeType;
|
||||
use Drupal\comment\Entity\Comment;
|
||||
use Drupal\taxonomy\Entity\Term;
|
||||
use Drupal\Tests\BrowserTestBase;
|
||||
|
||||
/**
|
||||
* Tests forum module uninstallation.
|
||||
*
|
||||
* @group forum
|
||||
*/
|
||||
class ForumUninstallTest extends BrowserTestBase {
|
||||
|
||||
/**
|
||||
* Modules to enable.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public static $modules = ['forum'];
|
||||
|
||||
/**
|
||||
* Tests if forum module uninstallation properly deletes the field.
|
||||
*/
|
||||
public function testForumUninstallWithField() {
|
||||
$this->drupalLogin($this->drupalCreateUser(['administer taxonomy', 'administer nodes', 'administer modules', 'delete any forum content', 'administer content types']));
|
||||
// Ensure that the field exists before uninstallation.
|
||||
$field_storage = FieldStorageConfig::loadByName('node', 'taxonomy_forums');
|
||||
$this->assertNotNull($field_storage, 'The taxonomy_forums field storage exists.');
|
||||
|
||||
// Create a taxonomy term.
|
||||
$term = Term::create([
|
||||
'name' => t('A term'),
|
||||
'langcode' => \Drupal::languageManager()->getDefaultLanguage()->getId(),
|
||||
'description' => '',
|
||||
'parent' => [0],
|
||||
'vid' => 'forums',
|
||||
'forum_container' => 0,
|
||||
]);
|
||||
$term->save();
|
||||
|
||||
// Create a forum node.
|
||||
$node = $this->drupalCreateNode([
|
||||
'title' => 'A forum post',
|
||||
'type' => 'forum',
|
||||
'taxonomy_forums' => [['target_id' => $term->id()]],
|
||||
]);
|
||||
|
||||
// Create at least one comment against the forum node.
|
||||
$comment = Comment::create([
|
||||
'entity_id' => $node->nid->value,
|
||||
'entity_type' => 'node',
|
||||
'field_name' => 'comment_forum',
|
||||
'pid' => 0,
|
||||
'uid' => 0,
|
||||
'status' => CommentInterface::PUBLISHED,
|
||||
'subject' => $this->randomMachineName(),
|
||||
'hostname' => '127.0.0.1',
|
||||
]);
|
||||
$comment->save();
|
||||
|
||||
// Attempt to uninstall forum.
|
||||
$this->drupalGet('admin/modules/uninstall');
|
||||
// Assert forum is required.
|
||||
$this->assertSession()->fieldDisabled('uninstall[forum]');
|
||||
$this->assertText('To uninstall Forum, first delete all Forum content');
|
||||
|
||||
// Delete the node.
|
||||
$this->drupalPostForm('node/' . $node->id() . '/delete', [], t('Delete'));
|
||||
|
||||
// Attempt to uninstall forum.
|
||||
$this->drupalGet('admin/modules/uninstall');
|
||||
// Assert forum is still required.
|
||||
$this->assertSession()->fieldDisabled('uninstall[forum]');
|
||||
$this->assertText('To uninstall Forum, first delete all Forums terms');
|
||||
|
||||
// Delete any forum terms.
|
||||
$vid = $this->config('forum.settings')->get('vocabulary');
|
||||
$terms = entity_load_multiple_by_properties('taxonomy_term', ['vid' => $vid]);
|
||||
foreach ($terms as $term) {
|
||||
$term->delete();
|
||||
}
|
||||
|
||||
// Ensure that the forum node type can not be deleted.
|
||||
$this->drupalGet('admin/structure/types/manage/forum');
|
||||
$this->assertNoLink(t('Delete'));
|
||||
|
||||
// Now attempt to uninstall forum.
|
||||
$this->drupalGet('admin/modules/uninstall');
|
||||
// Assert forum is no longer required.
|
||||
$this->assertFieldByName('uninstall[forum]');
|
||||
$this->drupalPostForm('admin/modules/uninstall', [
|
||||
'uninstall[forum]' => 1,
|
||||
], t('Uninstall'));
|
||||
$this->drupalPostForm(NULL, [], t('Uninstall'));
|
||||
|
||||
// Check that the field is now deleted.
|
||||
$field_storage = FieldStorageConfig::loadByName('node', 'taxonomy_forums');
|
||||
$this->assertNull($field_storage, 'The taxonomy_forums field storage has been deleted.');
|
||||
|
||||
// Check that a node type with a machine name of forum can be created after
|
||||
// uninstalling the forum module and the node type is not locked.
|
||||
$edit = [
|
||||
'name' => 'Forum',
|
||||
'title_label' => 'title for forum',
|
||||
'type' => 'forum',
|
||||
];
|
||||
$this->drupalPostForm('admin/structure/types/add', $edit, t('Save content type'));
|
||||
$this->assertTrue((bool) NodeType::load('forum'), 'Node type with machine forum created.');
|
||||
$this->drupalGet('admin/structure/types/manage/forum');
|
||||
$this->clickLink(t('Delete'));
|
||||
$this->drupalPostForm(NULL, [], t('Delete'));
|
||||
$this->assertResponse(200);
|
||||
$this->assertFalse((bool) NodeType::load('forum'), 'Node type with machine forum deleted.');
|
||||
|
||||
// Double check everything by reinstalling the forum module again.
|
||||
$this->drupalPostForm('admin/modules', ['modules[forum][enable]' => 1], 'Install');
|
||||
$this->assertText('Module Forum has been enabled.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests uninstallation if the field storage has been deleted beforehand.
|
||||
*/
|
||||
public function testForumUninstallWithoutFieldStorage() {
|
||||
// Manually delete the taxonomy_forums field before module uninstallation.
|
||||
$field_storage = FieldStorageConfig::loadByName('node', 'taxonomy_forums');
|
||||
$this->assertNotNull($field_storage, 'The taxonomy_forums field storage exists.');
|
||||
$field_storage->delete();
|
||||
|
||||
// Check that the field is now deleted.
|
||||
$field_storage = FieldStorageConfig::loadByName('node', 'taxonomy_forums');
|
||||
$this->assertNull($field_storage, 'The taxonomy_forums field storage has been deleted.');
|
||||
|
||||
// Delete all terms in the Forums vocabulary. Uninstalling the forum module
|
||||
// will fail unless this is done.
|
||||
$terms = entity_load_multiple_by_properties('taxonomy_term', ['vid' => 'forums']);
|
||||
foreach ($terms as $term) {
|
||||
$term->delete();
|
||||
}
|
||||
|
||||
// Ensure that uninstallation succeeds even if the field has already been
|
||||
// deleted manually beforehand.
|
||||
$this->container->get('module_installer')->uninstall(['forum']);
|
||||
}
|
||||
|
||||
}
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
namespace Drupal\Tests\forum\Kernel\Migrate\d6;
|
||||
|
||||
use Drupal\config\Tests\SchemaCheckTestTrait;
|
||||
use Drupal\Tests\SchemaCheckTestTrait;
|
||||
use Drupal\Tests\migrate_drupal\Kernel\d6\MigrateDrupal6TestBase;
|
||||
|
||||
/**
|
||||
|
@ -17,7 +17,7 @@ class MigrateForumConfigsTest extends MigrateDrupal6TestBase {
|
|||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static $modules = array('comment', 'forum', 'taxonomy');
|
||||
public static $modules = ['comment', 'forum', 'taxonomy'];
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
|
|
|
@ -37,9 +37,9 @@ class ForumBreadcrumbBuilderBaseTest extends UnitTestCase {
|
|||
// Make some test doubles.
|
||||
$entity_manager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface');
|
||||
$config_factory = $this->getConfigFactoryStub(
|
||||
array(
|
||||
'forum.settings' => array('IAmATestKey' => 'IAmATestValue'),
|
||||
)
|
||||
[
|
||||
'forum.settings' => ['IAmATestKey' => 'IAmATestValue'],
|
||||
]
|
||||
);
|
||||
$forum_manager = $this->getMock('Drupal\forum\ForumManagerInterface');
|
||||
$translation_manager = $this->getMock('Drupal\Core\StringTranslation\TranslationInterface');
|
||||
|
@ -48,20 +48,20 @@ class ForumBreadcrumbBuilderBaseTest extends UnitTestCase {
|
|||
$builder = $this->getMockForAbstractClass(
|
||||
'Drupal\forum\Breadcrumb\ForumBreadcrumbBuilderBase',
|
||||
// Constructor array.
|
||||
array(
|
||||
[
|
||||
$entity_manager,
|
||||
$config_factory,
|
||||
$forum_manager,
|
||||
$translation_manager,
|
||||
)
|
||||
]
|
||||
);
|
||||
|
||||
// Reflect upon our properties, except for config which is a special case.
|
||||
$property_names = array(
|
||||
$property_names = [
|
||||
'entityManager' => $entity_manager,
|
||||
'forumManager' => $forum_manager,
|
||||
'stringTranslation' => $translation_manager,
|
||||
);
|
||||
];
|
||||
foreach ($property_names as $property_name => $property_value) {
|
||||
$this->assertAttributeEquals(
|
||||
$property_value, $property_name, $builder
|
||||
|
@ -103,37 +103,37 @@ class ForumBreadcrumbBuilderBaseTest extends UnitTestCase {
|
|||
$vocab_storage = $this->getMock('Drupal\Core\Entity\EntityStorageInterface');
|
||||
$vocab_storage->expects($this->any())
|
||||
->method('load')
|
||||
->will($this->returnValueMap(array(
|
||||
array('forums', $prophecy->reveal()),
|
||||
)));
|
||||
->will($this->returnValueMap([
|
||||
['forums', $prophecy->reveal()],
|
||||
]));
|
||||
|
||||
$entity_manager = $this->getMockBuilder('Drupal\Core\Entity\EntityManagerInterface')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$entity_manager->expects($this->any())
|
||||
->method('getStorage')
|
||||
->will($this->returnValueMap(array(
|
||||
array('taxonomy_vocabulary', $vocab_storage),
|
||||
)));
|
||||
->will($this->returnValueMap([
|
||||
['taxonomy_vocabulary', $vocab_storage],
|
||||
]));
|
||||
|
||||
$config_factory = $this->getConfigFactoryStub(
|
||||
array(
|
||||
'forum.settings' => array(
|
||||
[
|
||||
'forum.settings' => [
|
||||
'vocabulary' => 'forums',
|
||||
),
|
||||
)
|
||||
],
|
||||
]
|
||||
);
|
||||
|
||||
// Build a breadcrumb builder to test.
|
||||
$breadcrumb_builder = $this->getMockForAbstractClass(
|
||||
'Drupal\forum\Breadcrumb\ForumBreadcrumbBuilderBase',
|
||||
// Constructor array.
|
||||
array(
|
||||
[
|
||||
$entity_manager,
|
||||
$config_factory,
|
||||
$forum_manager,
|
||||
$translation_manager,
|
||||
)
|
||||
]
|
||||
);
|
||||
|
||||
// Add a translation manager for t().
|
||||
|
@ -144,10 +144,10 @@ class ForumBreadcrumbBuilderBaseTest extends UnitTestCase {
|
|||
$route_match = $this->getMock('Drupal\Core\Routing\RouteMatchInterface');
|
||||
|
||||
// Expected result set.
|
||||
$expected = array(
|
||||
$expected = [
|
||||
Link::createFromRoute('Home', '<front>'),
|
||||
Link::createFromRoute('Fora_is_the_plural_of_forum', 'forum.index'),
|
||||
);
|
||||
];
|
||||
|
||||
// And finally, the test.
|
||||
$breadcrumb = $breadcrumb_builder->build($route_match);
|
||||
|
|
|
@ -41,21 +41,21 @@ class ForumListingBreadcrumbBuilderTest extends UnitTestCase {
|
|||
* @dataProvider providerTestApplies
|
||||
* @covers ::applies
|
||||
*/
|
||||
public function testApplies($expected, $route_name = NULL, $parameter_map = array()) {
|
||||
public function testApplies($expected, $route_name = NULL, $parameter_map = []) {
|
||||
// Make some test doubles.
|
||||
$entity_manager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface');
|
||||
$config_factory = $this->getConfigFactoryStub(array());
|
||||
$config_factory = $this->getConfigFactoryStub([]);
|
||||
$forum_manager = $this->getMock('Drupal\forum\ForumManagerInterface');
|
||||
$translation_manager = $this->getMock('Drupal\Core\StringTranslation\TranslationInterface');
|
||||
|
||||
// Make an object to test.
|
||||
$builder = $this->getMockBuilder('Drupal\forum\Breadcrumb\ForumListingBreadcrumbBuilder')
|
||||
->setConstructorArgs(array(
|
||||
->setConstructorArgs([
|
||||
$entity_manager,
|
||||
$config_factory,
|
||||
$forum_manager,
|
||||
$translation_manager,
|
||||
))
|
||||
])
|
||||
->setMethods(NULL)
|
||||
->getMock();
|
||||
|
||||
|
@ -84,29 +84,29 @@ class ForumListingBreadcrumbBuilderTest extends UnitTestCase {
|
|||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
return array(
|
||||
array(
|
||||
return [
|
||||
[
|
||||
FALSE,
|
||||
),
|
||||
array(
|
||||
],
|
||||
[
|
||||
FALSE,
|
||||
'NOT.forum.page',
|
||||
),
|
||||
array(
|
||||
],
|
||||
[
|
||||
FALSE,
|
||||
'forum.page',
|
||||
),
|
||||
array(
|
||||
],
|
||||
[
|
||||
TRUE,
|
||||
'forum.page',
|
||||
array(array('taxonomy_term', 'anything')),
|
||||
),
|
||||
array(
|
||||
[['taxonomy_term', 'anything']],
|
||||
],
|
||||
[
|
||||
TRUE,
|
||||
'forum.page',
|
||||
array(array('taxonomy_term', $mock_term)),
|
||||
),
|
||||
);
|
||||
[['taxonomy_term', $mock_term]],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -141,10 +141,10 @@ class ForumListingBreadcrumbBuilderTest extends UnitTestCase {
|
|||
$forum_manager = $this->getMock('Drupal\forum\ForumManagerInterface');
|
||||
$forum_manager->expects($this->at(0))
|
||||
->method('getParents')
|
||||
->will($this->returnValue(array($term1)));
|
||||
->will($this->returnValue([$term1]));
|
||||
$forum_manager->expects($this->at(1))
|
||||
->method('getParents')
|
||||
->will($this->returnValue(array($term1, $term2)));
|
||||
->will($this->returnValue([$term1, $term2]));
|
||||
|
||||
// The root forum.
|
||||
$prophecy = $this->prophesize('Drupal\taxonomy\VocabularyInterface');
|
||||
|
@ -156,35 +156,35 @@ class ForumListingBreadcrumbBuilderTest extends UnitTestCase {
|
|||
$vocab_storage = $this->getMock('Drupal\Core\Entity\EntityStorageInterface');
|
||||
$vocab_storage->expects($this->any())
|
||||
->method('load')
|
||||
->will($this->returnValueMap(array(
|
||||
array('forums', $prophecy->reveal()),
|
||||
)));
|
||||
->will($this->returnValueMap([
|
||||
['forums', $prophecy->reveal()],
|
||||
]));
|
||||
|
||||
$entity_manager = $this->getMockBuilder('Drupal\Core\Entity\EntityManagerInterface')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$entity_manager->expects($this->any())
|
||||
->method('getStorage')
|
||||
->will($this->returnValueMap(array(
|
||||
array('taxonomy_vocabulary', $vocab_storage),
|
||||
)));
|
||||
->will($this->returnValueMap([
|
||||
['taxonomy_vocabulary', $vocab_storage],
|
||||
]));
|
||||
|
||||
$config_factory = $this->getConfigFactoryStub(
|
||||
array(
|
||||
'forum.settings' => array(
|
||||
[
|
||||
'forum.settings' => [
|
||||
'vocabulary' => 'forums',
|
||||
),
|
||||
)
|
||||
],
|
||||
]
|
||||
);
|
||||
|
||||
// Build a breadcrumb builder to test.
|
||||
$breadcrumb_builder = $this->getMock(
|
||||
'Drupal\forum\Breadcrumb\ForumListingBreadcrumbBuilder', NULL, array(
|
||||
'Drupal\forum\Breadcrumb\ForumListingBreadcrumbBuilder', NULL, [
|
||||
$entity_manager,
|
||||
$config_factory,
|
||||
$forum_manager,
|
||||
$translation_manager,
|
||||
)
|
||||
]
|
||||
);
|
||||
|
||||
// Add a translation manager for t().
|
||||
|
@ -208,11 +208,11 @@ class ForumListingBreadcrumbBuilderTest extends UnitTestCase {
|
|||
->will($this->returnValue($forum_listing));
|
||||
|
||||
// First test.
|
||||
$expected1 = array(
|
||||
$expected1 = [
|
||||
Link::createFromRoute('Home', '<front>'),
|
||||
Link::createFromRoute('Fora_is_the_plural_of_forum', 'forum.index'),
|
||||
Link::createFromRoute('Something', 'forum.page', array('taxonomy_term' => 1)),
|
||||
);
|
||||
Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1]),
|
||||
];
|
||||
$breadcrumb = $breadcrumb_builder->build($route_match);
|
||||
$this->assertEquals($expected1, $breadcrumb->getLinks());
|
||||
$this->assertEquals(['route'], $breadcrumb->getCacheContexts());
|
||||
|
@ -220,12 +220,12 @@ class ForumListingBreadcrumbBuilderTest extends UnitTestCase {
|
|||
$this->assertEquals(Cache::PERMANENT, $breadcrumb->getCacheMaxAge());
|
||||
|
||||
// Second test.
|
||||
$expected2 = array(
|
||||
$expected2 = [
|
||||
Link::createFromRoute('Home', '<front>'),
|
||||
Link::createFromRoute('Fora_is_the_plural_of_forum', 'forum.index'),
|
||||
Link::createFromRoute('Something else', 'forum.page', array('taxonomy_term' => 2)),
|
||||
Link::createFromRoute('Something', 'forum.page', array('taxonomy_term' => 1)),
|
||||
);
|
||||
Link::createFromRoute('Something else', 'forum.page', ['taxonomy_term' => 2]),
|
||||
Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1]),
|
||||
];
|
||||
$breadcrumb = $breadcrumb_builder->build($route_match);
|
||||
$this->assertEquals($expected2, $breadcrumb->getLinks());
|
||||
$this->assertEquals(['route'], $breadcrumb->getCacheContexts());
|
||||
|
|
|
@ -41,10 +41,10 @@ class ForumNodeBreadcrumbBuilderTest extends UnitTestCase {
|
|||
* @dataProvider providerTestApplies
|
||||
* @covers ::applies
|
||||
*/
|
||||
public function testApplies($expected, $route_name = NULL, $parameter_map = array()) {
|
||||
public function testApplies($expected, $route_name = NULL, $parameter_map = []) {
|
||||
// Make some test doubles.
|
||||
$entity_manager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface');
|
||||
$config_factory = $this->getConfigFactoryStub(array());
|
||||
$config_factory = $this->getConfigFactoryStub([]);
|
||||
|
||||
$forum_manager = $this->getMock('Drupal\forum\ForumManagerInterface');
|
||||
$forum_manager->expects($this->any())
|
||||
|
@ -56,12 +56,12 @@ class ForumNodeBreadcrumbBuilderTest extends UnitTestCase {
|
|||
// Make an object to test.
|
||||
$builder = $this->getMockBuilder('Drupal\forum\Breadcrumb\ForumNodeBreadcrumbBuilder')
|
||||
->setConstructorArgs(
|
||||
array(
|
||||
[
|
||||
$entity_manager,
|
||||
$config_factory,
|
||||
$forum_manager,
|
||||
$translation_manager,
|
||||
)
|
||||
]
|
||||
)
|
||||
->setMethods(NULL)
|
||||
->getMock();
|
||||
|
@ -93,29 +93,29 @@ class ForumNodeBreadcrumbBuilderTest extends UnitTestCase {
|
|||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
return array(
|
||||
array(
|
||||
return [
|
||||
[
|
||||
FALSE,
|
||||
),
|
||||
array(
|
||||
],
|
||||
[
|
||||
FALSE,
|
||||
'NOT.entity.node.canonical',
|
||||
),
|
||||
array(
|
||||
],
|
||||
[
|
||||
FALSE,
|
||||
'entity.node.canonical',
|
||||
),
|
||||
array(
|
||||
],
|
||||
[
|
||||
FALSE,
|
||||
'entity.node.canonical',
|
||||
array(array('node', NULL)),
|
||||
),
|
||||
array(
|
||||
[['node', NULL]],
|
||||
],
|
||||
[
|
||||
TRUE,
|
||||
'entity.node.canonical',
|
||||
array(array('node', $mock_node)),
|
||||
),
|
||||
);
|
||||
[['node', $mock_node]],
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -151,10 +151,10 @@ class ForumNodeBreadcrumbBuilderTest extends UnitTestCase {
|
|||
->getMock();
|
||||
$forum_manager->expects($this->at(0))
|
||||
->method('getParents')
|
||||
->will($this->returnValue(array($term1)));
|
||||
->will($this->returnValue([$term1]));
|
||||
$forum_manager->expects($this->at(1))
|
||||
->method('getParents')
|
||||
->will($this->returnValue(array($term1, $term2)));
|
||||
->will($this->returnValue([$term1, $term2]));
|
||||
|
||||
$prophecy = $this->prophesize('Drupal\taxonomy\VocabularyInterface');
|
||||
$prophecy->label()->willReturn('Forums');
|
||||
|
@ -165,35 +165,35 @@ class ForumNodeBreadcrumbBuilderTest extends UnitTestCase {
|
|||
$vocab_storage = $this->getMock('Drupal\Core\Entity\EntityStorageInterface');
|
||||
$vocab_storage->expects($this->any())
|
||||
->method('load')
|
||||
->will($this->returnValueMap(array(
|
||||
array('forums', $prophecy->reveal()),
|
||||
)));
|
||||
->will($this->returnValueMap([
|
||||
['forums', $prophecy->reveal()],
|
||||
]));
|
||||
|
||||
$entity_manager = $this->getMockBuilder('Drupal\Core\Entity\EntityManagerInterface')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$entity_manager->expects($this->any())
|
||||
->method('getStorage')
|
||||
->will($this->returnValueMap(array(
|
||||
array('taxonomy_vocabulary', $vocab_storage),
|
||||
)));
|
||||
->will($this->returnValueMap([
|
||||
['taxonomy_vocabulary', $vocab_storage],
|
||||
]));
|
||||
|
||||
$config_factory = $this->getConfigFactoryStub(
|
||||
array(
|
||||
'forum.settings' => array(
|
||||
[
|
||||
'forum.settings' => [
|
||||
'vocabulary' => 'forums',
|
||||
),
|
||||
)
|
||||
],
|
||||
]
|
||||
);
|
||||
|
||||
// Build a breadcrumb builder to test.
|
||||
$breadcrumb_builder = $this->getMock(
|
||||
'Drupal\forum\Breadcrumb\ForumNodeBreadcrumbBuilder', NULL, array(
|
||||
'Drupal\forum\Breadcrumb\ForumNodeBreadcrumbBuilder', NULL, [
|
||||
$entity_manager,
|
||||
$config_factory,
|
||||
$forum_manager,
|
||||
$translation_manager,
|
||||
)
|
||||
]
|
||||
);
|
||||
|
||||
// Add a translation manager for t().
|
||||
|
@ -215,11 +215,11 @@ class ForumNodeBreadcrumbBuilderTest extends UnitTestCase {
|
|||
->will($this->returnValue($forum_node));
|
||||
|
||||
// First test.
|
||||
$expected1 = array(
|
||||
$expected1 = [
|
||||
Link::createFromRoute('Home', '<front>'),
|
||||
Link::createFromRoute('Forums', 'forum.index'),
|
||||
Link::createFromRoute('Something', 'forum.page', array('taxonomy_term' => 1)),
|
||||
);
|
||||
Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1]),
|
||||
];
|
||||
$breadcrumb = $breadcrumb_builder->build($route_match);
|
||||
$this->assertEquals($expected1, $breadcrumb->getLinks());
|
||||
$this->assertEquals(['route'], $breadcrumb->getCacheContexts());
|
||||
|
@ -227,12 +227,12 @@ class ForumNodeBreadcrumbBuilderTest extends UnitTestCase {
|
|||
$this->assertEquals(Cache::PERMANENT, $breadcrumb->getCacheMaxAge());
|
||||
|
||||
// Second test.
|
||||
$expected2 = array(
|
||||
$expected2 = [
|
||||
Link::createFromRoute('Home', '<front>'),
|
||||
Link::createFromRoute('Forums', 'forum.index'),
|
||||
Link::createFromRoute('Something else', 'forum.page', array('taxonomy_term' => 2)),
|
||||
Link::createFromRoute('Something', 'forum.page', array('taxonomy_term' => 1)),
|
||||
);
|
||||
Link::createFromRoute('Something else', 'forum.page', ['taxonomy_term' => 2]),
|
||||
Link::createFromRoute('Something', 'forum.page', ['taxonomy_term' => 1]),
|
||||
];
|
||||
$breadcrumb = $breadcrumb_builder->build($route_match);
|
||||
$this->assertEquals($expected2, $breadcrumb->getLinks());
|
||||
$this->assertEquals(['route'], $breadcrumb->getCacheContexts());
|
||||
|
|
|
@ -57,17 +57,17 @@ class ForumManagerTest extends UnitTestCase {
|
|||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$manager = $this->getMock('\Drupal\forum\ForumManager', array('getChildren'), array(
|
||||
$manager = $this->getMock('\Drupal\forum\ForumManager', ['getChildren'], [
|
||||
$config_factory,
|
||||
$entity_manager,
|
||||
$connection,
|
||||
$translation_manager,
|
||||
$comment_manager,
|
||||
));
|
||||
]);
|
||||
|
||||
$manager->expects($this->once())
|
||||
->method('getChildren')
|
||||
->will($this->returnValue(array()));
|
||||
->will($this->returnValue([]));
|
||||
|
||||
// Get the index once.
|
||||
$index1 = $manager->getIndex();
|
||||
|
|
Reference in a new issue