Passed
Pull Request — master (#53)
by Simon
02:05
created

MemberExtensionTest::testOnBeforeWriteNoForce()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

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