WMDE-leszek has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/350827 )
Change subject: DO NOT MERGE Demo only ...................................................................... DO NOT MERGE Demo only This shows a possible way to test Wikibase RDF-related services as changed in I5fc25575348ed09562c4c1541765f0ea35b4f812, without overriding MediaWiki services and falling into service instance caching trap. Change-Id: I1950d14fb3d105aebf727b0c3798610a2383b813 --- M repo/includes/WikibaseRepo.php M repo/tests/phpunit/includes/Dumpers/RdfDumpGeneratorTest.php M repo/tests/phpunit/includes/Rdf/RdfBuilderTest.php 3 files changed, 100 insertions(+), 22 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase refs/changes/27/350827/1 diff --git a/repo/includes/WikibaseRepo.php b/repo/includes/WikibaseRepo.php index f7a44da..f742288 100644 --- a/repo/includes/WikibaseRepo.php +++ b/repo/includes/WikibaseRepo.php @@ -22,7 +22,6 @@ use MediaWiki\Site\MediaWikiPageNameNormalizer; use MWException; use RequestContext; -use RuntimeException; use Serializers\DispatchingSerializer; use Serializers\Serializer; use SiteLookup; @@ -374,19 +373,6 @@ } return $instance; - } - - /** - * Get a new instance for use in unit tests. - * - * @return self - */ - public static function getTestInstance() { - if ( !defined( 'MW_PHPUNIT_TEST' ) ) { - throw new RuntimeException( 'getTestInstance() can only be used in unit tests' ); - } - - return self::newInstance(); } /** diff --git a/repo/tests/phpunit/includes/Dumpers/RdfDumpGeneratorTest.php b/repo/tests/phpunit/includes/Dumpers/RdfDumpGeneratorTest.php index a22bdc7..3fe5851 100644 --- a/repo/tests/phpunit/includes/Dumpers/RdfDumpGeneratorTest.php +++ b/repo/tests/phpunit/includes/Dumpers/RdfDumpGeneratorTest.php @@ -19,11 +19,17 @@ use Wikibase\Lib\Store\EntityRevisionLookup; use Wikibase\Lib\Store\EntityTitleLookup; use Wikibase\Lib\Store\RevisionedUnresolvedRedirectException; +use Wikibase\Rdf\EntityRdfBuilderFactory; +use Wikibase\Rdf\NullEntityRdfBuilder; +use Wikibase\Rdf\PropertyRdfBuilder; +use Wikibase\Rdf\RdfProducer; use Wikibase\Rdf\RdfVocabulary; +use Wikibase\Rdf\SiteLinksRdfBuilder; use Wikibase\Repo\Tests\Rdf\NTriplesRdfTestHelper; use Wikibase\Repo\WikibaseRepo; use Wikibase\Repo\Tests\Rdf\RdfBuilderTest; use Wikibase\Repo\Tests\Rdf\RdfBuilderTestData; +use Wikimedia\Purtle\RdfWriter; /** * @covers Wikibase\Dumpers\RdfDumpGenerator @@ -103,6 +109,48 @@ } /** + * Returns the mapping of entity types used in tests to callbacks instantiating EntityRdfBuilder + * instances, that are configured to use services configured for test purposes (e.g. SiteLookup). + * + * @see EntityTypeDefinitions::getRdfBuilderFactoryCallbacks + * + * TODO: move to RdfBuilderTestData? + * + * @param SiteLookup $siteLookup + * + * @return callable[] + */ + private function getRdfBuilderFactoryCallbacks( SiteLookup $siteLookup ) { + return [ + 'item' => function( + $flavorFlags, + RdfVocabulary $vocabulary, + RdfWriter $writer, + $mentionedEntityTracker, + $dedupe + ) use ( $siteLookup ) { + if ( ( $flavorFlags & RdfProducer::PRODUCE_SITELINKS ) !== 0 ) { + $sites = $siteLookup->getSites(); + $builder = new SiteLinksRdfBuilder( $vocabulary, $writer, $sites ); + $builder->setDedupeBag( $dedupe ); + return $builder; + } + return new NullEntityRdfBuilder(); + }, + 'property' => function( + $flavorFlags, + RdfVocabulary $vocabulary, + RdfWriter $writer + ) { + return new PropertyRdfBuilder( + $vocabulary, + $writer + ); + } + ]; + } + + /** * @param string $flavor * @param EntityDocument[] $entities * @param EntityId[] $redirects @@ -147,13 +195,12 @@ ) ); $siteLookup = $this->getSiteLookup(); - $this->setService( 'SiteLookup', $siteLookup ); - $wikibaseRepo = WikibaseRepo::getTestInstance(); + $wikibaseRepo = WikibaseRepo::getDefaultInstance(); // Note: we test against the actual RDF bindings here, so we get actual RDF. $rdfBuilderFactory = $wikibaseRepo->getValueSnakRdfBuilderFactory(); - $entityRdfBuilderFactory = $wikibaseRepo->getEntityRdfBuilderFactory(); + $entityRdfBuilderFactory = new EntityRdfBuilderFactory( $this->getRdfBuilderFactoryCallbacks( $siteLookup ) ); return RdfDumpGenerator::createDumpGenerator( 'ntriples', diff --git a/repo/tests/phpunit/includes/Rdf/RdfBuilderTest.php b/repo/tests/phpunit/includes/Rdf/RdfBuilderTest.php index 3410a41..926e164 100644 --- a/repo/tests/phpunit/includes/Rdf/RdfBuilderTest.php +++ b/repo/tests/phpunit/includes/Rdf/RdfBuilderTest.php @@ -3,18 +3,24 @@ namespace Wikibase\Repo\Tests\Rdf; use PageProps; +use SiteLookup; use Title; use Wikibase\DataModel\Entity\EntityDocument; use Wikibase\DataModel\Entity\EntityId; use Wikibase\DataModel\Entity\ItemId; use Wikibase\Lib\Store\EntityTitleLookup; use Wikibase\Rdf\DedupeBag; +use Wikibase\Rdf\EntityRdfBuilderFactory; use Wikibase\Rdf\HashDedupeBag; +use Wikibase\Rdf\NullEntityRdfBuilder; +use Wikibase\Rdf\PropertyRdfBuilder; use Wikibase\Rdf\RdfBuilder; use Wikibase\Rdf\RdfProducer; use Wikibase\Rdf\RdfVocabulary; +use Wikibase\Rdf\SiteLinksRdfBuilder; use Wikibase\Repo\WikibaseRepo; use Wikimedia\Purtle\NTriplesRdfWriter; +use Wikimedia\Purtle\RdfWriter; /** * @covers Wikibase\Rdf\RdfBuilder @@ -70,6 +76,48 @@ } /** + * Returns the mapping of entity types used in tests to callbacks instantiating EntityRdfBuilder + * instances, that are configured to use services configured for test purposes (e.g. SiteLookup). + * + * @see EntityTypeDefinitions::getRdfBuilderFactoryCallbacks + * + * TODO: move to RdfBuilderTestData? + * + * @param SiteLookup $siteLookup + * + * @return callable[] + */ + private function getRdfBuilderFactoryCallbacks( SiteLookup $siteLookup ) { + return [ + 'item' => function( + $flavorFlags, + RdfVocabulary $vocabulary, + RdfWriter $writer, + $mentionedEntityTracker, + $dedupe + ) use ( $siteLookup ) { + if ( ( $flavorFlags & RdfProducer::PRODUCE_SITELINKS ) !== 0 ) { + $sites = $siteLookup->getSites(); + $builder = new SiteLinksRdfBuilder( $vocabulary, $writer, $sites ); + $builder->setDedupeBag( $dedupe ); + return $builder; + } + return new NullEntityRdfBuilder(); + }, + 'property' => function( + $flavorFlags, + RdfVocabulary $vocabulary, + RdfWriter $writer + ) { + return new PropertyRdfBuilder( + $vocabulary, + $writer + ); + } + ]; + } + + /** * @param int $produce One of the RdfProducer::PRODUCE_... constants. * @param DedupeBag $dedup * @param RdfVocabulary $vocabulary @@ -82,13 +130,10 @@ } $siteLookup = $this->getTestData()->getSiteLookup(); - $this->setService( 'SiteLookup', $siteLookup ); // Note: using the actual factory here makes this an integration test! - $repo = WikibaseRepo::getTestInstance(); - - $valueBuilderFactory = $repo->getValueSnakRdfBuilderFactory(); - $entityRdfBuilderFactory = $repo->getEntityRdfBuilderFactory(); + $valueBuilderFactory = WikibaseRepo::getDefaultInstance()->getValueSnakRdfBuilderFactory(); + $entityRdfBuilderFactory = new EntityRdfBuilderFactory( $this->getRdfBuilderFactoryCallbacks( $siteLookup ) ); $emitter = new NTriplesRdfWriter(); $builder = new RdfBuilder( $siteLookup->getSites(), -- To view, visit https://gerrit.wikimedia.org/r/350827 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I1950d14fb3d105aebf727b0c3798610a2383b813 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: master Gerrit-Owner: WMDE-leszek <leszek.mani...@wikimedia.de> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits