$services->getContentLanguage(),
$services->getGenderCache(),
$services->getMainConfig()->get( 'LocalInterwikis' ),
- $services->getInterwikiLookup()
+ $services->getInterwikiLookup(),
+ $services->getNamespaceInfo()
);
},
*/
protected $interwikiLookup;
+ /**
+ * @var NamespaceInfo
+ */
+ protected $nsInfo;
+
/**
* @param Language $language The language object to use for localizing namespace names.
* @param GenderCache $genderCache The gender cache for generating gendered namespace names
* @param string[]|string $localInterwikis
* @param InterwikiLookup|null $interwikiLookup
+ * @param NamespaceInfo|null $nsInfo
*/
public function __construct( Language $language, GenderCache $genderCache,
- $localInterwikis = [], $interwikiLookup = null
+ $localInterwikis = [], InterwikiLookup $interwikiLookup = null,
+ NamespaceInfo $nsInfo = null
) {
+ if ( !$interwikiLookup ) {
+ wfDeprecated( __METHOD__ . ' with no InterwikiLookup argument', '1.34' );
+ $interwikiLookup = MediaWikiServices::getInstance()->getInterwikiLookup();
+ }
+ if ( !$nsInfo ) {
+ wfDeprecated( __METHOD__ . ' with no NamespaceInfo argument', '1.34' );
+ $nsInfo = MediaWikiServices::getInstance()->getNamespaceInfo();
+ }
$this->language = $language;
$this->genderCache = $genderCache;
$this->localInterwikis = (array)$localInterwikis;
- $this->interwikiLookup = $interwikiLookup ?:
- MediaWikiServices::getInstance()->getInterwikiLookup();
+ $this->interwikiLookup = $interwikiLookup;
+ $this->nsInfo = $nsInfo;
}
/**
*/
public function getNamespaceName( $namespace, $text ) {
if ( $this->language->needsGenderDistinction() &&
- MWNamespace::hasGenderDistinction( $namespace )
+ $this->nsInfo->hasGenderDistinction( $namespace )
) {
// NOTE: we are assuming here that the title text is a user name!
$gender = $this->genderCache->getGenderOf( $text, __METHOD__ );
]
] );
- // Reset TitleParser since we modified $wgLocalInterwikis
- $this->setService( 'TitleParser', new MediaWikiTitleCodec(
- Language::factory( 'en' ),
- new GenderCache(),
- [ 'localtestiw' ]
- ) );
+ $this->overrideMwServices();
}
/**
return $response[0]['query']['recentchanges'];
}
- private function getTitleFormatter() {
- return new MediaWikiTitleCodec(
- Language::factory( 'en' ),
- MediaWikiServices::getInstance()->getGenderCache()
- );
- }
-
private function getPrefixedText( LinkTarget $target ) {
- $formatter = $this->getTitleFormatter();
- return $formatter->getPrefixedText( $target );
+ return MediaWikiServices::getInstance()->getTitleFormatter()->getPrefixedText( $target );
}
public function testListRecentChanges_returnsRCInfo() {
}
}
- private function getTitleFormatter() {
- return new MediaWikiTitleCodec(
- Language::factory( 'en' ),
- MediaWikiServices::getInstance()->getGenderCache()
- );
- }
-
private function getPrefixedText( LinkTarget $target ) {
- $formatter = $this->getTitleFormatter();
- return $formatter->getPrefixedText( $target );
+ return MediaWikiServices::getInstance()->getTitleFormatter()->getPrefixedText( $target );
}
private function cleanTestUsersWatchlist() {
* @author Daniel Kinzler
*/
+use MediaWiki\Interwiki\InterwikiLookup;
+
/**
* @covers MediaWikiTitleCodec
*
'wgMetaNamespace' => 'Project',
'wgLocalInterwikis' => [ 'localtestiw' ],
'wgCapitalLinks' => true,
-
- // NOTE: this is why global state is evil.
- // TODO: refactor access to the interwiki codes so it can be injected.
- 'wgHooks' => [
- 'InterwikiLoadPrefix' => [
- function ( $prefix, &$data ) {
- if ( $prefix === 'localtestiw' ) {
- $data = [ 'iw_url' => 'localtestiw' ];
- } elseif ( $prefix === 'remotetestiw' ) {
- $data = [ 'iw_url' => 'remotetestiw' ];
- }
- return false;
- }
- ]
- ]
] );
$this->setUserLang( 'en' );
$this->setContentLang( 'en' );
return $genderCache;
}
+ /**
+ * Returns a mock InterwikiLookup that only has an isValidInterwiki() method, which recognizes
+ * 'localtestiw' and 'remotetestiw'. All other methods throw.
+ *
+ * @return InterwikiLookup
+ */
+ private function getInterwikiLookup() : InterwikiLookup {
+ $iwLookup = $this->createMock( InterwikiLookup::class );
+
+ $iwLookup->expects( $this->any() )
+ ->method( 'isValidInterwiki' )
+ ->will( $this->returnCallback( function ( $prefix ) {
+ return $prefix === 'localtestiw' || $prefix === 'remotetestiw';
+ } ) );
+
+ $iwLookup->expects( $this->never() )
+ ->method( $this->callback( function ( $name ) {
+ return $name !== 'isValidInterwiki';
+ } ) );
+
+ return $iwLookup;
+ }
+
+ /**
+ * Returns a mock NamespaceInfo that has only a hasGenderDistinction() method, which assumes
+ * only NS_USER and NS_USER_TALK have a gender distinction. All other methods throw.
+ *
+ * @return NamespaceInfo
+ */
+ private function getNamespaceInfo() : NamespaceInfo {
+ $nsInfo = $this->createMock( NamespaceInfo::class );
+
+ $nsInfo->expects( $this->any() )
+ ->method( 'hasGenderDistinction' )
+ ->will( $this->returnCallback( function ( $ns ) {
+ return $ns === NS_USER || $ns === NS_USER_TALK;
+ } ) );
+
+ $nsInfo->expects( $this->never() )
+ ->method( $this->callback( function ( $name ) {
+ return $name !== 'hasGenderDistinction';
+ } ) );
+
+ return $nsInfo;
+ }
+
protected function makeCodec( $lang ) {
- $gender = $this->getGenderCache();
- $lang = Language::factory( $lang );
- // language object can came from cache, which does not respect test settings
- $lang->resetNamespaces();
- return new MediaWikiTitleCodec( $lang, $gender );
+ return new MediaWikiTitleCodec(
+ Language::factory( $lang ),
+ $this->getGenderCache(),
+ [],
+ $this->getInterwikiLookup(),
+ $this->getNamespaceInfo()
+ );
}
public static function provideFormat() {