jenkins-bot has submitted this change and it was merged.

Change subject: Introduce ParserOutputDataUpdate infrastructure
......................................................................


Introduce ParserOutputDataUpdate infrastructure

This is split from I7b03cc0. This patch adds the new classes, but
does not use them.

PS1 is an untouched copy from I7b03cc0 (PS14) for easy comparison.

Note: This patch misses the PropertyDataTypeMatcher. This is intended
to make reviewing much easier. This means the two ImageLinksDataUpdate
and ExternalLinksDataUpdate classes should not be used because both will
add all StringValue's to the output, no matter what the property's data
type is. The missing filter will be added in the next patch.

Bug: T114220
Change-Id: I1618217b0926b0dd213f9a0d4b315514b66f2b54
---
A repo/includes/DataUpdates/EntityParserOutputDataUpdater.php
A repo/includes/DataUpdates/ExternalLinksDataUpdate.php
A repo/includes/DataUpdates/ImageLinksDataUpdate.php
A repo/includes/DataUpdates/ParserOutputDataUpdate.php
A repo/includes/DataUpdates/ReferencedEntitiesDataUpdate.php
A repo/includes/DataUpdates/SiteLinkDataUpdate.php
A repo/includes/DataUpdates/StatementDataUpdate.php
A repo/tests/phpunit/includes/DataUpdates/EntityParserOutputDataUpdaterTest.php
A repo/tests/phpunit/includes/DataUpdates/ExternalLinksDataUpdateTest.php
A repo/tests/phpunit/includes/DataUpdates/ImageLinksDataUpdateTest.php
A repo/tests/phpunit/includes/DataUpdates/ReferencedEntitiesDataUpdateTest.php
11 files changed, 860 insertions(+), 0 deletions(-)

Approvals:
  Daniel Kinzler: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/repo/includes/DataUpdates/EntityParserOutputDataUpdater.php 
