Current File : /home/jvzmxxx/wiki1/extensions/Wikibase/repo/tests/phpunit/includes/Api/RemoveClaimsTest.php
<?php

namespace Wikibase\Test\Repo\Api;

use DataValues\StringValue;
use Wikibase\DataModel\Entity\Item;
use Wikibase\DataModel\Entity\Property;
use Wikibase\DataModel\Services\Statement\GuidGenerator;
use Wikibase\DataModel\Snak\PropertyNoValueSnak;
use Wikibase\DataModel\Snak\PropertySomeValueSnak;
use Wikibase\DataModel\Snak\PropertyValueSnak;
use Wikibase\DataModel\Statement\Statement;
use Wikibase\DataModel\Statement\StatementList;
use Wikibase\DataModel\Term\Fingerprint;
use Wikibase\Repo\WikibaseRepo;

/**
 * @covers Wikibase\Repo\Api\RemoveClaims
 *
 * @group API
 * @group Database
 * @group Wikibase
 * @group WikibaseAPI
 * @group WikibaseRepo
 * @group RemoveClaimsTest
 *
 * @group medium
 *
 * @license GPL-2.0+
 * @author Jeroen De Dauw < jeroendedauw@gmail.com >
 * @author Katie Filbert < aude.wiki@gmail.com >
 */
class RemoveClaimsTest extends WikibaseApiTestCase {

	private static $propertyId;

	/**
	 * @param Item $item
	 *
	 * @return Item
	 */
	private function addStatementsAndSave( Item $item ) {
		$store = WikibaseRepo::getDefaultInstance()->getEntityStore();
		$store->saveEntity( $item, '', $GLOBALS['wgUser'], EDIT_NEW );

		if ( !isset( self::$propertyId ) ) {
			self::$propertyId = $this->getNewProperty( 'string' )->getId();
		}

		/** @var Statement[] $statements */
		$statements = array(
			new Statement( new PropertyNoValueSnak( self::$propertyId ) ),
			new Statement( new PropertyNoValueSnak( self::$propertyId ) ),
			new Statement( new PropertySomeValueSnak( self::$propertyId ) ),
			new Statement( new PropertyValueSnak( self::$propertyId, new StringValue( 'o_O' ) ) ),
		);

		foreach ( $statements as $statement ) {
			$guidGenerator = new GuidGenerator();
			$statement->setGuid( $guidGenerator->newGuid( $item->getId() ) );
			$item->getStatements()->addStatement( $statement );
		}

		$store->saveEntity( $item, '', $GLOBALS['wgUser'], EDIT_UPDATE );

		return $item;
	}

	/**
	 * @return Item[]
	 */
	public function itemProvider() {
		$fingerprint = new Fingerprint();
		$fingerprint->setLabel( 'en', 'kittens' );

		$nonEmptyItem = new Item();
		$nonEmptyItem->setFingerprint( $fingerprint );

		return array(
			$this->addStatementsAndSave( new Item() ),
			$this->addStatementsAndSave( $nonEmptyItem ),
		);
	}

	public function testValidRequests() {
		foreach ( $this->itemProvider() as $item ) {
			$this->doTestValidRequestSingle( $item );
		}

		foreach ( $this->itemProvider() as $item ) {
			$this->doTestValidRequestMultiple( $item );
		}
	}

	/**
	 * @param Item $item
	 */
	public function doTestValidRequestSingle( Item $item ) {
		$statements = $item->getStatements()->toArray();
		$obtainedStatements = null;

		while ( true ) {
			$statement = array_shift( $statements );
			if ( !$statement ) {
				break;
			}

			$this->makeTheRequest( array( $statement->getGuid() ) );

			/** @var Item $obtainedItem */
			$obtainedItem = WikibaseRepo::getDefaultInstance()->getEntityLookup()->getEntity( $item->getId() );
			$obtainedStatements = $obtainedItem->getStatements();

			$this->assertNull( $obtainedStatements->getFirstStatementWithGuid( $statement->getGuid() ) );

			$currentStatements = new StatementList( $statements );

			$this->assertTrue( $obtainedStatements->equals( $currentStatements ) );
		}

		$this->assertTrue( $obtainedStatements === null || $obtainedStatements->isEmpty() );
	}

	/**
	 * @param Item $item
	 */
	public function doTestValidRequestMultiple( Item $item ) {
		$guids = array();

		/** @var Statement $statement */
		foreach ( $item->getStatements() as $statement ) {
			$guids[] = $statement->getGuid();
		}

		$this->makeTheRequest( $guids );

		/** @var Item $obtainedItem */
		$obtainedItem = WikibaseRepo::getDefaultInstance()->getEntityLookup()->getEntity( $item->getId() );

		$this->assertTrue( $obtainedItem->getStatements()->isEmpty() );
	}

	private function makeTheRequest( array $claimGuids ) {
		$params = array(
			'action' => 'wbremoveclaims',
			'claim' => implode( '|', $claimGuids ),
		);

		list( $resultArray, ) = $this->doApiRequestWithToken( $params );

		$this->assertResultSuccess( $resultArray );
		$this->assertInternalType( 'array', $resultArray, 'top level element is an array' );
		$this->assertArrayHasKey( 'claims', $resultArray, 'top level element has a claims key' );

		$claims = $resultArray['claims'];

		$this->assertInternalType( 'array', $claims, 'top claims element is an array' );

		$this->assertArrayEquals( $claimGuids, $claims );
	}

	/**
	 * @expectedException \UsageException
	 *
	 * @dataProvider invalidClaimProvider
	 */
	public function testRemoveInvalidClaims( $claimGuids ) {
		$params = array(
			'action' => 'wbremoveclaims',
			'claim' => is_array( $claimGuids ) ? implode( '|', $claimGuids ) : $claimGuids,
		);

		$this->doApiRequestWithToken( $params );
	}

	public function invalidClaimProvider() {
		return array(
			array( 'xyz' ), //wrong guid
			array( 'x$y$z' ), //wrong guid
		);
	}

	/**
	 * @param string $type
	 *
	 * @return Property
	 */
	private function getNewProperty( $type ) {
		$property = Property::newFromType( $type );

		$store = WikibaseRepo::getDefaultInstance()->getEntityStore();
		$store->saveEntity( $property, '', $GLOBALS['wgUser'], EDIT_NEW );

		return $property;
	}

}