X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/19e297c21b10b1b8a3acad5e73fc71dcb35db44a..6932310fd58ebef145fa01eb76edf7150284d8ea:/tests/phpunit/includes/cache/LocalisationCacheTest.php diff --git a/tests/phpunit/includes/cache/LocalisationCacheTest.php b/tests/phpunit/includes/cache/LocalisationCacheTest.php new file mode 100644 index 00000000..5eed01cb --- /dev/null +++ b/tests/phpunit/includes/cache/LocalisationCacheTest.php @@ -0,0 +1,107 @@ +setMwGlobals( [ + 'wgExtensionMessagesFiles' => [], + 'wgHooks' => [], + ] ); + } + + /** + * @return LocalisationCache + */ + protected function getMockLocalisationCache() { + global $IP; + $lc = $this->getMockBuilder( 'LocalisationCache' ) + ->setConstructorArgs( [ [ 'store' => 'detect' ] ] ) + ->setMethods( [ 'getMessagesDirs' ] ) + ->getMock(); + $lc->expects( $this->any() )->method( 'getMessagesDirs' ) + ->will( $this->returnValue( + [ "$IP/tests/phpunit/data/localisationcache" ] + ) ); + + return $lc; + } + + public function testPuralRulesFallback() { + $cache = $this->getMockLocalisationCache(); + + $this->assertEquals( + $cache->getItem( 'ar', 'pluralRules' ), + $cache->getItem( 'arz', 'pluralRules' ), + 'arz plural rules (undefined) fallback to ar (defined)' + ); + + $this->assertEquals( + $cache->getItem( 'ar', 'compiledPluralRules' ), + $cache->getItem( 'arz', 'compiledPluralRules' ), + 'arz compiled plural rules (undefined) fallback to ar (defined)' + ); + + $this->assertNotEquals( + $cache->getItem( 'ksh', 'pluralRules' ), + $cache->getItem( 'de', 'pluralRules' ), + 'ksh plural rules (defined) dont fallback to de (defined)' + ); + + $this->assertNotEquals( + $cache->getItem( 'ksh', 'compiledPluralRules' ), + $cache->getItem( 'de', 'compiledPluralRules' ), + 'ksh compiled plural rules (defined) dont fallback to de (defined)' + ); + } + + public function testRecacheFallbacks() { + $lc = $this->getMockLocalisationCache(); + $lc->recache( 'ba' ); + $this->assertEquals( + [ + 'present-ba' => 'ba', + 'present-ru' => 'ru', + 'present-en' => 'en', + ], + $lc->getItem( 'ba', 'messages' ), + 'Fallbacks are only used to fill missing data' + ); + } + + public function testRecacheFallbacksWithHooks() { + // Use hook to provide updates for messages. This is what the + // LocalisationUpdate extension does. See T70781. + $this->mergeMwGlobalArrayValue( 'wgHooks', [ + 'LocalisationCacheRecacheFallback' => [ + function ( + LocalisationCache $lc, + $code, + array &$cache + ) { + if ( $code === 'ru' ) { + $cache['messages']['present-ba'] = 'ru-override'; + $cache['messages']['present-ru'] = 'ru-override'; + $cache['messages']['present-en'] = 'ru-override'; + } + } + ] + ] ); + + $lc = $this->getMockLocalisationCache(); + $lc->recache( 'ba' ); + $this->assertEquals( + [ + 'present-ba' => 'ba', + 'present-ru' => 'ru-override', + 'present-en' => 'ru-override', + ], + $lc->getItem( 'ba', 'messages' ), + 'Updates provided by hooks follow the normal fallback order.' + ); + } +}