semanticDataFactory = $utilityFactory->newSemanticDataFactory();
$this->stringValidator = $utilityFactory->newValidatorFactory()->newStringValidator();
$this->stringBuilder = $utilityFactory->newStringBuilder();
$this->pageCreator = $utilityFactory->newPageCreator();
$this->queryResultValidator = $utilityFactory->newValidatorFactory()->newQueryResultValidator();
$this->queryParser = ApplicationFactory::getInstance()->newQueryParser();
$utilityFactory->newMwHooksHandler()
->deregisterListedHooks()
->invokeHooksFromRegistry();
// Manipulate the interwiki prefix on-the-fly
MediaWikiServices::getInstance()->getHookContainer()->register(
'InterwikiLoadPrefix',
static function ( $prefix, &$interwiki ) {
if ( $prefix !== 'iw-test' ) {
return true;
}
$interwiki = [
'iw_prefix' => 'iw-test',
'iw_url' => 'http://www.example.org/$1',
'iw_api' => false,
'iw_wikiid' => 'foo',
'iw_local' => true,
'iw_trans' => false,
];
return false;
}
);
}
protected function tearDown(): void {
MediaWikiServices::getInstance()->getHookContainer()->clear( 'InterwikiLoadPrefix' );
parent::tearDown();
}
public function testRdfSerializationForInterwikiAnnotation() {
if ( version_compare( MW_VERSION, '1.40', '>=' ) ) {
$this->markTestSkipped( 'The Serialization for interwiki needs to be checked for MW 1.40 and newer.' );
}
$titleFactory = MediaWikiServices::getInstance()->getTitleFactory();
$this->stringBuilder
->addString( '[[Has type::Page]]' );
$this->pageCreator
->createPage( $titleFactory->newFromText( 'Use for interwiki annotation', SMW_NS_PROPERTY ) )
->doEdit( $this->stringBuilder->getString() );
$this->stringBuilder
->addString( '[[Use for interwiki annotation::Interwiki link]]' )
->addString( '[[Use for interwiki annotation::iw-test:Interwiki link]]' );
// parent::editPage( $wikiPageTwo, $this->stringBuilder->getString() );
$this->pageCreator
->createPage( $titleFactory->newFromText( __METHOD__ ) )
->doEdit( $this->stringBuilder->getString() );
$output = $this->fetchSerializedRdfOutputFor(
[ __METHOD__ ]
);
$expectedOutputContent = [
'',
''
];
$this->stringValidator->assertThatStringContains(
$expectedOutputContent,
$output
);
}
public function testQueryForInterwikiAnnotation() {
$titleFactory = MediaWikiServices::getInstance()->getTitleFactory();
$this->stringBuilder
->addString( '[[Has type::Page]]' );
$this->pageCreator
->createPage( $titleFactory->newFromText( 'Use for interwiki annotation', SMW_NS_PROPERTY ) )
->doEdit( $this->stringBuilder->getString() );
$this->pageCreator
->createPage( $titleFactory->newFromText( __METHOD__ . '-1' ) )
->doEdit( '[[Use for interwiki annotation::Interwiki link]]' );
$this->pageCreator
->createPage( $titleFactory->newFromText( __METHOD__ . '-2' ) )
->doEdit( '[[Use for interwiki annotation::iw-test:Interwiki link]]' );
$this->stringBuilder
->addString( '[[Use for interwiki annotation::iw-test:Interwiki link]]' );
$description = $this->queryParser->getQueryDescription( $this->stringBuilder->getString() );
$query = new Query(
$description,
false,
false
);
$query->querymode = Query::MODE_INSTANCES;
$query->setLimit( 10 );
// Expects only one result with an interwiki being used as differentiator
$this->subjects[] = DIWikiPage::newFromTitle( $titleFactory->newFromText( __METHOD__ . '-2' ) );
$this->queryResultValidator->assertThatQueryResultHasSubjects(
$this->subjects,
$this->getStore()->getQueryResult( $query )
);
$this->subjects[] = DIWikiPage::newFromTitle( $titleFactory->newFromText( __METHOD__ . '-1' ) );
}
private function fetchSerializedRdfOutputFor( array $pages ) {
$this->subjects = $pages;
$exporterFactory = new ExporterFactory();
$instance = $exporterFactory->newExportController(
$exporterFactory->newRDFXMLSerializer()
);
ob_start();
$instance->printPages( $pages );
return ob_get_clean();
}
}