silverstripe-comments/tests/CommentsExtensionTest.php

468 lines
15 KiB
PHP
Raw Normal View History

<?php
namespace SilverStripe\Comments\Tests;
use SilverStripe\Comments\Extensions\CommentsExtension;
use SilverStripe\Comments\Model\Comment;
use SilverStripe\Comments\Tests\CommentTestHelper;
use SilverStripe\Comments\Tests\Stubs\CommentableItem;
use SilverStripe\Comments\Tests\Stubs\CommentableItemDisabled;
use SilverStripe\Comments\Tests\Stubs\CommentableItemEnabled;
use SilverStripe\Core\Config\Config;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\Security\Member;
use SilverStripe\View\Requirements;
2016-02-19 01:48:25 +01:00
class CommentsExtensionTest extends SapphireTest
{
/**
* {@inheritDoc}
*/
2017-09-18 04:16:24 +02:00
protected static $fixture_file = 'CommentsTest.yml';
/**
* {@inheritDoc}
*/
2017-09-14 00:28:29 +02:00
protected static $extra_dataobjects = array(
CommentableItem::class,
CommentableItemEnabled::class,
CommentableItemDisabled::class
);
2016-02-19 01:48:25 +01:00
public function setUp()
{
parent::setUp();
Config::nest();
// Set good default values
2017-09-18 04:16:24 +02:00
Config::modify()->set(CommentsExtension::class, 'comments', array(
'enabled' => true,
'enabled_cms' => false,
'require_login' => false,
'require_login_cms' => false,
'required_permission' => false,
'require_moderation_nonmembers' => false,
'require_moderation' => false,
'require_moderation_cms' => false,
'frontend_moderation' => false,
'Member' => false,
));
$this->requiredExtensions = array(
'CommentableItem' => CommentsExtension::class
);
// Configure this dataobject
2017-09-18 04:16:24 +02:00
Config::modify()->set(CommentableItem::class, 'comments', array(
'enabled_cms' => true
));
}
2016-02-19 01:48:25 +01:00
public function tearDown()
{
Config::unnest();
parent::tearDown();
}
2017-09-18 04:16:24 +02:00
public function testGetCommentsOption()
{
Config::modify()->set(CommentableItem::class, 'comments', [
'comments_holder_id' => 'some-option'
]);
$item = $this->objFromFixture(CommentableItem::class, 'first');
$this->assertEquals('some-option', $item->getCommentsOption('comments_holder_id'));
}
2016-02-19 01:48:25 +01:00
public function testPopulateDefaults()
{
2017-09-18 04:16:24 +02:00
Config::modify()->set(CommentableItem::class, 'comments', array(
2017-09-14 01:12:07 +02:00
'require_moderation_cms' => true,
'require_moderation' => true,
'require_moderation_nonmembers' => true
));
$item = $this->objFromFixture(CommentableItem::class, 'first');
$item->populateDefaults();
$this->assertTrue($item->CommentsRequireLogin);
2017-09-18 04:16:24 +02:00
Config::modify()->set(CommentableItem::class, 'comments', array(
2017-09-14 01:12:07 +02:00
'require_moderation_cms' => true,
'require_moderation' => true,
'require_moderation_nonmembers' => true
));
$item = $this->objFromFixture(CommentableItem::class, 'first');
$item->populateDefaults();
$this->assertFalse($item->CommentsRequireLogin);
2016-02-19 01:48:25 +01:00
}
2016-02-19 01:48:25 +01:00
public function testUpdateSettingsFields()
{
$this->markTestSkipped('This needs SiteTree installed');
2016-02-19 01:48:25 +01:00
}
2016-02-19 01:48:25 +01:00
public function testGetModerationRequired()
{
// the 3 options take precedence in this order, executed if true
2017-09-18 04:16:24 +02:00
Config::modify()->set(CommentableItem::class, 'comments', array(
'require_moderation_cms' => true,
'require_moderation' => true,
'require_moderation_nonmembers' => true
));
// With require moderation CMS set to true, the value of the field
// 'ModerationRequired' is returned
$item = $this->objFromFixture(CommentableItem::class, 'first');
$item->ModerationRequired = 'None';
2017-09-14 01:12:07 +02:00
$item->write();
$this->assertEquals('None', $item->getModerationRequired());
$item->ModerationRequired = 'Required';
2017-09-14 01:12:07 +02:00
$item->write();
$this->assertEquals('Required', $item->getModerationRequired());
2017-09-14 01:12:07 +02:00
$item->ModerationRequired = 'NonMembersOnly';
2017-09-14 01:12:07 +02:00
$item->write();
$this->assertEquals('NonMembersOnly', $item->getModerationRequired());
2017-09-18 04:16:24 +02:00
Config::modify()->set(CommentableItem::class, 'comments', array(
'require_moderation_cms' => false,
'require_moderation' => true,
'require_moderation_nonmembers' => true
));
$this->assertEquals('Required', $item->getModerationRequired());
2017-09-18 04:16:24 +02:00
Config::modify()->set(CommentableItem::class, 'comments', array(
'require_moderation_cms' => false,
'require_moderation' => false,
'require_moderation_nonmembers' => true
));
$this->assertEquals('NonMembersOnly', $item->getModerationRequired());
2017-09-18 04:16:24 +02:00
Config::modify()->set(CommentableItem::class, 'comments', array(
'require_moderation_cms' => false,
'require_moderation' => false,
'require_moderation_nonmembers' => false
));
$this->assertEquals('None', $item->getModerationRequired());
2016-02-19 01:48:25 +01:00
}
2016-02-19 01:48:25 +01:00
public function testGetCommentsRequireLogin()
{
2017-09-18 04:16:24 +02:00
Config::modify()->set(CommentableItem::class, 'comments', array(
'require_login_cms' => true
));
// With require moderation CMS set to true, the value of the field
// 'ModerationRequired' is returned
$item = $this->objFromFixture(CommentableItem::class, 'first');
$item->CommentsRequireLogin = true;
$this->assertTrue($item->getCommentsRequireLogin());
$item->CommentsRequireLogin = false;
$this->assertFalse($item->getCommentsRequireLogin());
2017-09-18 04:16:24 +02:00
Config::modify()->set(CommentableItem::class, 'comments', array(
'require_login_cms' => false,
'require_login' => false
));
$this->assertFalse($item->getCommentsRequireLogin());
2017-09-18 04:16:24 +02:00
Config::modify()->set(CommentableItem::class, 'comments', array(
'require_login_cms' => false,
'require_login' => true
));
$this->assertTrue($item->getCommentsRequireLogin());
2016-02-19 01:48:25 +01:00
}
2016-02-19 01:48:25 +01:00
public function testAllComments()
{
2017-09-14 01:12:07 +02:00
$item = $this->objFromFixture(CommentableItem::class, 'first');
2017-09-18 04:16:24 +02:00
$this->assertEquals(4, $item->AllComments()->count());
2016-02-19 01:48:25 +01:00
}
2016-02-19 01:48:25 +01:00
public function testAllVisibleComments()
{
2017-09-14 01:12:07 +02:00
if (Member::currentUser()) {
Member::currentUser()->logOut();
}
$item = $this->objFromFixture(CommentableItem::class, 'second');
2017-09-18 04:16:24 +02:00
$this->assertEquals(4, $item->AllVisibleComments()->count());
2016-02-19 01:48:25 +01:00
}
2016-02-19 01:48:25 +01:00
public function testComments()
{
2017-09-18 04:16:24 +02:00
Config::modify()->set(CommentableItem::class, 'comments', array(
2017-09-14 01:12:07 +02:00
'nested_comments' => false
));
$item = $this->objFromFixture(CommentableItem::class, 'first');
2017-09-18 04:16:24 +02:00
$this->assertEquals(4, $item->Comments()->count());
2017-09-14 01:12:07 +02:00
2017-09-18 04:16:24 +02:00
Config::modify()->set(CommentableItem::class, 'comments', array(
2017-09-14 01:12:07 +02:00
'nested_comments' => true
));
2017-09-18 04:16:24 +02:00
$this->assertEquals(1, $item->Comments()->count());
2016-02-19 01:48:25 +01:00
}
2016-02-19 01:48:25 +01:00
public function testGetCommentsEnabled()
{
2017-09-18 04:16:24 +02:00
Config::modify()->set(CommentableItem::class, 'comments', array(
2017-09-14 01:12:07 +02:00
'enabled_cms' => true
));
$item = $this->objFromFixture(CommentableItem::class, 'first');
$this->assertTrue($item->getCommentsEnabled());
$item->ProvideComments = 0;
$this->assertFalse($item->getCommentsEnabled());
2016-02-19 01:48:25 +01:00
}
2016-02-19 01:48:25 +01:00
public function testGetCommentHolderID()
{
$item = $this->objFromFixture(CommentableItem::class, 'first');
2017-09-18 04:16:24 +02:00
Config::modify()->set(CommentableItem::class, 'comments', array(
'comments_holder_id' => 'commentid_test1',
));
$this->assertEquals('commentid_test1', $item->getCommentHolderID());
2017-09-18 04:16:24 +02:00
Config::modify()->set(CommentableItem::class, 'comments', array(
'comments_holder_id' => 'commtentid_test_another',
));
$this->assertEquals('commtentid_test_another', $item->getCommentHolderID());
2016-02-19 01:48:25 +01:00
}
2016-02-19 01:48:25 +01:00
public function testGetPostingRequiredPermission()
{
$this->markTestSkipped('TODO');
}
2016-02-19 01:48:25 +01:00
public function testCanModerateComments()
{
// ensure nobody logged in
2016-02-19 01:48:25 +01:00
if (Member::currentUser()) {
Member::currentUser()->logOut();
}
$item = $this->objFromFixture(CommentableItem::class, 'first');
$this->assertFalse($item->canModerateComments());
$this->logInWithPermission('CMS_ACCESS_CommentAdmin');
$this->assertTrue($item->canModerateComments());
2016-02-19 01:48:25 +01:00
}
2016-02-19 01:48:25 +01:00
public function testGetCommentRSSLink()
{
2017-09-18 04:16:24 +02:00
Config::modify()->set('SilverStripe\\Control\\Director', 'alternate_base_url', 'http://unittesting.local');
$item = $this->objFromFixture(CommentableItem::class, 'first');
2016-02-19 01:48:25 +01:00
$link = $item->getCommentRSSLink();
$this->assertEquals('http://unittesting.local/comments/rss', $link);
2016-02-19 01:48:25 +01:00
}
2016-02-19 01:48:25 +01:00
public function testGetCommentRSSLinkPage()
{
2017-09-18 04:16:24 +02:00
Config::modify()->set('SilverStripe\\Control\\Director', 'alternate_base_url', 'http://unittesting.local');
$item = $this->objFromFixture(CommentableItem::class, 'first');
$page = $item->getCommentRSSLinkPage();
$this->assertEquals(
'http://unittesting.local/comments/rss/SilverStripe-Comments-Tests-Stubs-CommentableItem/' . $item->ID,
$page
);
2016-02-19 01:48:25 +01:00
}
2016-02-19 01:48:25 +01:00
public function testCommentsForm()
{
2017-09-18 04:16:24 +02:00
Config::modify()->set(CommentableItem::class, 'comments', array(
2017-09-14 01:12:07 +02:00
'include_js' => false,
'comments_holder_id' => 'comments-holder',
));
$item = $this->objFromFixture(CommentableItem::class, 'first');
// The comments form is HTML to do assertions by contains
$cf = $item->CommentsForm();
2017-09-14 01:12:07 +02:00
$expected = '<form id="comments-holder" action="/comments'
. '/CommentsForm/" method="post" enctype="application/x-www-form-urlenco'
. 'ded">';
2017-09-14 01:12:07 +02:00
$this->assertContains($expected, $cf);
$this->assertContains('<h4>Post your comment</h4>', $cf);
// check the comments form exists
2017-09-18 04:16:24 +02:00
$expected = '<input type="text" name="Name"';
$this->assertContains($expected, $cf);
2017-09-18 04:16:24 +02:00
$expected = '<input type="email" name="Email"';
$this->assertContains($expected, $cf);
2017-09-18 04:16:24 +02:00
$expected = '<input type="text" name="URL"';
$this->assertContains($expected, $cf);
2017-09-18 04:16:24 +02:00
$expected = '<input type="hidden" name="ParentID"';
$this->assertContains($expected, $cf);
2017-09-18 04:16:24 +02:00
$expected = '<textarea name="Comment"';
$this->assertContains($expected, $cf);
2017-09-14 01:12:07 +02:00
$expected = '<input type="submit" name="action_doPostComment" value="Post" class="action" id="comments-holder_action_doPostComment"';
$this->assertContains($expected, $cf);
$expected = '<a href="/comments/spam/';
$this->assertContains($expected, $cf);
$expected = '<p>Reply to firstComA 1</p>';
$this->assertContains($expected, $cf);
$expected = '<a href="/comments/delete';
$this->assertContains($expected, $cf);
$expected = '<p>Reply to firstComA 2</p>';
$this->assertContains($expected, $cf);
$expected = '<p>Reply to firstComA 3</p>';
$this->assertContains($expected, $cf);
2016-02-19 01:48:25 +01:00
}
2016-02-19 01:48:25 +01:00
public function testAttachedToSiteTree()
{
$this->markTestSkipped('TODO');
}
2016-02-19 01:48:25 +01:00
public function testPagedComments()
{
$item = $this->objFromFixture(CommentableItem::class, 'first');
// Ensure Created times are set, as order not guaranteed if all set to 0
$comments = $item->PagedComments()->sort('ID');
$ctr = 0;
$timeBase = time()-10000;
foreach ($comments as $comment) {
$comment->Created = $timeBase + $ctr * 1000;
$comment->write();
$ctr++;
}
$results = $item->PagedComments()->toArray();
foreach ($results as $result) {
2016-02-19 01:48:25 +01:00
$result->sourceQueryParams = null;
}
$this->assertEquals(
$this->objFromFixture(Comment::class, 'firstComA')->Comment,
$results[3]->Comment
);
$this->assertEquals(
$this->objFromFixture(Comment::class, 'firstComAChild1')->Comment,
$results[2]->Comment
);
$this->assertEquals(
$this->objFromFixture(Comment::class, 'firstComAChild2')->Comment,
$results[1]->Comment
);
$this->assertEquals(
$this->objFromFixture(Comment::class, 'firstComAChild3')->Comment,
$results[0]->Comment
);
$this->assertEquals(4, sizeof($results));
2016-02-19 01:48:25 +01:00
}
2016-02-19 01:48:25 +01:00
public function testUpdateModerationFields()
{
$this->markTestSkipped('TODO');
}
2016-02-19 01:48:25 +01:00
public function testUpdateCMSFields()
{
2017-09-18 04:16:24 +02:00
Config::modify()->set(
CommentableItem::class,
'comments',
array(
'require_login_cms' => false
)
);
$this->logInWithPermission('ADMIN');
$item = $this->objFromFixture(CommentableItem::class, 'first');
$item->ProvideComments = true;
$item->write();
$fields = $item->getCMSFields();
CommentTestHelper::assertFieldsForTab(
$this,
2017-09-18 04:16:24 +02:00
'Comments.CommentsNewCommentsTab',
array('NewComments'),
$fields
);
CommentTestHelper::assertFieldsForTab(
$this,
2017-09-18 04:16:24 +02:00
'Comments.CommentsCommentsTab',
array('ApprovedComments'),
$fields
);
CommentTestHelper::assertFieldsForTab(
$this,
2017-09-18 04:16:24 +02:00
'Comments.CommentsSpamCommentsTab',
array('SpamComments'),
$fields
);
2017-09-18 04:16:24 +02:00
Config::modify()->set(
CommentableItem::class,
'comments',
array(
'require_login_cms' => true
)
);
$fields = $item->getCMSFields();
CommentTestHelper::assertFieldsForTab($this, 'Root.Settings', array('Comments'), $fields);
$settingsTab = $fields->findOrMakeTab('Root.Settings');
$settingsChildren = $settingsTab->getChildren();
$this->assertEquals(1, $settingsChildren->count());
$fieldGroup = $settingsChildren->first();
$fields = $fieldGroup->getChildren();
CommentTestHelper::assertFieldNames(
$this,
array('ProvideComments', 'CommentsRequireLogin'),
$fields
);
2017-09-18 04:16:24 +02:00
Config::modify()->set(
CommentableItem::class,
'comments',
array(
'require_login_cms' => true,
'require_moderation_cms' => true
)
);
$fields = $item->getCMSFields();
CommentTestHelper::assertFieldsForTab(
$this,
'Root.Settings',
array('Comments', 'ModerationRequired'),
$fields
);
$settingsTab = $fields->findOrMakeTab('Root.Settings');
$settingsChildren = $settingsTab->getChildren();
$this->assertEquals(2, $settingsChildren->count());
$fieldGroup = $settingsChildren->first();
$fields = $fieldGroup->getChildren();
CommentTestHelper::assertFieldNames(
$this,
array('ProvideComments', 'CommentsRequireLogin'),
$fields
);
2016-02-19 01:48:25 +01:00
}
}