diff options
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/InterwikiDBIntegrationTest.php')
-rw-r--r-- | www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/InterwikiDBIntegrationTest.php | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/InterwikiDBIntegrationTest.php b/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/InterwikiDBIntegrationTest.php new file mode 100644 index 00000000..d7c94f39 --- /dev/null +++ b/www/wiki/extensions/SemanticMediaWiki/tests/phpunit/Integration/InterwikiDBIntegrationTest.php @@ -0,0 +1,158 @@ +<?php + +namespace SMW\Tests\Integration; + +use SMW\ApplicationFactory; +use SMW\DIWikiPage; +use SMW\Tests\MwDBaseUnitTestCase; +use SMW\Tests\Utils\UtilityFactory; +use SMWExportController as ExportController; +use SMWQuery as Query; +use SMWRDFXMLSerializer as RDFXMLSerializer; +use Title; + +/** + * @group semantic-mediawiki + * @group medium + * + * @license GNU GPL v2+ + * @since 2.2 + * + * @author mwjames + */ +class InterwikiDBIntegrationTest extends MwDBaseUnitTestCase { + + private $stringValidator; + private $subjects = []; + + private $pageCreator; + private $stringBuilder; + + protected function setUp() { + parent::setUp(); + + $utilityFactory = UtilityFactory::getInstance(); + + $this->semanticDataFactory = $utilityFactory->newSemanticDataFactory(); + $this->stringValidator = $utilityFactory->newValidatorFactory()->newStringValidator(); + + $this->pageCreator = $utilityFactory->newPageCreator(); + $this->stringBuilder = $utilityFactory->newStringBuilder(); + + $this->queryResultValidator = $utilityFactory->newValidatorFactory()->newQueryResultValidator(); + $this->queryParser = ApplicationFactory::getInstance()->newQueryParser(); + + // Manipulate the interwiki prefix on-the-fly + $GLOBALS['wgHooks']['InterwikiLoadPrefix'][] = 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() { + + UtilityFactory::getInstance()->newPageDeleter()->doDeletePoolOfPages( $this->subjects ); + unset( $GLOBALS['wgHooks']['InterwikiLoadPrefix'] ); + + parent::tearDown(); + } + + public function testRdfSerializationForInterwikiAnnotation() { + + $this->stringBuilder + ->addString( '[[Has type::Page]]' ); + + $this->pageCreator + ->createPage( Title::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]]' ); + + $this->pageCreator + ->createPage( Title::newFromText( __METHOD__ ) ) + ->doEdit( $this->stringBuilder->getString() ); + + $output = $this->fetchSerializedRdfOutputFor( + [ __METHOD__ ] + ); + + $expectedOutputContent = [ + '<property:Use_for_interwiki_annotation rdf:resource="&wiki;Interwiki_link"/>', + '<property:Use_for_interwiki_annotation rdf:resource="&wiki;iw-2Dtest-3AInterwiki_link"/>' + ]; + + $this->stringValidator->assertThatStringContains( + $expectedOutputContent, + $output + ); + } + + public function testQueryForInterwikiAnnotation() { + + $this->stringBuilder + ->addString( '[[Has type::Page]]' ); + + $this->pageCreator + ->createPage( Title::newFromText( 'Use for interwiki annotation', SMW_NS_PROPERTY ) ) + ->doEdit( $this->stringBuilder->getString() ); + + $this->pageCreator + ->createPage( Title::newFromText( __METHOD__ . '-1' ) ) + ->doEdit( '[[Use for interwiki annotation::Interwiki link]]' ); + + $this->pageCreator + ->createPage( Title::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(Title::newFromText( __METHOD__ . '-2' ) ); + + $this->queryResultValidator->assertThatQueryResultHasSubjects( + $this->subjects, + $this->getStore()->getQueryResult( $query ) + ); + + $this->subjects[] = DIWikiPage::newFromTitle(Title::newFromText( __METHOD__ . '-1' ) ); + } + + private function fetchSerializedRdfOutputFor( array $pages ) { + + $this->subjects = $pages; + + $instance = new ExportController( new RDFXMLSerializer() ); + + ob_start(); + $instance->printPages( $pages ); + return ob_get_clean(); + } + +} |