Bene has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/276219

Change subject: Introduce content handler for media info entity type
......................................................................

Introduce content handler for media info entity type

Bug: T129380
Change-Id: I154f9a65fdf8455266a2af253d24ff8959a91055
---
A WikibaseMediaInfo.entitytypes.php
M extension.json
A src/Content/MediaInfoContent.php
A src/Content/MediaInfoHandler.php
M src/DataModel/MediaInfo.php
M src/DataModel/MediaInfoId.php
M src/WikibaseMediaInfoHooks.php
M tests/phpunit/composer/DataModel/MediaInfoTest.php
D tests/phpunit/composer/WikibaseMediaInfoHooksTest.php
A tests/phpunit/mediawiki/Content/MediaInfoContentTest.php
A tests/phpunit/mediawiki/Content/MediaInfoHandlerTest.php
A tests/phpunit/mediawiki/EntityTypesTest.php
M tests/phpunit/mediawiki/WikibaseMediaInfoHooksTest.php
13 files changed, 633 insertions(+), 172 deletions(-)


  git pull 
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/WikibaseMediaInfo 
refs/changes/19/276219/1

diff --git a/WikibaseMediaInfo.entitytypes.php 
b/WikibaseMediaInfo.entitytypes.php
new file mode 100644
index 0000000..33356e0
--- /dev/null
+++ b/WikibaseMediaInfo.entitytypes.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * Definition of the media info entity type.
+ * The array returned by the code below is supposed to be merged into 
$wgWBRepoEntityTypes.
+ *
+ * @note: Keep in sync with Wikibase
+ *
+ * @note: This is bootstrap code, it is executed for EVERY request. Avoid 
instantiating
+ * objects or loading classes here!
+ *
+ * @license GPL-2.0+
+ * @author Bene* < [email protected] >
+ */
+
+use Wikibase\DataModel\DeserializerFactory;
+use Wikibase\DataModel\SerializerFactory;
+use Wikibase\MediaInfo\Content\MediaInfoContent;
+use Wikibase\MediaInfo\Content\MediaInfoHandler;
+use Wikibase\MediaInfo\DataModel\Serialization\MediaInfoDeserializer;
+use Wikibase\MediaInfo\DataModel\Serialization\MediaInfoSerializer;
+use Wikibase\Repo\WikibaseRepo;
+
+return [
+       'mediainfo' => [
+               'serializer-factory-callback' => function( SerializerFactory 
$serializerFactory ) {
+                       return new MediaInfoSerializer(
+                               $serializerFactory->newTermListSerializer(),
+                               $serializerFactory->newStatementListSerializer()
+                       );
+               },
+               'deserializer-factory-callback' => function( 
DeserializerFactory $deserializerFactory ) {
+                       return new MediaInfoDeserializer(
+                               $deserializerFactory->newTermListDeserializer(),
+                               
$deserializerFactory->newStatementListDeserializer()
+                       );
+               },
+               'content-model-id' => MediaInfoContent::CONTENT_MODEL_ID,
+               'content-handler-factory-callback' => function() {
+                       $wikibaseRepo = WikibaseRepo::getDefaultInstance();
+
+                       return new MediaInfoHandler(
+                               $entityPerPage = 
$wikibaseRepo->getStore()->newEntityPerPage(),
+                               $termIndex = 
$wikibaseRepo->getStore()->getTermIndex(),
+                               $codec = 
$wikibaseRepo->getEntityContentDataCodec(),
+                               $constraintProvider = 
$wikibaseRepo->getEntityConstraintProvider(),
+                               $errorLocalizer = 
$wikibaseRepo->getValidatorErrorLocalizer(),
+                               $wikibaseRepo->getEntityIdParser()
+                       // $legacyFormatDetector = 
$wikibaseRepo->getLegacyFormatDetectorCallback()
+                       );
+               }
+       ]
+];
diff --git a/extension.json b/extension.json
index 9cb214f..bfa8f11 100644
--- a/extension.json
+++ b/extension.json
@@ -20,10 +20,10 @@
                        
