Passed
Push — master ( 6af672...0107a4 )
by Peter
07:37
created

IndexTest   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 108
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 51
c 0
b 0
f 0
dl 0
loc 108
rs 10
wmc 7

6 Methods

Rating   Name   Duplication   Size   Complexity  
A testGetRenderedPageReturnsNullIfEntityIsNotFound() 0 10 1
A testGetRenderedPageRendersPageIfPageIsVisible() 0 16 1
A setUp() 0 12 1
A testGetRenderedPageReturnsNullByDefaultIfPageIsDraft() 0 12 1
A testGetUserGroupIdentifiers() 0 20 2
A testGetUserGroupIdentifiersReturnsEarlyIfEntityIsNotFound() 0 9 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace AbterPhp\Website\Service\Website;
6
7
use AbterPhp\Admin\Domain\Entities\User;
8
use AbterPhp\Admin\Domain\Entities\UserGroup;
9
use AbterPhp\Admin\Domain\Entities\UserLanguage;
10
use AbterPhp\Admin\Orm\UserRepo;
11
use AbterPhp\Framework\Template\Engine;
12
use AbterPhp\Website\Domain\Entities\Page;
13
use AbterPhp\Website\Orm\PageRepo;
14
use Opulence\Events\Dispatchers\IEventDispatcher;
15
use Opulence\Orm\OrmException;
16
use PHPUnit\Framework\MockObject\MockObject;
17
use PHPUnit\Framework\TestCase;
18
19
class IndexTest extends TestCase
20
{
21
    /** @var Index - System Under Test */
22
    protected $sut;
23
24
    /** @var Engine|MockObject */
25
    protected $engineMock;
26
27
    /** @var PageRepo|MockObject */
28
    protected $pageRepoMock;
29
30
    /** @var UserRepo|MockObject */
31
    protected $userRepoMock;
32
33
    /** @var IEventDispatcher|MockObject */
34
    protected $eventDispatcherMock;
35
36
    public function setUp(): void
37
    {
38
        $this->engineMock          = $this->createMock(Engine::class);
39
        $this->pageRepoMock        = $this->createMock(PageRepo::class);
40
        $this->userRepoMock        = $this->createMock(UserRepo::class);
41
        $this->eventDispatcherMock = $this->createMock(IEventDispatcher::class);
42
43
        $this->sut = new Index(
44
            $this->engineMock,
45
            $this->pageRepoMock,
46
            $this->userRepoMock,
47
            $this->eventDispatcherMock
48
        );
49
    }
50
51
    public function testGetRenderedPageReturnsNullIfEntityIsNotFound()
52
    {
53
        $identifier           = 'foo';
54
        $userGroupIdentifiers = [];
55
56
        $this->pageRepoMock->expects($this->any())->method('getWithLayout')->willThrowException(new OrmException());
57
58
        $actualResult = $this->sut->getRenderedPage($identifier, $userGroupIdentifiers);
59
60
        $this->assertNull($actualResult);
61
    }
62
63
    public function testGetRenderedPageReturnsNullByDefaultIfPageIsDraft()
64
    {
65
        $identifier           = 'foo';
66
        $userGroupIdentifiers = [];
67
68
        $entity = new Page('', '', '', '', '', '', true, null, '', null);
69
70
        $this->pageRepoMock->expects($this->any())->method('getWithLayout')->willReturn($entity);
71
72
        $actualResult = $this->sut->getRenderedPage($identifier, $userGroupIdentifiers);
73
74
        $this->assertNull($actualResult);
75
    }
76
77
    public function testGetRenderedPageRendersPageIfPageIsVisible()
78
    {
79
        $identifier           = 'foo';
80
        $userGroupIdentifiers = [];
81
        $renderedBody         = 'bar';
82
83
        $entity = new Page('', '', '', '', '', '', false, null, '', null);
84
85
        $this->pageRepoMock->expects($this->any())->method('getWithLayout')->willReturn($entity);
86
87
        $this->engineMock->expects($this->atLeastOnce())->method('run')->willReturn($renderedBody);
88
89
        $actualResult = $this->sut->getRenderedPage($identifier, $userGroupIdentifiers);
90
91
        $this->assertInstanceOf(Page::class, $actualResult);
92
        $this->assertSame($renderedBody, $actualResult->getRenderedBody());
93
    }
94
95
    public function testGetUserGroupIdentifiers()
96
    {
97
        $visitorUsername = 'foo';
98
99
        $userGroup0 = new UserGroup('', '', '', []);
100
        $userGroup1 = new UserGroup('', '', '', []);
101
        $userGroups = [$userGroup0, $userGroup1];
102
103
        $language = new UserLanguage('', '', '');
104
        $user     = new User('', $visitorUsername, '', '', false, false, $language, $userGroups);
105
106
        $this->userRepoMock->expects($this->any())->method('getByUsername')->willReturn($user);
107
108
        $actualResult = $this->sut->getUserGroupIdentifiers($visitorUsername);
109
110
        $this->assertIsArray($actualResult);
111
112
        foreach ($actualResult as $idx => $item) {
113
            $this->assertArrayHasKey($idx, $userGroups);
114
            $this->assertSame($userGroups[$idx]->getIdentifier(), $item);
115
        }
116
    }
117
118
    public function testGetUserGroupIdentifiersReturnsEarlyIfEntityIsNotFound()
119
    {
120
        $visitorUsername = 'foo';
121
122
        $this->userRepoMock->expects($this->any())->method('getByUsername')->willThrowException(new OrmException());
123
124
        $actualResult = $this->sut->getUserGroupIdentifiers($visitorUsername);
125
126
        $this->assertSame([], $actualResult);
127
    }
128
}
129