Completed
Push — master ( 4b135f...89b1c6 )
by Manolo
09:09
created

ClickerTest::getClickMock()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 5
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 2
1
<?php
2
3
/*
4
 * This file is part of the MsalsasVotingBundle package.
5
 *
6
 * (c) Manolo Salsas
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Msalsas\VotingBundle\Tests\Service;
13
14
use Doctrine\Common\Persistence\ObjectRepository;
15
use Doctrine\ORM\EntityManagerInterface;
16
use Msalsas\VotingBundle\Entity\Click;
17
use Msalsas\VotingBundle\Entity\ReferenceClicks;
18
use Msalsas\VotingBundle\Service\Clicker;
19
use Msalsas\VotingBundle\Tests\Mock\AnonymousUserMock;
20
use Msalsas\VotingBundle\Tests\Mock\ClickMock;
21
use Msalsas\VotingBundle\Tests\Mock\UserMock;
22
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
23
use Symfony\Component\Translation\Translator;
24
use Symfony\Component\HttpFoundation\Request;
25
use Symfony\Component\HttpFoundation\RequestStack;
26
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
27
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
28
29
class ClickerTest extends WebTestCase
30
{
31
    protected $emMock;
32
    protected $requestStackMock;
33
    protected $translator;
34
35
    public function setUp()
36
    {
37
        parent::setUp();
38
        $emRepositoryMock = $this->getMockBuilder(ObjectRepository::class)->getMock();
39
        $this->emMock = $this->getMockBuilder(EntityManagerInterface::class)->getMock();
40
        $this->emMock->method('getRepository')->willReturn($emRepositoryMock);
41
42
        $requestMock = $this->getMockBuilder(Request::class)
43
            ->disableOriginalConstructor()
44
            ->setMethods(array('getClientIp'))
45
            ->getMock();
46
        $requestMock->expects($this->any())
47
            ->method('getClientIp')->willReturn('127.0.0.1');
48
49
        $this->requestStackMock = $this->getMockBuilder(RequestStack::class)
50
            ->disableOriginalConstructor()
51
            ->setMethods(array('getCurrentRequest'))
52
            ->getMock();
53
        $this->requestStackMock->expects($this->any())
54
            ->method('getCurrentRequest')->willReturn($requestMock);
55
        $this->translator = new Translator('en');
56
    }
57
58
    public function testNewReferenceClickWithUser()
59
    {
60
        $userMock = $this->getMockBuilder(UserMock::class)
61
            ->getMock();
62
63
        $tokenMock = $this->getMockBuilder(TokenInterface::class)
64
            ->disableOriginalConstructor()
65
            ->getMock();
66
        $tokenMock->method('getUser')->willReturn($userMock);
67
68
        $tokenStorageMock = $this->getMockBuilder(TokenStorageInterface::class)
69
            ->disableOriginalConstructor()
70
            ->getMock();
71
        $tokenStorageMock->method('getToken')->willReturn($tokenMock);
72
73
        $clicker = new Clicker($this->emMock, $tokenStorageMock, $this->requestStackMock, $this->translator);
74
75
        $this->assertSame(0, $clicker->getClicks(1));
76
77
        $clicks = $clicker->addClick(1);
78
79
        $this->assertSame(1, $clicks);
80
    }
81
82
    public function testClickWithAnonymous()
83
    {
84
        $referenceClicks = new ReferenceClicks();
85
        $referenceClicks->setReference(1);
86
87
        $userMock = $this->getMockBuilder(AnonymousUserMock::class)
88
            ->getMock();
89
90
        $tokenMock = $this->getMockBuilder(TokenInterface::class)
91
            ->disableOriginalConstructor()
92
            ->getMock();
93
        $tokenMock->method('getUser')->willReturn($userMock);
94
95
        $tokenStorageMock = $this->getMockBuilder(TokenStorageInterface::class)
96
            ->disableOriginalConstructor()
97
            ->getMock();
98
        $tokenStorageMock->method('getToken')->willReturn($tokenMock);
99
100
        $clicker = new Clicker($this->emMock, $tokenStorageMock, $this->requestStackMock, $this->translator);
101
102
        $this->assertSame(0, $clicker->getClicks($referenceClicks->getReference()));
103
104
        $clicks = $clicker->addClick($referenceClicks->getReference());
105
106
        $this->assertSame(1, $clicks);
107
    }
108
109
    public function testClickWithAnonymousAndNoIp()
110
    {
111
        $referenceClicks = new ReferenceClicks();
112
        $referenceClicks->setReference(1);
113
114
        $requestMock = $this->getMockBuilder(Request::class)
115
            ->disableOriginalConstructor()
116
            ->setMethods(array('getClientIp'))
117
            ->getMock();
118
        $requestMock->expects($this->any())
119
            ->method('getClientIp')->willReturn(null);
120
121
        $this->requestStackMock = $this->getMockBuilder(RequestStack::class)
122
            ->disableOriginalConstructor()
123
            ->setMethods(array('getCurrentRequest'))
124
            ->getMock();
125
        $this->requestStackMock->expects($this->any())
126
            ->method('getCurrentRequest')->willReturn($requestMock);
127
128
        $userMock = $this->getMockBuilder(AnonymousUserMock::class)
129
            ->getMock();
130
131
        $tokenMock = $this->getMockBuilder(TokenInterface::class)
132
            ->disableOriginalConstructor()
133
            ->getMock();
134
        $tokenMock->method('getUser')->willReturn($userMock);
135
136
        $tokenStorageMock = $this->getMockBuilder(TokenStorageInterface::class)
137
            ->disableOriginalConstructor()
138
            ->getMock();
139
        $tokenStorageMock->method('getToken')->willReturn($tokenMock);
140
141
        $clicker = new Clicker($this->emMock, $tokenStorageMock, $this->requestStackMock, $this->translator);
142
143
        $this->assertSame(0, $clicker->getClicks($referenceClicks->getReference()));
144
145
        $clicks = $clicker->addClick($referenceClicks->getReference());
146
147
        $this->assertSame(0, $clicks);
148
    }
149
150
    public function testClickWithUserWhoAlreadyClicked()
151
    {
152
        $userMock = $this->getMockBuilder(UserMock::class)
153
            ->getMock();
154
155
        $clickMock = $this->getClickMock($userMock);
156
        $referenceClicksMock = $this->getMockBuilder(ReferenceClicks::class)
157
            ->getMock();
158
        $referenceClicksMock->method('getReference')->willReturn(1);
159
        $referenceClicksMock->method('getClicks')->willReturn(2);
160
161
        $clickEmRepositoryMock = $this->getMockBuilder(ObjectRepository::class)->getMock();
162
        $referenceClicksEmRepositoryMock = $this->getMockBuilder(ObjectRepository::class)->getMock();
163
        $clickEmRepositoryMock->expects($this->exactly(1))->method('findOneBy')->willReturn($clickMock);
164
        $referenceClicksEmRepositoryMock->expects($this->exactly(1))->method('findOneBy')->willReturn($referenceClicksMock);
165
        $this->emMock = $this->getMockBuilder(EntityManagerInterface::class)->getMock();
166
        $this->emMock->expects($this->exactly(2))->method('getRepository')->withConsecutive([Click::class], [ReferenceClicks::class])
167
            ->willReturnOnConsecutiveCalls($clickEmRepositoryMock, $referenceClicksEmRepositoryMock);
168
169
        $tokenMock = $this->getMockBuilder(TokenInterface::class)
170
            ->disableOriginalConstructor()
171
            ->getMock();
172
        $tokenMock->method('getUser')->willReturn($userMock);
173
174
        $tokenStorageMock = $this->getMockBuilder(TokenStorageInterface::class)
175
            ->disableOriginalConstructor()
176
            ->getMock();
177
        $tokenStorageMock->method('getToken')->willReturn($tokenMock);
178
179
        $clicker = new Clicker($this->emMock, $tokenStorageMock, $this->requestStackMock, $this->translator);
180
181
        $clicks = $clicker->addClick(1);
182
183
        $this->assertSame(2, $clicks);
184
    }
185
186
187
    public function testClickWithUserWhoAlreadyClickedAndNoReference()
188
    {
189
        $userMock = $this->getMockBuilder(UserMock::class)
190
            ->getMock();
191
192
        $referenceClicksMock = $this->getMockBuilder(ReferenceClicks::class)
193
            ->getMock();
194
        $referenceClicksMock->method('getReference')->willReturn(1);
195
196
        $clickEmRepositoryMock = $this->getMockBuilder(ObjectRepository::class)->getMock();
197
        $referenceClicksEmRepositoryMock = $this->getMockBuilder(ObjectRepository::class)->getMock();
198
        $clickEmRepositoryMock->expects($this->exactly(1))->method('findOneBy')->willReturn(null);
199
        $referenceClicksEmRepositoryMock->expects($this->exactly(1))->method('findOneBy')->willReturn($referenceClicksMock);
200
        $this->emMock = $this->getMockBuilder(EntityManagerInterface::class)->getMock();
201
        $this->emMock->expects($this->exactly(2))->method('getRepository')->withConsecutive([Click::class], [ReferenceClicks::class])
202
            ->willReturnOnConsecutiveCalls($clickEmRepositoryMock, $referenceClicksEmRepositoryMock);
203
204
205
        $tokenMock = $this->getMockBuilder(TokenInterface::class)
206
            ->disableOriginalConstructor()
207
            ->getMock();
208
        $tokenMock->method('getUser')->willReturn($userMock);
209
210
        $tokenStorageMock = $this->getMockBuilder(TokenStorageInterface::class)
211
            ->disableOriginalConstructor()
212
            ->getMock();
213
        $tokenStorageMock->method('getToken')->willReturn($tokenMock);
214
215
        $clicker = new Clicker($this->emMock, $tokenStorageMock, $this->requestStackMock, $this->translator);
216
217
        $clicks = $clicker->addClick(1);
218
219
        $this->assertSame(0, $clicks);
220
    }
221
222
    public function testClickWithAnonymousWhoAlreadyClicked()
223
    {
224
        $userMock = $this->getMockBuilder(AnonymousUserMock::class)
225
            ->getMock();
226
227
        $clickMock = $this->getClickMock($userMock);
228
        $referenceClicksMock = $this->getMockBuilder(ReferenceClicks::class)
229
            ->getMock();
230
        $referenceClicksMock->method('getReference')->willReturn(1);
231
        $referenceClicksMock->method('getClicks')->willReturn(2);
232
233
        $clickEmRepositoryMock = $this->getMockBuilder(ObjectRepository::class)->getMock();
234
        $referenceClicksEmRepositoryMock = $this->getMockBuilder(ObjectRepository::class)->getMock();
235
        $clickEmRepositoryMock->expects($this->exactly(1))->method('findOneBy')->willReturn($clickMock);
236
        $referenceClicksEmRepositoryMock->expects($this->exactly(1))->method('findOneBy')->willReturn($referenceClicksMock);
237
        $this->emMock = $this->getMockBuilder(EntityManagerInterface::class)->getMock();
238
        $this->emMock->expects($this->exactly(2))->method('getRepository')->withConsecutive([Click::class], [ReferenceClicks::class])
239
            ->willReturnOnConsecutiveCalls($clickEmRepositoryMock, $referenceClicksEmRepositoryMock);
240
241
        $tokenMock = $this->getMockBuilder(TokenInterface::class)
242
            ->disableOriginalConstructor()
243
            ->getMock();
244
        $tokenMock->method('getUser')->willReturn($userMock);
245
246
        $tokenStorageMock = $this->getMockBuilder(TokenStorageInterface::class)
247
            ->disableOriginalConstructor()
248
            ->getMock();
249
        $tokenStorageMock->method('getToken')->willReturn($tokenMock);
250
251
        $clicker = new Clicker($this->emMock, $tokenStorageMock, $this->requestStackMock, $this->translator);
252
253
        $clicks = $clicker->addClick(1);
254
255
        $this->assertSame(2, $clicks);
256
    }
257
258
    private function getClickMock($user, $userIP = '127.0.0.1')
259
    {
260
        return $this->getMockBuilder(ClickMock::class)
261
            ->setConstructorArgs(array($user, $userIP))
262
            ->getMock();
263
    }
264
}