Completed
Branch master (3370dd)
by jelmer
01:40
created

testSuccessfulEnAndDecodingOfToken()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 5
rs 9.4285
cc 1
eloc 3
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
        self::assertFalse($expiringToken->hasExpired());
24
    }
25
26
    public function testCustomExpirationDate()
27
    {
28
        $now = new DateTimeImmutable();
29
        $fourDaysInterval = new DateInterval('P4D');
30
        $expiringToken = ExpiringToken::create($fourDaysInterval);
31
32
        self::assertEquals(
33
            $now->add($fourDaysInterval),
34
            $expiringToken->getExpiresOn()
35
        );
36
        self::assertFalse($expiringToken->hasExpired());
37
    }
38
39
    public function testExpiredToken()
40
    {
41
        $interval = DateInterval::createFromDateString('P0D');
42
        $expiredToken = ExpiringToken::create($interval);
43
        sleep(1);
44
        self::assertTrue($expiredToken->hasExpired());
45
46
        $this->expectException(TokenHasExpired::class);
47
        $this->expectExceptionMessage('The token has expired');
48
49
        $expiredToken->validateAgainst($expiredToken);
50
    }
51
52
    public function testEmptyToken()
53
    {
54
        $this->expectException(InvalidToken::class);
55
        $this->expectExceptionMessage('Unable to decode the token');
56
57
        ExpiringToken::fromString('');
58
    }
59
60
    public function testRandomStringAsToken()
61
    {
62
        $this->expectException(InvalidToken::class);
63
        $this->expectExceptionMessage('Unable to decode the token');
64
65
        ExpiringToken::fromString('bobTha');
66
    }
67
68
    public function testMissingExpirationDate()
69
    {
70
        $this->expectException(InvalidToken::class);
71
        $this->expectExceptionMessage('Unable to decode the token');
72
73
        ExpiringToken::fromString(base64_encode('bobTha'));
74
    }
75
76
    public function testInvalidExpirationDate()
77
    {
78
        $this->expectException(InvalidToken::class);
79
        $this->expectExceptionMessage('Unable to decode the token');
80
81
        ExpiringToken::fromString(base64_encode('bob_token:token'));
82
    }
83
84
    public function testTokenIsUrlSafe()
85
    {
86
        $stringToken = (string) ExpiringToken::create();
87
88
        self::assertSame($stringToken, urlencode($stringToken));
89
    }
90
91
    public function testSuccessfulEnAndDecodingOfToken()
92
    {
93
        $expiringToken = ExpiringToken::create();
94
        self::assertEquals($expiringToken, ExpiringToken::fromString((string) $expiringToken));
95
    }
96
97
    public function testValidToken()
98
    {
99
        $validToken = ExpiringToken::create();
100
        self::assertTrue($validToken->validateAgainst($validToken));
101
    }
102
103
    public function testInvalidToken()
104
    {
105
        $token1 = ExpiringToken::create();
106
        $token2 = ExpiringToken::create();
107
108
        $this->expectException(InvalidToken::class);
109
        $this->expectExceptionMessage('The token does not match the original token');
110
111
        $token1->validateAgainst($token2);
112
    }
113
}
114