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
