testGetLocalePriority()   A
last analyzed

Complexity

Conditions 3
Paths 4

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 9
nc 4
nop 6
dl 0
loc 15
rs 9.9666
c 0
b 0
f 0
1
<?php
2
3
namespace TractorCow\Fluent\Tests\Middleware;
4
5
use PHPUnit_Framework_MockObject_MockObject;
6
use SilverStripe\Control\Controller;
7
use SilverStripe\Control\HTTPRequest;
8
use SilverStripe\Core\Config\Config;
9
use SilverStripe\Dev\SapphireTest;
10
use TractorCow\Fluent\Extension\FluentDirectorExtension;
11
use TractorCow\Fluent\Middleware\DetectLocaleMiddleware;
12
use TractorCow\Fluent\Model\Domain;
13
use TractorCow\Fluent\Model\Locale;
14
use TractorCow\Fluent\State\FluentState;
15
16
class DetectLocaleMiddlewareTest extends SapphireTest
17
{
18
    protected static $fixture_file = 'DetectLocaleMiddlewareTest.yml';
19
20
    /**
21
     * @var Stub\DetectLocaleMiddlewareSpy
22
     */
23
    protected $middleware;
24
25
    protected function setUp()
26
    {
27
        parent::setUp();
28
        $this->middleware = new Stub\DetectLocaleMiddlewareSpy;
29
30
        Config::modify()->set(FluentDirectorExtension::class, 'query_param', 'l');
31
32
        // Enable localedetection
33
        FluentDirectorExtension::config()->set('detect_locale', true);
34
35
        // Clear cache
36
        Locale::clearCached();
37
        Domain::clearCached();
38
    }
39
40
    public function testGetPersistKey()
41
    {
42
        FluentState::singleton()->withState(function (FluentState $newState) {
43
            $newState->setIsFrontend(true);
44
            $this->assertSame('FluentLocale', $this->middleware->getPersistKey());
45
46
            $newState->setIsFrontend(false);
47
            $this->assertSame('FluentLocale_CMS', $this->middleware->getPersistKey());
48
        });
49
    }
50
51
    /**
52
     * @dataProvider localePriorityProvider
53
     * @param string $url
54
     * @param array $routeParams
55
     * @param array $queryParams
56
     * @param bool $persisted
57
     * @param string $header
58
     * @param string $expected
59
     */
60
    public function testGetLocalePriority($url, $routeParams, $queryParams, $persisted, $header, $expected)
61
    {
62
        $request = new HTTPRequest('GET', $url, $queryParams);
63
        $request->setRouteParams($routeParams);
64
        $request->setSession(Controller::curr()->getRequest()->getSession());
65
        $this->middleware->setPersistLocale($request, null);
66
67
        if ($persisted) {
68
            $this->middleware->setPersistLocale($request, $persisted);
69
        }
70
        if ($header) {
71
            $request->addHeader('Accept-Language', $header);
72
        }
73
74
        $this->assertSame($expected, $this->middleware->getLocale($request));
75
    }
76
77
    /**
78
     * @return array[] List of tests with arguments: $url, $routeParams, $queryParams, $persisted, $header, $expected
79
     */
80
    public function localePriorityProvider()
81
    {
82
        return [/*
83
            // First priority: controller routing params
84
            ['/nz/foo', ['l' => 'en_NZ'], ['l' => 'en_AU'], 'fr_FR', 'es-US', 'en_NZ'],
85
            // Second priority: request params
86
            ['/foo', [], ['l' => 'en_AU'], 'fr_FR', 'es-US', 'en_AU'],
87
            // Third priority: persisted locale
88
            ['/foo', [], [], 'fr_FR', 'es-US', 'fr_FR'],
89
            // Default to the default locale when not on the homepage
90
            ['/foo', [], [], null, 'es-US', 'es_ES'],*/
91
            // Home page only - fourth priority is request header
92
            ['/', [], [], null, 'es-US', 'es_US'],
93
        ];
94
    }
95
96
    public function testLocaleIsAlwaysPersistedEvenIfNotSetByTheMiddleware()
97
    {
98
        FluentState::singleton()->withState(function (FluentState $newState) {
99
            $request = new HTTPRequest('GET', '/');
100
            $newState->setLocale('dummy');
101
102
            /** @var DetectLocaleMiddleware|PHPUnit_Framework_MockObject_MockObject $middleware */
103
            $middleware = $this->getMockBuilder(DetectLocaleMiddleware::class)
104
                ->setMethods(['getLocale', 'setPersistLocale'])
105
                ->getMock();
106
107
            $middleware->expects($this->never())->method('getLocale');
108
            $middleware->expects($this->once())->method('setPersistLocale')->with($request, 'dummy');
109
110
            $middleware->process($request, function () {
111
                // no-op
112
            });
113
        });
114
    }
115
}
116