Passed
Push — master ( ddbf8b...086098 )
by Robbie
11:17
created

StorageTest::testSuccessRequest()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 7
nc 1
nop 0
dl 0
loc 13
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace SilverStripe\Security\Tests\Confirmation;
4
5
use SilverStripe\Control\Session;
6
use SilverStripe\Dev\SapphireTest;
7
use SilverStripe\Security\Confirmation\Storage;
8
use SilverStripe\Security\Confirmation\Item;
9
use SilverStripe\Control\Tests\HttpRequestMockBuilder;
10
11
class StorageTest extends SapphireTest
12
{
13
    use HttpRequestMockBuilder;
14
15
    private function getNamespace($id)
16
    {
17
        return str_replace('\\', '.', Storage::class).'.'.$id;
18
    }
19
20
    public function testNewStorage()
21
    {
22
        $session = $this->createMock(Session::class);
23
        $sessionCleaned = false;
24
        $session->method('clear')->will($this->returnCallback(static function ($namespace) use (&$sessionCleaned) {
0 ignored issues
show
Bug introduced by
The method method() does not exist on PHPUnit\Framework\MockObject\MockObject. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

24
        $session->/** @scrutinizer ignore-call */ 
25
                  method('clear')->will($this->returnCallback(static function ($namespace) use (&$sessionCleaned) {

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
25
            $sessionCleaned = $namespace;
26
        }));
27
28
        $storage = new Storage($session, 'test');
0 ignored issues
show
Unused Code introduced by
The assignment to $storage is dead and can be removed.
Loading history...
29
30
        $this->assertEquals(
31
            $this->getNamespace('test'),
32
            $sessionCleaned,
33
            'Session data should have been cleaned from the obsolete data'
34
        );
35
36
        $sessionCleaned = false;
37
        $storage = new Storage($session, 'test', false);
38
        $this->assertFalse($sessionCleaned, 'Session data should have been preserved');
39
    }
40
41
    public function testCleanup()
42
    {
43
        $session = $this->createMock(Session::class);
44
        $sessionCleaned = false;
45
        $session->method('clear')->will($this->returnCallback(static function ($namespace) use (&$sessionCleaned) {
46
            $sessionCleaned = $namespace;
47
        }));
48
49
        $storage = new Storage($session, 'test', false);
50
51
        $this->assertFalse($sessionCleaned, 'Session data should have been preserved');
52
53
        $storage->cleanup();
54
        $this->assertEquals(
55
            $this->getNamespace('test'),
56
            $sessionCleaned,
57
            'Session data should have been cleaned up'
58
        );
59
    }
60
61
    public function testSuccessRequest()
62
    {
63
        $session = new Session([]);
64
        $storage = new Storage($session, 'test');
65
66
        $request = $this->buildRequestMock('dev/build', ['flush' => 'all']);
67
68
        $storage->setSuccessRequest($request);
69
70
        // ensure the data is persisted within the session
71
        $storage = new Storage($session, 'test', false);
72
        $this->assertEquals('dev/build?flush=all', $storage->getSuccessUrl());
73
        $this->assertEquals('GET', $storage->getHttpMethod());
74
    }
75
76
    public function testPutItem()
77
    {
78
        $session = new Session([]);
79
        $storage = new Storage($session, 'test');
80
81
        $item1 = new Item('item1_token', 'item1_name', 'item1_desc');
82
        $item2 = new Item('item2_token', 'item2_name', 'item2_desc');
83
84
        $storage->putItem($item1);
85
        $storage->putItem($item2);
86
87
        // ensure the data is persisted within the session
88
        $storage = new Storage($session, 'test', false);
89
90
        $items = $storage->getItems();
91
        $hashedItems = $storage->getHashedItems();
92
93
        $this->assertCount(2, $items);
94
        $this->assertCount(2, $hashedItems);
95
96
        $item1Hash = $storage->getTokenHash($item1);
97
        $this->assertArrayHasKey($item1Hash, $items);
98
99
        $item = $items[$item1Hash];
100
101
        $this->assertEquals('item1_token', $item->getToken());
102
        $this->assertEquals('item1_name', $item->getName());
103
        $this->assertEquals('item1_desc', $item->getDescription());
104
        $this->assertFalse($item->isConfirmed());
105
106
        $item2Hash = $storage->getTokenHash($item2);
107
        $this->assertArrayHasKey($item2Hash, $items);
108
109
        $item = $items[$item2Hash];
110
111
        $this->assertEquals('item2_token', $item->getToken());
112
        $this->assertEquals('item2_name', $item->getName());
113
        $this->assertEquals('item2_desc', $item->getDescription());
114
        $this->assertFalse($item->isConfirmed());
115
    }
116
117
    public function testConfirmation()
118
    {
119
        $session = new Session([]);
120
        $storage = new Storage($session, 'test');
121
122
        $item1 = new Item('item1_token', 'item1_name', 'item1_desc');
123
        $item2 = new Item('item2_token', 'item2_name', 'item2_desc');
124
125
        $storage->putItem($item1);
126
        $storage->putItem($item2);
127
128
        // ensure the data is persisted within the session
129
        $storage = new Storage($session, 'test', false);
130
131
        foreach ($storage->getItems() as $item) {
132
            $this->assertFalse($item->isConfirmed());
133
        }
134
        $this->assertFalse($storage->check([$item1, $item2]));
135
136
        // check we cannot confirm items with incorrect data
137
        $storage->confirm([]);
138
        foreach ($storage->getItems() as $item) {
139
            $this->assertFalse($item->isConfirmed());
140
        }
141
        $this->assertFalse($storage->check([$item1, $item2]));
142
143
        // check we cannot confirm items with unsalted tokens
144
        $storage->confirm(['item1_token' => '1', 'item2_token' => '1']);
145
        foreach ($storage->getItems() as $item) {
146
            $this->assertFalse($item->isConfirmed());
147
        }
148
        $this->assertFalse($storage->check([$item1, $item2]));
149
150
        // check we can confirm data with properly salted tokens
151
        $storage->confirm($storage->getHashedItems());
152
        foreach ($storage->getItems() as $item) {
153
            $this->assertTrue($item->isConfirmed());
154
        }
155
        $this->assertTrue($storage->check([$item1, $item2]));
156
    }
157
}
158