*/
protected function getNearMatchInternal( $searchterm ) {
$lang = $this->language;
-
$allSearchTerms = [ $searchterm ];
if ( $lang->hasVariants() ) {
return $titleResult;
}
+ // Most of our handling here deals with finding a valid title for the search term,
+ // but almost anything starting with '#' is "valid" and points to Main_Page#searchterm.
+ // Rather than doing something completely wrong, do nothing.
+ if ( $searchterm === '' || $searchterm[0] === '#' ) {
+ return null;
+ }
+
foreach ( $allSearchTerms as $term ) {
# Exact match? No need to look further.
$title = Title::newFromText( $term );
--- /dev/null
+<?php
+
+/**
+ * @covers SearchNearMatcher
+ */
+class SearchNearMatcherTest extends \PHPUnit\Framework\TestCase {
+ public function nearMatchProvider() {
+ return [
+ 'empty request returns nothing' => [ null, 'en', '' ],
+ 'default behaviour' => [ 'Near Match Test', 'en', 'near match test' ],
+ 'with a hash returns nothing' => [ null, 'en', '#near match test' ],
+ ];
+ }
+
+ /**
+ * @dataProvider nearMatchProvider
+ */
+ public function testNearMatch( $expected, $langCode, $searchterm ) {
+ $linkCache = MediaWiki\MediaWikiServices::getInstance()->getLinkCache();
+ $linkCache->addGoodLinkObj( 42, Title::newFromText( 'Near Match Test' ) );
+ $config = new HashConfig( [
+ 'EnableSearchContributorsByIP' => false,
+ ] );
+ $lang = Language::factory( $langCode );
+ $matcher = new SearchNearMatcher( $config, $lang );
+
+ $title = $matcher->getNearMatch( $searchterm );
+ $this->assertEquals( $expected, $title === null ? null : (string)$title );
+ }
+}