Current File : /home/jvzmxxx/wiki/extensions/Wikibase/repo/tests/phpunit/includes/ChangeOp/ChangeOpAliasesTest.php
<?php

namespace Wikibase\Test;

use InvalidArgumentException;
use Wikibase\ChangeOp\ChangeOpAliases;
use Wikibase\ChangeOp\ChangeOpException;
use Wikibase\DataModel\Entity\EntityDocument;
use Wikibase\DataModel\Entity\Item;
use Wikibase\ItemContent;

/**
 * @covers Wikibase\ChangeOp\ChangeOpAliases
 *
 * @group Wikibase
 * @group WikibaseRepo
 * @group ChangeOp
 *
 * @license GPL-2.0+
 * @author Tobias Gritschacher < tobias.gritschacher@wikimedia.de >
 * @author Daniel Kinzler
 */
class ChangeOpAliasesTest extends \PHPUnit_Framework_TestCase {

	private function getTermValidatorFactory() {
		$mockProvider = new ChangeOpTestMockProvider( $this );
		return $mockProvider->getMockTermValidatorFactory();
	}

	public function invalidConstructorProvider() {
		$args = array();
		$args[] = array( 42, array( 'myNewAlias' ), 'add' );
		$args[] = array( 'en', array( 'myNewAlias' ), 1234 );

		return $args;
	}

	/**
	 * @dataProvider invalidConstructorProvider
	 * @expectedException InvalidArgumentException
	 *
	 * @param string $language
	 * @param string[] $aliases
	 * @param string $action
	 */
	public function testInvalidConstruct( $language, array $aliases, $action ) {
		// "INVALID" is invalid
		$validatorFactory = $this->getTermValidatorFactory();

		new ChangeOpAliases( $language, $aliases, $action, $validatorFactory );
	}

	public function changeOpAliasesProvider() {
		// "INVALID" is invalid
		$validatorFactory = $this->getTermValidatorFactory();

		$enAliases = array( 'en-alias1', 'en-alias2', 'en-alias3' );
		$existingEnAliases = array( 'en-existingAlias1', 'en-existingAlias2' );
		$itemContent = ItemContent::newEmpty();
		$item = $itemContent->getEntity();
		$item->setAliases( 'en', $existingEnAliases );

		return array(
			'add' => array(
				$item->copy(),
				new ChangeOpAliases( 'en', $enAliases, 'add', $validatorFactory ),
				array_merge( $existingEnAliases, $enAliases )
			),
			'set' => array(
				$item->copy(),
				new ChangeOpAliases( 'en', $enAliases, 'set', $validatorFactory ),
				$enAliases
			),
			'set (default)' => array(
				$item->copy(),
				new ChangeOpAliases( 'en', $enAliases, '', $validatorFactory ),
				$enAliases
			),
			'remove' => array(
				$item->copy(),
				new ChangeOpAliases( 'en', $existingEnAliases, 'remove', $validatorFactory ),
				null
			),
		);
	}

	/**
	 * @dataProvider changeOpAliasesProvider
	 */
	public function testApply(
		Item $item,
		ChangeOpAliases $changeOpAliases,
		array $expectedAliases = null
	) {
		$changeOpAliases->apply( $item );
		$fingerprint = $item->getFingerprint();

		if ( $expectedAliases === null ) {
			$this->assertFalse( $fingerprint->hasAliasGroup( 'en' ) );
		} else {
			$this->assertEquals( $expectedAliases, $fingerprint->getAliasGroup( 'en' )->getAliases() );
		}
	}

	public function validateProvider() {
		// "INVALID" is invalid
		$validatorFactory = $this->getTermValidatorFactory();

		return array(
			'set invalid alias' => array(
				new ChangeOpAliases( 'fr', array( 'INVALID' ), 'set', $validatorFactory )
			),
			'add invalid alias' => array(
				new ChangeOpAliases( 'fr', array( 'INVALID' ), 'add', $validatorFactory )
			),
			'set invalid language' => array(
				new ChangeOpAliases( 'INVALID', array( 'valid' ), 'set', $validatorFactory )
			),
			'add invalid language' => array(
				new ChangeOpAliases( 'INVALID', array( 'valid' ), 'add', $validatorFactory )
			),
			'remove invalid language' => array(
				new ChangeOpAliases( 'INVALID', array( 'valid' ), 'remove', $validatorFactory )
			),
		);
	}

	/**
	 * @dataProvider validateProvider
	 *
	 * @param ChangeOpAliases $changeOpAliases
	 */
	public function testValidate( ChangeOpAliases $changeOpAliases ) {
		$entity = new Item();

		$result = $changeOpAliases->validate( $entity );
		$this->assertFalse( $result->isValid() );
	}

	public function testValidateLeavesEntityUntouched() {
		$entity = new Item();
		$validatorFactory = $this->getTermValidatorFactory();
		$changeOpAliases = new ChangeOpAliases( 'de', array( 'test' ), 'set', $validatorFactory );
		$changeOpAliases->validate( $entity );
		$this->assertTrue( $entity->equals( new Item() ) );
	}

	public function testApplyWithInvalidAction() {
		$entity = new Item();
		$validatorFactory = $this->getTermValidatorFactory();

		$changeOpAliases = new ChangeOpAliases( 'en', array( 'test' ), 'invalidAction', $validatorFactory );

		$this->setExpectedException( ChangeOpException::class );
		$changeOpAliases->apply( $entity );
	}

	public function testApplyNoAliasesProvider() {
		$changeOp = new ChangeOpAliases( 'en', array( 'Foo' ), 'set', $this->getTermValidatorFactory() );
		$entity = $this->getMock( EntityDocument::class );

		$this->setExpectedException( InvalidArgumentException::class );
		$changeOp->apply( $entity );
	}

}