Passed
Pull Request — master (#42)
by
unknown
12:42
created

LoaderTest::testDetectEnv()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 34
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 25
c 1
b 0
f 0
dl 0
loc 34
rs 9.52
cc 3
nc 3
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpMyAdmin\MoTranslator\Tests;
6
7
use PhpMyAdmin\MoTranslator\Cache\CacheFactoryInterface;
8
use PhpMyAdmin\MoTranslator\Cache\CacheInterface;
9
use PhpMyAdmin\MoTranslator\Loader;
10
use PhpMyAdmin\MoTranslator\MoParser;
11
use PHPUnit\Framework\TestCase;
12
13
use function getenv;
14
use function putenv;
15
16
/**
17
 * Test for mo loading.
18
 */
19
class LoaderTest extends TestCase
20
{
21
    /**
22
     * @param array[] $expected
23
     *
24
     * @dataProvider localeList
25
     */
26
    public function testListLocales(string $locale, array $expected): void
27
    {
28
        $this->assertEquals(
29
            $expected,
30
            Loader::listLocales($locale)
31
        );
32
    }
33
34
    /**
35
     * @return array[]
36
     */
37
    public function localeList(): array
38
    {
39
        return [
40
            [
41
                'cs_CZ',
42
                [
43
                    'cs_CZ',
44
                    'cs',
45
                ],
46
            ],
47
            [
48
                'sr_CS.UTF-8@latin',
49
                [
50
                    'sr_CS.UTF-8@latin',
51
                    'sr_CS@latin',
52
                    'sr@latin',
53
                    'sr_CS.UTF-8',
54
                    'sr_CS',
55
                    'sr',
56
                ],
57
            ],
58
            // For a locale containing country code, we prefer
59
            // full locale name, but if that's not found, fall back
60
            // to the language only locale name.
61
            [
62
                'sr_RS',
63
                [
64
                    'sr_RS',
65
                    'sr',
66
                ],
67
            ],
68
            // If language code is used, it's the only thing returned.
69
            [
70
                'sr',
71
                ['sr'],
72
            ],
73
            // There is support for language and charset only.
74
            [
75
                'sr.UTF-8',
76
                [
77
                    'sr.UTF-8',
78
                    'sr',
79
                ],
80
            ],
81
82
            // It can also split out character set from the full locale name.
83
            [
84
                'sr_RS.UTF-8',
85
                [
86
                    'sr_RS.UTF-8',
87
                    'sr_RS',
88
                    'sr',
89
                ],
90
            ],
91
92
            // There is support for @modifier in locale names as well.
93
            [
94
                'sr_RS.UTF-8@latin',
95
                [
96
                    'sr_RS.UTF-8@latin',
97
                    'sr_RS@latin',
98
                    'sr@latin',
99
                    'sr_RS.UTF-8',
100
                    'sr_RS',
101
                    'sr',
102
                ],
103
            ],
104
            [
105
                'sr.UTF-8@latin',
106
                [
107
                    'sr.UTF-8@latin',
108
                    'sr@latin',
109
                    'sr.UTF-8',
110
                    'sr',
111
                ],
112
            ],
113
114
            // We can pass in only language and modifier.
115
            [
116
                'sr@latin',
117
                [
118
                    'sr@latin',
119
                    'sr',
120
                ],
121
            ],
122
123
            // If locale name is not following the regular POSIX pattern,
124
            // it's used verbatim.
125
            [
126
                'something',
127
                ['something'],
128
            ],
129
130
            // Passing in an empty string returns an empty array.
131
            [
132
                '',
133
                [],
134
            ],
135
        ];
136
    }
137
138
    private function getLoader(string $domain, string $locale): Loader
139
    {
140
        $loader = new Loader();
141
        $loader->setlocale($locale);
142
        $loader->textdomain($domain);
143
        $loader->bindtextdomain($domain, __DIR__ . '/data/locale/');
144
145
        return $loader;
146
    }
147
148
    public function testLocaleChange(): void
149
    {
150
        $loader = new Loader();
151
        $loader->setlocale('cs');
152
        $loader->textdomain('phpmyadmin');
153
        $loader->bindtextdomain('phpmyadmin', __DIR__ . '/data/locale/');
154
        $translator = $loader->getTranslator('phpmyadmin');
155
        $this->assertEquals('Typ', $translator->gettext('Type'));
156
        $loader->setlocale('be_BY');
157
        $translator = $loader->getTranslator('phpmyadmin');
158
        $this->assertEquals('Тып', $translator->gettext('Type'));
159
    }
160
161
    /**
162
     * @dataProvider translatorData
163
     */
164
    public function testGetTranslator(string $domain, string $locale, string $otherdomain, string $expected): void
165
    {
166
        $loader = $this->getLoader($domain, $locale);
167
        $translator = $loader->getTranslator($otherdomain);
168
        $this->assertEquals(
169
            $expected,
170
            $translator->gettext('Type')
171
        );
172
    }
173
174
    /**
175
     * @return array[]
176
     */
177
    public function translatorData(): array
178
    {
179
        return [
180
            [
181
                'phpmyadmin',
182
                'cs',
183
                '',
184
                'Typ',
185
            ],
186
            [
187
                'phpmyadmin',
188
                'cs_CZ',
189
                '',
190
                'Typ',
191
            ],
192
            [
193
                'phpmyadmin',
194
                'be_BY',
195
                '',
196
                'Тып',
197
            ],
198
            [
199
                'phpmyadmin',
200
                'be@latin',
201
                '',
202
                'Typ',
203
            ],
204
            [
205
                'phpmyadmin',
206
                'cs',
207
                'other',
208
                'Type',
209
            ],
210
            [
211
                'other',
212
                'cs',
213
                'phpmyadmin',
214
                'Type',
215
            ],
216
        ];
217
    }
218
219
    public function testInstance(): void
220
    {
221
        $loader = Loader::getInstance();
222
        $loader->setlocale('cs');
223
        $loader->textdomain('phpmyadmin');
224
        $loader->bindtextdomain('phpmyadmin', __DIR__ . '/data/locale/');
225
226
        $translator = $loader->getTranslator();
227
        $this->assertEquals(
228
            'Typ',
229
            $translator->gettext('Type')
230
        );
231
232
        /* Ensure the object survives */
233
        $loader = Loader::getInstance();
234
        $translator = $loader->getTranslator();
235
        $this->assertEquals(
236
            'Typ',
237
            $translator->gettext('Type')
238
        );
239
240
        /* Ensure the object can support different locale files for the same domain */
241
        $loader = Loader::getInstance();
242
        $loader->setlocale('be_BY');
243
        $loader->bindtextdomain('phpmyadmin', __DIR__ . '/data/locale/');
244
        $translator = $loader->getTranslator();
245
        $this->assertEquals(
246
            'Тып',
247
            $translator->gettext('Type')
248
        );
249
    }
250
251
    public function testDetect(): void
252
    {
253
        $GLOBALS['lang'] = 'foo';
254
        $loader = Loader::getInstance();
255
        $this->assertEquals(
256
            'foo',
257
            $loader->detectlocale()
258
        );
259
        unset($GLOBALS['lang']);
260
    }
261
262
    public function testDetectEnv(): void
263
    {
264
        $loader = Loader::getInstance();
265
        foreach (['LC_MESSAGES', 'LC_ALL', 'LANG'] as $var) {
266
            putenv($var);
267
            if (getenv($var) === false) {
268
                continue;
269
            }
270
271
            $this->markTestSkipped('Unsetting environment does not work');
272
        }
273
274
        unset($GLOBALS['lang']);
275
        putenv('LC_ALL=baz');
276
        $this->assertEquals(
277
            'baz',
278
            $loader->detectlocale()
279
        );
280
        putenv('LC_ALL');
281
        putenv('LC_MESSAGES=bar');
282
        $this->assertEquals(
283
            'bar',
284
            $loader->detectlocale()
285
        );
286
        putenv('LC_MESSAGES');
287
        putenv('LANG=barr');
288
        $this->assertEquals(
289
            'barr',
290
            $loader->detectlocale()
291
        );
292
        putenv('LANG');
293
        $this->assertEquals(
294
            'en',
295
            $loader->detectlocale()
296
        );
297
    }
298
299
    public function testSetCacheFactory(): void
300
    {
301
        $expected = 'Foo';
302
        $locale = 'be_BY';
303
        $domain = 'apcu';
304
305
        $cache = $this->createStub(CacheInterface::class);
0 ignored issues
show
Bug introduced by
The method createStub() does not exist on PhpMyAdmin\MoTranslator\Tests\LoaderTest. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

305
        /** @scrutinizer ignore-call */ 
306
        $cache = $this->createStub(CacheInterface::class);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
306
        $cache->method('get')
307
            ->willReturn($expected);
308
        $factory = $this->createMock(CacheFactoryInterface::class);
309
        $factory->expects($this->once())
310
            ->method('getInstance')
311
            ->with($this->isInstanceOf(MoParser::class), $locale, $domain)
312
            ->willReturn($cache);
313
314
        Loader::setCacheFactory($factory);
315
        $loader = Loader::getInstance();
316
        $loader->setlocale($locale);
317
        $loader->bindtextdomain($domain, __DIR__ . '/data/locale/');
318
        $translator = $loader->getTranslator($domain);
319
320
        $actual = $translator->gettext('Type');
321
        $this->assertEquals($expected, $actual);
322
    }
323
}
324