Completed
Push — master ( c0b10e...49744a )
by Daniel
09:58
created

tests/BlogPostTest.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace SilverStripe\Blog\Tests;
4
5
use SilverStripe\Blog\Model\BlogPost;
6
use SilverStripe\Core\Config\Config;
7
use SilverStripe\Dev\SapphireTest;
8
use SilverStripe\ORM\FieldType\DBDatetime;
9
use SilverStripe\Security\Member;
10
11
class BlogPostTest extends SapphireTest
12
{
13
    /**
14
     * {@inheritDoc}
15
     * @var string
16
     */
17
    protected static $fixture_file = 'blog.yml';
18
19
    /**
20
     * {@inheritdoc}
21
     */
22
    public function tearDown()
23
    {
24
        DBDatetime::clear_mock_now();
25
        parent::tearDown();
26
    }
27
28
    /**
29
     * @dataProvider canViewProvider
30
     */
31
    public function testCanView($date, $user, $page, $canView)
32
    {
33
        $userRecord = $this->objFromFixture(Member::class, $user);
34
        $pageRecord = $this->objFromFixture(BlogPost::class, $page);
35
        DBDatetime::set_mock_now($date);
36
        $this->assertEquals($canView, $pageRecord->canView($userRecord));
37
    }
38
39
    /**
40
     * @return array
41
     */
42
    public function canViewProvider()
43
    {
44
        $someFutureDate = '2013-10-10 20:00:00';
45
        $somePastDate = '2009-10-10 20:00:00';
46
        return [
47
            // Check this post given the date has passed
48
            [$someFutureDate, 'Editor', 'PostA', true],
49
            [$someFutureDate, 'Contributor', 'PostA', true],
50
            [$someFutureDate, 'BlogEditor', 'PostA', true],
51
            [$someFutureDate, 'Writer', 'PostA', true],
52
53
            // Check unpublished pages
54
            [$somePastDate, 'Editor', 'PostA', true],
55
            [$somePastDate, 'Contributor', 'PostA', true],
56
            [$somePastDate, 'BlogEditor', 'PostA', true],
57
            [$somePastDate, 'Writer', 'PostA', true],
58
59
            // Test a page that was authored by another user
60
61
            // Check this post given the date has passed
62
            [$someFutureDate, 'Editor', 'FirstBlogPost', true],
63
            [$someFutureDate, 'Contributor', 'FirstBlogPost', true],
64
            [$someFutureDate, 'BlogEditor', 'FirstBlogPost', true],
65
            [$someFutureDate, 'Writer', 'FirstBlogPost', true],
66
67
            // Check future pages - non-editors shouldn't be able to see this
68
            [$somePastDate, 'Editor', 'FirstBlogPost', true],
69
            [$somePastDate, 'Contributor', 'FirstBlogPost', false],
70
            [$somePastDate, 'BlogEditor', 'FirstBlogPost', false],
71
            [$somePastDate, 'Writer', 'FirstBlogPost', false],
72
        ];
73
    }
74
75
    public function testCandidateAuthors()
76
    {
77
        $blogpost = $this->objFromFixture(BlogPost::class, 'PostC');
78
79
        $this->assertEquals(7, $blogpost->getCandidateAuthors()->count());
80
81
        //Set the group to draw Members from
82
        Config::inst()->update(BlogPost::class, 'restrict_authors_to_group', 'blogusers');
0 ignored issues
show
It seems like you code against a concrete implementation and not the interface SilverStripe\Config\Coll...nfigCollectionInterface as the method update() does only exist in the following implementations of said interface: SilverStripe\Config\Coll...s\DeltaConfigCollection, SilverStripe\Config\Coll...\MemoryConfigCollection.

Let’s take a look at an example:

interface User
{
    /** @return string */
    public function getPassword();
}

class MyUser implements User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the interface:

    interface User
    {
        /** @return string */
        public function getPassword();
    
        /** @return string */
        public function getDisplayName();
    }
    
Loading history...
83
84
        $this->assertEquals(3, $blogpost->getCandidateAuthors()->count());
85
86
        // Test cms field is generated
87
        $fields = $blogpost->getCMSFields();
88
        $this->assertNotEmpty($fields->dataFieldByName('Authors'));
89
    }
90
91 View Code Duplication
    public function testCanViewFuturePost()
92
    {
93
        $blogPost = $this->objFromFixture(BlogPost::class, 'NullPublishDate');
94
95
        $editor = $this->objFromFixture(Member::class, 'BlogEditor');
96
        $this->assertTrue($blogPost->canView($editor));
97
98
        $visitor = $this->objFromFixture(Member::class, 'Visitor');
99
        $this->assertFalse($blogPost->canView($visitor));
100
    }
101
102
    /**
103
     * The purpose of getDate() is to act as a proxy for PublishDate in the default RSS
104
     * template, rather than copying the entire template.
105
     */
106
    public function testGetDate()
107
    {
108
        $blogPost = $this->objFromFixture(BlogPost::class, 'NullPublishDate');
109
        $this->assertNull($blogPost->getDate());
110
111
        $blogPost = $this->objFromFixture(BlogPost::class, 'PostA');
112
        $this->assertEquals('2012-01-09 15:00:00', $blogPost->getDate());
113
    }
114
}
115