Current File : /home/jvzmxxx/wiki/extensions/Wikibase/lib/tests/phpunit/PropertyInfoSnakUrlExpanderTest.php
<?php

namespace Wikibase\Lib\Test;

use DataValues\StringValue;
use Wikibase\DataModel\Entity\EntityIdValue;
use Wikibase\DataModel\Entity\PropertyId;
use Wikibase\DataModel\Snak\PropertyValueSnak;
use Wikibase\Lib\FieldPropertyInfoProvider;
use Wikibase\Lib\PropertyInfoProvider;
use Wikibase\Lib\PropertyInfoSnakUrlExpander;
use Wikibase\PropertyInfoStore;
use Wikibase\Lib\Tests\Store\MockPropertyInfoStore;
use Wikimedia\Assert\ParameterTypeException;

/**
 * @covers Wikibase\Lib\PropertyInfoSnakUrlExpander
 *
 * @group Wikibase
 * @group WikibaseLib
 *
 * @license GPL-2.0+
 * @author Daniel Kinzler
 */
class PropertyInfoSnakUrlExpanderTest extends \PHPUnit_Framework_TestCase {

	public function provideExpandUrl() {
		$p66 = new PropertyId( 'P66' );
		$p2 = new PropertyId( 'P2' );
		$p3 = new PropertyId( 'P3' );
		$p4 = new PropertyId( 'P4' );
		$p5 = new PropertyId( 'P5' );
		$p523 = new PropertyId( 'P523' );

		$infoStore = new MockPropertyInfoStore();

		$infoStore->setPropertyInfo( $p2, array(
			// MockPropertyInfoStore requires the KEY_DATA_TYPE field.
			PropertyInfoStore::KEY_DATA_TYPE => 'string'
		) );

		$infoStore->setPropertyInfo( $p3, array(
			PropertyInfoStore::KEY_DATA_TYPE => 'string',
			PropertyInfoStore::KEY_FORMATTER_URL => 'http://acme.info/foo/$1',
		) );

		$infoStore->setPropertyInfo( $p4, array(
			PropertyInfoStore::KEY_DATA_TYPE => 'string',
			PropertyInfoStore::KEY_FORMATTER_URL => 'http://acme.info/foo?m=test&q=$1',
		) );

		$infoStore->setPropertyInfo( $p5, array(
			PropertyInfoStore::KEY_DATA_TYPE => 'string',
			PropertyInfoStore::KEY_FORMATTER_URL => 'http://acme.info/foo#$1',
		) );

		$infoStore->setPropertyInfo( $p523, array(
			PropertyInfoStore::KEY_DATA_TYPE => 'string',
			PropertyInfoStore::KEY_FORMATTER_URL => '$1',
		) );

		$infoProvider = new FieldPropertyInfoProvider( $infoStore, PropertyInfoStore::KEY_FORMATTER_URL );

		$value = new StringValue( 'X&Y' );
		$url = new StringValue( 'http://acme.info/&?&foo/' );

		return array(
			'unknown property' => array(
				$infoProvider,
				new PropertyValueSnak( $p66, $value ),
				null
			),
			'no url pattern' => array(
				$infoProvider,
				new PropertyValueSnak( $p2, $value ),
				null
			),
			'url pattern defined' => array(
				$infoProvider,
				new PropertyValueSnak( $p3, $value ),
				'http://acme.info/foo/X%26Y'
			),
			'value with slash' => array(
				$infoProvider,
				new PropertyValueSnak( $p3, new StringValue( 'X/Y' ) ),
				'http://acme.info/foo/X/Y'
			),
			'pattern with url parameter' => array(
				$infoProvider,
				new PropertyValueSnak( $p4, $value ),
				'http://acme.info/foo?m=test&q=X%26Y'
			),
			'pattern with fragment' => array(
				$infoProvider,
				new PropertyValueSnak( $p5, $value ),
				'http://acme.info/foo#X%26Y'
			),
			'minimal url pattern' => array(
				$infoProvider,
				new PropertyValueSnak( $p523, $url ),
				'http://acme.info/%26%3F%26foo/'
			),
		);
	}

	/**
	 * @dataProvider provideExpandUrl
	 */
	public function testExpandUrl(
		PropertyInfoProvider $infoProvider,
		PropertyValueSnak $snak,
		$expected
	) {
		$lookup = new PropertyInfoSnakUrlExpander( $infoProvider );

		$url = $lookup->expandUrl( $snak );
		$this->assertEquals( $expected, $url );
	}

	public function provideExpandUrl_ParameterTypeException() {
		return array(
			'bad value type' => array(
				new PropertyValueSnak(
					new PropertyId( 'P7' ),
					new EntityIdValue( new PropertyId( 'P18' ) )
				)
			),
		);
	}

	/**
	 * @dataProvider provideExpandUrl_ParameterTypeException
	 */
	public function testExpandUrl_ParameterTypeException( $snak ) {
		$infoProvider = new FieldPropertyInfoProvider(
			new MockPropertyInfoStore(),
			PropertyInfoStore::KEY_FORMATTER_URL
		);
		$urlExpander = new PropertyInfoSnakUrlExpander( $infoProvider );

		$this->setExpectedException( ParameterTypeException::class );
		$urlExpander->expandUrl( $snak );
	}

}