wiki.techinc.nl/tests/phpunit/includes/api/query/ApiQueryLanguageinfoTest.php
Acamicamacaraca a573bea01b Implement LanguageConverter for sh.wiki
This patch will implement a one-way transliterator (Latin->Cyrillic), per community consensus.

Bug: T268033
Change-Id: I6f3e7efe3630e9960584dca3a5ee55cb92ea722c
Co-Authored-By: Deni <deni@deni.dk>
Co-Authored-By: Winston Sung <winston21.sung@gmail.com>
2022-11-15 06:29:11 +00:00

163 lines
4.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
use Wikimedia\Timestamp\ConvertibleTimestamp;
/**
* @group API
* @group medium
*
* @covers ApiQueryLanguageinfo
*/
class ApiQueryLanguageinfoTest extends ApiTestCase {
protected function setUp(): void {
parent::setUp();
// register custom language names so this test is independent of CLDR
$this->setTemporaryHook(
'LanguageGetTranslatedLanguageNames',
static function ( array &$names, $code ) {
switch ( $code ) {
case 'en':
$names['sh'] = 'Serbo-Croatian';
$names['qtp'] = 'a custom language code MediaWiki knows nothing about';
break;
case 'pt':
$names['de'] = 'alemão';
break;
}
}
);
}
private function doQuery( array $params ): array {
$params += [
'action' => 'query',
'meta' => 'languageinfo',
'uselang' => 'en',
];
$res = $this->doApiRequest( $params );
$this->assertArrayNotHasKey( 'warnings', $res[0] );
return [ $res[0]['query']['languageinfo'], $res[0]['continue'] ?? null ];
}
public function provideTestAllPropsForSingleLanguage() {
yield [
'sr',
[
'code' => 'sr',
'bcp47' => 'sr',
'autonym' => 'српски / srpski',
'name' => 'српски / srpski',
'fallbacks' => [ 'sr-ec', 'sr-cyrl' ],
'dir' => 'ltr',
'variants' => [ 'sr', 'sr-ec', 'sr-el' ],
'variantnames' => [
'sr' => 'Ћир./lat.',
'sr-ec' => 'Ћирилица',
'sr-el' => 'Latinica',
],
]
];
yield [
'qtp', // reserved for local use by ISO 639; registered in setUp()
[
'code' => 'qtp',
'bcp47' => 'qtp',
'autonym' => '',
'name' => 'a custom language code MediaWiki knows nothing about',
'fallbacks' => [],
'dir' => 'ltr',
'variants' => [ 'qtp' ],
'variantnames' => [ 'qtp' => 'qtp' ],
]
];
}
/**
* @dataProvider provideTestAllPropsForSingleLanguage
*/
public function testAllPropsForSingleLanguage( string $langCode, array $expected ) {
[ $response, $continue ] = $this->doQuery( [
'liprop' => 'code|bcp47|dir|autonym|name|fallbacks|variants|variantnames',
'licode' => $langCode,
] );
$this->assertArrayEquals( [ $langCode => $expected ], $response );
}
public function testNameInOtherLanguageForSingleLanguage() {
[ $response, $continue ] = $this->doQuery( [
'liprop' => 'name',
'licode' => 'de',
'uselang' => 'pt',
] );
$this->assertArrayEquals( [ 'de' => [ 'name' => 'alemão' ] ], $response );
}
public function testContinuationNecessary() {
$time = 0;
ConvertibleTimestamp::setFakeTime( static function () use ( &$time ) {
return $time += 0.75;
} );
[ $response, $continue ] = $this->doQuery( [] );
$this->assertCount( 2, $response );
$this->assertArrayHasKey( 'licontinue', $continue );
}
public function testContinuationNotNecessary() {
$time = 0;
ConvertibleTimestamp::setFakeTime( static function () use ( &$time ) {
return $time += 1.5;
} );
[ $response, $continue ] = $this->doQuery( [
'licode' => 'de',
] );
$this->assertNull( $continue );
}
public function testContinuationInAlphabeticalOrderNotParameterOrder() {
$time = 0;
ConvertibleTimestamp::setFakeTime( static function () use ( &$time ) {
return $time += 0.75;
} );
$params = [ 'licode' => 'en|ru|zh|de|yue' ];
[ $response, $continue ] = $this->doQuery( $params );
$this->assertCount( 2, $response );
$this->assertArrayHasKey( 'licontinue', $continue );
$this->assertSame( [ 'de', 'en' ], array_keys( $response ) );
$time = 0;
$params = $continue + $params;
[ $response, $continue ] = $this->doQuery( $params );
$this->assertCount( 2, $response );
$this->assertArrayHasKey( 'licontinue', $continue );
$this->assertSame( [ 'ru', 'yue' ], array_keys( $response ) );
$time = 0;
$params = $continue + $params;
[ $response, $continue ] = $this->doQuery( $params );
$this->assertCount( 1, $response );
$this->assertNull( $continue );
$this->assertSame( [ 'zh' ], array_keys( $response ) );
}
public function testResponseHasModulePathEvenIfEmpty() {
[ $response, $continue ] = $this->doQuery( [ 'licode' => '' ] );
$this->assertSame( [], $response );
// the real test is that $res[0]['query']['languageinfo'] in doQuery() didnt fail
}
}