MemberExtensionTest::testOnBeforeWrite()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 26
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 16
nc 1
nop 0
dl 0
loc 26
rs 9.7333
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\ORM\FieldType\DBDatetime;
16
use SilverStripe\Security\Member;
17
use SilverStripe\Security\Security;
18
use SilverStripe\SiteConfig\SiteConfig;
19
20
class MemberExtensionTest extends SapphireTest
21
{
22
    protected static $fixture_file = '../fixtures/member.yml';
23
24
    public function testMemberCodesExpired()
25
    {
26
        /** @var Member|MemberExtension $member */
27
        $member = $this->objFromFixture(Member::class, 'member1');
28
29
        Security::setCurrentUser($member);
30
        $member->updateMFA = true;
31
        $member->write();
32
33
        /** @var DataList|BackupCode $codes */
34
        $codes = $member->BackupCodes()->column('ID');
35
36
        $member->updateMFA = true;
37
        $member->write();
38
39
        foreach ($codes as $code) {
40
            /** @var BackupCode $backup */
41
            $backup = BackupCode::get()->byID($code);
42
            $this->assertNull($backup);
43
        }
44
    }
45
46
    public function testMemberCodesNotExpired()
47
    {
48
        /** @var Member|MemberExtension $member */
49
        $member = $this->objFromFixture(Member::class, 'member1');
50
51
        Security::setCurrentUser($member);
52
        $member->updateMFA = true;
53
        $member->write();
54
55
        /** @var DataList|BackupCode $codes */
56
        $codes = $member->BackupCodes()->column('ID');
57
58
        $member->updateMFA = false;
59
        $member->write();
60
61
        foreach ($codes as $code) {
62
            /** @var BackupCode $backup */
63
            $backup = BackupCode::get()->byID($code);
64
            $this->assertNotNull($backup);
65
        }
66
    }
67
68
    public function testUpdateCMSFields()
69
    {
70
        $fields = FieldList::create([TabSet::create('Root')]);
71
72
        /** @var MemberExtension $extension */
73
        $extension = Injector::inst()->get(MemberExtension::class);
74
75
        // Something something in session
76
        Controller::curr()->getRequest()->getSession()->set('tokens', '123456');
77
        $extension->updateCMSFields($fields);
78
79
        $this->assertNull(Controller::curr()->getRequest()->getSession()->get('tokens'));
80
    }
81
82
    public function testUpdateCMSFieldsNoTokens()
83
    {
84
        $fields = FieldList::create([TabSet::create('Root')]);
85
86
        $extension = Injector::inst()->get(MemberExtension::class);
87
88
        $extension->updateCMSFields($fields);
89
90
        $this->assertFalse($fields->hasField('BackupTokens'));
91
    }
92
93
    public function testOnAfterWrite()
94
    {
95
        /** @var MemberExtension $extension */
96
        $extension = Injector::inst()->get(MemberExtension::class);
97
        /** @var Member $member */
98
        $member = $this->objFromFixture(Member::class, 'member1');
99
        $member->updateMFA = true;
100
101
        Security::setCurrentUser($member);
102
        $extension->setOwner($member);
103
104
        $extension->onAfterWrite();
105
106
        $this->assertCount(15, CodeHelper::getCodesFromSession());
107
        $this->assertCount(15, $member->BackupCodes());
108
    }
109
110
    public function testOnBeforeWrite()
111
    {
112
        /** @var MemberExtension $extension */
113
        $extension = Injector::inst()->get(MemberExtension::class);
114
        /** @var Member|MemberExtension $member */
115
        $member = $this->objFromFixture(Member::class, 'member1');
116
        Security::setCurrentUser($member);
117
        $member->MFAEnabled = false;
118
        $member->write();
119
        $config = SiteConfig::current_site_config();
120
        $config->ForceMFA = DBDatetime::now()->Format(DBDatetime::ISO_DATE);
121
        $config->write;
122
        $extension->setOwner($member);
123
124
        $extension->onBeforeWrite();
125
126
        $this->assertTrue($member->MFAEnabled);
127
128
        /** @var MemberExtension $extension */
129
        $member->MFAEnabled = false;
130
        $config->ForceMFA = null;
131
        $config->write;
132
133
        $extension->onBeforeWrite();
134
135
        $this->assertFalse($member->MFAEnabled);
136
    }
137
138
    public function testIsInGracePeriod()
139
    {
140
        /** @var Member|MemberExtension $member */
141
        $member = $this->objFromFixture(Member::class, 'member2');
142
        Security::setCurrentUser($member);
143
        $this->assertTrue($member->isInGracePeriod());
144
        /** @var SiteConfig|SiteConfigExtension $config */
145
        $config = SiteConfig::current_site_config();
146
        $config->ForceMFA = DBDatetime::now()->Format(DBDatetime::ISO_DATE);
147
        $config->write();
148
        $this->assertTrue($member->isInGracePeriod());
149
        $member->Created = '1970-01-01 00:00:00';
150
        $member->write();
151
        $this->assertFalse($member->isInGracePeriod());
152
        $member->Created = DBDatetime::now()->Format(DBDatetime::ISO_DATETIME);
153
        $member->MFAEnabled = true;
154
        $member->write();
155
        $this->assertFalse($member->isInGracePeriod());
156
    }
157
}
158