Passed
Push — master ( db9ca8...fb6e5b )
by Robbie
03:35
created

AuditHookTest::testAddViewerGroupToPage()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 21
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 14
dl 0
loc 21
rs 9.7998
c 0
b 0
f 0
cc 2
nc 2
nop 0
1
<?php
2
3
namespace SilverStripe\Auditor\Tests;
4
5
use Page;
0 ignored issues
show
Bug introduced by
The type Page was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
6
use Silverstripe\Auditor\AuditHook;
7
use SilverStripe\Auditor\Tests\AuditHookTest\Logger;
8
use SilverStripe\Core\Injector\Injector;
9
use SilverStripe\Dev\FunctionalTest;
10
use SilverStripe\Security\Group;
11
use SilverStripe\Security\Member;
12
13
class AuditHookTest extends FunctionalTest
14
{
15
    protected $usesDatabase = true;
16
17
    protected $writer = null;
18
19
    protected function setUp()
20
    {
21
        parent::setUp();
22
23
        $this->writer = new Logger;
24
25
        // Phase singleton out, so the message log is purged.
26
        Injector::inst()->unregisterNamedObject('AuditLogger');
27
        Injector::inst()->registerService($this->writer, 'AuditLogger');
28
    }
29
30
    public function testLoggingIn()
31
    {
32
        $this->logInWithPermission('ADMIN');
33
34
        $message = $this->writer->getLastMessage();
35
        $this->assertContains('[email protected]', $message);
36
        $this->assertContains('successfully logged in', $message);
37
    }
38
39
    public function testAutoLoggingIn()
40
    {
41
        // Simulate an autologin by calling the extension hook directly.
42
        // Member->autoLogin() relies on session and cookie state which we can't simulate here.
43
        $this->logInWithPermission('ADMIN');
44
        $member = Member::get()->filter(array('Email' => '[email protected]'))->first();
45
        $member->extend('memberAutoLoggedIn');
46
47
        $message = $this->writer->getLastMessage();
48
        $this->assertContains('[email protected]', $message);
49
        $this->assertContains('successfully restored autologin', $message);
50
    }
51
52
    public function testLoggingOut()
53
    {
54
        $this->logInWithPermission('ADMIN');
55
56
        $member = Member::get()->filter(array('Email' => '[email protected]'))->first();
0 ignored issues
show
Unused Code introduced by
The assignment to $member is dead and can be removed.
Loading history...
57
        $this->logOut();
58
59
        $message = $this->writer->getLastMessage();
60
        $this->assertContains('[email protected]', $message);
61
        $this->assertContains('successfully logged out', $message);
62
    }
63
64
    public function testLoggingWriteDoesNotOccurWhenNotLoggedIn()
65
    {
66
        $this->logOut();
67
68
        $group = new Group(array('Title' => 'My group'));
69
        $group->write();
70
71
        $message = $this->writer->getLastMessage();
72
        $this->assertEmpty($message, 'No one is logged in, so nothing was logged');
73
    }
74
75
    public function testLoggingWriteWhenLoggedIn()
76
    {
77
        $this->logInWithPermission('ADMIN');
78
79
        $group = new Group(array('Title' => 'My group'));
80
        $group->write();
81
82
        $message = $this->writer->getLastMessage();
83
        $this->assertContains('[email protected]', $message);
84
        $this->assertContains('modified', $message);
85
        $this->assertContains(Group::class, $message);
86
    }
87
88
    public function testAddMemberToGroupUsingGroupMembersRelation()
89
    {
90
        $this->logInWithPermission('ADMIN');
91
92
        $group = new Group(array('Title' => 'My group'));
93
        $group->write();
94
95
        $member = new Member(array('FirstName' => 'Joe', 'Email' => 'joe1'));
96
        $member->write();
97
98
        $group->Members()->add($member);
99
100
        $message = $this->writer->getLastMessage();
101
        $this->assertContains('[email protected]', $message);
102
        $this->assertContains('added Member "joe1"', $message);
103
        $this->assertContains('to Group "My group"', $message);
104
    }
105
106
    public function testAddMemberToGroupUsingMemberGroupsRelation()
107
    {
108
        $this->logInWithPermission('ADMIN');
109
110
        $group = new Group(array('Title' => 'My group'));
111
        $group->write();
112
113
        $member = new Member(array('FirstName' => 'Joe', 'Email' => 'joe2'));
114
        $member->write();
115
116
        $member->Groups()->add($group);
117
118
        $message = $this->writer->getLastMessage();
119
        $this->assertContains('[email protected]', $message);
120
        $this->assertContains('added Member "joe2"', $message);
121
        $this->assertContains('to Group "My group"', $message);
122
    }
123
124
    public function testRemoveMemberFromGroupUsingGroupMembersRelation()
125
    {
126
        $this->logInWithPermission('ADMIN');
127
128
        $group = new Group(array('Title' => 'My group'));
129
        $group->write();
130
131
        $member = new Member(array('FirstName' => 'Joe', 'Email' => 'joe3'));
132
        $member->write();
133
134
        $group->Members()->add($member);
135
        $group->Members()->remove($member);
136
137
        $message = $this->writer->getLastMessage();
138
        $this->assertContains('[email protected]', $message);
139
        $this->assertContains('removed Member "joe3"', $message);
140
        $this->assertContains('from Group "My group"', $message);
141
    }
142
143
    public function testRemoveMemberFromGroupUsingMemberGroupsRelation()
144
    {
145
        $this->logInWithPermission('ADMIN');
146
147
        $group = new Group(array('Title' => 'My group'));
148
        $group->write();
149
150
        $member = new Member(array('FirstName' => 'Joe', 'Email' => 'joe4'));
151
        $member->write();
152
153
        $member->Groups()->add($group);
154
        $member->Groups()->remove($group);
155
156
        $message = $this->writer->getLastMessage();
157
        $this->assertContains('[email protected]', $message);
158
        $this->assertContains('removed Member "joe4"', $message);
159
        $this->assertContains('from Group "My group"', $message);
160
    }
161
162
    public function testAddViewerGroupToPage()
163
    {
164
        if (!class_exists(Page::class)) {
165
            $this->markTestSkipped('This test requires the CMS module installed.');
166
        }
167
168
        $this->logInWithPermission('ADMIN');
169
170
        $group = new Group();
171
        $group->Title = 'Test group';
172
        $group->write();
173
174
        $page = new Page();
175
        $page->CanViewType = 'OnlyTheseUsers';
176
        $page->ViewerGroups()->add($group);
177
        $page->write();
178
        $page->publishSingle();
179
180
        $message = $this->writer->getLastMessage();
181
        $this->assertContains('Effective ViewerGroups', $message);
182
        $this->assertContains('OnlyTheseUsers', $message);
183
    }
184
185
    public function testPublishPage()
186
    {
187
        if (!class_exists(Page::class)) {
188
            $this->markTestSkipped('This test requires the CMS module installed.');
189
        }
190
191
        $this->logInWithPermission('ADMIN');
192
193
        $page = new Page();
194
        $page->Title = 'My page';
195
        $page->Content = 'This is my page content';
196
        $page->write();
197
        $page->publishSingle();
198
199
        $message = $this->writer->getLastMessage();
200
        $this->assertContains('[email protected]', $message);
201
        $this->assertContains('published Page', $message);
202
        $this->assertContains('My page', $message);
203
    }
204
205
    public function testUnpublishPage()
206
    {
207
        if (!class_exists(Page::class)) {
208
            $this->markTestSkipped('This test requires the CMS module installed.');
209
        }
210
211
        $this->logInWithPermission('ADMIN');
212
213
        $page = new Page();
214
        $page->Title = 'My page';
215
        $page->Content = 'This is my page content';
216
        $page->write();
217
        $page->publishSingle();
218
        $page->doUnpublish();
219
220
        $message = $this->writer->getLastMessage();
221
        $this->assertContains('[email protected]', $message);
222
        $this->assertContains('unpublished Page', $message);
223
        $this->assertContains('My page', $message);
224
    }
225
226
    public function testDuplicatePage()
227
    {
228
        if (!class_exists(Page::class)) {
229
            $this->markTestSkipped('This test requires the CMS module installed.');
230
        }
231
232
        $this->logInWithPermission('ADMIN');
233
234
        $page = new Page();
235
        $page->Title = 'My page';
236
        $page->Content = 'This is my page content';
237
        $page->write();
238
        $page->duplicate();
239
240
        $message = $this->writer->getLastMessage();
241
        $this->assertContains('[email protected]', $message);
242
        $this->assertContains('duplicated Page', $message);
243
        $this->assertContains('My page', $message);
244
    }
245
246
    public function testRevertToLive()
247
    {
248
        if (!class_exists(Page::class)) {
249
            $this->markTestSkipped('This test requires the CMS module installed.');
250
        }
251
252
        $this->logInWithPermission('ADMIN');
253
254
        $page = new Page();
255
        $page->Title = 'My page';
256
        $page->Content = 'This is my page content';
257
        $page->write();
258
        $page->publishSingle();
259
260
        $page->Content = 'Changed';
261
        $page->write();
262
        $page->doRevertToLive();
263
264
        $message = $this->writer->getLastMessage();
265
        $this->assertContains('[email protected]', $message);
266
        $this->assertContains('reverted Page', $message);
267
        $this->assertContains('My page', $message);
268
    }
269
270
    public function testDelete()
271
    {
272
        if (!class_exists(Page::class)) {
273
            $this->markTestSkipped('This test requires the CMS module installed.');
274
        }
275
276
        $this->logInWithPermission('ADMIN');
277
278
        $page = new Page();
279
        $page->Title = 'My page';
280
        $page->Content = 'This is my page content';
281
        $page->write();
282
        $page->publishSingle();
283
284
        $page->delete();
285
286
        $message = $this->writer->getLastMessage();
287
        $this->assertContains('[email protected]', $message);
288
        $this->assertContains('deleted Page', $message);
289
        $this->assertContains('My page', $message);
290
    }
291
292
    public function testRestoreToStage()
293
    {
294
        if (!class_exists(Page::class)) {
295
            $this->markTestSkipped('This test requires the CMS module installed.');
296
        }
297
298
        $this->logInWithPermission('ADMIN');
299
300
        $page = new Page();
301
        $page->Title = 'My page';
302
        $page->Content = 'Published';
303
        $page->write();
304
        $page->publishSingle();
305
306
        $page->Content = 'This is my page content';
307
        $page->write();
308
        $page->publishSingle();
309
        $page->delete();
310
311
        $message = $this->writer->getLastMessage();
312
        $this->assertContains('[email protected]', $message);
313
        $this->assertContains('deleted Page', $message);
314
        $this->assertContains('My page', $message);
315
    }
316
}
317