Completed
Push — master ( f5fa17...2365be )
by Łukasz
21:38
created

testGetPreferredLanguagesWithoutUserLanguage()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 32

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 2
dl 0
loc 32
rs 9.408
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * @copyright Copyright (C) eZ Systems AS. All rights reserved.
5
 * @license For full copyright and license information view LICENSE file distributed with this source code.
6
 */
7
declare(strict_types=1);
8
9
namespace eZ\Publish\Core\MVC\Symfony\Locale\Tests;
10
11
use eZ\Publish\Core\MVC\Symfony\Locale\UserLanguagePreferenceProvider;
12
use PHPUnit\Framework\TestCase;
13
use Symfony\Component\HttpFoundation\HeaderBag;
14
use Symfony\Component\HttpFoundation\Request;
15
use Symfony\Component\HttpFoundation\RequestStack;
16
use Symfony\Component\Yaml\Yaml;
17
use eZ\Publish\API\Repository\UserPreferenceService;
18
use eZ\Publish\API\Repository\Values\UserPreference\UserPreference;
19
use eZ\Publish\Core\Base\Exceptions\NotFoundException;
20
21
class UserLanguagePreferenceProviderTest extends TestCase
22
{
23
    private const LOCALE_FALLBACK = 'en';
24
    private const LANGUAGE_PREFERENCE_NAME = 'language';
25
    private const LANGUAGE_PREFERENCE_VALUE = 'no';
26
27
    /**
28
     * @var \eZ\Publish\Core\MVC\Symfony\Locale\UserLanguagePreferenceProviderInterface
29
     */
30
    private $userLanguagePreferenceProvider;
31
32
    /**
33
     * @var \PHPUnit\Framework\MockObject\MockObject|\Symfony\Component\HttpFoundation\RequestStack
34
     */
35
    private $requestStackMock;
36
37
    /**
38
     * @var \eZ\Publish\API\Repository\UserPreferenceService
39
     */
40
    private $userPreferenceServiceMock;
41
42
    public function setUp()
43
    {
44
        $this->requestStackMock = $this->createMock(RequestStack::class);
45
46
        $userLanguagePreference = new UserPreference([
47
            'name' => self::LANGUAGE_PREFERENCE_NAME,
48
            'value' => self::LANGUAGE_PREFERENCE_VALUE,
49
        ]);
50
51
        $this->userPreferenceServiceMock = $this->createMock(UserPreferenceService::class);
0 ignored issues
show
Documentation Bug introduced by
It seems like $this->createMock(\eZ\Pu...eferenceService::class) of type object<PHPUnit\Framework\MockObject\MockObject> is incompatible with the declared type object<eZ\Publish\API\Re...\UserPreferenceService> of property $userPreferenceServiceMock.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
52
        $this->userPreferenceServiceMock
53
            ->method('getUserPreference')
54
            ->with(self::LANGUAGE_PREFERENCE_NAME)
55
            ->willReturn($userLanguagePreference);
56
57
        $this->userLanguagePreferenceProvider = new UserLanguagePreferenceProvider(
58
            $this->requestStackMock,
59
            $this->userPreferenceServiceMock,
60
            $this->getLanguageCodesMap(),
61
            self::LOCALE_FALLBACK
62
        );
63
    }
64
65
    /**
66
     * @dataProvider providerForTestGetPreferredLanguages
67
     *
68
     * @param array $userLanguages
69
     * @param array $expectedEzLanguageCodes
70
     */
71
    public function testGetPreferredLanguagesWithoutUserLanguage(array $userLanguages, array $expectedEzLanguageCodes): void
72
    {
73
        $request = new Request();
74
        $request->headers = new HeaderBag(
75
            [
76
                'Accept-Language' => implode(', ', $userLanguages),
77
            ]
78
        );
79
        $this
80
            ->requestStackMock
81
            ->expects($this->once())
82
            ->method('getCurrentRequest')
83
            ->willReturn($request);
84
85
        $userPreferenceServiceMock = $this->createMock(UserPreferenceService::class);
86
        $userPreferenceServiceMock
87
            ->method('getUserPreference')
88
            ->with(self::LANGUAGE_PREFERENCE_NAME)
89
            ->will($this->throwException(new NotFoundException('User Preference', self::LANGUAGE_PREFERENCE_NAME)));
90
91
        $userLanguagePreferenceProvider = new UserLanguagePreferenceProvider(
92
            $this->requestStackMock,
0 ignored issues
show
Bug introduced by
It seems like $this->requestStackMock can also be of type object<PHPUnit\Framework\MockObject\MockObject>; however, eZ\Publish\Core\MVC\Symf...Provider::__construct() does only seem to accept object<Symfony\Component...oundation\RequestStack>, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
93
            $userPreferenceServiceMock,
94
            $this->getLanguageCodesMap(),
95
            self::LOCALE_FALLBACK
96
        );
97
98
        self::assertEquals(
99
            $expectedEzLanguageCodes,
100
            $userLanguagePreferenceProvider->getPreferredLanguages()
101
        );
102
    }
103
104
    /**
105
     * @dataProvider providerForTestGetPreferredLanguagesWithUserPreferredLanguage
106
     *
107
     * @param array $userLanguages
108
     * @param array $expectedEzLanguageCodes
109
     */
110
    public function testGetPreferredLanguagesWithUserPreferredLanguage(array $userLanguages, array $expectedEzLanguageCodes): void
111
    {
112
        $request = new Request();
113
        $request->headers = new HeaderBag(
114
            [
115
                'Accept-Language' => implode(', ', $userLanguages),
116
            ]
117
        );
118
        $this
119
            ->requestStackMock
120
            ->expects($this->once())
121
            ->method('getCurrentRequest')
122
            ->willReturn($request);
123
124
        $userLanguagePreferenceProvider = new UserLanguagePreferenceProvider(
125
            $this->requestStackMock,
0 ignored issues
show
Bug introduced by
It seems like $this->requestStackMock can also be of type object<PHPUnit\Framework\MockObject\MockObject>; however, eZ\Publish\Core\MVC\Symf...Provider::__construct() does only seem to accept object<Symfony\Component...oundation\RequestStack>, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
126
            $this->userPreferenceServiceMock,
127
            $this->getLanguageCodesMap(),
128
            self::LOCALE_FALLBACK
129
        );
130
131
        self::assertEquals(
132
            $expectedEzLanguageCodes,
133
            $userLanguagePreferenceProvider->getPreferredLanguages()
134
        );
135
    }
136
137
    /**
138
     * @see testGetPreferredLanguages
139
     *
140
     * @return array
141
     */
142
    public function providerForTestGetPreferredLanguages(): array
143
    {
144
        return [
145
            [[], ['eng-GB', 'eng-US']],
146
            [['pl'], ['pol-PL']],
147
            [['fr'], ['fre-FR']],
148
            [['en'], ['eng-GB', 'eng-US']],
149
            [['en_us'], ['eng-US']],
150
        ];
151
    }
152
153
    /**
154
     * @see testGetPreferredLanguages
155
     *
156
     * @return array
157
     */
158
    public function providerForTestGetPreferredLanguagesWithUserPreferredLanguage(): array
159
    {
160
        return [
161
            [[], ['nor-NO', 'eng-GB', 'eng-US']],
162
            [['pl'], ['nor-NO', 'pol-PL']],
163
            [['fr'], ['nor-NO', 'fre-FR']],
164
            [['en'], ['nor-NO', 'eng-GB', 'eng-US']],
165
            [['en_us'], ['nor-NO', 'eng-US']],
166
        ];
167
    }
168
169
    private function getLanguageCodesMap(): array
170
    {
171
        $config = Yaml::parseFile(
172
            realpath(dirname(__DIR__, 6) . '/Bundle/EzPublishCoreBundle/Resources/config/locale.yml')
173
        );
174
175
        return $config['parameters']['ezpublish.locale.browser_map'];
176
    }
177
}
178