b/repo/includes/DataUpdates/EntityParserOutputDataUpdater.php
new file mode 100644
index 0000000..a4f2483
--- /dev/null
+++ b/repo/includes/DataUpdates/EntityParserOutputDataUpdater.php
@@ -0,0 +1,117 @@
+<?php
+
+namespace Wikibase\Repo\DataUpdates;
+
+use ParserOutput;
+use Wikibase\DataModel\Entity\EntityDocument;
+use Wikibase\DataModel\Entity\Item;
+use Wikibase\DataModel\Statement\StatementListProvider;
+
+/**
+ * @since 0.5
+ *
+ * @license GNU GPL v2+
+ * @author Katie Filbert < [email protected] >
+ * @author Thiemo Mättig
+ */
+class EntityParserOutputDataUpdater {
+
+       /**
+        * @var ParserOutputDataUpdate[]
+        */
+       private $dataUpdates;
+
+       /**
+        * @param ParserOutputDataUpdate[] $dataUpdates
+        */
+       public function __construct( array $dataUpdates ) {
+               $this->dataUpdates = $dataUpdates;
+       }
+
+       /**
+        * @param EntityDocument $entity
+        */
+       public function processEntity( EntityDocument $entity ) {
+               if ( $entity instanceof StatementListProvider ) {
+                       $this->processStatements( $entity );
+               }
+
+               if ( $entity instanceof Item ) {
+                       $this->processSiteLinks( $entity );
+               }
+       }
+
+       /**
+        * @param StatementListProvider $entity
+        */
+       private function processStatements( StatementListProvider $entity ) {
+               $dataUpdates = $this->getStatementDataUpdates();
+
+               if ( empty( $dataUpdates ) ) {
+                       return;
+               }
+
+               foreach ( $entity->getStatements() as $statement ) {
+                       foreach ( $dataUpdates as $dataUpdate ) {
+                               $dataUpdate->processStatement( $statement );
+                       }
+               }
+       }
+
+       /**
+        * @param Item $item
+        */
+       private function processSiteLinks( Item $item ) {
+               $dataUpdates = $this->getSiteLinkDataUpdates();
+
+               if ( empty( $dataUpdates ) ) {
+                       return;
+               }
+
+               foreach ( $item->getSiteLinkList() as $siteLink ) {
+                       foreach ( $dataUpdates as $dataUpdate ) {
+                               $dataUpdate->processSiteLink( $siteLink );
+                       }
+               }
+       }
+
+       /**
+        * @return StatementDataUpdate[]
+        */
+       private function getStatementDataUpdates() {
+               $statementDataUpdates = array();
+
+               foreach ( $this->dataUpdates as $dataUpdate ) {
+                       if ( $dataUpdate instanceof StatementDataUpdate ) {
+                               $statementDataUpdates[] = $dataUpdate;
+                       }
+               }
+
+               return $statementDataUpdates;
+       }
+
+       /**
+        * @return SiteLinkDataUpdate[]
+        */
+       private function getSiteLinkDataUpdates() {
+               $siteLinkDataUpdates = array();
+
+               foreach ( $this->dataUpdates as $dataUpdate ) {
+                       if ( $dataUpdate instanceof SiteLinkDataUpdate ) {
+                               $siteLinkDataUpdates[] = $dataUpdate;
+                       }
+               }
+
+               return $siteLinkDataUpdates;
+       }
+
+       /**
+        * @param ParserOutput $parserOutput
+        */
+       public function updateParserOutput( ParserOutput $parserOutput ) {
+               foreach ( $this->dataUpdates as $dataUpdate ) {
+                       $dataUpdate->updateParserOutput( $parserOutput );
+               }
+       }
+
+}
diff --git a/repo/includes/DataUpdates/ExternalLinksDataUpdate.php 
b/repo/includes/DataUpdates/ExternalLinksDataUpdate.php
new file mode 100644
index 0000000..bb38d9b
--- /dev/null
+++ b/repo/includes/DataUpdates/ExternalLinksDataUpdate.php
@@ -0,0 +1,81 @@
+<?php
+
+namespace Wikibase\Repo\DataUpdates;
+
+use DataValues\StringValue;
+use ParserOutput;
+use Wikibase\DataModel\Snak\PropertyValueSnak;
+use Wikibase\DataModel\Snak\Snak;
+use Wikibase\DataModel\Statement\Statement;
+use Wikibase\DataModel\Statement\StatementList;
+
+/**
+ * Add url data values as external links in ParserOutput.
+ *
+ * @fixme This basic version does not do filtering based on the property data 
type!
+ *
+ * @since 0.5
+ *
+ * @license GNU GPL v2+
+ * @author Bene* < [email protected] >
+ * @author Katie Filbert < [email protected] >
+ * @author Thiemo Mättig
+ */
+class ExternalLinksDataUpdate implements StatementDataUpdate {
+
+       /**
+        * @var null[]
+        */
+       private $urls = array();
+
+       /**
+        * @param StatementList $statements
+        *
+        * @return string[]
+        */
+       public function getExternalLinks( StatementList $statements ) {
+               $this->urls = array();
+
+               foreach ( $statements as $statement ) {
+                       $this->processStatement( $statement );
+               }
+
+               return array_keys( $this->urls );
+       }
+
+       /**
+        * @param Statement $statement
+        */
+       public function processStatement( Statement $statement ) {
+               foreach ( $statement->getAllSnaks() as $snak ) {
+                       $this->processSnak( $snak );
+               }
+       }
+
+       /**
+        * @param Snak $snak
+        */
+       private function processSnak( Snak $snak ) {
+               if ( $snak instanceof PropertyValueSnak ) {
+                       $value = $snak->getDataValue();
+
+                       if ( $value instanceof StringValue ) {
+                               $url = $value->getValue();
+
+                               if ( $url !== '' ) {
+                                       $this->urls[$url] = null;
+                               }
+                       }
+               }
+       }
+
+       /**
+        * @param ParserOutput $parserOutput
+        */
+       public function updateParserOutput( ParserOutput $parserOutput ) {
+               foreach ( $this->urls as $url => $null ) {
+                       $parserOutput->addExternalLink( $url );
+               }
+       }
+
+}
diff --git a/repo/includes/DataUpdates/ImageLinksDataUpdate.php 
b/repo/includes/DataUpdates/ImageLinksDataUpdate.php
new file mode 100644
index 0000000..ec06aa2
--- /dev/null
+++ b/repo/includes/DataUpdates/ImageLinksDataUpdate.php
@@ -0,0 +1,83 @@
+<?php
+
+namespace Wikibase\Repo\DataUpdates;
+
+use DataValues\StringValue;
+use ParserOutput;
+use Wikibase\DataModel\Snak\PropertyValueSnak;
+use Wikibase\DataModel\Snak\Snak;
+use Wikibase\DataModel\Statement\Statement;
+use Wikibase\DataModel\Statement\StatementList;
+
+/**
+ * Register commonsMedia values as used images in ParserOutput.
+ *
+ * @fixme This basic version does not do filtering based on the property data 
type!
+ *
+ * @since 0.5
+ *
+ * @license GNU GPL v2+
+ * @author Bene* < [email protected] >
+ * @author Katie Filbert < [email protected] >
+ * @author Thiemo Mättig
+ */
+class ImageLinksDataUpdate implements StatementDataUpdate {
+
+       /**
+        * @var null[]
+        */
+       private $fileNames = array();
+
+       /**
+        * @param StatementList $statements
+        *
+        * @return string[]
+        */
+       public function getImageLinks( StatementList $statements ) {
+               $this->fileNames = array();
+
+               foreach ( $statements as $statement ) {
+                       $this->processStatement( $statement );
+               }
+
+               return array_keys( $this->fileNames );
+       }
+
+       /**
+        * @param Statement $statement
+        */
+       public function processStatement( Statement $statement ) {
+               foreach ( $statement->getAllSnaks() as $snak ) {
+                       $this->processSnak( $snak );
+               }
+       }
+
+       /**
+        * @param Snak $snak
+        */
+       private function processSnak( Snak $snak ) {
+               if ( $snak instanceof PropertyValueSnak ) {
+                       $value = $snak->getDataValue();
+
+                       if ( $value instanceof StringValue ) {
+                               $fileName = str_replace( ' ', '_', 
$value->getValue() );
+
+                               if ( $fileName !== '' ) {
+                                       $this->fileNames[$fileName] = null;
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Treat CommonsMedia values as file transclusions
+        *
+        * @param ParserOutput $parserOutput
+        */
+       public function updateParserOutput( ParserOutput $parserOutput ) {
+               foreach ( $this->fileNames as $fileName => $null ) {
+                       $parserOutput->addImage( $fileName );
+               }
+       }
+
+}
diff --git a/repo/includes/DataUpdates/ParserOutputDataUpdate.php 
b/repo/includes/DataUpdates/ParserOutputDataUpdate.php
new file mode 100644
index 0000000..56946cd
--- /dev/null
+++ b/repo/includes/DataUpdates/ParserOutputDataUpdate.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace Wikibase\Repo\DataUpdates;
+
+use ParserOutput;
+
+/**
+ * @since 0.5
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < [email protected] >
+ */
+interface ParserOutputDataUpdate {
+
+       /**
+        * Update extension data, properties or other data in ParserOutput.
+        * These updates are invoked when EntityContent::getParserOutput is 
called.
+        *
+        * @param ParserOutput $parserOutput
+        */
+       public function updateParserOutput( ParserOutput $parserOutput );
+
+}
diff --git a/repo/includes/DataUpdates/ReferencedEntitiesDataUpdate.php 
b/repo/includes/DataUpdates/ReferencedEntitiesDataUpdate.php
new file mode 100644
index 0000000..9cdf943
--- /dev/null
+++ b/repo/includes/DataUpdates/ReferencedEntitiesDataUpdate.php
@@ -0,0 +1,162 @@
+<?php
+
+namespace Wikibase\Repo\DataUpdates;
+
+use DataValues\DataValue;
+use DataValues\QuantityValue;
+use LinkBatch;
+use ParserOutput;
+use Title;
+use Wikibase\DataModel\Entity\EntityId;
+use Wikibase\DataModel\Entity\EntityIdParser;
+use Wikibase\DataModel\Entity\EntityIdParsingException;
+use Wikibase\DataModel\Entity\EntityIdValue;
+use Wikibase\DataModel\SiteLink;
+use Wikibase\DataModel\Snak\PropertyValueSnak;
+use Wikibase\DataModel\Snak\Snak;
+use Wikibase\DataModel\Statement\Statement;
+use Wikibase\DataModel\Statement\StatementList;
+use Wikibase\Lib\Store\EntityTitleLookup;
+
+/**
+ * Finds linked entities on an Entity and add the links to ParserOutput.
+ *
+ * @since 0.5
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < [email protected] >
+ * @author Bene* < [email protected] >
+ * @author Thiemo Mättig
+ */
+class ReferencedEntitiesDataUpdate implements SiteLinkDataUpdate, 
StatementDataUpdate {
+
+       /**
+        * @var EntityTitleLookup
+        */
+       private $entityTitleLookup;
+
+       /**
+        * @var EntityIdParser
+        */
+       private $externalEntityIdParser;
+
+       /**
+        * @var EntityId[] Associative array mapping entity id serializations 
to EntityId objects.
+        */
+       private $entityIds = array();
+
+       /**
+        * @param EntityTitleLookup $entityTitleLookup
+        * @param EntityIdParser $externalEntityIdParser Parser for external 
entity IDs (usually URIs)
+        *              into EntityIds. Such external entity IDs may be used 
for units in QuantityValues, for
+        *              calendar models in TimeValue, and for the reference 
globe in GlobeCoordinateValues.
+        */
+       public function __construct(
+               EntityTitleLookup $entityTitleLookup,
+               EntityIdParser $externalEntityIdParser
+       ) {
+               $this->entityTitleLookup = $entityTitleLookup;
+               $this->externalEntityIdParser = $externalEntityIdParser;
+       }
+
+       /**
+        * @param StatementList $statements
+        *
+        * @return EntityId[] Associative array mapping entity id 
serializations to EntityId objects.
+        */
+       public function getEntityIds( StatementList $statements ) {
+               $this->entityIds = array();
+
+               foreach ( $statements as $statement ) {
+                       $this->processStatement( $statement );
+               }
+
+               return array_values( $this->entityIds );
+       }
+
+       /**
+        * @param Statement $statement
+        */
+       public function processStatement( Statement $statement ) {
+               foreach ( $statement->getAllSnaks() as $snak ) {
+                       $this->processSnak( $snak );
+               }
+       }
+
+       /**
+        * @param Snak $snak
+        */
+       private function processSnak( Snak $snak ) {
+               $propertyId = $snak->getPropertyId();
+               $this->entityIds[$propertyId->getSerialization()] = $propertyId;
+
+               if ( $snak instanceof PropertyValueSnak ) {
+                       $this->processDataValue( $snak->getDataValue() );
+               }
+       }
+
+       /**
+        * @param DataValue $dataValue
+        */
+       private function processDataValue( DataValue $dataValue ) {
+               if ( $dataValue instanceof EntityIdValue ) {
+                       $entityId = $dataValue->getEntityId();
+                       $this->entityIds[$entityId->getSerialization()] = 
$entityId;
+               } elseif ( $dataValue instanceof QuantityValue ) {
+                       $unitUri = $dataValue->getUnit();
+                       $this->processUri( $unitUri );
+               }
+
+               // TODO: EntityIds from GlobeCoordinateValue's globe URI 
(Wikidata, not local item URI!)
+               // TODO: EntityIds from TimeValue's calendar URI (Wikidata, not 
local item URI!)
+       }
+
+       /**
+        * @param string $uri
+        */
+       private function processUri( $uri ) {
+               try {
+                       $entityId = $this->externalEntityIdParser->parse( $uri 
);
+                       $this->entityIds[$entityId->getSerialization()] = 
$entityId;
+               } catch ( EntityIdParsingException $ex ) {
+                       // noop
+               }
+       }
+
+       /**
+        * @param SiteLink $siteLink
+        */
+       public function processSiteLink( SiteLink $siteLink ) {
+               $this->entityIds = array_merge( $this->entityIds, 
$siteLink->getBadges() );
+       }
+
+       /**
+        * @param ParserOutput $parserOutput
+        */
+       public function updateParserOutput( ParserOutput $parserOutput ) {
+               $this->addLinksToParserOutput( $parserOutput );
+       }
+
+       /**
+        * @param ParserOutput $parserOutput
+        */
+       private function addLinksToParserOutput( ParserOutput $parserOutput ) {
+               $linkBatch = new LinkBatch();
+
+               foreach ( $this->entityIds as $entityId ) {
+                       $linkBatch->addObj( 
$this->entityTitleLookup->getTitleForId( $entityId ) );
+               }
+
+               $pages = $linkBatch->doQuery();
+
+               if ( $pages === false ) {
+                       return;
+               }
+
+               foreach ( $pages as $page ) {
+                       $title = Title::makeTitle( $page->page_namespace, 
$page->page_title );
+                       $parserOutput->addLink( $title, $page->page_id );
+               }
+       }
+
+}
diff --git a/repo/includes/DataUpdates/SiteLinkDataUpdate.php 
b/repo/includes/DataUpdates/SiteLinkDataUpdate.php
new file mode 100644
index 0000000..116b3ae
--- /dev/null
+++ b/repo/includes/DataUpdates/SiteLinkDataUpdate.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Wikibase\Repo\DataUpdates;
+
+use Wikibase\DataModel\SiteLink;
+
+/**
+ * @since 0.5
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < [email protected] >
+ */
+interface SiteLinkDataUpdate extends ParserOutputDataUpdate {
+
+       /**
+        * Extract some data or do processing on a SiteLink during parsing.
+        *
+        * This method is invoked when processing a SiteLinkList on an Item,
+        * or other entity type that has SiteLinks.
+        *
+        * @param SiteLink $siteLink
+        */
+       public function processSiteLink( SiteLink $siteLink );
+
+}
diff --git a/repo/includes/DataUpdates/StatementDataUpdate.php 
b/repo/includes/DataUpdates/StatementDataUpdate.php
new file mode 100644
index 0000000..c1e5ff5
--- /dev/null
+++ b/repo/includes/DataUpdates/StatementDataUpdate.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Wikibase\Repo\DataUpdates;
+
+use Wikibase\DataModel\Statement\Statement;
+
+/**
+ * @since 0.5
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < [email protected] >
+ */
+interface StatementDataUpdate extends ParserOutputDataUpdate {
+
+       /**
+        * Extract some data or do processing on a Statement during parsing.
+        *
+        * This method is normally invoked when processing a StatementList
+        * for all Statements on a StatementListProvider (e.g. an Item).
+        *
+        * @param Statement $statement
+        */
+       public function processStatement( Statement $statement );
+
+}
diff --git 
a/repo/tests/phpunit/includes/DataUpdates/EntityParserOutputDataUpdaterTest.php 
b/repo/tests/phpunit/includes/DataUpdates/EntityParserOutputDataUpdaterTest.php
new file mode 100644
index 0000000..eafbf0b
--- /dev/null
+++ 
b/repo/tests/phpunit/includes/DataUpdates/EntityParserOutputDataUpdaterTest.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace Wikibase\Repo\Tests\DataUpdates;
+
+use PHPUnit_Framework_TestCase;
+use Wikibase\DataModel\Entity\Item;
+use Wikibase\DataModel\SiteLinkList;
+use Wikibase\DataModel\Snak\PropertyNoValueSnak;
+use Wikibase\DataModel\Statement\StatementList;
+use Wikibase\Repo\DataUpdates\EntityParserOutputDataUpdater;
+
+/**
+ * @covers Wikibase\Repo\DataUpdates\EntityParserOutputDataUpdater
+ *
+ * @group Wikibase
+ * @group WikibaseRepo
+ *
+ * @licence GNU GPL v2+
+ * @author Thiemo Mättig
+ */
+class EntityParserOutputDataUpdaterTest extends PHPUnit_Framework_TestCase {
+
+       /**
+        * @dataProvider entitiesProvider
+        */
+       public function testUpdateParserOutput( array $entities, $statements, 
$siteLinks ) {
+               $parserOutput = $this->getMockBuilder( 'ParserOutput' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $statementDataUpdate = $this->getMockBuilder( 
'Wikibase\Repo\DataUpdates\StatementDataUpdate' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $statementDataUpdate->expects( $this->exactly( $statements ) )
+                       ->method( 'processStatement' );
+               $statementDataUpdate->expects( $this->once() )
+                       ->method( 'updateParserOutput' );
+
+               $siteLinkDataUpdate = $this->getMockBuilder( 
'Wikibase\Repo\DataUpdates\SiteLinkDataUpdate' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $siteLinkDataUpdate->expects( $this->exactly( $siteLinks ) )
+                       ->method( 'processSiteLink' );
+               $siteLinkDataUpdate->expects( $this->once() )
+                       ->method( 'updateParserOutput' );
+
+               $instance = new EntityParserOutputDataUpdater( array(
+                       $statementDataUpdate,
+                       $siteLinkDataUpdate,
+               ) );
+               foreach ( $entities as $entity ) {
+                       $instance->processEntity( $entity );
+               }
+               $instance->updateParserOutput( $parserOutput );
+       }
+
+       public function entitiesProvider() {
+               $statements = new StatementList();
+               $statements->addNewStatement( new PropertyNoValueSnak( 1 ) );
+               $q1 = new Item( null, null, null, $statements );
+
+               $siteLinks = new SiteLinkList();
+               $siteLinks->addNewSiteLink( 'enwiki', 'Title' );
+               $q2 = new Item( null, null, $siteLinks );
+
+               return array(
+                       array( array(), 0, 0 ),
+                       array( array( $q1 ), 1, 0 ),
+                       array( array( $q2 ), 0, 1 ),
+                       array( array( $q1, $q2 ), 1, 1 ),
+               );
+       }
+
+}
diff --git 
a/repo/tests/phpunit/includes/DataUpdates/ExternalLinksDataUpdateTest.php 
b/repo/tests/phpunit/includes/DataUpdates/ExternalLinksDataUpdateTest.php
new file mode 100644
index 0000000..a18f787
--- /dev/null
+++ b/repo/tests/phpunit/includes/DataUpdates/ExternalLinksDataUpdateTest.php
@@ -0,0 +1,72 @@
+<?php
+
+namespace Wikibase\Repo\Tests\DataUpdates;
+
+use DataValues\StringValue;
+use PHPUnit_Framework_TestCase;
+use Wikibase\DataModel\Snak\PropertyValueSnak;
+use Wikibase\DataModel\Statement\StatementList;
+use Wikibase\Repo\DataUpdates\ExternalLinksDataUpdate;
+
+/**
+ * @covers Wikibase\Repo\DataUpdates\ExternalLinksDataUpdate
+ *
+ * @group Wikibase
+ * @group WikibaseRepo
+ *
+ * @licence GNU GPL v2+
+ * @author Thiemo Mättig
+ */
+class ExternalLinksDataUpdateTest extends PHPUnit_Framework_TestCase {
+
+       /**
+        * @param StatementList $statements
+        * @param string $string
+        */
+       private function addStatement( StatementList $statements, $string ) {
+               $statements->addNewStatement( new PropertyValueSnak( 1, new 
StringValue( $string ) ) );
+       }
+
+       /**
+        * @dataProvider externalLinksProvider
+        */
+       public function testGetExternalLinks( StatementList $statements, array 
$expected ) {
+               $instance = new ExternalLinksDataUpdate();
+               $actual = $instance->getExternalLinks( $statements );
+               $this->assertSame( $expected, $actual );
+       }
+
+       /**
+        * @dataProvider externalLinksProvider
+        */
+       public function testUpdateParserOutput( StatementList $statements, 
array $expected ) {
+               $parserOutput = $this->getMockBuilder( 'ParserOutput' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $parserOutput->expects( $this->exactly( count( $expected ) ) )
+                       ->method( 'addExternalLink' );
+
+               $instance = new ExternalLinksDataUpdate();
+               foreach ( $statements as $statement ) {
+                       $instance->processStatement( $statement );
+               }
+               $instance->updateParserOutput( $parserOutput );
+       }
+
+       public function externalLinksProvider() {
+               $set1 = new StatementList();
+               $this->addStatement( $set1, 'http://1.de' );
+               $this->addStatement( $set1, '' );
+
+               $set2 = new StatementList();
+               $this->addStatement( $set2, 'http://2a.de' );
+               $this->addStatement( $set2, 'http://2b.de' );
+
+               return array(
+                       array( new StatementList(), array() ),
+                       array( $set1, array( 'http://1.de' ) ),
+                       array( $set2, array( 'http://2a.de', 'http://2b.de' ) ),
+               );
+       }
+
+}
diff --git 
a/repo/tests/phpunit/includes/DataUpdates/ImageLinksDataUpdateTest.php 
b/repo/tests/phpunit/includes/DataUpdates/ImageLinksDataUpdateTest.php
new file mode 100644
index 0000000..017a1ca
--- /dev/null
+++ b/repo/tests/phpunit/includes/DataUpdates/ImageLinksDataUpdateTest.php
@@ -0,0 +1,72 @@
+<?php
+
+namespace Wikibase\Repo\Tests\DataUpdates;
+
+use DataValues\StringValue;
+use PHPUnit_Framework_TestCase;
+use Wikibase\DataModel\Snak\PropertyValueSnak;
+use Wikibase\DataModel\Statement\StatementList;
+use Wikibase\Repo\DataUpdates\ImageLinksDataUpdate;
+
+/**
+ * @covers Wikibase\Repo\DataUpdates\ImageLinksDataUpdate
+ *
+ * @group Wikibase
+ * @group WikibaseRepo
+ *
+ * @licence GNU GPL v2+
+ * @author Thiemo Mättig
+ */
+class ImageLinksDataUpdateTest extends PHPUnit_Framework_TestCase {
+
+       /**
+        * @param StatementList $statements
+        * @param string $string
+        */
+       private function addStatement( StatementList $statements, $string ) {
+               $statements->addNewStatement( new PropertyValueSnak( 1, new 
StringValue( $string ) ) );
+       }
+
+       /**
+        * @dataProvider imageLinksProvider
+        */
+       public function testGetImageLinks( StatementList $statements, array 
$expected ) {
+               $instance = new ImageLinksDataUpdate();
+               $actual = $instance->getImageLinks( $statements );
+               $this->assertSame( $expected, $actual );
+       }
+
+       /**
+        * @dataProvider imageLinksProvider
+        */
+       public function testUpdateParserOutput( StatementList $statements, 
array $expected ) {
+               $parserOutput = $this->getMockBuilder( 'ParserOutput' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $parserOutput->expects( $this->exactly( count( $expected ) ) )
+                       ->method( 'addImage' );
+
+               $instance = new ImageLinksDataUpdate();
+               foreach ( $statements as $statement ) {
+                       $instance->processStatement( $statement );
+               }
+               $instance->updateParserOutput( $parserOutput );
+       }
+
+       public function imageLinksProvider() {
+               $set1 = new StatementList();
+               $this->addStatement( $set1, '1.jpg' );
+               $this->addStatement( $set1, '' );
+
+               $set2 = new StatementList();
+               $this->addStatement( $set2, '2a.jpg' );
+               $this->addStatement( $set2, '2b.jpg' );
+
+               return array(
+                       array( new StatementList(), array() ),
+                       array( $set1, array( '1.jpg' ) ),
+                       array( $set2, array( '2a.jpg', '2b.jpg' ) ),
+               );
+       }
+
+}
diff --git 
a/repo/tests/phpunit/includes/DataUpdates/ReferencedEntitiesDataUpdateTest.php 
b/repo/tests/phpunit/includes/DataUpdates/ReferencedEntitiesDataUpdateTest.php
new file mode 100644
index 0000000..5168097
--- /dev/null
+++ 
b/repo/tests/phpunit/includes/DataUpdates/ReferencedEntitiesDataUpdateTest.php
@@ -0,0 +1,126 @@
+<?php
+
+namespace Wikibase\Repo\Tests\DataUpdates;
+
+use DataValues\QuantityValue;
+use MediaWikiTestCase;
+use Title;
+use Wikibase\DataModel\Entity\EntityId;
+use Wikibase\DataModel\Entity\EntityIdValue;
+use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\DataModel\Entity\PropertyId;
+use Wikibase\DataModel\Snak\PropertyValueSnak;
+use Wikibase\DataModel\Statement\StatementList;
+use Wikibase\Repo\DataUpdates\ReferencedEntitiesDataUpdate;
+
+/**
+ * @covers Wikibase\Repo\DataUpdates\ReferencedEntitiesDataUpdate
+ *
+ * @group Wikibase
+ * @group WikibaseRepo
+ * @group Database
+ *
+ * @licence GNU GPL v2+
+ * @author Thiemo Mättig
+ */
+class ReferencedEntitiesDataUpdateTest extends MediaWikiTestCase {
+
+       const UNIT_PREFIX = 'unit:';
+
+       protected function setUp() {
+               parent::setUp();
+
+               foreach ( array( 'P1', 'Q1', 'Q20', 'Q21', 'Q22' ) as $pageName 
) {
+                       $this->insertPage( $pageName );
+               }
+       }
+
+       /**
+        * @param int $count
+        *
+        * @return ReferencedEntitiesDataUpdate
+        */
+       private function newInstance( $count = 0 ) {
+               $entityTitleLookup = $this->getMockBuilder( 
'Wikibase\Lib\Store\EntityTitleLookup' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $entityTitleLookup->expects( $this->exactly( $count ) )
+                       ->method( 'getTitleForId' )
+                       ->will( $this->returnCallback( function( EntityId $id ) 
{
+                               return Title::newFromText( 
$id->getSerialization() );
+                       } ) );
+
+               $entityidParser = $this->getMockBuilder( 
'Wikibase\DataModel\Entity\EntityIdParser' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $entityidParser->expects( $this->any() )
+                       ->method( 'parse' )
+                       ->will( $this->returnCallback( function( $id ) {
+                               return new ItemId(
+                                       substr( $id, strlen( 
ReferencedEntitiesDataUpdateTest::UNIT_PREFIX ) )
+                               );
+                       } ) );
+
+               return new ReferencedEntitiesDataUpdate( $entityTitleLookup, 
$entityidParser );
+       }
+
+       /**
+        * @param StatementList $statements
+        * @param string $itemId
+        */
+       private function addStatement( StatementList $statements, $itemId ) {
+               $statements->addNewStatement(
+                       new PropertyValueSnak( 1, new EntityIdValue( new 
ItemId( $itemId ) ) )
+               );
+       }
+
+       /**
+        * @dataProvider entityIdProvider
+        */
+       public function testGetExternalLinks( StatementList $statements, array 
$expected ) {
+               $instance = $this->newInstance();
+               $actual = $instance->getEntityIds( $statements );
+               $this->assertEquals( $expected, $actual );
+       }
+
+       /**
+        * @dataProvider entityIdProvider
+        */
+       public function testUpdateParserOutput( StatementList $statements, 
array $expected ) {
+               $parserOutput = $this->getMockBuilder( 'ParserOutput' )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $parserOutput->expects( $this->exactly( count( $expected ) ) )
+                       ->method( 'addLink' );
+
+               $instance = $this->newInstance( count( $expected ) );
+               foreach ( $statements as $statement ) {
+                       $instance->processStatement( $statement );
+               }
+               $instance->updateParserOutput( $parserOutput );
+       }
+
+       public function entityIdProvider() {
+               $set1 = new StatementList();
+               $this->addStatement( $set1, 'Q1' );
+
+               $set2 = new StatementList();
+               $this->addStatement( $set2, 'Q20' );
+               $this->addStatement( $set2, 'Q21' );
+               $set2->addNewStatement(
+                       new PropertyValueSnak( 1, QuantityValue::newFromNumber( 
1, self::UNIT_PREFIX . 'Q22' ) )
+               );
+
+               return array(
+                       array( new StatementList(), array() ),
+                       array( $set1, array( new PropertyId( 'P1' ), new 
ItemId( 'Q1' ) ) ),
+                       array( $set2, array(
+                               new PropertyId( 'P1' ),
+                               new ItemId( 'Q20' ),
+                               new ItemId( 'Q21' ),
+                               new ItemId( 'Q22' ),
+                       ) ),
+               );
+       }
+
+}

-- 
To view, visit https://gerrit.wikimedia.org/r/244643
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I1618217b0926b0dd213f9a0d4b315514b66f2b54
Gerrit-PatchSet: 4
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Thiemo Mättig (WMDE) <[email protected]>
Gerrit-Reviewer: Aude <[email protected]>
Gerrit-Reviewer: Daniel Kinzler <[email protected]>
Gerrit-Reviewer: Jonas Kress (WMDE) <[email protected]>
Gerrit-Reviewer: Thiemo Mättig (WMDE) <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to