ForumPostPolicyTest.php 5.99 KB
<?php

namespace FootyRoom\Tests\Integration\ForumPost;

use FootyRoom\Core\Comment\CommentPolicy;
use FootyRoom\Core\CoreException;
use FootyRoom\Core\ForumPost\ForumPostPolicy;
use FootyRoom\Queries\Post\ForumPostQueryHandler;
use FootyRoom\User\User;
use FootyRoom\Queries\Comment\CommentQueryHandler;
use FootyRoom\Tests\TestCase;

class ForumPostPolicyTest extends TestCase
{
    public function setup()
    {
        $this->mockCommentPolicy = $this->getMockBuilder(CommentPolicy::class)
                            ->disableOriginalConstructor()
                            ->getMock();

        $this->mockCommentQueryHandler = $this->getMockBuilder(CommentQueryHandler::class)
                            ->disableOriginalConstructor()
                            ->getMock();

        $this->mockForumPostQueryHandler = $this->getMockBuilder(ForumPostQueryHandler::class)
                            ->disableOriginalConstructor()
                            ->getMock();

        $this->forumPostPolicy = new ForumPostPolicy($this->mockCommentPolicy, $this->mockForumPostQueryHandler);
    }

    public function testCanModerate()
    {
        $user = new User(['user_id' => 41301, 'status' => '', 'user_role' => 20]);
        $throwException = false;

        $result = $this->forumPostPolicy->canModerate($user, $throwException);

        $this->assertTrue($result);
    }

    public function testCanNotModerate()
    {
        $user = new User(['user_id' => 41301, 'status' => '', 'user_role' => 10]);
        $throwException = false;

        $result = $this->forumPostPolicy->canModerate($user, $throwException);

        $this->assertFalse($result);
    }

    /**
     * @expectedException        \FootyRoom\Core\AuthException
     */
    public function testCanNotModerateWithThrowException()
    {
        $user = new User(['user_id' => 41301, 'status' => '', 'user_role' => 10]);
        $throwException = true;

        $result = $this->forumPostPolicy->canModerate($user, $throwException);
    }

    public function testCanAdminister()
    {
        $user = new User(['user_id' => 41301, 'status' => '', 'user_role' => 30]);
        $throwException = false;

        $result = $this->forumPostPolicy->canAdminister($user, $throwException);

        $this->assertTrue($result);
    }

    public function testCanNotAdminister()
    {
        $user = new User(['user_id' => 41301, 'status' => '', 'user_role' => 25]);
        $throwException = false;

        $result = $this->forumPostPolicy->canAdminister($user, $throwException);

        $this->assertFalse($result);
    }

    /**
     * @expectedException        \FootyRoom\Core\AuthException
     */
    public function testCanNotAdministerWithThrowException()
    {
        $user = new User(['user_id' => 41301, 'status' => '', 'user_role' => 25]);
        $throwException = true;

        $result = $this->forumPostPolicy->canAdminister($user, $throwException);
    }

    public function testCanPost()
    {
        $user = new User(['user_id' => 41301, 'status' => '']);
        $throwException = false;

        $this->mockCommentPolicy->method('canComment')
                                ->will($this->returnValue(true));

        $result = $this->forumPostPolicy->canPost($user, $throwException);

        $this->assertTrue($result);
    }

    /**
     * @expectedException        \FootyRoom\Core\CoreException
     */
    public function testCanNotPostAndThrowException()
    {
        $user = new User(['user_id' => 41301, 'status' => '']);
        $throwException = false;

        $this->mockCommentPolicy->method('canComment')
                                ->will($this->throwException(new CoreException()));

        $result = $this->forumPostPolicy->canPost($user, $throwException);
    }

    public function testCanComment()
    {
        $user = new User(['user_id' => 41301, 'status' => '']);
        $throwException = false;

        $this->mockCommentPolicy->method('canComment')
                                ->will($this->returnValue(true));

        $result = $this->forumPostPolicy->canComment($user, 'Hello there', $throwException);

        $this->assertTrue($result);
    }

    public function testNewbornCannotCommentWithLinks()
    {
        $user = new User(['user_id' => 41301, 'status' => 'newborn']);
        $throwException = false;

        $result = $this->forumPostPolicy->canComment($user, 'Hello there http://footyroom.com', $throwException);

        $this->assertFalse($result);
    }

    public function testUserCanPostInAnyExceptFootyroomBlog()
    {
        $userRole = 10;
        $categorySlug = 'test';

        $result = $this->forumPostPolicy->canPostIn($userRole, $categorySlug);

        $this->assertTrue($result);
    }

    public function testUserCanNotPostInFootyroomBlog()
    {
        $userRole = 10;
        $categorySlug = 'footyroom-blog';

        $result = $this->forumPostPolicy->canPostIn($userRole, $categorySlug);

        $this->assertFalse($result);
    }

    public function testModeratorCanNotPostInFootyroomBlog()
    {
        $userRole = 20;
        $categorySlug = 'footyroom-blog';

        $result = $this->forumPostPolicy->canPostIn($userRole, $categorySlug);

        $this->assertFalse($result);
    }

    public function testOnlyAdminCanPostInFootyroomBlog()
    {
        $userRole = 30;
        $categorySlug = 'footyroom-blog';

        $result = $this->forumPostPolicy->canPostIn($userRole, $categorySlug);

        $this->assertTrue($result);
    }

    public function testSuperModeratorCanSeeUnpublished()
    {
        $userRole = 25;

        $result = $this->forumPostPolicy->seeUnpublished($userRole);

        $this->assertTrue($result);
    }

    public function testModeratorCanNotSeeUnpublished()
    {
        $userRole = 20;

        $result = $this->forumPostPolicy->seeUnpublished($userRole);

        $this->assertFalse($result);
    }

    public function testUserCanNotSeeUnpublished()
    {
        $userRole = 10;

        $result = $this->forumPostPolicy->seeUnpublished($userRole);

        $this->assertFalse($result);
    }
}