UserBlockTest::testDefaultToString()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 7
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 12
rs 10
1
<?php
2
3
declare(strict_types=1);
4
5
namespace AbterPhp\Framework\Navigation;
6
7
use AbterPhp\Framework\Constant\Session as SessionConstant;
8
use AbterPhp\Framework\Html\INode;
9
use AbterPhp\Framework\Html\Node;
10
use Opulence\Sessions\ISession;
11
use Opulence\Sessions\Session;
12
use PHPUnit\Framework\MockObject\MockObject;
13
use PHPUnit\Framework\TestCase;
14
15
class UserBlockTest extends TestCase
16
{
17
    /** @var ISession|MockObject */
18
    protected $sessionMock;
19
20
    protected array $sessionData = [
21
        SessionConstant::USERNAME            => 'Mr. Wolf',
22
        SessionConstant::EMAIL               => '[email protected]',
23
        SessionConstant::IS_GRAVATAR_ALLOWED => true,
24
    ];
25
26
    public function setUp(): void
27
    {
28
        parent::setUp();
29
30
        $this->sessionMock = $this->createMock(Session::class);
31
32
        $sessionData = &$this->sessionData;
33
        $this->sessionMock->expects($this->any())->method('has')->willReturnCallback(
34
            fn ($key) => isset($sessionData[$key])
35
        );
36
        $this->sessionMock->expects($this->any())->method('get')->willReturnCallback(
37
            fn ($key) => $sessionData[$key] ?? ''
38
        );
39
    }
40
41
    public function testConstructThrowsExceptionIfUsernameIsNotRetrievable(): void
42
    {
43
        $this->expectException(\LogicException::class);
44
45
        /** @var ISession|MockObject $sessionMock */
46
        $sessionMock = $this->createMock(Session::class);
47
48
        $sessionMock->expects($this->any())->method('has')->willReturn(false);
49
50
        new UserBlock($sessionMock);
51
    }
52
53
    public function testFallbackUserImageIsUsedIfGravatarIsNotAllowed(): void
54
    {
55
        $sessionData = [
56
            SessionConstant::USERNAME            => 'Mr. Wolf',
57
            SessionConstant::EMAIL               => '[email protected]',
58
            SessionConstant::IS_GRAVATAR_ALLOWED => false,
59
        ];
60
61
        /** @var ISession|MockObject $sessionMock */
62
        $sessionMock = $this->createMock(Session::class);
63
64
        $sessionMock->expects($this->any())->method('has')->willReturnCallback(
65
            fn ($key) => isset($sessionData[$key])
66
        );
67
        $sessionMock->expects($this->any())->method('get')->willReturnCallback(
68
            fn ($key) => $sessionData[$key] ?? ''
69
        );
70
71
        $sut = new UserBlock($sessionMock);
72
73
        $rendered = (string)$sut;
74
75
        $this->assertStringContainsString(
76
            '<a><div><span src="https://via.placeholder.com/40/09f/fff.png" alt="Mr. Wolf"></span></div>',
77
            $rendered
78
        ); // nolint
79
        $this->assertStringContainsString('<div>Mr. Wolf</div>', $rendered);
80
        $this->assertStringContainsString('<div></div></a>', $rendered);
81
    }
82
83
    public function testDefaultToString(): void
84
    {
85
        $sut = $this->createUserBlock();
86
87
        $rendered = (string)$sut;
88
89
        $this->assertStringContainsString(
90
            '<a><div><div class="user-img" style="background: url(https://www.gravatar.com/avatar/2ea036c591050aa0bd31e5034c18012f) no-repeat;"><img src="https://www.gravatar.com/avatar/2ea036c591050aa0bd31e5034c18012f" alt="Mr. Wolf"></div></div>', // phpcs:ignore
91
            $rendered
92
        );
93
        $this->assertStringContainsString('<div>Mr. Wolf</div>', $rendered);
94
        $this->assertStringContainsString('<div></div></a>', $rendered);
95
    }
96
97
    public function testToStringWithOptionalsSet(): void
98
    {
99
        $sut = $this->createUserBlock();
100
101
        $sut->setMediaLeft(new Node('AAA'));
102
        $sut->setMediaBody(new Node('BBB'));
103
        $sut->setMediaRight(new Node('CCC'));
104
105
        $rendered = (string)$sut;
106
107
        $this->assertStringContainsString("<a>AAA\nBBB\nCCC</a>", $rendered);
108
    }
109
110
    public function testGetNodes(): void
111
    {
112
        $expectedNodes = [];
113
114
        $sut = $this->createUserBlock();
115
116
        $actualResult = $sut->getNodes();
117
118
        $this->assertEquals($expectedNodes, $actualResult);
119
    }
120
121
    public function testGetExtendedNodes(): void
122
    {
123
        $sut = $this->createUserBlock();
124
125
        $actualResult = $sut->getExtendedNodes();
126
127
        $this->assertCount(3, $actualResult);
128
        $this->assertInstanceOf(Node::class, $actualResult[0]);
129
        $this->assertInstanceOf(Node::class, $actualResult[1]);
130
        $this->assertInstanceOf(Node::class, $actualResult[2]);
131
    }
132
133
    public function testGetMediaLeftReturnsTheLastSetMediaLeft(): void
134
    {
135
        /** @var Node|MockObject $mediaLeft */
136
        $mediaLeft = $this->createMock(Node::class);
137
138
        $sut = $this->createUserBlock();
139
140
        $sut->setMediaLeft($mediaLeft);
141
142
        $actualResult = $sut->getMediaLeft();
143
144
        $this->assertSame($mediaLeft, $actualResult);
145
    }
146
147
    public function testGetMediaRightReturnsTheLastSetMediaRight(): void
148
    {
149
        /** @var Node|MockObject $mediaRight */
150
        $mediaRight = $this->createMock(Node::class);
151
152
        $sut = $this->createUserBlock();
153
154
        $sut->setMediaRight($mediaRight);
155
156
        $actualResult = $sut->getMediaRight();
157
158
        $this->assertSame($mediaRight, $actualResult);
159
    }
160
161
    public function testGetMediaBodyReturnsTheLastSetMediaBody(): void
162
    {
163
        /** @var Node|MockObject $mediaBody */
164
        $mediaBody = $this->createMock(Node::class);
165
166
        $sut = $this->createUserBlock();
167
168
        $sut->setMediaBody($mediaBody);
169
170
        $actualResult = $sut->getMediaBody();
171
172
        $this->assertSame($mediaBody, $actualResult);
173
    }
174
175
    /**
176
     * @param INode[]|INode|string|null $content
177
     *
178
     * @return UserBlock
179
     */
180
    protected function createUserBlock($content = null): UserBlock
181
    {
182
        $userBlock = new UserBlock($this->sessionMock);
183
184
        if ($content) {
185
            $userBlock->getMediaRight()->setContent($content);
186
        }
187
188
        return $userBlock;
189
    }
190
}
191