testEnvironment = new TestEnvironment(); $this->store = $this->getMockBuilder( '\SMW\Store' ) ->disableOriginalConstructor() ->getMockForAbstractClass(); $this->fallbackSearchEngine = $this->getMockBuilder( 'SearchEngine' ) ->disableOriginalConstructor() ->setMethods( [ 'replacePrefixes', 'searchTitle', 'searchText' ] ) ->getMock(); } protected function tearDown(): void { $this->testEnvironment->tearDown(); parent::tearDown(); } public function testCanConstruct() { $this->assertInstanceOf( ExtendedSearch::class, new ExtendedSearch( $this->store, $this->fallbackSearchEngine ) ); } public function testFallbackSearchEngineAccessToPublicProperties() { $reflect = new \ReflectionObject( $this->fallbackSearchEngine ); $properties = [ 'prefix', 'namespaces' ]; foreach ( $reflect->getProperties( \ReflectionProperty::IS_PUBLIC ) as $prop ) { foreach ( $properties as $k => $p ) { if ( $prop->getName() === $p ) { unset( $properties[$k] ); } } } $this->assertEmpty( $properties ); } public function testSetLimitOffset() { $instance = new ExtendedSearch( $this->store, $this->fallbackSearchEngine ); $instance->setLimitOffset( 10, false ); $this->assertEquals( 10, $instance->getLimit() ); $this->assertSame( 0, $instance->getOffset() ); } public function testSearchTitle_withNonsemanticQuery() { $term = 'Some string that can not be interpreted as a semantic query'; $searchResultSet = $this->getMockBuilder( 'SearchResultSet' ) ->disableOriginalConstructor() ->getMock(); $this->fallbackSearchEngine->expects( $this->once() ) ->method( 'replacePrefixes' ) ->willReturnArgument( 0 ); $this->fallbackSearchEngine->expects( $this->once() ) ->method( 'searchTitle' ) ->willReturnMap( [ [ $term, $searchResultSet ] ] ); $this->store->expects( $this->any() ) ->method( 'getPropertySubjects' ) ->willReturn( [] ); $instance = new ExtendedSearch( $this->store, $this->fallbackSearchEngine ); $this->assertEquals( $searchResultSet, $instance->searchTitle( $term ) ); } public function testSearchTitle_withEmptyQuery() { $term = ' '; $searchResultSet = $this->getMockBuilder( 'SearchResultSet' ) ->disableOriginalConstructor() ->getMock(); $this->fallbackSearchEngine->expects( $this->once() ) ->method( 'replacePrefixes' ) ->willReturnArgument( 0 ); $this->fallbackSearchEngine->expects( $this->once() ) ->method( 'searchTitle' ) ->willReturnMap( [ [ $term, $searchResultSet ] ] ); $this->store->expects( $this->any() ) ->method( 'getPropertySubjects' ) ->willReturn( [] ); $instance = new ExtendedSearch( $this->store, $this->fallbackSearchEngine ); $this->assertEquals( $searchResultSet, $instance->searchTitle( $term ) ); } public function testSearchText_withSemanticQuery() { $term = '[[Some string that can be interpreted as a semantic query]]'; $infoLink = $this->getMockBuilder( '\SMWInfolink' ) ->disableOriginalConstructor() ->getMock(); $query = $this->getMockBuilder( '\SMWQuery' ) ->disableOriginalConstructor() ->getMock(); $queryResult = $this->getMockBuilder( '\SMW\Query\QueryResult' ) ->disableOriginalConstructor() ->getMock(); $queryResult->expects( $this->any() ) ->method( 'getQuery' ) ->willReturn( $query ); $queryResult->expects( $this->any() ) ->method( 'getQueryLink' ) ->willReturn( $infoLink ); $this->store->expects( $this->any() ) ->method( 'getPropertySubjects' ) ->willReturn( [] ); $this->store->expects( $this->exactly( 2 ) ) ->method( 'getQueryResult' ) ->willReturnCallback( static function ( SMWQuery $query ) use ( $queryResult ) { return $query->querymode === SMWQuery::MODE_COUNT ? 9001 : $queryResult; } ); $instance = new ExtendedSearch( $this->store, $this->fallbackSearchEngine ); $result = $instance->searchText( $term ); $this->assertInstanceOf( 'SMW\MediaWiki\Search\SearchResultSet', $result ); $this->assertEquals( 9001, $result->getTotalHits() ); } public function testSearchText_withNonsemanticQuery() { $term = 'Some string that can not be interpreted as a semantic query'; $searchResultSet = $this->getMockBuilder( 'SearchResultSet' ) ->disableOriginalConstructor() ->getMock(); $this->fallbackSearchEngine->expects( $this->once() ) ->method( 'replacePrefixes' ) ->willReturnArgument( 0 ); $this->fallbackSearchEngine->expects( $this->once() ) ->method( 'searchText' ) ->willReturnMap( [ [ $term, $searchResultSet ] ] ); $instance = new ExtendedSearch( $this->store, $this->fallbackSearchEngine ); $this->assertEquals( $searchResultSet, $instance->searchText( $term ) ); } public function testSearchTitle_withSemanticQuery() { $term = '[[Some string that can be interpreted as a semantic query]]'; $instance = new ExtendedSearch( $this->store, $this->fallbackSearchEngine ); $this->assertNull( $instance->searchTitle( $term ) ); } public function testCompletionSearch_OnEligiblePrefix() { $infoLink = $this->getMockBuilder( '\SMWInfolink' ) ->disableOriginalConstructor() ->getMock(); $query = $this->getMockBuilder( '\SMWQuery' ) ->disableOriginalConstructor() ->getMock(); $queryBuilder = $this->getMockBuilder( '\SMW\MediaWiki\Search\QueryBuilder' ) ->disableOriginalConstructor() ->getMock(); $queryBuilder->expects( $this->any() ) ->method( 'getQuery' ) ->willReturn( $query ); $queryResult = $this->getMockBuilder( '\SMW\Query\QueryResult' ) ->disableOriginalConstructor() ->getMock(); $queryResult->expects( $this->any() ) ->method( 'getQuery' ) ->willReturn( $query ); $queryResult->expects( $this->any() ) ->method( 'getResults' ) ->willReturn( [] ); $queryResult->expects( $this->any() ) ->method( 'getQueryLink' ) ->willReturn( $infoLink ); $this->store->expects( $this->exactly( 3 ) ) ->method( 'getQueryResult' ) ->willReturnCallback( static function ( SMWQuery $query ) use ( $queryResult ) { return $query->querymode === \SMWQuery::MODE_COUNT ? 9001 : $queryResult; } ); $fallbackSearchEngine = $this->getMockBuilder( 'SearchEngine' ) ->disableOriginalConstructor() ->getMock(); $fallbackSearchEngine->expects( $this->once() ) ->method( 'completionSearch' ) ->with( 'fcat:Foo' ); $instance = new ExtendedSearch( $this->store, $fallbackSearchEngine ); $instance->setExtraPrefixMap( [ 'abc', 'cat' => 'bar' ] ); $instance->setQueryBuilder( $queryBuilder ); $this->assertInstanceof( '\SearchSuggestionSet', $instance->completionSearch( 'in:Foo' ) ); $instance->completionSearch( 'abc:Foo' ); $instance->completionSearch( 'cat:Foo' ); // In-between doesn't count so it uses the fallbacksearch engine $instance->completionSearch( 'fcat:Foo' ); } public function testCompletionSearch_NoRelevantPrefix() { $searchSuggestionSet = $this->getMockBuilder( '\SearchSuggestionSet' ) ->disableOriginalConstructor() ->getMock(); $searchSuggestionSet->expects( $this->any() ) ->method( 'map' ) ->willReturn( [] ); $fallbackSearchEngine = $this->getMockBuilder( 'SearchEngine' ) ->disableOriginalConstructor() ->getMock(); $fallbackSearchEngine->expects( $this->once() ) ->method( 'completionSearch' ) ->willReturn( $searchSuggestionSet ); $instance = new ExtendedSearch( $this->store, $fallbackSearchEngine ); $this->assertInstanceof( '\SearchSuggestionSet', $instance->completionSearch( 'Foo' ) ); } public function testCompletionSearch_NoRelevantPrefix_ReplaceEmptySearchTermWithInfusedTerm() { $fallbackSearchEngine = $this->getMockBuilder( 'SearchEngine' ) ->disableOriginalConstructor() ->getMock(); $fallbackSearchEngine->expects( $this->once() ) ->method( 'completionSearch' ) ->with( 'origTerm' ); $instance = new ExtendedSearch( $this->store, $fallbackSearchEngine ); $instance->setCompletionSearchTerm( 'origTerm' ); $instance->completionSearch( '' ); } }