| Current File : /home/jvzmxxx/wiki1/extensions/Wikibase/repo/tests/phpunit/includes/Api/SearchEntitiesTest.php |
<?php
namespace Wikibase\Test\Repo\Api;
use ApiMain;
use FauxRequest;
use PHPUnit_Framework_TestCase;
use RequestContext;
use Title;
use Wikibase\DataModel\Entity\ItemId;
use Wikibase\DataModel\Term\Term;
use Wikibase\Lib\ContentLanguages;
use Wikibase\Lib\StaticContentLanguages;
use Wikibase\Lib\Store\EntityTitleLookup;
use Wikibase\Repo\Api\EntitySearchHelper;
use Wikibase\Repo\Api\SearchEntities;
use Wikibase\Lib\Interactors\TermSearchResult;
/**
* @covers Wikibase\Repo\Api\SearchEntities
*
* @group API
* @group Wikibase
* @group WikibaseAPI
* @group WikibaseRepo
*
* @group medium
*
* @license GPL-2.0+
* @author Addshore
* @author Daniel Kinzler
*/
class SearchEntitiesTest extends PHPUnit_Framework_TestCase {
/**
* @param array $params
*
* @return ApiMain
*/
private function getApiMain( array $params ) {
$context = new RequestContext();
$context->setLanguage( 'en-ca' );
$context->setRequest( new FauxRequest( $params, true ) );
$main = new ApiMain( $context );
return $main;
}
/**
* @return EntityTitleLookup
*/
private function getMockTitleLookup() {
$titleLookup = $this->getMock( EntityTitleLookup::class );
$titleLookup->expects( $this->any() )->method( 'getTitleForId' )
->will( $this->returnValue( $this->getMockTitle() ) );
return $titleLookup;
}
/**
* @return Title
*/
public function getMockTitle() {
$mock = $this->getMockBuilder( Title::class )
->disableOriginalConstructor()
->getMock();
$mock->expects( $this->any() )
->method( 'getFullUrl' )
->will( $this->returnValue( 'http://fullTitleUrl' ) );
$mock->expects( $this->any() )
->method( 'getPrefixedText' )
->will( $this->returnValue( 'Prefixed:Title' ) );
$mock->expects( $this->any() )
->method( 'getArticleID' )
->will( $this->returnValue( 42 ) );
return $mock;
}
/**
* @return ContentLanguages
*/
private function getContentLanguages() {
return new StaticContentLanguages(
array( 'de', 'de-ch', 'en', 'ii', 'nn', 'ru', 'zh-cn' )
);
}
/**
* @param array $params
* @param TermSearchResult[] $returnResults
*
* @return EntitySearchHelper
*/
private function getMockEntitySearchHelper( array $params, array $returnResults = array() ) {
// defaults from SearchEntities
$params = array_merge( array(
'strictlanguage' => false,
'type' => 'item',
'limit' => 7,
'continue' => 0
), $params );
$mock = $this->getMockBuilder( EntitySearchHelper::class )
->disableOriginalConstructor()
->getMock();
$mock->expects( $this->atLeastOnce() )
->method( 'getRankedSearchResults' )
->with(
$this->equalTo( $params['search'] ),
$this->equalTo( $params['language'] ),
$this->equalTo( $params['type'] ),
$this->equalTo( $params['continue'] + $params['limit'] + 1 ),
$this->equalTo( $params['strictlanguage'] )
)
->will( $this->returnValue( $returnResults ) );
return $mock;
}
/**
* @param array $params
* @param EntitySearchHelper|null $entitySearchHelper
*
* @return array[]
*/
private function callApiModule( array $params, EntitySearchHelper $entitySearchHelper = null ) {
$module = new SearchEntities(
$this->getApiMain( $params ),
'wbsearchentities'
);
if ( $entitySearchHelper == null ) {
$entitySearchHelper = $this->getMockEntitySearchHelper( $params );
}
$module->setServices(
$entitySearchHelper,
$this->getMockTitleLookup(),
$this->getContentLanguages(),
array( 'item', 'property' ),
'concept:'
);
$module->execute();
$result = $module->getResult();
return $result->getResultData( null, array(
'BC' => array(),
'Types' => array(),
'Strip' => 'all',
) );
}
public function testSearchStrictLanguage_passedToSearchInteractor() {
$params = array(
'action' => 'wbsearchentities',
'search' => 'Foo',
'type' => 'item',
'language' => 'de-ch',
'strictlanguage' => true
);
$this->callApiModule( $params );
}
public function provideTestSearchEntities() {
$q111Match = new TermSearchResult(
new Term( 'qid', 'Q111' ),
'entityId',
new ItemId( 'Q111' ),
new Term( 'pt', 'ptLabel' ),
new Term( 'pt', 'ptDescription' )
);
$q222Match = new TermSearchResult(
new Term( 'en-gb', 'Fooooo' ),
'label',
new ItemId( 'Q222' ),
new Term( 'en-gb', 'FooHeHe' ),
new Term( 'en', 'FooHeHe en description' )
);
$q333Match = new TermSearchResult(
new Term( 'de', 'AMatchedTerm' ),
'alias',
new ItemId( 'Q333' ),
new Term( 'fr', 'ADisplayLabel' )
);
$q111Result = array(
'id' => 'Q111',
'concepturi' => 'concept:Q111',
'url' => 'http://fullTitleUrl',
'title' => 'Prefixed:Title',
'pageid' => 42,
'label' => 'ptLabel',
'description' => 'ptDescription',
'aliases' => array( 'Q111' ),
'match' => array(
'type' => 'entityId',
'text' => 'Q111',
),
);
$q222Result = array(
'id' => 'Q222',
'concepturi' => 'concept:Q222',
'url' => 'http://fullTitleUrl',
'title' => 'Prefixed:Title',
'pageid' => 42,
'label' => 'FooHeHe',
'description' => 'FooHeHe en description',
'aliases' => array( 'Fooooo' ),
'match' => array(
'type' => 'label',
'language' => 'en-gb',
'text' => 'Fooooo',
),
);
$q333Result = array(
'id' => 'Q333',
'concepturi' => 'concept:Q333',
'url' => 'http://fullTitleUrl',
'title' => 'Prefixed:Title',
'pageid' => 42,
'label' => 'ADisplayLabel',
'aliases' => array( 'AMatchedTerm' ),
'match' => array(
'type' => 'alias',
'language' => 'de',
'text' => 'AMatchedTerm',
),
);
return array(
'No exact match' => array(
array( 'search' => 'Q999' ),
array(),
array(),
),
'Exact EntityId match' => array(
array( 'search' => 'Q111' ),
array( $q111Match ),
array( $q111Result ),
),
'Multiple Results' => array(
array(),
array( $q222Match, $q333Match ),
array( $q222Result, $q333Result ),
),
'Multiple Results (limited)' => array(
array( 'limit' => 1 ),
array( $q222Match, $q333Match ),
array( $q222Result ),
),
'Multiple Results (limited-continue)' => array(
array( 'limit' => 1, 'continue' => 1 ),
array( $q222Match, $q333Match ),
array( $q333Result ),
),
);
}
/**
* @dataProvider provideTestSearchEntities
*/
public function testSearchEntities( array $overrideParams, array $interactorReturn, array $expected ) {
$params = array_merge( array(
'action' => 'wbsearchentities',
'search' => 'Foo',
'type' => 'item',
'language' => 'en'
), $overrideParams );
$entitySearchHelper = $this->getMockEntitySearchHelper( $params, $interactorReturn );
$result = $this->callApiModule( $params, $entitySearchHelper );
$this->assertResultLooksGood( $result );
$this->assertEquals( $expected, $result['search'] );
}
private function assertResultLooksGood( $result ) {
$this->assertArrayHasKey( 'searchinfo', $result );
$this->assertArrayHasKey( 'search', $result['searchinfo'] );
$this->assertArrayHasKey( 'search', $result );
foreach ( $result['search'] as $key => $searchresult ) {
$this->assertInternalType( 'integer', $key );
$this->assertArrayHasKey( 'id', $searchresult );
$this->assertArrayHasKey( 'concepturi', $searchresult );
$this->assertArrayHasKey( 'url', $searchresult );
$this->assertArrayHasKey( 'title', $searchresult );
$this->assertArrayHasKey( 'pageid', $searchresult );
}
}
}