Passed
Push — master ( 545e22...b70257 )
by Robbie
11:19 queued 10s
created

testCurrentAbsoluteURLHandlesSlashes()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 6
nc 1
nop 1
dl 0
loc 10
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace SilverStripe\Core\Tests\Startup;
4
5
use SilverStripe\Control\Controller;
6
use SilverStripe\Control\HTTPRequest;
7
use SilverStripe\Control\Session;
8
use SilverStripe\Core\Startup\ParameterConfirmationToken;
9
use SilverStripe\Core\Tests\Startup\ParameterConfirmationTokenTest\ParameterConfirmationTokenTest_Token;
10
use SilverStripe\Core\Tests\Startup\ParameterConfirmationTokenTest\ParameterConfirmationTokenTest_ValidToken;
11
use SilverStripe\Dev\SapphireTest;
12
13
class ParameterConfirmationTokenTest extends SapphireTest
14
{
15
    /**
16
     * @var HTTPRequest
17
     */
18
    protected $request = null;
19
20
    protected function setUp()
21
    {
22
        parent::setUp();
23
        $_GET = [];
24
        $_GET['parameterconfirmationtokentest_notoken'] = 'value';
25
        $_GET['parameterconfirmationtokentest_empty'] = '';
26
        $_GET['parameterconfirmationtokentest_withtoken'] = '1';
27
        $_GET['parameterconfirmationtokentest_withtokentoken'] = 'dummy';
28
        $_GET['parameterconfirmationtokentest_nulltoken'] = '1';
29
        $_GET['parameterconfirmationtokentest_nulltokentoken'] = null;
30
        $_GET['parameterconfirmationtokentest_emptytoken'] = '1';
31
        $_GET['parameterconfirmationtokentest_emptytokentoken'] = '';
32
        $_GET['BackURL'] = 'page?parameterconfirmationtokentest_backtoken=1';
33
        $this->request = new HTTPRequest('GET', 'anotherpage', $_GET);
34
        $this->request->setSession(new Session([]));
35
    }
36
37
    public function testParameterDetectsParameters()
38
    {
39
        $withoutToken = new ParameterConfirmationTokenTest_Token(
40
            'parameterconfirmationtokentest_notoken',
41
            $this->request
42
        );
43
        $emptyParameter = new ParameterConfirmationTokenTest_Token(
44
            'parameterconfirmationtokentest_empty',
45
            $this->request
46
        );
47
        $withToken = new ParameterConfirmationTokenTest_ValidToken(
48
            'parameterconfirmationtokentest_withtoken',
49
            $this->request
50
        );
51
        $withoutParameter = new ParameterConfirmationTokenTest_Token(
52
            'parameterconfirmationtokentest_noparam',
53
            $this->request
54
        );
55
        $nullToken = new ParameterConfirmationTokenTest_Token(
56
            'parameterconfirmationtokentest_nulltoken',
57
            $this->request
58
        );
59
        $emptyToken = new ParameterConfirmationTokenTest_Token(
60
            'parameterconfirmationtokentest_emptytoken',
61
            $this->request
62
        );
63
        $backToken = new ParameterConfirmationTokenTest_Token(
64
            'parameterconfirmationtokentest_backtoken',
65
            $this->request
66
        );
67
68
        // Check parameter
69
        $this->assertTrue($withoutToken->parameterProvided());
70
        $this->assertTrue($emptyParameter->parameterProvided());  // even if empty, it's still provided
71
        $this->assertTrue($withToken->parameterProvided());
72
        $this->assertFalse($withoutParameter->parameterProvided());
73
        $this->assertTrue($nullToken->parameterProvided());
74
        $this->assertTrue($emptyToken->parameterProvided());
75
        $this->assertFalse($backToken->parameterProvided());
76
77
        // Check backurl
78
        $this->assertFalse($withoutToken->existsInReferer());
79
        $this->assertFalse($emptyParameter->existsInReferer());  // even if empty, it's still provided
80
        $this->assertFalse($withToken->existsInReferer());
81
        $this->assertFalse($withoutParameter->existsInReferer());
82
        $this->assertFalse($nullToken->existsInReferer());
83
        $this->assertFalse($emptyToken->existsInReferer());
84
        $this->assertTrue($backToken->existsInReferer());
85
86
        // Check token
87
        $this->assertFalse($withoutToken->tokenProvided());
88
        $this->assertFalse($emptyParameter->tokenProvided());
89
        $this->assertTrue($withToken->tokenProvided()); // Actually forced to true for this test
90
        $this->assertFalse($withoutParameter->tokenProvided());
91
        $this->assertFalse($nullToken->tokenProvided());
92
        $this->assertFalse($emptyToken->tokenProvided());
93
        $this->assertFalse($backToken->tokenProvided());
94
95
        // Check if reload is required
96
        $this->assertTrue($withoutToken->reloadRequired());
97
        $this->assertTrue($emptyParameter->reloadRequired());
98
        $this->assertFalse($withToken->reloadRequired());
99
        $this->assertFalse($withoutParameter->reloadRequired());
100
        $this->assertTrue($nullToken->reloadRequired());
101
        $this->assertTrue($emptyToken->reloadRequired());
102
        $this->assertFalse($backToken->reloadRequired());
103
104
        // Check if a reload is required in case of error
105
        $this->assertTrue($withoutToken->reloadRequiredIfError());
106
        $this->assertTrue($emptyParameter->reloadRequiredIfError());
107
        $this->assertFalse($withToken->reloadRequiredIfError());
108
        $this->assertFalse($withoutParameter->reloadRequiredIfError());
109
        $this->assertTrue($nullToken->reloadRequiredIfError());
110
        $this->assertTrue($emptyToken->reloadRequiredIfError());
111
        $this->assertTrue($backToken->reloadRequiredIfError());
112
113
        // Check redirect url
114
        $home = (BASE_URL ?: '/') . '?';
115
        $current = Controller::join_links(BASE_URL, '/', 'anotherpage') . '?';
116
        $this->assertStringStartsWith($current, $withoutToken->redirectURL());
117
        $this->assertStringStartsWith($current, $emptyParameter->redirectURL());
118
        $this->assertStringStartsWith($current, $nullToken->redirectURL());
119
        $this->assertStringStartsWith($current, $emptyToken->redirectURL());
120
        $this->assertStringStartsWith($home, $backToken->redirectURL());
121
122
        // Check suppression
123
        $this->assertEquals('value', $this->request->getVar('parameterconfirmationtokentest_notoken'));
124
        $withoutToken->suppress();
125
        $this->assertNull($this->request->getVar('parameterconfirmationtokentest_notoken'));
126
    }
127
128
    public function testPrepareTokens()
129
    {
130
        // Test priority ordering
131
        $token = ParameterConfirmationToken::prepare_tokens(
132
            [
133
                'parameterconfirmationtokentest_notoken',
134
                'parameterconfirmationtokentest_empty',
135
                'parameterconfirmationtokentest_noparam'
136
            ],
137
            $this->request
138
        );
139
        // Test no invalid tokens
140
        $this->assertEquals('parameterconfirmationtokentest_empty', $token->getName());
141
        $token = ParameterConfirmationToken::prepare_tokens(
142
            [ 'parameterconfirmationtokentest_noparam' ],
143
            $this->request
144
        );
145
        $this->assertEmpty($token);
146
147
        // Test backurl token
148
        $token = ParameterConfirmationToken::prepare_tokens(
149
            [ 'parameterconfirmationtokentest_backtoken' ],
150
            $this->request
151
        );
152
        $this->assertEquals('parameterconfirmationtokentest_backtoken', $token->getName());
153
154
        // Test prepare_tokens() unsets $_GET vars
155
        $this->assertArrayNotHasKey('parameterconfirmationtokentest_notoken', $_GET);
156
        $this->assertArrayNotHasKey('parameterconfirmationtokentest_empty', $_GET);
157
        $this->assertArrayNotHasKey('parameterconfirmationtokentest_noparam', $_GET);
158
    }
159
160
    public function dataProviderURLs()
161
    {
162
        return [
163
            [''],
164
            ['/'],
165
            ['bar'],
166
            ['bar/'],
167
            ['/bar'],
168
            ['/bar/'],
169
        ];
170
    }
171
172
    /**
173
     * currentURL needs to handle base or url being missing, or any combination of slashes.
174
     *
175
     * There should always be exactly one slash between each part in the result, and any trailing slash
176
     * should be preserved.
177
     *
178
     * @dataProvider dataProviderURLs
179
     */
180
    public function testCurrentURLHandlesSlashes($url)
181
    {
182
        $this->request->setUrl($url);
183
184
        $token = new ParameterConfirmationTokenTest_Token(
185
            'parameterconfirmationtokentest_parameter',
186
            $this->request
187
        );
188
        $expected = rtrim(Controller::join_links(BASE_URL, '/', $url), '/') ?: '/';
189
        $this->assertEquals($expected, $token->currentURL(), "Invalid redirect for request url $url");
190
    }
191
}
192