Passed
Pull Request — master (#97)
by Robbie
02:35
created

testShouldRedirectToMFAWhenMFAIsOptionalAndHasNotBeenSkipped()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 6
nc 1
nop 0
dl 0
loc 11
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace SilverStripe\MFA\Tests\Service;
4
5
use SilverStripe\Dev\SapphireTest;
6
use SilverStripe\MFA\Extension\MemberExtension;
7
use SilverStripe\MFA\Service\EnforcementManager;
8
use SilverStripe\MFA\Service\MethodRegistry;
9
use SilverStripe\MFA\Tests\Stub\BasicMath\Method as BasicMathMethod;
10
use SilverStripe\ORM\FieldType\DBDatetime;
11
use SilverStripe\Security\Member;
12
use SilverStripe\SiteConfig\SiteConfig;
13
14
class EnforcementManagerTest extends SapphireTest
15
{
16
    protected static $fixture_file = 'EnforcementManagerTest.yml';
17
18
    protected function setUp()
19
    {
20
        parent::setUp();
21
22
        DBDatetime::set_mock_now('2019-01-25 12:00:00');
23
24
        $this->setSiteConfig(['MFAEnabled' => true]);
25
26
        MethodRegistry::config()->set('methods', [
27
            BasicMathMethod::class,
28
        ]);
29
    }
30
31
    public function testCannotSkipWhenMFAIsRequiredWithNoGracePeriod()
32
    {
33
        $this->setSiteConfig(['MFARequired' => true]);
34
35
        $member = new Member();
36
        $this->assertFalse(EnforcementManager::create()->canSkipMFA($member));
37
    }
38
39
    public function testCanSkipWhenMFAIsRequiredWithGracePeriodExpiringInFuture()
40
    {
41
        $this->setSiteConfig(['MFARequired' => true, 'MFAGracePeriodExpires' => '2019-01-30']);
42
43
        $member = new Member();
44
        $this->assertTrue(EnforcementManager::create()->canSkipMFA($member));
45
    }
46
47
    public function testCannotSkipWhenMFAIsRequiredWithGracePeriodExpiringInPast()
48
    {
49
        $this->setSiteConfig(['MFARequired' => true, 'MFAGracePeriodExpires' => '2018-12-25']);
50
51
        $member = new Member();
52
        $this->assertFalse(EnforcementManager::create()->canSkipMFA($member));
53
    }
54
55
    public function testCannotSkipWhenMemberHasRegisteredAuthenticationMethodsSetUp()
56
    {
57
        $this->setSiteConfig(['MFARequired' => false]);
58
        // Sally has "backup codes" as a registered authentication method already
59
        /** @var Member $member */
60
        $member = $this->objFromFixture(Member::class, 'sally_smith');
61
        $this->logInAs($member);
62
63
        $this->assertFalse(EnforcementManager::create()->canSkipMFA($member));
64
    }
65
66
    public function testCanSkipWhenMFAIsOptional()
67
    {
68
        $this->setSiteConfig(['MFARequired' => false]);
69
        // Anonymous admin user
70
        $memberId = $this->logInWithPermission();
71
        /** @var Member $member */
72
        $member = Member::get()->byID($memberId);
73
74
        $this->assertTrue(EnforcementManager::create()->canSkipMFA($member));
75
    }
76
77
    public function testShouldNotRedirectToMFAWhenMFAIsNotEnabled()
78
    {
79
        $this->setSiteConfig(['MFAEnabled' => false]);
80
        /** @var Member $member */
81
        $member = $this->objFromFixture(Member::class, 'sally_smith');
82
        $this->logInAs($member);
83
84
        $this->assertFalse(EnforcementManager::create()->shouldRedirectToMFA($member));
85
    }
86
87
    public function testShouldRedirectToMFAWhenMFAIsRequired()
88
    {
89
        $this->setSiteConfig(['MFARequired' => true]);
90
        /** @var Member $member */
91
        $member = $this->objFromFixture(Member::class, 'sally_smith');
92
        $this->logInAs($member);
93
94
        $this->assertTrue(EnforcementManager::create()->shouldRedirectToMFA($member));
95
    }
96
97
    public function testShouldRedirectToMFAWhenMFAIsOptionalAndHasNotBeenSkipped()
98
    {
99
        $this->setSiteConfig(['MFARequired' => false]);
100
101
        /** @var Member|MemberExtension $member */
102
        $member = $this->objFromFixture(Member::class, 'sally_smith');
103
        $member->HasSkippedMFARegistration = false;
104
        $member->write();
105
        $this->logInAs($member);
106
107
        $this->assertTrue(EnforcementManager::create()->shouldRedirectToMFA($member));
108
    }
109
110
    public function testShouldNotRedirectToMFAWhenMFAIsOptionalAndHasBeenSkipped()
111
    {
112
        $this->setSiteConfig(['MFARequired' => false]);
113
114
        /** @var Member&MemberExtension $member */
115
        $member = $this->objFromFixture(Member::class, 'sally_smith');
116
        $member->HasSkippedMFARegistration = true;
117
        $member->write();
118
        $this->logInAs($member);
119
120
        $this->assertFalse(EnforcementManager::create()->shouldRedirectToMFA($member));
121
    }
122
123
    /**
124
     * Helper method for changing the current SiteConfig values
125
     *
126
     * @param array $data
127
     */
128
    protected function setSiteConfig(array $data)
129
    {
130
        if (!isset($data['MFAEnabled'])) {
131
            // Default to enabling MFA for fixture
132
            $data['MFAEnabled'] = true;
133
        }
134
        $siteConfig = SiteConfig::current_site_config();
135
        $siteConfig->update($data);
136
        $siteConfig->write();
137
    }
138
}
139