Test search filter by topics

This commit is contained in:
Yuriy Bakhtin 2024-02-15 14:11:12 +01:00
parent 4cfa5f0dbb
commit 7abead96b6
4 changed files with 84 additions and 30 deletions

View File

@ -163,9 +163,11 @@ class ZendLucenceDriver extends AbstractDriver
if (!empty($request->topic)) {
Wildcard::setMinPrefixLength(0);
$subQuery = new Boolean();
foreach ($request->topic as $topic) {
$query->addSubquery(new Wildcard(new Term('*-' . $topic . '-*', 'tags')), true);
$subQuery->addSubquery(new Wildcard(new Term('*-' . $topic . '-*', 'tags')));
}
$query->addSubquery($subQuery, true);
}
if ($request->author) {

View File

@ -5,11 +5,13 @@ namespace humhub\modules\content\tests\codeception\unit\search;
use humhub\modules\content\models\Content;
use humhub\modules\content\Module;
use humhub\modules\content\search\driver\AbstractDriver;
use humhub\modules\content\search\driver\MysqlDriver;
use humhub\modules\content\search\ResultSet;
use humhub\modules\content\search\SearchRequest;
use humhub\modules\content\tests\codeception\unit\TestContent;
use humhub\modules\post\models\Post;
use humhub\modules\space\models\Space;
use humhub\modules\topic\models\Topic;
use humhub\modules\user\models\User;
use tests\codeception\_support\HumHubDbTestCase;
use Yii;
@ -21,25 +23,20 @@ abstract class AbstractDriverTestSuite extends HumHubDbTestCase
abstract protected function createDriver(): AbstractDriver;
public function _before()
abstract protected function updateNewAddedContents(): void;
protected function _before()
{
$this->searchDriver = $this->createDriver();
/** @var Module $module */
$module = Yii::$app->getModule('content');
$module->setComponents([
'search' => [
'class' => get_class($this->searchDriver)
]
]);
$this->searchDriver->purge();
$module->set('search', ['class' => get_class($this->searchDriver)]);
parent::_before();
}
public function testKeywords()
{
$space = Space::findOne(['id' => 1]);
@ -55,12 +52,13 @@ abstract class AbstractDriverTestSuite extends HumHubDbTestCase
$this->assertEquals(1, count($this->getSearchResultByKeyword('Marabr*')->results));
}
/**
* @skip Not possible on MySQLDriver
*/
public function testShortKeywords()
{
if ($this->searchDriver instanceof MysqlDriver) {
// Not possible on MySQLDriver
return;
}
$space = Space::findOne(['id' => 1]);
$this->becomeUser('Admin');
(new Post($space, Content::VISIBILITY_PUBLIC, ['message' => 'Some Other']))->save();
@ -71,10 +69,16 @@ abstract class AbstractDriverTestSuite extends HumHubDbTestCase
$this->assertEquals(1, count($this->getSearchResultByKeyword('X')->results));
}
private function getSearchRequest(): SearchRequest
{
$this->updateNewAddedContents();
return new SearchRequest();
}
private function getSearchResultByKeyword(string $keyword): ResultSet
{
$request = new SearchRequest();
$request = $this->getSearchRequest();
$request->keyword = $keyword;
return $this->searchDriver->search($request);
}
@ -94,7 +98,7 @@ abstract class AbstractDriverTestSuite extends HumHubDbTestCase
$post3->content->created_at = '2023-12-04 22:00:00';
$post3->save();
$request = new SearchRequest();
$request = $this->getSearchRequest();
$request->keyword = 'Test';
$request->dateFrom = '2024-02-01';
@ -116,6 +120,47 @@ abstract class AbstractDriverTestSuite extends HumHubDbTestCase
$this->assertEquals(2, count($result->results));
}
public function testFilterTopics()
{
$space = Space::findOne(['id' => 1]);
$this->becomeUser('Admin');
$post1 = new Post($space, Content::VISIBILITY_PUBLIC, ['message' => 'Test Test1']);
if ($post1->save()) {
Topic::attach($post1->content, ['_add:red']);
}
$topic1 = Topic::findOne(['name' => 'red']);
$post2 = new Post($space, Content::VISIBILITY_PUBLIC, ['message' => 'Test Test2']);
if ($post2->save()) {
Topic::attach($post2->content, [$topic1, '_add:green']);
}
$topic2 = Topic::findOne(['name' => 'green']);
$post3 = new Post($space, Content::VISIBILITY_PUBLIC, ['message' => 'Test Test3']);
if ($post3->save()) {
Topic::attach($post3->content, [$topic2, '_add:blue']);
}
$topic3 = Topic::findOne(['name' => 'blue']);
$request = $this->getSearchRequest();
$request->keyword = 'Test';
$request->topic = [$topic1->id];
$result = $this->searchDriver->search($request);
$this->assertEquals(2, count($result->results));
$request->topic = [$topic1->id, $topic2->id];
$result = $this->searchDriver->search($request);
$this->assertEquals(3, count($result->results));
$request->topic = [$topic2->id];
$result = $this->searchDriver->search($request);
$this->assertEquals(2, count($result->results));
$request->topic = [$topic3->id];
$result = $this->searchDriver->search($request);
$this->assertEquals(1, count($result->results));
}
public function testFilterContentType()
{
$space = Space::findOne(['id' => 1]);
@ -125,7 +170,7 @@ abstract class AbstractDriverTestSuite extends HumHubDbTestCase
(new TestContent($space, Content::VISIBILITY_PUBLIC, ['message' => 'Test Test1']))->save();
(new TestContent($space, Content::VISIBILITY_PUBLIC, ['message' => 'Test Test2']))->save();
$request = new SearchRequest();
$request = $this->getSearchRequest();
$request->keyword = 'Test';
$request->contentType = TestContent::class;
@ -148,9 +193,8 @@ abstract class AbstractDriverTestSuite extends HumHubDbTestCase
(new Post($space, Content::VISIBILITY_PUBLIC, ['message' => 'TestAuthor Test4']))->save();
(new Post($space, Content::VISIBILITY_PUBLIC, ['message' => 'TestAuthor Test5']))->save();
// Search by filter
$request = new SearchRequest();
// Search by filter "Author"
$request = $this->getSearchRequest();
$request->keyword = 'TestAuthor';
$request->author = [User::findOne(['username' => 'User2'])->guid];
@ -158,12 +202,12 @@ abstract class AbstractDriverTestSuite extends HumHubDbTestCase
$this->assertEquals(3, count($result->results));
// Search by keyword
// Search by keyword without filter "Author"
$request = new SearchRequest();
$request->keyword = 'Sara Tester';
$request->keyword = 'TestAuthor';
$result = $this->searchDriver->search($request);
$this->assertEquals(3, count($result->results));
$this->assertEquals(4, count($result->results));
}
public function testOrderBy()
@ -183,12 +227,7 @@ abstract class AbstractDriverTestSuite extends HumHubDbTestCase
$post3->save();
$post3->content->updateAttributes(['created_at' => '2023-02-01 11:00:00']);
$this->searchDriver->purge();
$this->searchDriver->update($post1->content);
$this->searchDriver->update($post2->content);
$this->searchDriver->update($post3->content);
$request = new SearchRequest();
$request = $this->getSearchRequest();
$request->keyword = 'Keyword';
$request->orderBy = SearchRequest::ORDER_BY_CREATION_DATE;
$result = $this->searchDriver->search($request);
@ -198,7 +237,7 @@ abstract class AbstractDriverTestSuite extends HumHubDbTestCase
$this->assertEquals($post3->content->id, $result->results[1]->content->id);
$this->assertEquals($post1->content->id, $result->results[2]->content->id);
$request = new SearchRequest();
$request = $this->getSearchRequest();
$request->keyword = 'Keyword';
$request->orderBy = SearchRequest::ORDER_BY_SCORE;
$result = $this->searchDriver->search($request);

View File

@ -11,4 +11,8 @@ class MysqlDriverTest extends AbstractDriverTestSuite
{
return new MysqlDriver();
}
protected function updateNewAddedContents(): void
{
}
}

View File

@ -2,6 +2,7 @@
namespace humhub\modules\content\tests\codeception\unit\search;
use humhub\modules\content\models\Content;
use humhub\modules\content\search\driver\AbstractDriver;
use humhub\modules\content\search\driver\ZendLucenceDriver;
@ -11,4 +12,12 @@ class ZendLucenceDriverTest extends AbstractDriverTestSuite
{
return new ZendLucenceDriver();
}
protected function updateNewAddedContents(): void
{
foreach (Content::find()->where(['visibility' => Content::VISIBILITY_PUBLIC])->each() as $content) {
$this->searchDriver->delete($content);
$this->searchDriver->update($content);
}
}
}