testSuccessfulEnAndDecodingOfToken()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 10
rs 9.4285
cc 1
eloc 7
nc 1
nop 0
1
<?php
2
3
namespace Pageon\Tests\ExpiringToken;
4
5
use DateInterval;
6
use DateTimeImmutable;
7
use Pageon\ExpiringToken\ExpiringToken;
8
use Pageon\ExpiringToken\InvalidToken;
9
use Pageon\ExpiringToken\TokenHasExpired;
10
use PHPUnit\Framework\TestCase;
11
12
class ExpiringTokenTest extends TestCase
13
{
14
    public function testDefaultExpirationDate()
15
    {
16
        $now = new DateTimeImmutable();
17
        $expiringToken = ExpiringToken::create();
18
19
        self::assertEquals(
20
            $now->add(new DateInterval(ExpiringToken::DEFAULT_DATE_INTERVAL)),
21
            $expiringToken->getExpiresOn(),
22
            '',
23
            1
24
        );
25
        self::assertFalse($expiringToken->hasExpired());
26
    }
27
28
    public function testCustomExpirationDate()
29
    {
30
        $now = new DateTimeImmutable();
31
        $fourDaysInterval = new DateInterval('P4D');
32
        $expiringToken = ExpiringToken::create($fourDaysInterval);
33
34
        self::assertEquals(
35
            $now->add($fourDaysInterval),
36
            $expiringToken->getExpiresOn(),
37
            '',
38
            1
39
        );
40
        self::assertFalse($expiringToken->hasExpired());
41
    }
42
43
    public function testExpiredToken()
44
    {
45
        $interval = DateInterval::createFromDateString('P0D');
46
        $expiredToken = ExpiringToken::create($interval);
47
        sleep(1);
48
        self::assertTrue($expiredToken->hasExpired());
49
50
        $this->expectException(TokenHasExpired::class);
51
        $this->expectExceptionMessage('The token has expired');
52
53
        $expiredToken->validateAgainst($expiredToken);
54
    }
55
56
    public function testEmptyToken()
57
    {
58
        $this->expectException(InvalidToken::class);
59
        $this->expectExceptionMessage('Unable to decode the token');
60
61
        ExpiringToken::fromString('');
62
    }
63
64
    public function testRandomStringAsToken()
65
    {
66
        $this->expectException(InvalidToken::class);
67
        $this->expectExceptionMessage('Unable to decode the token');
68
69
        ExpiringToken::fromString('bobTha');
70
    }
71
72
    public function testMissingExpirationDate()
73
    {
74
        $this->expectException(InvalidToken::class);
75
        $this->expectExceptionMessage('Unable to decode the token');
76
77
        ExpiringToken::fromString(base64_encode('bobTha'));
78
    }
79
80
    public function testInvalidExpirationDate()
81
    {
82
        $this->expectException(InvalidToken::class);
83
        $this->expectExceptionMessage('Unable to decode the token');
84
85
        ExpiringToken::fromString(base64_encode('bob_token:token'));
86
    }
87
88
    public function testTokenIsUrlSafe()
89
    {
90
        $stringToken = (string) ExpiringToken::create();
91
92
        self::assertSame($stringToken, urlencode($stringToken));
93
    }
94
95
    public function testSuccessfulEnAndDecodingOfToken()
96
    {
97
        $expiringToken = ExpiringToken::create();
98
        self::assertEquals(
99
            $expiringToken,
100
            ExpiringToken::fromString((string) $expiringToken),
101
            '',
102
            1
103
        );
104
    }
105
106
    public function testValidToken()
107
    {
108
        $validToken = ExpiringToken::create();
109
        self::assertTrue($validToken->validateAgainst($validToken));
110
    }
111
112
    public function testInvalidToken()
113
    {
114
        $token1 = ExpiringToken::create();
115
        $token2 = ExpiringToken::create();
116
117
        $this->expectException(InvalidToken::class);
118
        $this->expectExceptionMessage('The token does not match the original token');
119
120
        $token1->validateAgainst($token2);
121
    }
122
}
123