Passed
Pull Request — master (#38)
by Simon
01:47
created

MemberExtensionTest::testIsInGracePeriod()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 18
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 14
nc 1
nop 0
dl 0
loc 18
rs 9.7998
c 0
b 0
f 0
1
<?php
2
3
namespace Firesphere\BootstrapMFA\Tests;
4
5
use Firesphere\BootstrapMFA\Extensions\MemberExtension;
6
use Firesphere\BootstrapMFA\Extensions\SiteConfigExtension;
7
use Firesphere\BootstrapMFA\Models\BackupCode;
8
use Firesphere\BootstrapMFA\Tests\Helpers\CodeHelper;
9
use SilverStripe\Control\Controller;
10
use SilverStripe\Core\Injector\Injector;
11
use SilverStripe\Dev\SapphireTest;
12
use SilverStripe\Forms\FieldList;
13
use SilverStripe\Forms\TabSet;
14
use SilverStripe\ORM\DataList;
15
use SilverStripe\Security\Member;
16
use SilverStripe\Security\Security;
17
use SilverStripe\SiteConfig\SiteConfig;
18
19
class MemberExtensionTest extends SapphireTest
20
{
21
    protected static $fixture_file = '../fixtures/member.yml';
22
23
    public function testMemberCodesExpired()
24
    {
25
        /** @var Member|MemberExtension $member */
26
        $member = $this->objFromFixture(Member::class, 'member1');
27
28
        $member->updateMFA = true;
29
        $member->write();
30
31
        /** @var DataList|BackupCode $codes */
32
        $codes = $member->BackupCodes();
33
34
        $member->updateMFA = true;
35
        $member->write();
36
37
        foreach ($codes as $code) {
38
            /** @var BackupCode $backup */
39
            $backup = BackupCode::get()->byID($code->ID);
40
            $this->assertNull($backup);
41
        }
42
    }
43
44
    public function testMemberCodesNotExpired()
45
    {
46
        /** @var Member|MemberExtension $member */
47
        $member = $this->objFromFixture(Member::class, 'member1');
48
49
        $member->updateMFA = true;
50
        $member->write();
51
52
        /** @var DataList|BackupCode $codes */
53
        $codes = $member->BackupCodes();
54
55
        $member->write();
56
57
        foreach ($codes as $code) {
58
            /** @var BackupCode $backup */
59
            $backup = BackupCode::get()->byID($code->ID);
60
            $this->assertNotNull($backup);
61
        }
62
    }
63
64
    public function testUpdateCMSFields()
65
    {
66
        $fields = FieldList::create([TabSet::create('Root')]);
67
68
        /** @var MemberExtension $extension */
69
        $extension = Injector::inst()->get(MemberExtension::class);
70
71
        // Something something in session
72
        Controller::curr()->getRequest()->getSession()->set('tokens', '123456');
73
        $extension->updateCMSFields($fields);
74
75
        $this->assertNull(Controller::curr()->getRequest()->getSession()->get('tokens'));
76
    }
77
78
    public function testUpdateCMSFieldsNoTokens()
79
    {
80
        $fields = FieldList::create([TabSet::create('Root')]);
81
82
        $extension = Injector::inst()->get(MemberExtension::class);
83
84
        $extension->updateCMSFields($fields);
85
86
        $this->assertFalse($fields->hasField('BackupTokens'));
87
    }
88
89
    public function testOnAfterWrite()
90
    {
91
        /** @var MemberExtension $extension */
92
        $extension = Injector::inst()->get(MemberExtension::class);
93
        /** @var Member $member */
94
        $member = $this->objFromFixture(Member::class, 'member1');
95
        $member->updateMFA = true;
96
97
        Security::setCurrentUser($member);
98
        $extension->setOwner($member);
99
100
        $extension->onAfterWrite();
101
102
        $this->assertCount(15, CodeHelper::getCodesFromSession());
103
        $this->assertCount(15, $member->BackupCodes());
104
    }
105
106
    public function testOnBeforeWrite()
107
    {
108
        /** @var MemberExtension $extension */
109
        $extension = Injector::inst()->get(MemberExtension::class);
110
        /** @var Member|MemberExtension $member */
111
        $member = $this->objFromFixture(Member::class, 'member1');
112
        $member->MFAEnabled = false;
113
        $member->write();
114
        $config = SiteConfig::current_site_config();
115
        $config->ForceMFA = true;
116
        $config->write;
117
        $extension->setOwner($member);
118
119
        $extension->onBeforeWrite();
120
121
        $this->assertTrue($member->MFAEnabled);
122
    }
123
124
    public function testOnBeforeWriteNoForce()
125
    {
126
        /** @var MemberExtension $extension */
127
        $extension = Injector::inst()->get(MemberExtension::class);
128
        /** @var Member $member */
129
        $member = $this->objFromFixture(Member::class, 'member1');
130
        $member->MFAEnabled = false;
131
        $config = SiteConfig::current_site_config();
132
        $config->ForceMFA = false;
133
        $config->write;
134
        $extension->setOwner($member);
135
136
        $extension->onBeforeWrite();
137
138
        $this->assertFalse($member->MFAEnabled);
139
    }
140
141
    public function testGetBackupcodes()
142
    {
143
        /** @var MemberExtension $extension */
144
        $extension = Injector::inst()->get(MemberExtension::class);
145
        /** @var Member $member */
146
        $member = $this->objFromFixture(Member::class, 'member1');
147
        $member->updateMFA = true;
148
149
        Security::setCurrentUser($member);
150
        $extension->setOwner($member);
151
152
        $extension->onAfterWrite();
153
154
        $directCodes = $member->BackupCodes()->map('ID', 'Code');
155
        $indirectCodes = $member->getBackupcodes()->map('ID', 'Code');
156
157
        $this->assertEquals($directCodes, $indirectCodes);
158
    }
159
160
    public function testIsInGracePeriod()
161
    {
162
        /** @var Member|MemberExtension $member */
163
        $member = $this->objFromFixture(Member::class, 'member2');
164
        Security::setCurrentUser($member);
165
        $this->assertTrue($member->isInGracePeriod());
166
        /** @var SiteConfig|SiteConfigExtension $config */
167
        $config = SiteConfig::current_site_config();
168
        $config->EnforceMFA = true;
169
        $config->write();
170
        $this->assertTrue($member->isInGracePeriod());
171
        $member->Created = '1970-01-01 00:00:00';
172
        $member->write();
173
        $this->assertFalse($member->isInGracePeriod());
174
        $member->Created = date('Y-m-d 00:00:00');
175
        $member->MFAEnabled = true;
176
        $member->write();
177
        $this->assertFalse($member->isInGracePeriod());
178
    }
179
}
180