| Current File : /home/jvzmxxx/wiki/extensions/Wikibase/lib/tests/phpunit/Changes/EntityChangeFactoryTest.php |
<?php
namespace Wikibase\Lib\Test\Change;
use Diff\DiffOp\Diff\Diff;
use Diff\DiffOp\DiffOpAdd;
use Diff\DiffOp\DiffOpRemove;
use Wikibase\DataModel\Entity\EntityId;
use Wikibase\DataModel\Entity\Item;
use Wikibase\DataModel\Entity\ItemId;
use Wikibase\DataModel\Entity\Property;
use Wikibase\DataModel\Entity\PropertyId;
use Wikibase\DataModel\Services\Diff\EntityDiffer;
use Wikibase\DataModel\Snak\PropertyNoValueSnak;
use Wikibase\DataModel\Statement\Statement;
use Wikibase\DataModel\Statement\StatementList;
use Wikibase\EntityChange;
use Wikibase\ItemChange;
use Wikibase\Lib\Changes\EntityChangeFactory;
/**
* @covers Wikibase\Lib\Changes\EntityChangeFactory
*
* @since 0.5
*
* @group Database
* @group Wikibase
* @group WikibaseLib
* @group WikibaseChange
*
* @license GPL-2.0+
* @author Daniel Kinzler
* @author Katie Filbert < aude.wiki@gmail.com >
*/
class EntityChangeFactoryTest extends \PHPUnit_Framework_TestCase {
/**
* @return EntityChangeFactory
*/
public function getEntityChangeFactory() {
$changeClasses = array(
Item::ENTITY_TYPE => ItemChange::class,
);
$factory = new EntityChangeFactory(
new EntityDiffer(),
$changeClasses
);
return $factory;
}
public function newForEntityProvider() {
return array(
'add item' => array( EntityChange::ADD, new ItemId( 'Q17' ), ItemChange::class ),
'remove property' => array( EntityChange::REMOVE, new PropertyId( 'P17' ), EntityChange::class ),
);
}
/**
* @dataProvider newForEntityProvider
*
* @param string $action
* @param EntityId $entityId
* @param string $expectedClass
*/
public function testNewForEntity( $action, $entityId, $expectedClass ) {
$factory = $this->getEntityChangeFactory();
$change = $factory->newForEntity( $action, $entityId );
$this->assertInstanceOf( $expectedClass, $change );
$this->assertEquals( $action, $change->getAction() );
$this->assertEquals( $entityId, $change->getEntityId() );
}
public function testNewFromUpdate() {
$itemId = new ItemId( 'Q1' );
$item = new Item( $itemId );
$item->setLabel( 'en', 'kitten' );
$updatedItem = new Item( $itemId );
$updatedItem->setLabel( 'en', 'kitten' );
$updatedItem->setLabel( 'es', 'gato' );
$factory = $this->getEntityChangeFactory();
$change = $factory->newFromUpdate( EntityChange::UPDATE, $item, $updatedItem );
$this->assertEquals( $itemId, $change->getEntityId(), 'entity id' );
$this->assertEquals( 'q1', $change->getObjectId(), 'object id' );
$this->assertEquals( 'wikibase-item~update', $change->getType(), 'type' );
$this->assertEquals(
new Diff( array( 'es' => new DiffOpAdd( 'gato' ) ) ),
$change->getDiff()->getLabelsDiff(),
'diff'
);
}
public function testNewFromUpdate_add() {
$itemId = new ItemId( 'Q1' );
$item = new Item( $itemId );
$item->setLabel( 'en', 'kitten' );
$factory = $this->getEntityChangeFactory();
$change = $factory->newFromUpdate( EntityChange::ADD, null, $item );
$this->assertEquals( $itemId, $change->getEntityId(), 'entity id' );
$this->assertEquals( 'q1', $change->getObjectId(), 'object id' );
$this->assertEquals( 'wikibase-item~add', $change->getType(), 'type' );
$this->assertEquals(
new Diff( array( 'en' => new DiffOpAdd( 'kitten' ) ) ),
$change->getDiff()->getLabelsDiff(),
'diff'
);
}
public function testNewFromUpdate_remove() {
$propertyId = new PropertyId( 'P2' );
$property = new Property( $propertyId, null, 'string' );
$property->setLabel( 'de', 'Katze' );
$factory = $this->getEntityChangeFactory();
$change = $factory->newFromUpdate( EntityChange::REMOVE, $property, null );
$this->assertEquals( $propertyId, $change->getEntityId(), 'entity id' );
$this->assertEquals( 'p2', $change->getObjectId(), 'object id' );
$this->assertEquals( 'wikibase-property~remove', $change->getType(), 'type' );
$this->assertEquals(
new Diff( array( 'de' => new DiffOpRemove( 'Katze' ) ) ),
$change->getDiff()->getLabelsDiff(),
'diff'
);
}
public function testNewFromUpdate_restore() {
$itemId = new ItemId( 'Q4' );
$item = new Item( $itemId );
$item->getSiteLinkList()->addNewSiteLink( 'enwiki', 'Kitten' );
$factory = $this->getEntityChangeFactory();
$change = $factory->newFromUpdate( EntityChange::RESTORE, null, $item );
$this->assertEquals( $itemId, $change->getEntityId(), 'entity id' );
$this->assertEquals( 'q4', $change->getObjectId(), 'object id' );
$this->assertEquals( 'wikibase-item~restore', $change->getType(), 'type' );
$this->assertEquals(
new Diff( array(
'enwiki' => new Diff( array(
'name' => new DiffOpAdd( 'Kitten' )
) )
) ),
$change->getDiff()->getSiteLinkDiff(),
'diff'
);
}
public function testNewFromUpdate_excludeStatementsInDiffs() {
$factory = $this->getEntityChangeFactory();
$item = new Item( new ItemId( 'Q3' ) );
$statementList = new StatementList( array(
new Statement( new PropertyNoValueSnak( 9000 ) )
) );
$item->setStatements( $statementList );
$updatedItem = new Item( new ItemId( 'Q3' ) );
$statementList = new StatementList( array(
new Statement( new PropertyNoValueSnak( 10 ) )
) );
$updatedItem->setStatements( $statementList );
$change = $factory->newFromUpdate( EntityChange::UPDATE, $item, $updatedItem );
$this->assertTrue(
$change->getDiff()->isEmpty(),
'Diff excludes statement changes and is empty'
);
}
}