Passed
Push — master ( 3624ae...1055f5 )
by Simon
01:38
created

BackupCodeTest::getCodesFromSession()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 16
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 16
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 7
nc 1
nop 0

1 Method

Rating   Name   Duplication   Size   Complexity  
A BackupCodeTest::testWarningEmail() 0 7 1
1
<?php
2
3
namespace Firesphere\BootstrapMFA\Tests;
4
5
6
use Firesphere\BootstrapMFA\Models\BackupCode;
7
use Firesphere\BootstrapMFA\Generators\CodeGenerator;
8
use Firesphere\BootstrapMFA\Tests\Helpers\CodeHelper;
9
use SilverStripe\Control\Controller;
10
use SilverStripe\Control\Session;
11
use SilverStripe\Core\Config\Config;
12
use SilverStripe\Core\Injector\Injector;
13
use SilverStripe\Dev\Debug;
14
use SilverStripe\Dev\SapphireTest;
15
use SilverStripe\Security\Member;
16
use SilverStripe\Security\IdentityStore;
17
use SilverStripe\Security\Security;
18
19
class BackupCodeTest extends SapphireTest
20
{
21
22
    protected static $fixture_file = '../fixtures/member.yml';
23
24
    protected function setUp()
25
    {
26
        // Set to an idiotic length so we don't accidentally hit
27
        // a alphanumeric that due to fluke of randomness
28
        // only contains numbers, etc.
29
        Config::modify()->set(CodeGenerator::class, 'length', 100);
30
31
        return parent::setUp(); // TODO: Change the autogenerated stub
32
    }
33
34
    public function testWarningEmail()
35
    {
36
        $member = $this->objFromFixture(Member::class, 'member1');
37
38
        BackupCode::sendWarningEmail($member);
39
40
        $this->assertEmailSent($member->Email);
41
    }
42
43
    public function testWarningMailNotSameUser()
44
    {
45
        $admin = $this->objFromFixture(Member::class, 'member2');
46
        Security::setCurrentUser($admin);
47
48
        $member = $this->objFromFixture(Member::class, 'member1');
49
50
        BackupCode::generateTokensForMember($member);
51
52
        $this->assertEmailSent($member->Email);
53
    }
54
55
    public function testCodesGenerated()
56
    {
57
58
        $member = $this->objFromFixture(Member::class, 'member1');
59
        Security::setCurrentUser($member);
60
61
        BackupCode::get()->removeAll();
62
63
        BackupCode::generateTokensForMember($member);
64
65
        $codes = BackupCode::get()->filter(['MemberID' => $member->ID]);
66
67
        $this->assertGreaterThan(0, $codes->count());
68
69
        $codesFromValid = BackupCode::getValidTokensForMember($member);
70
71
        $this->assertEquals($codes->count(), $codesFromValid->count());
72
73
    }
74
75
    public function testCanEdit()
76
    {
77
        $backup = Injector::inst()->get(BackupCode::class);
78
79
        $this->assertFalse($backup->canEdit());
80
    }
81
82
    public function testExpiry()
83
    {
84
        $member = $this->objFromFixture(Member::class, 'member1');
85
        Security::setCurrentUser($member);
86
87
        BackupCode::generateTokensForMember($member);
88
        /** @var BackupCode $code */
89
        $code = BackupCode::get()->filter(['MemberID' => $member->ID])->first();
90
91
        $code = $code->expire();
92
93
        $this->assertTrue((bool)$code->Used);
94
95
        $code = BackupCode::get()->byID($code->ID);
96
97
        $this->assertTrue((bool)$code->Used);
98
    }
99
100
    public function testTokenLimit()
101
    {
102
        /** @var Member $member */
103
        $member = $this->objFromFixture(Member::class, 'member1');
104
        Injector::inst()->get(IdentityStore::class)->logIn($member);
105
        BackupCode::generateTokensForMember($member);
106
107
        $codes = CodeHelper::getCodesFromSession();
108
        // Default length
109
        $this->assertEquals(15, count($codes));
110
111
        Config::modify()->set(BackupCode::class, 'token_limit', 10);
112
113
        BackupCode::generateTokensForMember($member);
114
        $codes = CodeHelper::getCodesFromSession();
115
        $this->assertEquals(10, count($codes));
116
    }
117
118
    public function testBackupCodeConfigNumeric()
119
    {
120
        Config::modify()->set(BackupCode::class, 'token_limit', 3);
121
        Config::modify()->set(CodeGenerator::class, 'length', 10);
122
        Config::modify()->set(CodeGenerator::class, 'type', 'numeric');
123
124
        /** @var Member $member */
125
        $member = $this->objFromFixture(Member::class, 'member1');
126
        Injector::inst()->get(IdentityStore::class)->logIn($member);
127
        BackupCode::generateTokensForMember($member);
128
129
        $codes = CodeHelper::getCodesFromSession();
130
131
        // Actual testing
132
        foreach ($codes as $code) {
133
            $this->assertEquals(10, strlen($code));
134
            $this->assertTrue(is_numeric($code));
135
        }
136
    }
137
138
    public function testBackupCodeConfigAlpha()
139
    {
140
        Config::modify()->set(BackupCode::class, 'token_limit', 3);
141
        Config::modify()->set(CodeGenerator::class, 'type', 'characters');
142
        Config::modify()->set(CodeGenerator::class, 'case', 'mixed');
143
144
        /** @var Member $member */
145
        $member = $this->objFromFixture(Member::class, 'member1');
146
        Injector::inst()->get(IdentityStore::class)->logIn($member);
147
        BackupCode::generateTokensForMember($member);
148
149
        $codes = CodeHelper::getCodesFromSession();
150
151
        // Actual testing
152
        foreach ($codes as $code) {
153
            $this->assertTrue(ctype_alpha($code));
154
            $this->assertFalse(is_numeric($code));
155
            $this->assertFalse(ctype_upper($code));
156
            $this->assertFalse(ctype_lower($code));
157
        }
158
    }
159
160
    public function testBackupCodeConfigAlphaUpper()
161
    {
162
        Config::modify()->set(BackupCode::class, 'token_limit', 3);
163
        Config::modify()->set(CodeGenerator::class, 'type', 'characters');
164
        Config::modify()->set(CodeGenerator::class, 'case', 'upper');
165
166
        /** @var Member $member */
167
        $member = $this->objFromFixture(Member::class, 'member1');
168
        Injector::inst()->get(IdentityStore::class)->logIn($member);
169
        BackupCode::generateTokensForMember($member);
170
171
        $codes = CodeHelper::getCodesFromSession();
172
173
        // Actual testing
174
        foreach ($codes as $code) {
175
            $this->assertFalse(is_numeric($code));
176
            $this->assertTrue(ctype_alpha($code));
177
            $this->assertTrue(ctype_upper($code));
178
        }
179
    }
180
181
    public function testBackupCodeConfigAlphaLower()
182
    {
183
        Config::modify()->set(BackupCode::class, 'token_limit', 3);
184
        Config::modify()->set(CodeGenerator::class, 'type', 'characters');
185
        Config::modify()->set(CodeGenerator::class, 'case', 'lower');
186
187
        /** @var Member $member */
188
        $member = $this->objFromFixture(Member::class, 'member1');
189
        Injector::inst()->get(IdentityStore::class)->logIn($member);
190
        BackupCode::generateTokensForMember($member);
191
192
        $codes = CodeHelper::getCodesFromSession();
193
194
        // Actual testing
195
        foreach ($codes as $code) {
196
            $this->assertFalse(is_numeric($code));
197
            $this->assertTrue(ctype_alpha($code));
198
            $this->assertTrue(ctype_lower($code));
199
        }
200
    }
201
202
}