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

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 composer.json
M extension.json
A src/Content/MediaInfoContent.php
A src/Content/MediaInfoHandler.php
M src/WikibaseMediaInfoHooks.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
11 files changed, 698 insertions(+), 165 deletions(-)

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



diff --git a/WikibaseMediaInfo.entitytypes.php 
b/WikibaseMediaInfo.entitytypes.php
new file mode 100644
index 0000000..86a05c5
--- /dev/null
+++ b/WikibaseMediaInfo.entitytypes.php
@@ -0,0 +1,52 @@
+<?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()
+                       );
+               }
+       ]
+];
diff --git a/composer.json b/composer.json
index 6f0df76..6bfb06d 100644
--- a/composer.json
+++ b/composer.json
@@ -16,7 +16,7 @@
        "require": {
                "php": ">=5.5.0",
                "serialization/serialization": "~3.2",
-               "wikibase/data-model": "~5.0",
+               "wikibase/data-model": "~6.0",
                "wikibase/data-model-serialization": "~2.0"
        },
        "require-dev": {
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..dbf848d
--- /dev/null
+++ b/src/Content/MediaInfoContent.php
@@ -0,0 +1,119 @@
+<?php
+
+namespace Wikibase\MediaInfo\Content;
+
+use Hooks;
+use InvalidArgumentException;
+use Wikibase\Content\EntityHolder;
+use Wikibase\DataModel\Entity\Entity;
+use Wikibase\DataModel\Term\Fingerprint;
+use Wikibase\EntityContent;
+use Wikibase\MediaInfo\DataModel\MediaInfo;
+use Wikibase\Repo\FingerprintSearchTextGenerator;
+
+/**
+ * @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 );
+       }
+
+       /**
+        * @see EntityContent::getEntity
+        *
+        * @return MediaInfo
+        */
+       public function getEntity() {
+               return $this->getMediaInfo();
+       }
+
+       /**
+        * @see EntityContent::getEntityHolder
+        *
+        * @return EntityHolder
+        */
+       protected function getEntityHolder() {
+               return $this->mediaInfoHolder;
+       }
+
+       /**
+        * @see EntityContent::isStub
+        *
+        * @return bool
+        */
+       public function isStub() {
+               return !$this->isRedirect()
+                      && !$this->getMediaInfo()->isEmpty()
+                      && $this->getMediaInfo()->getStatements()->isEmpty();
+       }
+
+       /**
+        * @see EntityContent::isCountable
+        *
+        * @param bool|null $hasLinks
+        *
+        * @return bool
+        */
+       public function isCountable( $hasLinks = null ) {
+               return !$this->isRedirect() && 
!$this->getMediaInfo()->isEmpty();
+       }
+
+       /**
+        * @see EntityContent::getTextForSearchIndex
+        *
+        * @return string
+        */
+       public function getTextForSearchIndex() {
+               if ( $this->isRedirect() ) {
+                       return '';
+               }
+
+               $mediaInfo = $this->getMediaInfo();
+               $fingerprint = new Fingerprint( $mediaInfo->getLabels(), 
$mediaInfo->getDescriptions() );
+
+               $searchTextGenerator = new FingerprintSearchTextGenerator();
+               $text = $searchTextGenerator->generate( $fingerprint );
+
+               if ( !Hooks::run( 'WikibaseTextForSearchIndex', [ $this, &$text 
] ) ) {
+                       return '';
+               }
+
+               return $text;
+       }
+
+}
diff --git a/src/Content/MediaInfoHandler.php b/src/Content/MediaInfoHandler.php
new file mode 100644
index 0000000..9137be6
--- /dev/null
+++ b/src/Content/MediaInfoHandler.php
@@ -0,0 +1,97 @@
+<?php
+
+namespace Wikibase\MediaInfo\Content;
+
+use Wikibase\DataModel\Entity\Entity;
+use Wikibase\DataModel\Entity\EntityId;
+use Wikibase\DataModel\Entity\EntityIdParser;
+use Wikibase\EditEntityAction;
+use Wikibase\HistoryEntityAction;
+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\SubmitEntityAction;
+use Wikibase\TermIndex;
+use Wikibase\ViewEntityAction;
+
+/**
+ * @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[]
+        */
+       public function getActionOverrides() {
+               return [
+                       'history' => HistoryEntityAction::class,
+                       'view' => ViewEntityAction::class,
+                       'edit' => EditEntityAction::class,
+                       'submit' => SubmitEntityAction::class,
+               ];
+       }
+
+       /**
+        * @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/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/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..3a0189b
--- /dev/null
+++ b/tests/phpunit/mediawiki/Content/MediaInfoContentTest.php
@@ -0,0 +1,208 @@
+<?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 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() );
+       }
+
+       public function provideTextForSearchIndex() {
+               $searchIndex = [
+                       [ new MediaInfo(), '' ]
+               ];
+
+               $mediaInfo = new MediaInfo();
+               $mediaInfo->getLabels()->setTextForLanguage( 'en', 'Foo' );
+               $mediaInfo->getLabels()->setTextForLanguage( 'de', 'Bar' );
+               $searchIndex[] = [ $mediaInfo, "Foo\nBar" ];
+
+               $mediaInfo = new MediaInfo();
+               $mediaInfo->getDescriptions()->setTextForLanguage( 'en', 'Foo' 
);
+               $mediaInfo->getDescriptions()->setTextForLanguage( 'de', 'Bar' 
);
+               $searchIndex[] = [ $mediaInfo, "Foo\nBar" ];
+
+               $mediaInfo = new MediaInfo();
+               $mediaInfo->getLabels()->setTextForLanguage( 'en', 'Foo' );
+               $mediaInfo->getLabels()->setTextForLanguage( 'de', 'Bar' );
+               $mediaInfo->getDescriptions()->setTextForLanguage( 'en', 'Foo 
desc' );
+               $mediaInfo->getDescriptions()->setTextForLanguage( 'de', 'Bar 
desc' );
+               $searchIndex[] = [ $mediaInfo, "Foo\nBar\nFoo desc\nBar desc" ];
+
+               return $searchIndex;
+       }
+
+       /**
+        * @dataProvider provideTextForSearchIndex
+        */
+       public function testGetTextForSearchIndex( MediaInfo $mediaInfo, 
$expected ) {
+               $mediaInfoContent = new MediaInfoContent( new 
EntityInstanceHolder( $mediaInfo ) );
+
+               $this->assertSame( $expected, 
$mediaInfoContent->getTextForSearchIndex() );
+       }
+
+}
diff --git a/tests/phpunit/mediawiki/Content/MediaInfoHandlerTest.php 
b/tests/phpunit/mediawiki/Content/MediaInfoHandlerTest.php
new file mode 100644
index 0000000..e56fcc5
--- /dev/null
+++ b/tests/phpunit/mediawiki/Content/MediaInfoHandlerTest.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace Wikibase\MediaInfo\Tests\MediaWiki\Content;
+
+use HistoryAction;
+use PHPUnit_Framework_TestCase;
+use ViewAction;
+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 testGetActionOverrides() {
+               $mediaInfoHandler = $this->newMediaInfoHandler();
+
+               $actionOverrides = $mediaInfoHandler->getActionOverrides();
+
+               $this->assertSame(
+                       [ 'history', 'view', 'edit', 'submit' ],
+                       array_keys( $actionOverrides )
+               );
+
+               $this->assertTrue( is_subclass_of( $actionOverrides['history'], 
HistoryAction::class ) );
+               $this->assertTrue( is_subclass_of( $actionOverrides['view'], 
ViewAction::class ) );
+               $this->assertTrue( is_subclass_of( $actionOverrides['edit'], 
ViewAction::class ) );
+               $this->assertTrue( is_subclass_of( $actionOverrides['submit'], 
ViewAction::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: merged
Gerrit-Change-Id: I154f9a65fdf8455266a2af253d24ff8959a91055
Gerrit-PatchSet: 6
Gerrit-Project: mediawiki/extensions/WikibaseMediaInfo
Gerrit-Branch: master
Gerrit-Owner: Bene <[email protected]>
Gerrit-Reviewer: Bene <[email protected]>
Gerrit-Reviewer: Daniel Kinzler <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

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

Reply via email to