Passed
Pull Request — master (#165)
by Garion
02:22
created

SecurityExtensionTest   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 92
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 45
dl 0
loc 92
rs 10
c 0
b 0
f 0
wmc 5

5 Methods

Rating   Name   Duplication   Size   Complexity  
A testResetAccountFailsWithInvalidToken() 0 11 1
A testResetAccountFailsWithExpiredToken() 0 15 1
A testResetAccountSubmissionFailsWithExpiredSession() 0 21 1
A testResetAccountFailsWhenAlreadyAuthenticated() 0 13 1
A testResetAccountSubmissionPasses() 0 20 1
1
<?php
2
3
namespace SilverStripe\MFA\Tests\Extension\AccountReset;
4
5
use SilverStripe\Dev\FunctionalTest;
6
use SilverStripe\MFA\Extension\AccountReset\MemberExtension;
7
use SilverStripe\MFA\Extension\AccountReset\SecurityAdminExtension;
8
use SilverStripe\ORM\FieldType\DBDatetime;
9
use SilverStripe\Security\Member;
10
11
/**
12
 * Class SecurityExtensionTest
13
 *
14
 * @package SilverStripe\MFA\Tests\Extension\AccountReset
15
 */
16
class SecurityExtensionTest extends FunctionalTest
17
{
18
    protected static $fixture_file = 'SecurityExtensionTest.yml';
19
20
    public function testResetAccountFailsWhenAlreadyAuthenticated()
21
    {
22
        /** @var Member&MemberExtension $member */
23
        $member = $this->objFromFixture(Member::class, 'user');
24
        $this->logInAs($member);
25
26
        $token = $member->generateAccountResetTokenAndStoreHash();
27
28
        $url = (new SecurityAdminExtension())->getAccountResetLink($member, $token);
29
        $response = $this->get($url);
30
31
        $this->assertEquals(400, $response->getStatusCode());
32
        $this->assertContains('Already authenticated', $response->getBody());
33
    }
34
35
    public function testResetAccountFailsWithInvalidToken()
36
    {
37
        /** @var Member&MemberExtension $member */
38
        $member = $this->objFromFixture(Member::class, 'user');
39
        $member->generateAccountResetTokenAndStoreHash();
40
41
        $url = (new SecurityAdminExtension())->getAccountResetLink($member, 'not-actually-the-token');
42
        $response = $this->get($url);
43
44
        $this->assertEquals(400, $response->getStatusCode());
45
        $this->assertContains('Invalid member or token', $response->getBody());
46
    }
47
48
    public function testResetAccountFailsWithExpiredToken()
49
    {
50
        /** @var Member&MemberExtension $member */
51
        $member = $this->objFromFixture(Member::class, 'user');
52
53
        // Wrap token generation in old timestamp to guarantee token expiry
54
        DBDatetime::set_mock_now('2011-11-26 17:00');
55
        $token = $member->generateAccountResetTokenAndStoreHash();
56
        DBDatetime::clear_mock_now();
57
58
        $url = (new SecurityAdminExtension())->getAccountResetLink($member, $token);
59
        $response = $this->get($url);
60
61
        $this->assertEquals(400, $response->getStatusCode());
62
        $this->assertContains('Invalid member or token', $response->getBody());
63
    }
64
65
    public function testResetAccountSubmissionFailsWithExpiredSession()
66
    {
67
        /** @var Member&MemberExtension $member */
68
        $member = $this->objFromFixture(Member::class, 'user');
69
        $token = $member->generateAccountResetTokenAndStoreHash();
70
71
        $url = (new SecurityAdminExtension())->getAccountResetLink($member, $token);
72
        $response = $this->get($url);
73
74
        $this->assertEquals(200, $response->getStatusCode(), $response->getBody());
75
76
        // Simulate expired session
77
        $this->session()->destroy(true);
78
79
        $response = $this->submitForm(
80
            'Form_ResetAccountForm',
81
            null,
82
            ['NewPassword1' => 'testtest', 'NewPassword2' => 'testtest']
83
        );
84
85
        $this->assertContains('The account reset process timed out', $response->getBody());
86
    }
87
88
    public function testResetAccountSubmissionPasses()
89
    {
90
        /** @var Member&MemberExtension $member */
91
        $member = $this->objFromFixture(Member::class, 'user');
92
        $token = $member->generateAccountResetTokenAndStoreHash();
93
94
        $url = (new SecurityAdminExtension())->getAccountResetLink($member, $token);
95
        $response = $this->get($url);
96
97
        $this->assertEquals(200, $response->getStatusCode(), $response->getBody());
98
99
        $response = $this->submitForm(
100
            'Form_ResetAccountForm',
101
            null,
102
            ['NewPassword1' => 'testtest', 'NewPassword2' => 'testtest']
103
        );
104
105
        // User should have been redirected to Login form with session message
106
        $this->assertContains('Login', $response->getBody());
107
        $this->assertContains('Reset complete', $response->getBody());
108
    }
109
}
110