silverstripe-blog/tests/BlogTest.php

362 lines
13 KiB
PHP
Raw Normal View History

2013-10-10 00:09:28 +02:00
<?php
use SilverStripe\Blog\Model\BlogController;
use SilverStripe\CMS\Controllers\ContentController;
use SilverStripe\Control\Controller;
use SilverStripe\Control\Director;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Core\Config\Config;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\ORM\DataModel;
use SilverStripe\ORM\FieldType\DBDatetime;
use SilverStripe\ORM\SS_List;
use SilverStripe\Security\Member;
2015-05-09 16:33:12 +02:00
/**
* @mixin PHPUnit_Framework_TestCase
*/
2015-11-21 07:17:29 +01:00
class BlogTest extends SapphireTest
{
/**
* @var string
*/
public static $fixture_file = 'blog.yml';
2015-05-09 16:33:12 +02:00
2015-11-21 07:17:29 +01:00
/**
* {@inheritdoc}
*/
public function setUp()
{
parent::setUp();
2015-05-09 16:33:12 +02:00
2015-11-21 07:17:29 +01:00
Config::nest();
DBDatetime::set_mock_now('2013-10-10 20:00:00');
2015-05-09 16:33:12 +02:00
2015-11-21 07:17:29 +01:00
/**
* @var Blog $blog
*/
$blog = $this->objFromFixture('SilverStripe\\Blog\\Model\\Blog', 'FirstBlog');
2015-05-09 16:33:12 +02:00
2015-11-21 07:17:29 +01:00
$blog->publish('Stage', 'Live');
}
2015-02-08 08:03:55 +01:00
2015-11-21 07:17:29 +01:00
/**
* {@inheritdoc}
*/
public function tearDown()
{
DBDatetime::clear_mock_now();
2015-11-21 07:17:29 +01:00
Config::unnest();
2015-05-09 16:33:12 +02:00
2015-11-21 07:17:29 +01:00
parent::tearDown();
}
2015-05-09 16:33:12 +02:00
2015-11-21 07:17:29 +01:00
public function testGetExcludedSiteTreeClassNames()
{
$member = Member::currentUser();
2013-10-10 00:09:28 +02:00
2015-11-21 07:17:29 +01:00
if ($member) {
$member->logout();
}
2013-10-10 00:09:28 +02:00
2015-11-21 07:17:29 +01:00
/**
* @var Blog $blog
*/
$blog = $this->objFromFixture('SilverStripe\\Blog\\Model\\Blog', 'FirstBlog');
2013-10-10 00:09:28 +02:00
Config::inst()->update('SilverStripe\\Blog\\Model\\BlogPost', 'show_in_sitetree', true);
2015-11-21 07:17:29 +01:00
$classes = $blog->getExcludedSiteTreeClassNames();
2013-10-10 00:09:28 +02:00
$this->assertNotContains('SilverStripe\\Blog\\Model\\BlogPost', $classes, 'BlogPost class should be hidden.');
2015-05-09 16:33:12 +02:00
Config::inst()->update('SilverStripe\\Blog\\Model\\BlogPost', 'show_in_sitetree', false);
2015-11-21 07:17:29 +01:00
$classes = $blog->getExcludedSiteTreeClassNames();
2013-10-10 00:09:28 +02:00
$this->assertContains('SilverStripe\\Blog\\Model\\BlogPost', $classes, 'BlogPost class should be hidden.');
2015-11-21 07:17:29 +01:00
}
2013-10-10 00:09:28 +02:00
2015-11-21 07:17:29 +01:00
public function testGetArchivedBlogPosts()
{
$member = Member::currentUser();
2013-10-10 00:09:28 +02:00
2015-11-21 07:17:29 +01:00
if ($member) {
$member->logout();
}
2015-05-09 16:33:12 +02:00
2015-11-21 07:17:29 +01:00
/**
* @var Blog $blog
*/
$blog = $this->objFromFixture('SilverStripe\\Blog\\Model\\Blog', 'FirstBlog');
2013-10-10 00:09:28 +02:00
2015-11-21 07:17:29 +01:00
$archive = $blog->getArchivedBlogPosts(2013);
2013-10-10 00:09:28 +02:00
2015-11-21 07:17:29 +01:00
$this->assertEquals(2, $archive->count(), 'Incorrect Yearly Archive count for 2013');
$this->assertEquals('First Post', $archive->first()->Title, 'Incorrect First Blog post');
$this->assertEquals('Second Post', $archive->last()->Title, 'Incorrect Last Blog post');
2015-05-09 16:33:12 +02:00
2015-11-21 07:17:29 +01:00
$archive = $blog->getArchivedBlogPosts(2013, 10);
2013-10-10 00:09:28 +02:00
2015-11-21 07:17:29 +01:00
$this->assertEquals(1, $archive->count(), 'Incorrect monthly archive count.');
2015-05-09 16:33:12 +02:00
2015-11-21 07:17:29 +01:00
$archive = $blog->getArchivedBlogPosts(2013, 10, 01);
2013-10-10 00:09:28 +02:00
2015-11-21 07:17:29 +01:00
$this->assertEquals(1, $archive->count(), 'Incorrect daily archive count.');
}
2015-11-21 07:17:29 +01:00
public function testArchiveLinks()
{
/**
* @var Blog $blog
*/
$blog = $this->objFromFixture('SilverStripe\\Blog\\Model\\Blog', 'FirstBlog');
2015-05-09 16:33:12 +02:00
2015-11-21 07:17:29 +01:00
$link = Controller::join_links($blog->Link('archive'), '2013', '10', '01');
2015-05-09 16:33:12 +02:00
2015-11-21 07:17:29 +01:00
$this->assertEquals(200, $this->getStatusOf($link), 'HTTP Status should be 200');
2015-05-09 16:33:12 +02:00
2015-11-21 07:17:29 +01:00
$link = Controller::join_links($blog->Link('archive'), '2013', '10');
2015-11-21 07:17:29 +01:00
$this->assertEquals(200, $this->getStatusOf($link), 'HTTP Status should be 200');
2015-11-21 07:17:29 +01:00
$link = Controller::join_links($blog->Link('archive'), '2013');
2015-11-21 07:17:29 +01:00
$this->assertEquals(200, $this->getStatusOf($link), 'HTTP Status should be 200');
2015-11-21 07:17:29 +01:00
$link = Controller::join_links($blog->Link('archive'), '2011', '10', '01');
2015-11-21 07:17:29 +01:00
$this->assertEquals(200, $this->getStatusOf($link), 'HTTP Status should be 200');
2015-11-21 07:17:29 +01:00
$link = Controller::join_links($blog->Link('archive'));
$this->assertEquals(200, $this->getStatusOf($link), 'HTTP Status should be 200');
2015-11-21 07:17:29 +01:00
$link = Controller::join_links($blog->Link('archive'), 'invalid-year');
2015-11-21 07:17:29 +01:00
$this->assertEquals(404, $this->getStatusOf($link), 'HTTP Status should be 404');
$link = Controller::join_links($blog->Link('archive'), '2013', '99');
$this->assertEquals(404, $this->getStatusOf($link), 'HTTP Status should be 404');
$link = Controller::join_links($blog->Link('archive'), '2013', '10', '99');
$this->assertEquals(404, $this->getStatusOf($link), 'HTTP Status should be 404');
}
/*
* Test archive year
*/
public function testArchiveYear()
{
$blog = $this->objFromFixture('SilverStripe\\Blog\\Model\\Blog', 'FirstBlog');
$controller = new BlogController($blog);
2015-11-21 07:17:29 +01:00
$this->requestURL($controller, 'first-post/archive/');
$this->assertEquals(2013, $controller->getArchiveYear(), 'getArchiveYear should return 2013');
}
/**
* @param string $link
*
* @return int
*/
protected function getStatusOf($link)
{
return Director::test($link)->getStatusCode();
}
public function testRoles()
{
/**
* @var Blog $firstBlog
*/
$firstBlog = $this->objFromFixture('SilverStripe\\Blog\\Model\\Blog', 'FirstBlog');
2015-11-21 07:17:29 +01:00
/**
* @var Blog $fourthBlog
*/
$fourthBlog = $this->objFromFixture('SilverStripe\\Blog\\Model\\Blog', 'FourthBlog');
2015-11-21 07:17:29 +01:00
/**
* @var BlogPost $postA
*/
$postA = $this->objFromFixture('SilverStripe\\Blog\\Model\\BlogPost', 'PostA');
2015-11-21 07:17:29 +01:00
/**
* @var BlogPost $postB
*/
$postB = $this->objFromFixture('SilverStripe\\Blog\\Model\\BlogPost', 'PostB');
2015-11-21 07:17:29 +01:00
/**
* @var BlogPost $postC
*/
$postC = $this->objFromFixture('SilverStripe\\Blog\\Model\\BlogPost', 'PostC');
2015-11-21 07:17:29 +01:00
/**
* @var Member $editor
*/
$editor = $this->objFromFixture('SilverStripe\\Security\\Member', 'BlogEditor');
2015-11-21 07:17:29 +01:00
/**
* @var Member $writer
*/
$writer = $this->objFromFixture('SilverStripe\\Security\\Member', 'Writer');
2015-11-21 07:17:29 +01:00
/**
* @var Member $contributor
*/
$contributor = $this->objFromFixture('SilverStripe\\Security\\Member', 'Contributor');
2015-11-21 07:17:29 +01:00
/**
* @var Member $visitor
*/
$visitor = $this->objFromFixture('SilverStripe\\Security\\Member', 'Visitor');
2015-11-21 07:17:29 +01:00
$this->assertEquals('Editor', $fourthBlog->RoleOf($editor));
$this->assertEquals('Contributor', $fourthBlog->RoleOf($contributor));
$this->assertEquals('Writer', $fourthBlog->RoleOf($writer));
$this->assertEmpty($fourthBlog->RoleOf($visitor));
$this->assertEquals('Author', $postA->RoleOf($writer));
$this->assertEquals('Author', $postA->RoleOf($contributor));
$this->assertEquals('Editor', $postA->RoleOf($editor));
$this->assertEmpty($postA->RoleOf($visitor));
// Test RoleOf with string values given
$this->assertEquals('Editor', $fourthBlog->RoleOf((string)(int)$editor->ID));
$this->assertEquals('Contributor', $fourthBlog->RoleOf((string)(int)$contributor->ID));
$this->assertEquals('Writer', $fourthBlog->RoleOf((string)(int)$writer->ID));
$this->assertEmpty($fourthBlog->RoleOf((string)(int)$visitor->ID));
$this->assertEquals('Author', $postA->RoleOf((string)(int)$writer->ID));
$this->assertEquals('Author', $postA->RoleOf((string)(int)$contributor->ID));
$this->assertEquals('Editor', $postA->RoleOf((string)(int)$editor->ID));
$this->assertEmpty($postA->RoleOf((string)(int)$visitor->ID));
// Test RoleOf with int values given
$this->assertEquals('Editor', $fourthBlog->RoleOf((int)$editor->ID));
$this->assertEquals('Contributor', $fourthBlog->RoleOf((int)$contributor->ID));
$this->assertEquals('Writer', $fourthBlog->RoleOf((int)$writer->ID));
$this->assertEmpty($fourthBlog->RoleOf((int)$visitor->ID));
$this->assertEquals('Author', $postA->RoleOf((int)$writer->ID));
$this->assertEquals('Author', $postA->RoleOf((int)$contributor->ID));
$this->assertEquals('Editor', $postA->RoleOf((int)$editor->ID));
$this->assertEmpty($postA->RoleOf((int)$visitor->ID));
$this->assertTrue($fourthBlog->canEdit($editor));
$this->assertFalse($firstBlog->canEdit($editor));
$this->assertTrue($fourthBlog->canAddChildren($editor));
$this->assertFalse($firstBlog->canAddChildren($editor));
$this->assertTrue($postA->canEdit($editor));
$this->assertTrue($postB->canEdit($editor));
$this->assertTrue($postC->canEdit($editor));
$this->assertTrue($postA->canPublish($editor));
$this->assertTrue($postB->canPublish($editor));
$this->assertTrue($postC->canPublish($editor));
$this->assertFalse($fourthBlog->canEdit($writer));
$this->assertFalse($firstBlog->canEdit($writer));
$this->assertTrue($fourthBlog->canAddChildren($writer));
$this->assertFalse($firstBlog->canAddChildren($writer));
$this->assertTrue($postA->canEdit($writer));
$this->assertFalse($postB->canEdit($writer));
$this->assertTrue($postC->canEdit($writer));
$this->assertTrue($postA->canPublish($writer));
$this->assertFalse($postB->canPublish($writer));
$this->assertTrue($postC->canPublish($writer));
$this->assertFalse($fourthBlog->canEdit($contributor));
$this->assertFalse($firstBlog->canEdit($contributor));
$this->assertTrue($fourthBlog->canAddChildren($contributor));
$this->assertFalse($firstBlog->canAddChildren($contributor));
$this->assertTrue($postA->canEdit($contributor));
$this->assertFalse($postB->canEdit($contributor));
$this->assertTrue($postC->canEdit($contributor));
$this->assertFalse($postA->canPublish($contributor));
$this->assertFalse($postB->canPublish($contributor));
$this->assertFalse($postC->canPublish($contributor));
$this->assertFalse($fourthBlog->canEdit($visitor));
$this->assertFalse($firstBlog->canEdit($visitor));
$this->assertFalse($fourthBlog->canAddChildren($visitor));
$this->assertFalse($firstBlog->canAddChildren($visitor));
$this->assertFalse($postA->canEdit($visitor));
$this->assertFalse($postB->canEdit($visitor));
$this->assertFalse($postC->canEdit($visitor));
$this->assertFalse($postA->canPublish($visitor));
$this->assertFalse($postB->canPublish($visitor));
$this->assertFalse($postC->canPublish($visitor));
}
public function testFilteredCategories()
{
$blog = $this->objFromFixture('SilverStripe\\Blog\\Model\\Blog', 'FirstBlog');
$controller = new BlogController($blog);
2015-11-21 07:17:29 +01:00
// Root url
$this->requestURL($controller, 'first-post');
$this->assertIDsEquals(
$blog->AllChildren()->column('ID'),
$controller->PaginatedList()->column('ID')
);
// RSS
$this->requestURL($controller, 'first-post/rss');
$this->assertIDsEquals(
$blog->AllChildren()->column('ID'),
$controller->PaginatedList()->column('ID')
);
// Posts
$firstPostID = $this->idFromFixture('SilverStripe\\Blog\\Model\\BlogPost', 'FirstBlogPost');
$secondPostID = $this->idFromFixture('SilverStripe\\Blog\\Model\\BlogPost', 'SecondBlogPost');
$firstFuturePostID = $this->idFromFixture('SilverStripe\\Blog\\Model\\BlogPost', 'FirstFutureBlogPost');
$secondFuturePostID = $this->idFromFixture('SilverStripe\\Blog\\Model\\BlogPost', 'SecondFutureBlogPost');
2015-11-21 07:17:29 +01:00
// Request first tag
$this->requestURL($controller, 'first-post/tag/first-tag');
$this->assertIDsEquals(
array($firstPostID, $firstFuturePostID, $secondFuturePostID),
$controller->PaginatedList()
);
// Request 2013 posts
$this->requestURL($controller, 'first-post/archive/2013');
$this->assertIDsEquals(
array($firstPostID, $secondPostID, $secondFuturePostID),
$controller->PaginatedList()
);
}
/**
* Mock a request against a given controller
*
* @param ContentController $controller
* @param string $url
*/
protected function requestURL(ContentController $controller, $url)
{
$request = new HTTPRequest('get', $url);
2015-11-21 07:17:29 +01:00
$request->match('$URLSegment//$Action/$ID/$OtherID');
$request->shift();
$controller->init();
$controller->handleRequest($request, new DataModel());
}
/**
* Assert these id lists match
*
* @param array|SS_List $left
* @param array|SS_List $right
*/
protected function assertIDsEquals($left, $right)
{
if ($left instanceof SS_List) {
$left = $left->column('ID');
}
if ($right instanceof SS_List) {
$right = $right->column('ID');
}
asort($left);
asort($right);
$this->assertEquals(array_values($left), array_values($right));
}
2015-05-09 16:33:12 +02:00
}