Completed
Push — master ( 4ad6bd...3873e4 )
by Ingo
11:53
created

testCurrentAbsoluteURLHandlesSlashes()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 13
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 8
nc 3
nop 0
dl 0
loc 13
rs 9.4285
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
        $this->request = new HTTPRequest('GET', '/', $get);
33
        $this->request->setSession(new Session([]));
34
    }
35
36
    public function testParameterDetectsParameters()
37
    {
38
        $withoutToken = new ParameterConfirmationTokenTest_Token('parameterconfirmationtokentest_notoken', $this->request);
39
        $emptyParameter = new ParameterConfirmationTokenTest_Token('parameterconfirmationtokentest_empty', $this->request);
40
        $withToken = new ParameterConfirmationTokenTest_ValidToken('parameterconfirmationtokentest_withtoken', $this->request);
41
        $withoutParameter = new ParameterConfirmationTokenTest_Token('parameterconfirmationtokentest_noparam', $this->request);
42
        $nullToken = new ParameterConfirmationTokenTest_Token('parameterconfirmationtokentest_nulltoken', $this->request);
43
        $emptyToken = new ParameterConfirmationTokenTest_Token('parameterconfirmationtokentest_emptytoken', $this->request);
44
45
        // Check parameter
46
        $this->assertTrue($withoutToken->parameterProvided());
47
        $this->assertTrue($emptyParameter->parameterProvided());  // even if empty, it's still provided
48
        $this->assertTrue($withToken->parameterProvided());
49
        $this->assertFalse($withoutParameter->parameterProvided());
50
        $this->assertTrue($nullToken->parameterProvided());
51
        $this->assertTrue($emptyToken->parameterProvided());
52
53
        // Check token
54
        $this->assertFalse($withoutToken->tokenProvided());
55
        $this->assertFalse($emptyParameter->tokenProvided());
56
        $this->assertTrue($withToken->tokenProvided()); // Actually forced to true for this test
57
        $this->assertFalse($withoutParameter->tokenProvided());
58
        $this->assertFalse($nullToken->tokenProvided());
59
        $this->assertFalse($emptyToken->tokenProvided());
60
61
        // Check if reload is required
62
        $this->assertTrue($withoutToken->reloadRequired());
63
        $this->assertTrue($emptyParameter->reloadRequired());
64
        $this->assertFalse($withToken->reloadRequired());
65
        $this->assertFalse($withoutParameter->reloadRequired());
66
        $this->assertTrue($nullToken->reloadRequired());
67
        $this->assertTrue($emptyToken->reloadRequired());
68
69
        // Check suppression
70
        $this->assertEquals('value', $this->request->getVar('parameterconfirmationtokentest_notoken'));
71
        $withoutToken->suppress();
72
        $this->assertNull($this->request->getVar('parameterconfirmationtokentest_notoken'));
73
    }
74
75
    public function testPrepareTokens()
76
    {
77
        // Test priority ordering
78
        $token = ParameterConfirmationToken::prepare_tokens(
79
            [
80
                'parameterconfirmationtokentest_notoken',
81
                'parameterconfirmationtokentest_empty',
82
                'parameterconfirmationtokentest_noparam'
83
            ],
84
            $this->request
85
        );
86
        // Test no invalid tokens
87
        $this->assertEquals('parameterconfirmationtokentest_empty', $token->getName());
88
        $token = ParameterConfirmationToken::prepare_tokens(
89
            [ 'parameterconfirmationtokentest_noparam' ],
90
            $this->request
91
        );
92
        $this->assertEmpty($token);
93
    }
94
95
    /**
96
     * currentAbsoluteURL needs to handle base or url being missing, or any combination of slashes.
97
     *
98
     * There should always be exactly one slash between each part in the result, and any trailing slash
99
     * should be preserved.
100
     */
101
    public function testCurrentAbsoluteURLHandlesSlashes()
102
    {
103
        $token = new ParameterConfirmationTokenTest_Token(
104
            'parameterconfirmationtokentest_parameter',
105
            $this->request
106
        );
107
108
        foreach (array('', '/', 'bar', 'bar/', '/bar', '/bar/') as $url) {
109
            $this->request->setUrl($url);
110
            $expected = rtrim(Controller::join_links(BASE_URL, '/', $url), '/') ?: '/';
111
            $this->assertEquals($expected, $token->currentURL(), "Invalid redirect for request url $url");
112
        }
113
    }
114
}
115