Passed
Push — 4.1.1 ( 01ed8a )
by Robbie
09:45
created

testGroupFlushesPermissions()   C

Complexity

Conditions 7
Paths 64

Size

Total Lines 45
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 27
nc 64
nop 0
dl 0
loc 45
rs 6.7272
c 0
b 0
f 0
1
<?php
2
3
namespace SilverStripe\Security\Tests;
4
5
use Psr\SimpleCache\CacheInterface;
6
use SilverStripe\Core\Cache\CacheFactory;
7
use SilverStripe\Core\Injector\Injector;
8
use SilverStripe\Dev\SapphireTest;
9
use SilverStripe\Security\Group;
10
use SilverStripe\Security\InheritedPermissionFlusher;
11
use SilverStripe\Security\Member;
12
use SilverStripe\Security\Tests\InheritedPermissionsFlusherTest\TestCacheFlusher;
13
14
class InheritedPermissionsFlusherTest extends SapphireTest
15
{
16
    protected static $fixture_file = 'InheritedPermissionsFlusherTest.yml';
17
18
    protected function setUp()
19
    {
20
        parent::setUp();
21
22
        // Set up a mock cache service
23
        Injector::inst()->load([
24
            CacheInterface::class . '.TestFlusherCache' => [
25
                'factory' => CacheFactory::class,
26
                'constructor' => ['namespace' => 'TestFlusherCache']
27
            ]
28
        ]);
29
    }
30
31
    public function testMemberFlushesPermissions()
32
    {
33
        $cache = Injector::inst()->create(CacheInterface::class . '.TestFlusherCache');
34
        $flusher = new TestCacheFlusher($cache);
35
        $extension = new InheritedPermissionFlusher();
36
        $extension->setServices([$flusher]);
37
        Injector::inst()->registerService($extension, InheritedPermissionFlusher::class);
38
        $editor = $this->objFromFixture(Member::class, 'editor');
39
        $admin = $this->objFromFixture(Member::class, 'admin');
40
        $editorKey = $flusher->generateCacheKey(TestCacheFlusher::$categories[0], $editor->ID);
41
        $adminKey = $flusher->generateCacheKey(TestCacheFlusher::$categories[0], $admin->ID);
42
        $cache->set($editorKey, 'uncle');
43
        $cache->set($adminKey, 'cheese');
44
        $editor->flushCache();
45
46
        $this->assertNull($cache->get($editorKey));
47
        $this->assertEquals('cheese', $cache->get($adminKey));
48
49
        $admin->flushCache();
50
        $this->assertNull($cache->get($editorKey));
51
        $this->assertNull($cache->get($adminKey));
52
    }
53
54
    public function testGroupFlushesPermissions()
55
    {
56
        $cache = Injector::inst()->create(CacheInterface::class . '.TestFlusherCache');
57
        $flusher = new TestCacheFlusher($cache);
58
        $extension = new InheritedPermissionFlusher();
59
        $extension->setServices([$flusher]);
60
        Injector::inst()->registerService($extension, InheritedPermissionFlusher::class);
61
        /** @var Group $editors */
62
        $editors = $this->objFromFixture(Group::class, 'editors');
63
        /** @var Group $admins */
64
        $admins = $this->objFromFixture(Group::class, 'admins');
65
66
        // Populate the cache for all members in each group
67
        foreach ($editors->Members() as $editor) {
68
            $editorKey = $flusher->generateCacheKey(TestCacheFlusher::$categories[0], $editor->ID);
69
            $cache->set($editorKey, 'uncle');
70
        }
71
        foreach ($admins->Members() as $admin) {
72
            $adminKey = $flusher->generateCacheKey(TestCacheFlusher::$categories[0], $admin->ID);
73
            $cache->set($adminKey, 'cheese');
74
        }
75
76
        // Clear the cache for all members in the editors group
77
        $editors->flushCache();
78
79
        foreach ($editors->Members() as $editor) {
80
            $editorKey = $flusher->generateCacheKey(TestCacheFlusher::$categories[0], $editor->ID);
81
            $this->assertNull($cache->get($editorKey));
82
        }
83
        // Admins group should be unaffected
84
        foreach ($admins->Members() as $admin) {
85
            $adminKey = $flusher->generateCacheKey(TestCacheFlusher::$categories[0], $admin->ID);
86
            $this->assertEquals('cheese', $cache->get($adminKey));
87
        }
88
89
90
        $admins->flushCache();
91
        // Admins now affected
92
        foreach ($admins->Members() as $admin) {
93
            $adminKey = $flusher->generateCacheKey(TestCacheFlusher::$categories[0], $admin->ID);
94
            $this->assertNull($cache->get($adminKey));
95
        }
96
        foreach ($editors->Members() as $editor) {
97
            $editorKey = $flusher->generateCacheKey(TestCacheFlusher::$categories[0], $editor->ID);
98
            $this->assertNull($cache->get($editorKey));
99
        }
100
    }
101
}
102