Merge "Setup: Remove scopedProfileIn() calls"
[lhc/web/wiklou.git] / tests / phpunit / includes / cache / LocalisationCacheTest.php
1 <?php
2 /**
3 * @group Database
4 * @group Cache
5 * @covers LocalisationCache
6 * @author Niklas Laxström
7 */
8 class LocalisationCacheTest extends MediaWikiTestCase {
9 protected function setUp() {
10 parent::setUp();
11 $this->setMwGlobals( [
12 'wgExtensionMessagesFiles' => [],
13 'wgHooks' => [],
14 ] );
15 }
16
17 /**
18 * @return LocalisationCache
19 */
20 protected function getMockLocalisationCache() {
21 global $IP;
22 $lc = $this->getMockBuilder( \LocalisationCache::class )
23 ->setConstructorArgs( [ [ 'store' => 'detect' ] ] )
24 ->setMethods( [ 'getMessagesDirs' ] )
25 ->getMock();
26 $lc->expects( $this->any() )->method( 'getMessagesDirs' )
27 ->will( $this->returnValue(
28 [ "$IP/tests/phpunit/data/localisationcache" ]
29 ) );
30
31 return $lc;
32 }
33
34 public function testPuralRulesFallback() {
35 $cache = $this->getMockLocalisationCache();
36
37 $this->assertEquals(
38 $cache->getItem( 'ar', 'pluralRules' ),
39 $cache->getItem( 'arz', 'pluralRules' ),
40 'arz plural rules (undefined) fallback to ar (defined)'
41 );
42
43 $this->assertEquals(
44 $cache->getItem( 'ar', 'compiledPluralRules' ),
45 $cache->getItem( 'arz', 'compiledPluralRules' ),
46 'arz compiled plural rules (undefined) fallback to ar (defined)'
47 );
48
49 $this->assertNotEquals(
50 $cache->getItem( 'ksh', 'pluralRules' ),
51 $cache->getItem( 'de', 'pluralRules' ),
52 'ksh plural rules (defined) dont fallback to de (defined)'
53 );
54
55 $this->assertNotEquals(
56 $cache->getItem( 'ksh', 'compiledPluralRules' ),
57 $cache->getItem( 'de', 'compiledPluralRules' ),
58 'ksh compiled plural rules (defined) dont fallback to de (defined)'
59 );
60 }
61
62 public function testRecacheFallbacks() {
63 $lc = $this->getMockLocalisationCache();
64 $lc->recache( 'ba' );
65 $this->assertEquals(
66 [
67 'present-ba' => 'ba',
68 'present-ru' => 'ru',
69 'present-en' => 'en',
70 ],
71 $lc->getItem( 'ba', 'messages' ),
72 'Fallbacks are only used to fill missing data'
73 );
74 }
75
76 public function testRecacheFallbacksWithHooks() {
77 // Use hook to provide updates for messages. This is what the
78 // LocalisationUpdate extension does. See T70781.
79 $this->mergeMwGlobalArrayValue( 'wgHooks', [
80 'LocalisationCacheRecacheFallback' => [
81 function (
82 LocalisationCache $lc,
83 $code,
84 array &$cache
85 ) {
86 if ( $code === 'ru' ) {
87 $cache['messages']['present-ba'] = 'ru-override';
88 $cache['messages']['present-ru'] = 'ru-override';
89 $cache['messages']['present-en'] = 'ru-override';
90 }
91 }
92 ]
93 ] );
94
95 $lc = $this->getMockLocalisationCache();
96 $lc->recache( 'ba' );
97 $this->assertEquals(
98 [
99 'present-ba' => 'ba',
100 'present-ru' => 'ru-override',
101 'present-en' => 'ru-override',
102 ],
103 $lc->getItem( 'ba', 'messages' ),
104 'Updates provided by hooks follow the normal fallback order.'
105 );
106 }
107 }