"Wikibase\\MediaInfo\\WikibaseMediaInfoHooks::onUnitTestsList"
                ],
                "WikibaseRepoEntityTypes": [
-                       
"Wikibase\\MediaInfo\\WikibaseMediaInfoHooks::onWikibaseRepoEntityTypes"
+                       
"Wikibase\\MediaInfo\\WikibaseMediaInfoHooks::onWikibaseEntityTypes"
                ],
                "WikibaseClientEntityTypes": [
-                       
"Wikibase\\MediaInfo\\WikibaseMediaInfoHooks::onWikibaseClientEntityTypes"
+                       
"Wikibase\\MediaInfo\\WikibaseMediaInfoHooks::onWikibaseEntityTypes"
                ]
        },
        "MessagesDirs": {
diff --git a/src/Content/MediaInfoContent.php b/src/Content/MediaInfoContent.php
new file mode 100644
index 0000000..7fde363
--- /dev/null
+++ b/src/Content/MediaInfoContent.php
@@ -0,0 +1,85 @@
+<?php
+
+namespace Wikibase\MediaInfo\Content;
+
+use InvalidArgumentException;
+use Wikibase\Content\EntityHolder;
+use Wikibase\DataModel\Entity\Entity;
+use Wikibase\EntityContent;
+use Wikibase\MediaInfo\DataModel\MediaInfo;
+
+/**
+ * @license GPL-2.0+
+ * @author Bene* < [email protected] >
+ */
+class MediaInfoContent extends EntityContent {
+
+       const CONTENT_MODEL_ID = 'wikibase-mediainfo';
+
+       /**
+        * @var EntityHolder
+        */
+       private $mediaInfoHolder;
+
+       /**
+        * Do not use to construct new stuff from outside of this class,
+        * use the static newFoobar methods.
+        *
+        * In other words: treat as protected (which it was, but now
+        * cannot be since we derive from Content).
+        *
+        * @protected
+        *
+        * @param EntityHolder $mediaInfoHolder
+        * @throws InvalidArgumentException
+        */
+       public function __construct( EntityHolder $mediaInfoHolder ) {
+               parent::__construct( self::CONTENT_MODEL_ID );
+
+               if ( $mediaInfoHolder->getEntityType() !== 
MediaInfo::ENTITY_TYPE ) {
+                       throw new InvalidArgumentException( '$mediaInfoHolder 
must contain a MediaInfo entity' );
+               }
+
+               $this->mediaInfoHolder = $mediaInfoHolder;
+       }
+
+       /**
+        * @return MediaInfo
+        */
+       public function getMediaInfo() {
+               return $this->mediaInfoHolder->getEntity( MediaInfo::class );
+       }
+
+       /**
+        * @return MediaInfo
+        */
+       public function getEntity() {
+               return $this->getMediaInfo();
+       }
+
+       /**
+        * @return EntityHolder
+        */
+       protected function getEntityHolder() {
+               return $this->mediaInfoHolder;
+       }
+
+       /**
+        * @return bool
+        */
+       public function isStub() {
+               return !$this->isRedirect()
+                      && !$this->getMediaInfo()->isEmpty()
+                      && $this->getMediaInfo()->getStatements()->isEmpty();
+       }
+
+       /**
+        * @param bool|null $hasLinks
+        *
+        * @return bool
+        */
+       public function isCountable( $hasLinks = null ) {
+               return !$this->isRedirect() && 
!$this->getMediaInfo()->isEmpty();
+       }
+
+}
diff --git a/src/Content/MediaInfoHandler.php b/src/Content/MediaInfoHandler.php
new file mode 100644
index 0000000..2fa7230
--- /dev/null
+++ b/src/Content/MediaInfoHandler.php
@@ -0,0 +1,81 @@
+<?php
+
+namespace Wikibase\MediaInfo\Content;
+
+use Wikibase\DataModel\Entity\Entity;
+use Wikibase\DataModel\Entity\EntityId;
+use Wikibase\DataModel\Entity\EntityIdParser;
+use Wikibase\Lib\Store\EntityContentDataCodec;
+use Wikibase\MediaInfo\DataModel\MediaInfo;
+use Wikibase\MediaInfo\DataModel\MediaInfoId;
+use Wikibase\Repo\Content\EntityHandler;
+use Wikibase\Repo\Store\EntityPerPage;
+use Wikibase\Repo\Validators\EntityConstraintProvider;
+use Wikibase\Repo\Validators\ValidatorErrorLocalizer;
+use Wikibase\TermIndex;
+
+/**
+ * @license GPL-2.0+
+ * @author Bene* < [email protected] >
+ */
+class MediaInfoHandler extends EntityHandler {
+
+       /**
+        * @param EntityPerPage $entityPerPage
+        * @param TermIndex $termIndex
+        * @param EntityContentDataCodec $contentCodec
+        * @param EntityConstraintProvider $constraintProvider
+        * @param ValidatorErrorLocalizer $errorLocalizer
+        * @param EntityIdParser $entityIdParser
+        * @param callable|null $legacyExportFormatDetector
+        */
+       public function __construct(
+               EntityPerPage $entityPerPage,
+               TermIndex $termIndex,
+               EntityContentDataCodec $contentCodec,
+               EntityConstraintProvider $constraintProvider,
+               ValidatorErrorLocalizer $errorLocalizer,
+               EntityIdParser $entityIdParser,
+               $legacyExportFormatDetector = null
+       ) {
+               parent::__construct(
+                       MediaInfoContent::CONTENT_MODEL_ID,
+                       $entityPerPage,
+                       $termIndex,
+                       $contentCodec,
+                       $constraintProvider,
+                       $errorLocalizer,
+                       $entityIdParser,
+                       $legacyExportFormatDetector
+               );
+       }
+
+       /**
+        * @return string
+        */
+       protected function getContentClass() {
+               return MediaInfoContent::class;
+       }
+
+       /**
+        * @return MediaInfo
+        */
+       public function makeEmptyEntity() {
+               return new MediaInfo();
+       }
+
+       /**
+        * @return MediaInfoId
+        */
+       public function makeEntityId( $id ) {
+               return new MediaInfoId( $id );
+       }
+
+       /**
+        * @return string
+        */
+       public function getEntityType() {
+               return MediaInfo::ENTITY_TYPE;
+       }
+
+}
diff --git a/src/DataModel/MediaInfo.php b/src/DataModel/MediaInfo.php
index 83c7e48..9fb13c0 100644
--- a/src/DataModel/MediaInfo.php
+++ b/src/DataModel/MediaInfo.php
@@ -77,16 +77,18 @@
        }
 
        /**
-        * @param MediaInfoId $id
+        * @param MediaInfoId|int|null $id
         *
         * @throws InvalidArgumentException
         */
        public function setId( $id ) {
-               if ( !( $id instanceof MediaInfoId ) ) {
+               if ( $id === null || $id instanceof MediaInfoId ) {
+                       $this->id = $id;
+               } elseif ( is_int( $id ) && $id > 0 ) {
+                       $this->id = new MediaInfoId( 'M' . $id );
+               } else {
                        throw new InvalidArgumentException( '$id must be an 
instance of MediaInfoId' );
                }
-
-               $this->id = $id;
        }
 
        /**
diff --git a/src/DataModel/MediaInfoId.php b/src/DataModel/MediaInfoId.php
index 868d7e7..805df96 100644
--- a/src/DataModel/MediaInfoId.php
+++ b/src/DataModel/MediaInfoId.php
@@ -43,7 +43,7 @@
         * @return string
         */
        public function getEntityType() {
-               return 'mediainfo';
+               return MediaInfo::ENTITY_TYPE;
        }
 
        /**
diff --git a/src/WikibaseMediaInfoHooks.php b/src/WikibaseMediaInfoHooks.php
index 1410340..2f2e457 100644
--- a/src/WikibaseMediaInfoHooks.php
+++ b/src/WikibaseMediaInfoHooks.php
@@ -4,8 +4,7 @@
 
 use Wikibase\DataModel\DeserializerFactory;
 use Wikibase\DataModel\SerializerFactory;
-use Wikibase\MediaInfo\DataModel\Serialization\MediaInfoDeserializer;
-use Wikibase\MediaInfo\DataModel\Serialization\MediaInfoSerializer;
+use Wikibase\MediaInfo\Content\MediaInfoContent;
 
 /**
  * MediaWiki hook handlers for the Wikibase MediaInfo extension.
@@ -20,8 +19,6 @@
         *
         * @see https://www.mediawiki.org/wiki/Manual:Hooks/UnitTestsList
         *
-        * @since 0.1
-        *
         * @param string[] &$paths
         */
        public static function onUnitTestsList( array &$paths ) {
@@ -29,52 +26,19 @@
        }
 
        /**
-        * Returns the common definition of the media info entity type that 
both repo and client use.
-        *
-        * @return array
-        */
-       private static function getCommonMediaInfoDefinition() {
-               return [
-                       'serializer-factory-callback' => function( 
SerializerFactory $serializerFactory ) {
-                               return new MediaInfoSerializer(
-                                       
$serializerFactory->newTermListSerializer(),
-                                       
$serializerFactory->newStatementListSerializer()
-                               );
-                       },
-                       'deserializer-factory-callback' => function( 
DeserializerFactory $deserializerFactory ) {
-                               return new MediaInfoDeserializer(
-                                       
$deserializerFactory->newTermListDeserializer(),
-                                       
$deserializerFactory->newStatementListDeserializer()
-                               );
-                       }
-               ];
-       }
-
-       /**
         * Adds the definition of the media info entity type to the definitions 
array Wikibase uses.
         *
-        * @param $entityTypeDefinitions
-        */
-       public static function onWikibaseRepoEntityTypes( 
&$entityTypeDefinitions ) {
-               $entityTypeDefinitions['mediainfo'] = array_merge(
-                       self::getCommonMediaInfoDefinition(),
-                       [
-                               // TODO
-                       ]
-               );
-       }
-
-       /**
-        * Adds the definition of the media info entity type to the definitions 
array Wikibase uses.
+        * @see WikibaseMediaInfo.entitytypes.php
         *
-        * @param $entityTypeDefinitions
+        * @note: This is bootstrap code, it is executed for EVERY request. 
Avoid instantiating
+        * objects or loading classes here!
+        *
+        * @param array[] $entityTypeDefinitions
         */
-       public static function onWikibaseClientEntityTypes( 
&$entityTypeDefinitions ) {
-               $entityTypeDefinitions['mediainfo'] = array_merge(
-                       self::getCommonMediaInfoDefinition(),
-                       [
-                               // TODO
-                       ]
+       public static function onWikibaseEntityTypes( array 
&$entityTypeDefinitions ) {
+               $entityTypeDefinitions = array_merge(
+                       $entityTypeDefinitions,
+                       require __DIR__ . 
'/../WikibaseMediaInfo.entitytypes.php'
                );
        }
 
diff --git a/tests/phpunit/composer/DataModel/MediaInfoTest.php 
b/tests/phpunit/composer/DataModel/MediaInfoTest.php
index 56087a5..ef457db 100644
--- a/tests/phpunit/composer/DataModel/MediaInfoTest.php
+++ b/tests/phpunit/composer/DataModel/MediaInfoTest.php
@@ -50,12 +50,19 @@
                $this->assertSame( 'mediainfo', $mediaInfo->getType() );
        }
 
-       public function testSetNewId() {
+       public function testSetId() {
                $mediaInfo = new MediaInfo();
                $id = new MediaInfoId( 'M1' );
                $mediaInfo->setId( $id );
 
                $this->assertSame( $id, $mediaInfo->getId() );
+       }
+
+       public function testSetNumericId() {
+               $mediaInfo = new MediaInfo();
+               $mediaInfo->setId( 1 );
+
+               $this->assertSame( 'M1', 
$mediaInfo->getId()->getSerialization() );
        }
 
        public function testOverrideId() {
@@ -66,11 +73,20 @@
                $this->assertSame( $id, $mediaInfo->getId() );
        }
 
+       public function testSetNullId() {
+               $mediaInfo = new MediaInfo( new MediaInfoId( 'M1' ) );
+               $mediaInfo->setId( null );
+
+               $this->assertSame( null, $mediaInfo->getId() );
+       }
+
        public function provideInvalidIds() {
                return [
-                       [ null ],
                        [ false ],
-                       [ 42 ],
+                       [ 'foo' ],
+                       [ 3.14159 ],
+                       [ 0 ],
+                       [ -1 ],
                        [ 'M1' ],
                        [ new ItemId( 'Q1' ) ],
                ];
diff --git a/tests/phpunit/composer/WikibaseMediaInfoHooksTest.php 
b/tests/phpunit/composer/WikibaseMediaInfoHooksTest.php
deleted file mode 100644
index 013ee5b..0000000
--- a/tests/phpunit/composer/WikibaseMediaInfoHooksTest.php
+++ /dev/null
@@ -1,104 +0,0 @@
-<?php
-
-namespace Wikibase\MediaInfo\Tests;
-
-use Deserializers\Deserializer;
-use PHPUnit_Framework_TestCase;
-use Serializers\Serializer;
-use Wikibase\DataModel\DeserializerFactory;
-use Wikibase\DataModel\SerializerFactory;
-use Wikibase\MediaInfo\DataModel\Serialization\MediaInfoDeserializer;
-use Wikibase\MediaInfo\DataModel\Serialization\MediaInfoSerializer;
-use Wikibase\MediaInfo\WikibaseMediaInfoHooks;
-
-/**
- * @covers Wikibase\MediaInfo\WikibaseMediaInfoHooks
- *
- * @license GPL-2.0+
- * @author Bene* < [email protected] >
- */
-class WikibaseMediaInfoHooksTest extends PHPUnit_Framework_TestCase {
-
-       public function testOnUnitTestsList() {
-               $paths = [ 'foo' ];
-               WikibaseMediaInfoHooks::onUnitTestsList( $paths );
-
-               $this->assertSame( 'foo', $paths[0] );
-               $this->assertSame( realpath( __DIR__ . '/../' ), realpath( 
$paths[1] ) );
-       }
-
-       public function testOnWikibaseRepoEntityTypes() {
-               $entityTypeDefinitions = [
-                       'item' => [ 'foo', 'bar' ]
-               ];
-
-               WikibaseMediaInfoHooks::onWikibaseRepoEntityTypes( 
$entityTypeDefinitions );
-
-               $this->assertArrayHasKey( 'item', $entityTypeDefinitions );
-               $this->assertSame( [ 'foo', 'bar' ], 
$entityTypeDefinitions['item'] );
-
-               $this->assertArrayHasKey( 'mediainfo', $entityTypeDefinitions );
-               $this->assertSerializerFactoryCallback( 
$entityTypeDefinitions['mediainfo'] );
-               $this->assertDeserializerFactoryCallback( 
$entityTypeDefinitions['mediainfo'] );
-       }
-
-       public function testOnWikibaseClientEntityTypes() {
-               $entityTypeDefinitions = [
-                       'item' => [ 'foo', 'bar' ]
-               ];
-
-               WikibaseMediaInfoHooks::onWikibaseClientEntityTypes( 
$entityTypeDefinitions );
-
-               $this->assertArrayHasKey( 'item', $entityTypeDefinitions );
-               $this->assertSame( [ 'foo', 'bar' ], 
$entityTypeDefinitions['item'] );
-
-               $this->assertArrayHasKey( 'mediainfo', $entityTypeDefinitions );
-               $this->assertSerializerFactoryCallback( 
$entityTypeDefinitions['mediainfo'] );
-               $this->assertDeserializerFactoryCallback( 
$entityTypeDefinitions['mediainfo'] );
-       }
-
-       private function assertSerializerFactoryCallback( array $definitions ) {
-               $this->assertArrayHasKey( 'serializer-factory-callback', 
$definitions );
-               $callback = $definitions['serializer-factory-callback'];
-               $this->assertInternalType( 'callable', $callback );
-
-               $serializerFactory = $this->getMockBuilder( 
SerializerFactory::class )
-                       ->disableOriginalConstructor()
-                       ->getMock();
-
-               $serializerFactory->expects( $this->once() )
-                       ->method( 'newTermListSerializer' )
-                       ->will( $this->returnValue( $this->getMock( 
Serializer::class ) ) );
-
-               $serializerFactory->expects( $this->once() )
-                       ->method( 'newStatementListSerializer' )
-                       ->will( $this->returnValue( $this->getMock( 
Serializer::class ) ) );
-
-               $mediaInfoSerializer = call_user_func( $callback, 
$serializerFactory );
-
-               $this->assertInstanceOf( MediaInfoSerializer::class, 
$mediaInfoSerializer );
-       }
-
-       private function assertDeserializerFactoryCallback( array $definitions 
) {
-               $this->assertArrayHasKey( 'deserializer-factory-callback', 
$definitions );
-               $callback = $definitions['deserializer-factory-callback'];
-               $this->assertInternalType( 'callable', $callback );
-
-               $deserializerFactory = $this->getMockBuilder( 
DeserializerFactory::class )
-                       ->disableOriginalConstructor()
-                       ->getMock();
-
-               $deserializerFactory->expects( $this->once() )
-                       ->method( 'newTermListDeserializer' )
-                       ->will( $this->returnValue( $this->getMock( 
Deserializer::class ) ) );
-
-               $deserializerFactory->expects( $this->once() )
-                       ->method( 'newStatementListDeserializer' )
-                       ->will( $this->returnValue( $this->getMock( 
Deserializer::class ) ) );
-
-               $mediaInfoSerializer = call_user_func( $callback, 
$deserializerFactory );
-
-               $this->assertInstanceOf( MediaInfoDeserializer::class, 
$mediaInfoSerializer );
-       }
-
-}
diff --git a/tests/phpunit/mediawiki/Content/MediaInfoContentTest.php 
b/tests/phpunit/mediawiki/Content/MediaInfoContentTest.php
new file mode 100644
index 0000000..efbf563
--- /dev/null
+++ b/tests/phpunit/mediawiki/Content/MediaInfoContentTest.php
@@ -0,0 +1,185 @@
+<?php
+
+namespace Wikibase\MediaInfo\Tests\MediaWiki\Content;
+
+use InvalidArgumentException;
+use PHPUnit_Framework_TestCase;
+use Wikibase\Content\EntityInstanceHolder;
+use Wikibase\DataModel\Entity\EntityId;
+use Wikibase\DataModel\Entity\Item;
+use Wikibase\DataModel\Snak\PropertyNoValueSnak;
+use Wikibase\DataModel\Statement\StatementList;
+use Wikibase\MediaInfo\Content\MediaInfoContent;
+use Wikibase\MediaInfo\DataModel\MediaInfo;
+use Wikibase\MediaInfo\DataModel\MediaInfoId;
+
+/**
+ * @covers Wikibase\MediaInfo\Content\MediaInfoContent
+ *
+ * @license GPL-2.0+
+ * @author Bene* < [email protected] >
+ */
+class MediaInfoContentTest extends PHPUnit_Framework_TestCase {
+
+       public function provideGetEntityId() {
+               $mediaInfoId = new MediaInfoId( 'M1' );
+               $mediaInfoContent = new MediaInfoContent(
+                       new EntityInstanceHolder( new MediaInfo( $mediaInfoId ) 
)
+               );
+
+               return [
+                       [ $mediaInfoContent, $mediaInfoId ]
+               ];
+       }
+
+       public function testInvalidEntityType() {
+               $this->setExpectedException( InvalidArgumentException::class );
+               new MediaInfoContent( new EntityInstanceHolder( new Item() ) );
+       }
+
+       public function testGetMediaInfo() {
+               $mediaInfo = new MediaInfo();
+               $mediaInfoContent = new MediaInfoContent( new 
EntityInstanceHolder( $mediaInfo ) );
+
+               $this->assertSame( $mediaInfo, 
$mediaInfoContent->getMediaInfo() );
+       }
+
+       public function testGetEntity() {
+               $mediaInfo = new MediaInfo();
+               $mediaInfoContent = new MediaInfoContent( new 
EntityInstanceHolder( $mediaInfo ) );
+
+               $this->assertSame( $mediaInfo, $mediaInfoContent->getEntity() );
+       }
+
+       public function provideStubs() {
+               $stubs = [];
+
+               $mediaInfo = new MediaInfo();
+               $mediaInfo->getLabels()->setTextForLanguage( 'en', 'Foo' );
+               $stubs[] = [ $mediaInfo ];
+
+               $mediaInfo = new MediaInfo( new MediaInfoId( 'M1' ) );
+               $mediaInfo->getLabels()->setTextForLanguage( 'en', 'Foo' );
+               $stubs[] = [ $mediaInfo ];
+
+               $mediaInfo = new MediaInfo();
+               $mediaInfo->getDescriptions()->setTextForLanguage( 'en', 'Foo' 
);
+               $stubs[] = [ $mediaInfo ];
+
+               $mediaInfo = new MediaInfo( new MediaInfoId( 'M1' ) );
+               $mediaInfo->getDescriptions()->setTextForLanguage( 'en', 'Foo' 
);
+               $stubs[] = [ $mediaInfo ];
+
+               $mediaInfo = new MediaInfo();
+               $mediaInfo->getLabels()->setTextForLanguage( 'en', 'Foo' );
+               $mediaInfo->getDescriptions()->setTextForLanguage( 'en', 'Foo' 
);
+               $stubs[] = [ $mediaInfo ];
+
+               $mediaInfo = new MediaInfo( new MediaInfoId( 'M1' ) );
+               $mediaInfo->getLabels()->setTextForLanguage( 'en', 'Foo' );
+               $mediaInfo->getDescriptions()->setTextForLanguage( 'en', 'Foo' 
);
+               $stubs[] = [ $mediaInfo ];
+
+               return $stubs;
+       }
+
+       /**
+        * @dataProvider provideStubs
+        */
+       public function testIsStub( MediaInfo $mediaInfo ) {
+               $mediaInfoContent = new MediaInfoContent( new 
EntityInstanceHolder( $mediaInfo ) );
+
+               $this->assertTrue( $mediaInfoContent->isStub() );
+       }
+
+       public function provideNotStubs() {
+               $notStubs = [
+                       [ new MediaInfo() ],
+                       [ new MediaInfo( new MediaInfoId( 'M1' ) ) ]
+               ];
+
+               $mediaInfo = new MediaInfo();
+               $mediaInfo->getStatements()->addNewStatement( new 
PropertyNoValueSnak( 42 ) );
+               $notStubs[] = [ $mediaInfo ];
+
+               $mediaInfo = new MediaInfo( new MediaInfoId( 'M1' ) );
+               $mediaInfo->getStatements()->addNewStatement( new 
PropertyNoValueSnak( 42 ) );
+               $notStubs[] = [ $mediaInfo ];
+
+               $mediaInfo = new MediaInfo();
+               $mediaInfo->getLabels()->setTextForLanguage( 'en', 'Foo' );
+               $mediaInfo->getStatements()->addNewStatement( new 
PropertyNoValueSnak( 42 ) );
+               $notStubs[] = [ $mediaInfo ];
+
+               $mediaInfo = new MediaInfo();
+               $mediaInfo->getDescriptions()->setTextForLanguage( 'en', 'Foo' 
);
+               $mediaInfo->getStatements()->addNewStatement( new 
PropertyNoValueSnak( 42 ) );
+               $notStubs[] = [ $mediaInfo ];
+
+               return $notStubs;
+       }
+
+       /**
+        * @dataProvider provideNotStubs
+        */
+       public function testIsNotStub( MediaInfo $mediaInfo ) {
+               $mediaInfoContent = new MediaInfoContent( new 
EntityInstanceHolder( $mediaInfo ) );
+
+               $this->assertFalse( $mediaInfoContent->isStub() );
+       }
+
+       public function provideCountable() {
+               $countable = [];
+
+               $mediaInfo = new MediaInfo();
+               $mediaInfo->getLabels()->setTextForLanguage( 'en', 'Foo' );
+               $countable[] = [ $mediaInfo ];
+
+               $mediaInfo = new MediaInfo( new MediaInfoId( 'M1' ) );
+               $mediaInfo->getLabels()->setTextForLanguage( 'en', 'Foo' );
+               $countable[] = [ $mediaInfo ];
+
+               $mediaInfo = new MediaInfo();
+               $mediaInfo->getDescriptions()->setTextForLanguage( 'en', 'Foo' 
);
+               $countable[] = [ $mediaInfo ];
+
+               $mediaInfo = new MediaInfo( new MediaInfoId( 'M1' ) );
+               $mediaInfo->getDescriptions()->setTextForLanguage( 'en', 'Foo' 
);
+
+               $mediaInfo = new MediaInfo();
+               $mediaInfo->getStatements()->addNewStatement( new 
PropertyNoValueSnak( 42 ) );
+               $countable[] = [ $mediaInfo ];
+
+               $mediaInfo = new MediaInfo( new MediaInfoId( 'M1' ) );
+               $mediaInfo->getStatements()->addNewStatement( new 
PropertyNoValueSnak( 42 ) );
+               $countable[] = [ $mediaInfo ];
+
+               return $countable;
+       }
+
+       /**
+        * @dataProvider provideCountable
+        */
+       public function testIsCountable( MediaInfo $mediaInfo ) {
+               $mediaInfoContent = new MediaInfoContent( new 
EntityInstanceHolder( $mediaInfo ) );
+
+               $this->assertTrue( $mediaInfoContent->isCountable() );
+       }
+
+       public function provideNotCountable() {
+               return [
+                       [ new MediaInfo() ],
+                   [ new MediaInfo( new MediaInfoId( 'M1' ) ) ]
+               ];
+       }
+
+       /**
+        * @dataProvider provideNotCountable
+        */
+       public function testIsNotCountable( MediaInfo $mediaInfo ) {
+               $mediaInfoContent = new MediaInfoContent( new 
EntityInstanceHolder( $mediaInfo ) );
+
+               $this->assertFalse( $mediaInfoContent->isCountable() );
+       }
+
+}
diff --git a/tests/phpunit/mediawiki/Content/MediaInfoHandlerTest.php 
b/tests/phpunit/mediawiki/Content/MediaInfoHandlerTest.php
new file mode 100644
index 0000000..9c153e8
--- /dev/null
+++ b/tests/phpunit/mediawiki/Content/MediaInfoHandlerTest.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Wikibase\MediaInfo\Tests\MediaWiki\Content;
+
+use PHPUnit_Framework_TestCase;
+use Wikibase\DataModel\Entity\EntityIdParser;
+use Wikibase\Lib\Store\EntityContentDataCodec;
+use Wikibase\MediaInfo\Content\MediaInfoHandler;
+use Wikibase\MediaInfo\DataModel\MediaInfo;
+use Wikibase\MediaInfo\DataModel\MediaInfoId;
+use Wikibase\Repo\Store\EntityPerPage;
+use Wikibase\Repo\Validators\EntityConstraintProvider;
+use Wikibase\Repo\Validators\ValidatorErrorLocalizer;
+use Wikibase\TermIndex;
+
+/**
+ * @covers Wikibase\MediaInfo\Content\MediaInfoHandler
+ *
+ * @license GPL-2.0+
+ * @author Bene* < [email protected] >
+ */
+class MediaInfoHandlerTest extends PHPUnit_Framework_TestCase {
+
+       private function getMockWithoutConstructor( $className ) {
+               return $this->getMockBuilder( $className )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+       }
+
+       private function newMediaInfoHandler() {
+               return new MediaInfoHandler(
+                       $this->getMock( EntityPerPage::class ),
+                       $this->getMock( TermIndex::class ),
+                       $this->getMockWithoutConstructor( 
EntityContentDataCodec::class ),
+                       $this->getMockWithoutConstructor( 
EntityConstraintProvider::class ),
+                       $this->getMock( ValidatorErrorLocalizer::class ),
+                       $this->getMock( EntityIdParser::class )
+               );
+       }
+
+       public function testMakeEmptyEntity() {
+               $mediaInfoHandler = $this->newMediaInfoHandler();
+
+               $this->assertEquals( new MediaInfo(), 
$mediaInfoHandler->makeEmptyEntity() );
+       }
+
+       public function testMakeEntityId() {
+               $mediaInfoHandler = $this->newMediaInfoHandler();
+
+               $this->assertEquals( new MediaInfoId( 'M1' ), 
$mediaInfoHandler->makeEntityId( 'M1' ) );
+       }
+
+       public function testGetEntityType() {
+               $mediaInfoHandler = $this->newMediaInfoHandler();
+
+               $this->assertEquals( MediaInfo::ENTITY_TYPE, 
$mediaInfoHandler->getEntityType() );
+       }
+
+}
diff --git a/tests/phpunit/mediawiki/EntityTypesTest.php 
b/tests/phpunit/mediawiki/EntityTypesTest.php
new file mode 100644
index 0000000..27d1de8
--- /dev/null
+++ b/tests/phpunit/mediawiki/EntityTypesTest.php
@@ -0,0 +1,117 @@
+<?php
+
+namespace Wikibase\MediaInfo\Tests\MediaWiki;
+
+use Deserializers\Deserializer;
+use PHPUnit_Framework_TestCase;
+use Serializers\Serializer;
+use Wikibase\DataModel\DeserializerFactory;
+use Wikibase\DataModel\SerializerFactory;
+use Wikibase\MediaInfo\Content\MediaInfoContent;
+use Wikibase\MediaInfo\Content\MediaInfoHandler;
+use Wikibase\MediaInfo\DataModel\Serialization\MediaInfoDeserializer;
+use Wikibase\MediaInfo\DataModel\Serialization\MediaInfoSerializer;
+
+/**
+ * @covers WikibaseMediaInfo.entitytypes.php
+ *
+ * @license GPL-2.0+
+ * @author Bene* < [email protected] >
+ */
+class EntityTypesTest extends PHPUnit_Framework_TestCase {
+
+       private function getRegistry() {
+               return require __DIR__ . 
'/../../../WikibaseMediaInfo.entitytypes.php';
+       }
+
+       public function testEntityTypes() {
+               $registry = $this->getRegistry();
+
+               $this->assertEquals(
+                       [ 'mediainfo' ],
+                       array_keys( $registry )
+               );
+       }
+
+       private function getSerializerFactory() {
+               $serializerFactory = $this->getMockBuilder( 
SerializerFactory::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $serializerFactory->expects( $this->once() )
+                       ->method( 'newTermListSerializer' )
+                       ->will( $this->returnValue( $this->getMock( 
Serializer::class ) ) );
+
+               $serializerFactory->expects( $this->once() )
+                       ->method( 'newStatementListSerializer' )
+                       ->will( $this->returnValue( $this->getMock( 
Serializer::class ) ) );
+
+               return $serializerFactory;
+       }
+
+       public function testSerializerFactoryCallback() {
+               $registry = $this->getRegistry();
+
+               $this->assertArrayHasKey( 'mediainfo', $registry );
+               $this->assertArrayHasKey( 'serializer-factory-callback', 
$registry['mediainfo'] );
+
+               $callback = 
$registry['mediainfo']['serializer-factory-callback'];
+               $this->assertInternalType( 'callable', $callback );
+
+               $mediaInfoSerializer = call_user_func( $callback, 
$this->getSerializerFactory() );
+               $this->assertInstanceOf( MediaInfoSerializer::class, 
$mediaInfoSerializer );
+       }
+
+       private function getDeserializerFactory() {
+               $deserializerFactory = $this->getMockBuilder( 
DeserializerFactory::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+
+               $deserializerFactory->expects( $this->once() )
+                       ->method( 'newTermListDeserializer' )
+                       ->will( $this->returnValue( $this->getMock( 
Deserializer::class ) ) );
+
+               $deserializerFactory->expects( $this->once() )
+                       ->method( 'newStatementListDeserializer' )
+                       ->will( $this->returnValue( $this->getMock( 
Deserializer::class ) ) );
+
+               return $deserializerFactory;
+       }
+
+       public function testDeserializerFactoryCallback() {
+               $registry = $this->getRegistry();
+
+               $this->assertArrayHasKey( 'mediainfo', $registry );
+               $this->assertArrayHasKey( 'deserializer-factory-callback', 
$registry['mediainfo'] );
+
+               $callback = 
$registry['mediainfo']['deserializer-factory-callback'];
+               $this->assertInternalType( 'callable', $callback );
+
+               $mediaInfoDeserializer = call_user_func( $callback, 
$this->getDeserializerFactory() );
+               $this->assertInstanceOf( MediaInfoDeserializer::class, 
$mediaInfoDeserializer );
+       }
+
+       public function testContentModelId() {
+               $registry = $this->getRegistry();
+
+               $this->assertArrayHasKey( 'mediainfo', $registry );
+               $this->assertArrayHasKey( 'content-model-id', 
$registry['mediainfo'] );
+
+               $modelId = $registry['mediainfo']['content-model-id'];
+               $this->assertSame( MediaInfoContent::CONTENT_MODEL_ID, $modelId 
);
+       }
+
+       public function testContentHandlerFactoryCallback() {
+               $registry = $this->getRegistry();
+
+               $this->assertArrayHasKey( 'mediainfo', $registry );
+               $this->assertArrayHasKey( 'content-handler-factory-callback', 
$registry['mediainfo'] );
+
+               $callback = 
$registry['mediainfo']['content-handler-factory-callback'];
+               $this->assertInternalType( 'callable', $callback );
+
+               $mediaInfoHandler = call_user_func( $callback );
+               $this->assertInstanceOf( MediaInfoHandler::class, 
$mediaInfoHandler );
+       }
+
+}
diff --git a/tests/phpunit/mediawiki/WikibaseMediaInfoHooksTest.php 
b/tests/phpunit/mediawiki/WikibaseMediaInfoHooksTest.php
index db8c197..80cd1ee 100644
--- a/tests/phpunit/mediawiki/WikibaseMediaInfoHooksTest.php
+++ b/tests/phpunit/mediawiki/WikibaseMediaInfoHooksTest.php
@@ -2,8 +2,14 @@
 
 namespace Wikibase\MediaInfo\Tests\MediaWiki;
 
+use Deserializers\Deserializer;
 use Hooks;
 use PHPUnit_Framework_TestCase;
+use Serializers\Serializer;
+use Wikibase\DataModel\DeserializerFactory;
+use Wikibase\DataModel\SerializerFactory;
+use Wikibase\MediaInfo\DataModel\Serialization\MediaInfoDeserializer;
+use Wikibase\MediaInfo\DataModel\Serialization\MediaInfoSerializer;
 
 /**
  * @covers Wikibase\MediaInfo\WikibaseMediaInfoHooks
@@ -24,25 +30,22 @@
                $this->assertContains( $expected, $paths );
        }
 
-       public function testOnWikibaseRepoEntityTypes() {
-               $entityTypeDefinitions = [
-                       'item' => [ 'foo', 'bar' ]
+       public function provideWikibaseEntityTypesHooks() {
+               return [
+                       [ 'WikibaseRepoEntityTypes' ],
+                   [ 'WikibaseClientEntityTypes' ]
                ];
-
-               Hooks::run( 'WikibaseRepoEntityTypes', [ 
&$entityTypeDefinitions ] );
-
-               $this->assertArrayHasKey( 'item', $entityTypeDefinitions );
-               $this->assertSame( [ 'foo', 'bar' ], 
$entityTypeDefinitions['item'] );
-
-               $this->assertArrayHasKey( 'mediainfo', $entityTypeDefinitions );
        }
 
-       public function testOnWikibaseClientEntityTypes() {
+       /**
+        * @dataProvider provideWikibaseEntityTypesHooks
+        */
+       public function testOnWikibaseEntityTypes( $hook ) {
                $entityTypeDefinitions = [
                        'item' => [ 'foo', 'bar' ]
                ];
 
-               Hooks::run( 'WikibaseClientEntityTypes', [ 
&$entityTypeDefinitions ] );
+               Hooks::run( $hook, [ &$entityTypeDefinitions ] );
 
                $this->assertArrayHasKey( 'item', $entityTypeDefinitions );
                $this->assertSame( [ 'foo', 'bar' ], 
$entityTypeDefinitions['item'] );

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I154f9a65fdf8455266a2af253d24ff8959a91055
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/WikibaseMediaInfo
Gerrit-Branch: master
Gerrit-Owner: Bene <[email protected]>

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

Reply via email to