Passed
Push — 4.1 ( 6d2665...02ad0f )
by
unknown
32:36 queued 24:09
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('parameterconfirmationtokentest_notoken', $this->request);
40
        $emptyParameter = new ParameterConfirmationTokenTest_Token('parameterconfirmationtokentest_empty', $this->request);
41
        $withToken = new ParameterConfirmationTokenTest_ValidToken('parameterconfirmationtokentest_withtoken', $this->request);
42
        $withoutParameter = new ParameterConfirmationTokenTest_Token('parameterconfirmationtokentest_noparam', $this->request);
43
        $nullToken = new ParameterConfirmationTokenTest_Token('parameterconfirmationtokentest_nulltoken', $this->request);
44
        $emptyToken = new ParameterConfirmationTokenTest_Token('parameterconfirmationtokentest_emptytoken', $this->request);
45
        $backToken = new ParameterConfirmationTokenTest_Token('parameterconfirmationtokentest_backtoken', $this->request);
46
47
        // Check parameter
48
        $this->assertTrue($withoutToken->parameterProvided());
49
        $this->assertTrue($emptyParameter->parameterProvided());  // even if empty, it's still provided
50
        $this->assertTrue($withToken->parameterProvided());
51
        $this->assertFalse($withoutParameter->parameterProvided());
52
        $this->assertTrue($nullToken->parameterProvided());
53
        $this->assertTrue($emptyToken->parameterProvided());
54
        $this->assertFalse($backToken->parameterProvided());
55
56
        // Check backurl
57
        $this->assertFalse($withoutToken->existsInReferer());
58
        $this->assertFalse($emptyParameter->existsInReferer());  // even if empty, it's still provided
59
        $this->assertFalse($withToken->existsInReferer());
60
        $this->assertFalse($withoutParameter->existsInReferer());
61
        $this->assertFalse($nullToken->existsInReferer());
62
        $this->assertFalse($emptyToken->existsInReferer());
63
        $this->assertTrue($backToken->existsInReferer());
64
65
        // Check token
66
        $this->assertFalse($withoutToken->tokenProvided());
67
        $this->assertFalse($emptyParameter->tokenProvided());
68
        $this->assertTrue($withToken->tokenProvided()); // Actually forced to true for this test
69
        $this->assertFalse($withoutParameter->tokenProvided());
70
        $this->assertFalse($nullToken->tokenProvided());
71
        $this->assertFalse($emptyToken->tokenProvided());
72
        $this->assertFalse($backToken->tokenProvided());
73
74
        // Check if reload is required
75
        $this->assertTrue($withoutToken->reloadRequired());
76
        $this->assertTrue($emptyParameter->reloadRequired());
77
        $this->assertFalse($withToken->reloadRequired());
78
        $this->assertFalse($withoutParameter->reloadRequired());
79
        $this->assertTrue($nullToken->reloadRequired());
80
        $this->assertTrue($emptyToken->reloadRequired());
81
        $this->assertFalse($backToken->reloadRequired());
82
83
        // Check if a reload is required in case of error
84
        $this->assertTrue($withoutToken->reloadRequiredIfError());
85
        $this->assertTrue($emptyParameter->reloadRequiredIfError());
86
        $this->assertFalse($withToken->reloadRequiredIfError());
87
        $this->assertFalse($withoutParameter->reloadRequiredIfError());
88
        $this->assertTrue($nullToken->reloadRequiredIfError());
89
        $this->assertTrue($emptyToken->reloadRequiredIfError());
90
        $this->assertTrue($backToken->reloadRequiredIfError());
91
92
        // Check redirect url
93
        $home = (BASE_URL ?: '/') . '?';
94
        $current = Controller::join_links(BASE_URL, '/', 'anotherpage') . '?';
95
        $this->assertStringStartsWith($current, $withoutToken->redirectURL());
96
        $this->assertStringStartsWith($current, $emptyParameter->redirectURL());
97
        $this->assertStringStartsWith($current, $nullToken->redirectURL());
98
        $this->assertStringStartsWith($current, $emptyToken->redirectURL());
99
        $this->assertStringStartsWith($home, $backToken->redirectURL());
100
101
        // Check suppression
102
        $this->assertEquals('value', $this->request->getVar('parameterconfirmationtokentest_notoken'));
103
        $withoutToken->suppress();
104
        $this->assertNull($this->request->getVar('parameterconfirmationtokentest_notoken'));
105
    }
106
107
    public function testPrepareTokens()
108
    {
109
        // Test priority ordering
110
        $token = ParameterConfirmationToken::prepare_tokens(
111
            [
112
                'parameterconfirmationtokentest_notoken',
113
                'parameterconfirmationtokentest_empty',
114
                'parameterconfirmationtokentest_noparam'
115
            ],
116
            $this->request
117
        );
118
        // Test no invalid tokens
119
        $this->assertEquals('parameterconfirmationtokentest_empty', $token->getName());
120
        $token = ParameterConfirmationToken::prepare_tokens(
121
            [ 'parameterconfirmationtokentest_noparam' ],
122
            $this->request
123
        );
124
        $this->assertEmpty($token);
125
126
        // Test backurl token
127
        $token = ParameterConfirmationToken::prepare_tokens(
128
            [ 'parameterconfirmationtokentest_backtoken' ],
129
            $this->request
130
        );
131
        $this->assertEquals('parameterconfirmationtokentest_backtoken', $token->getName());
132
133
        // Test prepare_tokens() unsets $_GET vars
134
        $this->assertArrayNotHasKey('parameterconfirmationtokentest_notoken', $_GET);
135
        $this->assertArrayNotHasKey('parameterconfirmationtokentest_empty', $_GET);
136
        $this->assertArrayNotHasKey('parameterconfirmationtokentest_noparam', $_GET);
137
    }
138
139
    public function dataProviderURLs()
140
    {
141
        return [
142
            [''],
143
            ['/'],
144
            ['bar'],
145
            ['bar/'],
146
            ['/bar'],
147
            ['/bar/'],
148
        ];
149
    }
150
151
    /**
152
     * currentURL needs to handle base or url being missing, or any combination of slashes.
153
     *
154
     * There should always be exactly one slash between each part in the result, and any trailing slash
155
     * should be preserved.
156
     *
157
     * @dataProvider dataProviderURLs
158
     */
159
    public function testCurrentURLHandlesSlashes($url)
160
    {
161
        $this->request->setUrl($url);
162
163
        $token = new ParameterConfirmationTokenTest_Token(
164
            'parameterconfirmationtokentest_parameter',
165
            $this->request
166
        );
167
        $expected = rtrim(Controller::join_links(BASE_URL, '/', $url), '/') ?: '/';
168
        $this->assertEquals($expected, $token->currentURL(), "Invalid redirect for request url $url");
169
    }
170
}
171