Completed
Push — master ( 79deb4...9a29db )
by Robbie
10s
created

testGetRequiresPasswordChangeOnNextLogin()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 9
nc 1
nop 0
dl 0
loc 13
rs 9.9666
c 0
b 0
f 0
1
<?php
2
3
namespace SilverStripe\SecuityExtensions\Tests\Extension;
4
5
use SilverStripe\Dev\SapphireTest;
6
use SilverStripe\Forms\FieldList;
7
use SilverStripe\Forms\Form;
8
use SilverStripe\SecurityExtensions\Extension\MemberExtension;
9
use SilverStripe\ORM\FieldType\DBDateTime;
10
use SilverStripe\Security\Member;
11
12
class MemberExtensionTest extends SapphireTest
13
{
14
    protected static $fixture_file = 'MemberExtensionTest.yml';
15
16
    protected static $required_extensions = [
17
        Member::class => [MemberExtension::class]
18
    ];
19
20
    public function testAdminCanRequirePasswordChangeOnNextLogIn()
21
    {
22
        /** @var Member&MemberExtension $targetMember */
23
        $targetMember = $this->objFromFixture(Member::class, 'someone');
24
        $this->logInWithPermission('ADMIN');
25
        $field = $targetMember->getCMSFields()->dataFieldByName('RequiresPasswordChangeOnNextLogin');
26
        $this->assertNotNull($field);
27
    }
28
29
    public function testUserCannotRequireTheirOwnPasswordChangeOnNextLogIn()
30
    {
31
        /** @var Member&MemberExtension $targetMember */
32
        $targetMember = $this->objFromFixture(Member::class, 'someone');
33
        $this->logInAs($targetMember);
34
        $field = $targetMember->getCMSFields()->dataFieldByName('RequiresPasswordChangeOnNextLogin');
35
        $this->assertNull($field);
36
    }
37
38
    public function testUserCannotRequireOthersToPasswordChangeOnNextLogIn()
39
    {
40
        /** @var Member&MemberExtension $targetMember */
41
        $targetMember = $this->objFromFixture(Member::class, 'anyone');
42
        $this->logInAs('someone');
43
        $field = $targetMember->getCMSFields()->dataFieldByName('RequiresPasswordChangeOnNextLogin');
44
        $this->assertNull($field);
45
    }
46
47
    public function testCheckingRequiresPasswordChangeOnNextLoginWillSetPasswordExpiryToNow()
48
    {
49
        $mockDate = '2019-03-02 00:00:00';
50
        DBDateTime::set_mock_now($mockDate);
51
52
        /** @var Member&MemberExtension $targetMember */
53
        $targetMember = $this->objFromFixture(Member::class, 'someone');
54
55
        $this->assertNull($targetMember->PasswordExpiry);
56
57
        $this->logInWithPermission('ADMIN');
58
        $fields = $targetMember->getCMSFields();
59
        $form = new Form(null, 'SomeForm', $fields, new FieldList());
60
        $field = $fields->dataFieldByName('RequiresPasswordChangeOnNextLogin');
61
        $field->setValue(1);
62
        $form->saveInto($targetMember);
63
64
        $this->assertEquals($mockDate, $targetMember->PasswordExpiry);
65
    }
66
67
    public function testCheckingPasswordChangeUpdatesFutureExpiriesToNow()
68
    {
69
        $mockDate = '2019-03-02 00:00:00';
70
        DBDateTime::set_mock_now($mockDate);
71
72
        /** @var Member&MemberExtension $targetMember */
73
        $targetMember = $this->objFromFixture(Member::class, 'willexpire');
74
75
        $this->assertTrue($targetMember->dbObject('PasswordExpiry')->inFuture());
76
77
        $this->logInWithPermission('ADMIN');
78
        $fields = $targetMember->getCMSFields();
79
        $form = new Form(null, 'SomeForm', $fields, new FieldList());
80
        $field = $fields->dataFieldByName('RequiresPasswordChangeOnNextLogin');
81
        $field->setValue(1);
82
        $form->saveInto($targetMember);
83
84
        $this->assertEquals($mockDate, $targetMember->PasswordExpiry);
85
    }
86
87
    public function testCheckingPasswordChangeDoesNotAlterPastDates()
88
    {
89
        $mockDate = '2019-03-02 00:00:00';
90
        DBDateTime::set_mock_now($mockDate);
91
92
        /** @var Member&MemberExtension $targetMember */
93
        $targetMember = $this->objFromFixture(Member::class, 'expired');
94
        $originalValue = $targetMember->PasswordExpiry;
95
96
        $this->assertTrue($targetMember->dbObject('PasswordExpiry')->inPast());
97
98
        $this->logInWithPermission('ADMIN');
99
        $fields = $targetMember->getCMSFields();
100
        $form = new Form(null, 'SomeForm', $fields, new FieldList());
101
        $field = $fields->dataFieldByName('RequiresPasswordChangeOnNextLogin');
102
        $field->setValue(1);
103
        $form->saveInto($targetMember);
104
105
        $this->assertEquals($originalValue, $targetMember->PasswordExpiry);
106
    }
107
108
    public function testSavingUncheckedPasswordChangeNullsPastDates()
109
    {
110
        $mockDate = '2019-03-02 00:00:00';
111
        DBDateTime::set_mock_now($mockDate);
112
113
        /** @var Member&MemberExtension $targetMember */
114
        $targetMember = $this->objFromFixture(Member::class, 'expired');
115
116
        $this->logInWithPermission('ADMIN');
117
        $fields = $targetMember->getCMSFields();
118
        $form = new Form(null, 'SomeForm', $fields, new FieldList());
119
        $field = $fields->dataFieldByName('RequiresPasswordChangeOnNextLogin');
120
        $field->setValue(0);
121
        $form->saveInto($targetMember);
122
123
        $this->assertNull($targetMember->PasswordExpiry);
124
    }
125
126
    public function testSavingUncheckedPasswordChangeDoesNotAlterFutureDates()
127
    {
128
        $mockDate = '2019-03-02 00:00:00';
129
        DBDateTime::set_mock_now($mockDate);
130
131
        /** @var Member&MemberExtension $targetMember */
132
        $targetMember = $this->objFromFixture(Member::class, 'willexpire');
133
        $originalValue = $targetMember->PasswordExpiry;
134
135
        $this->logInWithPermission('ADMIN');
136
        $fields = $targetMember->getCMSFields();
137
        $form = new Form(null, 'SomeForm', $fields, new FieldList());
138
        $field = $fields->dataFieldByName('RequiresPasswordChangeOnNextLogin');
139
        $field->setValue(0);
140
        $form->saveInto($targetMember);
141
142
        $this->assertNotNull($targetMember->PasswordExpiry);
143
        $this->assertEquals($originalValue, $targetMember->PasswordExpiry);
144
    }
145
146
    public function testSavingChangePasswordOnNextLoginIsNotPossibleIfTheCurrentMemberCannotEditTheMemberBeingSaved()
147
    {
148
        /** @var Member&MemberExtension $targetMember */
149
        $targetMember = $this->objFromFixture(Member::class, 'expired');
150
        $originalValue = $targetMember->PasswordExpiry;
151
152
        $this->logInAs('someone');
153
        $fields = $targetMember->saveRequiresPasswordChangeOnNextLogin(0);
0 ignored issues
show
Unused Code introduced by
The assignment to $fields is dead and can be removed.
Loading history...
154
155
        $this->assertEquals($originalValue, $targetMember->PasswordExpiry);
156
    }
157
158
    public function testGetRequiresPasswordChangeOnNextLogin()
159
    {
160
        $this->assertTrue(
161
            $this->objFromFixture(Member::class, 'expired')->getRequiresPasswordChangeOnNextLogin(),
162
            'PasswordExpiry date in the past should require a change'
163
        );
164
        $this->assertFalse(
165
            $this->objFromFixture(Member::class, 'willexpire')->getRequiresPasswordChangeOnNextLogin(),
166
            'PasswordExpiry date in the past should NOT require a change'
167
        );
168
        $this->assertFalse(
169
            $this->objFromFixture(Member::class, 'someone')->getRequiresPasswordChangeOnNextLogin(),
170
            'PasswordExpiry is NULL should NOT require a change'
171
        );
172
    }
173
}
174