Passed
Push — master ( f08e4a...0370aa )
by Simon
02:02
created

MemberExtensionTest::testGetBackupcodes()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 17
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

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