File size: 2,815 Bytes
d2897cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?php

declare(strict_types=1);

namespace Mautic\UserBundle\Tests\Model\UserToken;

use Mautic\CoreBundle\Helper\RandomHelper\RandomHelperInterface;
use Mautic\UserBundle\Entity\User;
use Mautic\UserBundle\Entity\UserToken;
use Mautic\UserBundle\Entity\UserTokenRepositoryInterface;
use Mautic\UserBundle\Model\UserToken\UserTokenService;
use PHPUnit\Framework\MockObject\MockObject;

class UserTokenServiceTest extends \PHPUnit\Framework\TestCase
{
    /**
     * @var MockObject|RandomHelperInterface
     */
    private MockObject $randomHelperMock;

    /**
     * @var MockObject|UserTokenRepositoryInterface
     */
    private MockObject $userTokenRepositoryMock;

    protected function setUp(): void
    {
        $this->randomHelperMock        = $this->getMockBuilder(RandomHelperInterface::class)->getMock();
        $this->userTokenRepositoryMock = $this->getMockBuilder(UserTokenRepositoryInterface::class)->getMock();
    }

    /**
     * Tests second attempt for generating secret if not unique secret was generated first time.
     */
    public function testGenerateSecret(): void
    {
        $secretLength    = 6;
        $randomSecret    = 'secret';
        $token           = new UserToken();
        $token->setAuthorizator('test-secret');

        $this->randomHelperMock->expects($this->exactly(2))
            ->method('generate')
            ->with($secretLength)
            ->willReturn($randomSecret);

        $this->userTokenRepositoryMock->expects($this->exactly(2))
            ->method('isSecretUnique')
            ->with($randomSecret)
            ->willReturnOnConsecutiveCalls(
                false, // Test second attempt to get unique secret
                true // Ok now
            );

        $userTokenService = $this->getUserTokenService();
        $secretToken      = $userTokenService->generateSecret($token, $secretLength);
        $this->assertSame($randomSecret, $secretToken->getSecret());
        $this->assertTrue($secretToken->isOneTimeOnly());
        $this->assertNull($secretToken->getExpiration());
    }

    public function testVerify(): void
    {
        $token        = new UserToken();
        $user         = new User();
        $authorizator = 'authorizator';
        $token->setUser($user)
            ->setOneTimeOnly(true)
            ->setExpiration(null)
            ->setAuthorizator($authorizator);

        $this->userTokenRepositoryMock->expects($this->once())
            ->method('verify')
            ->with($token)
            ->willReturn(true);

        $this->assertTrue($this->getUserTokenService()->verify($token));
    }

    private function getUserTokenService(): UserTokenService
    {
        return new UserTokenService(
            $this->randomHelperMock,
            $this->userTokenRepositoryMock
        );
    }
}