5 * @covers ApiQuerySearch
7 class ApiQuerySearchTest
extends ApiTestCase
{
8 public function provideSearchResults() {
10 'empty search result' => [ [], [] ],
11 'has search results' => [
13 [ $this->mockResultClosure( 'Zomg' ) ],
15 'filters broken search results' => [
18 $this->mockResultClosure( 'a' ),
19 $this->mockResultClosure( 'Zomg', [ 'setBrokenTitle' => true ] ),
20 $this->mockResultClosure( 'b' ),
23 'filters results with missing revision' => [
26 $this->mockResultClosure( 'Zomg', [ 'setMissingRevision' => true ] ),
27 $this->mockResultClosure( 'b' ),
28 $this->mockResultClosure( 'a' ),
35 * @dataProvider provideSearchResults
37 public function testSearchResults( $expect, $hits, array $params = [] ) {
38 MockSearchEngine
::addMockResults( 'my query', $hits );
39 list( $response, $request ) = $this->doApiRequest( $params +
[
42 'srsearch' => 'my query',
45 foreach ( $response['query']['search'] as $result ) {
46 $titles[] = $result['title'];
48 $this->assertEquals( $expect, $titles );
51 public function provideInterwikiResults() {
53 'empty' => [ [], [] ],
54 'one wiki response' => [
55 [ 'utwiki' => [ 'Qwerty' ] ],
57 ISearchResultSet
::SECONDARY_RESULTS
=> [
58 'utwiki' => new MockSearchResultSet( [
59 $this->mockResultClosure(
61 [ 'setInterwikiPrefix' => 'utwiki' ]
71 * @dataProvider provideInterwikiResults
73 public function testInterwikiResults( $expect, $hits, array $params = [] ) {
74 MockSearchEngine
::setMockInterwikiResults( $hits );
75 list( $response, $request ) = $this->doApiRequest( $params +
[
78 'srsearch' => 'my query',
79 'srinterwiki' => true,
82 $this->assertArrayNotHasKey( 'interwikisearch', $response['query'] );
86 $this->assertArrayHasKey( 'interwikisearchinfo', $response['query'] );
87 foreach ( $response['query']['interwikisearch'] as $wiki => $wikiResults ) {
89 foreach ( $wikiResults as $wikiResult ) {
90 $results[$wiki][] = $wikiResult['title'];
93 $this->assertEquals( $expect, $results );
96 public function setUp() {
98 MockSearchEngine
::clearMockResults();
99 $this->registerMockSearchEngine();
102 private function registerMockSearchEngine() {
103 $this->setMwGlobals( [
104 'wgSearchType' => MockSearchEngine
::class,
109 * Returns a closure that evaluates to a MockSearchResult, to be resolved by
110 * MockSearchEngine::addMockResults() or MockresultSet::extractResults().
112 * This is needed because MockSearchResults cannot be instantiated in a data provider,
113 * since they load revisions. This would hit the "real" database instead of the mock
114 * database, which in turn may cause cache pollution and other inconsistencies, see T202641.
116 * @param string $title
117 * @param array $setters
118 * @return callable function(): MockSearchResult
120 private function mockResultClosure( $title, $setters = [] ) {
121 return function () use ( $title, $setters ){
122 $result = MockSearchResult
::newFromTitle( Title
::newFromText( $title ) );
124 foreach ( $setters as $method => $param ) {
125 $result->$method( $param );