Passed
Pull Request — master (#32)
by Robbie
01:51
created

EnforcementManagerTest::setUp()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
nc 1
nop 0
dl 0
loc 10
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 testShouldRedirectToMFAWhenMFAIsRequired()
78
    {
79
        $this->setSiteConfig(['MFARequired' => true]);
80
        /** @var Member $member */
81
        $member = $this->objFromFixture(Member::class, 'sally_smith');
82
        $this->logInAs($member);
83
84
        $this->assertTrue(EnforcementManager::create()->shouldRedirectToMFA($member));
85
    }
86
87
    public function testShouldRedirectToMFAWhenMFAIsOptionalAndHasNotBeenSkipped()
88
    {
89
        $this->setSiteConfig(['MFARequired' => false]);
90
91
        /** @var Member|MemberExtension $member */
92
        $member = $this->objFromFixture(Member::class, 'sally_smith');
93
        $member->HasSkippedMFARegistration = false;
94
        $member->write();
95
        $this->logInAs($member);
96
97
        $this->assertTrue(EnforcementManager::create()->shouldRedirectToMFA($member));
98
    }
99
100
    public function testShouldNotRedirectToMFAWhenMFAIsOptionalAndHasBeenSkipped()
101
    {
102
        $this->setSiteConfig(['MFARequired' => false]);
103
104
        /** @var Member&MemberExtension $member */
105
        $member = $this->objFromFixture(Member::class, 'sally_smith');
106
        $member->HasSkippedMFARegistration = true;
107
        $member->write();
108
        $this->logInAs($member);
109
110
        $this->assertFalse(EnforcementManager::create()->shouldRedirectToMFA($member));
111
    }
112
113
    /**
114
     * Helper method for changing the current SiteConfig values
115
     *
116
     * @param array $data
117
     */
118
    protected function setSiteConfig(array $data)
119
    {
120
        $siteConfig = SiteConfig::current_site_config();
121
        $siteConfig->update($data);
122
        $siteConfig->write();
123
    }
124
}
125