tao-test/app/tao/test/unit/models/classes/search/SearchProxyTest.php

226 lines
7.1 KiB
PHP

<?php
/**
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; under version 2
* of the License (non-upgradable).
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Copyright (c) 2020-2021 (original work) Open Assessment Technologies SA;
*/
declare(strict_types=1);
namespace oat\tao\test\unit\model\search;
use oat\generis\model\GenerisRdf;
use oat\generis\test\TestCase;
use oat\tao\model\AdvancedSearch\AdvancedSearchChecker;
use oat\tao\model\search\IdentifierSearcher;
use oat\tao\model\search\ResultSet;
use oat\tao\model\search\ResultSetResponseNormalizer;
use oat\tao\model\search\SearchInterface;
use oat\tao\model\search\SearchProxy;
use oat\tao\model\search\SearchQuery;
use oat\tao\model\search\SearchQueryFactory;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Http\Message\ServerRequestInterface;
class SearchProxyTest extends TestCase
{
/** @var SearchProxy */
private $subject;
/** @var AdvancedSearchChecker|MockObject */
private $advancedSearchCheckerMock;
/** @var IdentifierSearcher|MockObject */
private $identifierSearcher;
/** @var SearchQueryFactory|MockObject */
private $searchQueryFactoryMock;
/** @var ResultSet|MockObject */
private $resultSetMock;
/** @var ServerRequestInterface|MockObject */
private $requestMock;
/** @var ResultSetResponseNormalizer|MockObject */
private $resultSetResponseNormalizerMock;
/** @var SearchInterface|MockObject */
private $defaultSearch;
/** @var SearchInterface|MockObject */
private $advancedSearch;
public function setUp(): void
{
$this->advancedSearchCheckerMock = $this->createMock(AdvancedSearchChecker::class);
$this->identifierSearcher = $this->createMock(IdentifierSearcher::class);
$this->defaultSearch = $this->createMock(SearchInterface::class);
$this->advancedSearch = $this->createMock(SearchInterface::class);
$this->searchQueryFactoryMock = $this->createMock(SearchQueryFactory::class);
$this->resultSetResponseNormalizerMock = $this->createMock(ResultSetResponseNormalizer::class);
$this->resultSetMock = $this->createMock(ResultSet::class);
$this->requestMock = $this->createMock(ServerRequestInterface::class);
$this->requestMock->method('getQueryParams')->willReturn(
[
'params' =>
[
'query' => 'test',
'structure' => 'exampleRootNode',
],
]
);
$this->subject = new SearchProxy(
[
SearchProxy::OPTION_DEFAULT_SEARCH_CLASS => $this->defaultSearch,
SearchProxy::OPTION_ADVANCED_SEARCH_CLASS => $this->advancedSearch,
]
);
$this->subject->setServiceLocator(
$this->getServiceLocatorMock(
[
AdvancedSearchChecker::class => $this->advancedSearchCheckerMock,
SearchQueryFactory::class => $this->searchQueryFactoryMock,
ResultSetResponseNormalizer::class => $this->resultSetResponseNormalizerMock,
IdentifierSearcher::class => $this->identifierSearcher
]
)
);
}
public function testSearchByIdentifier(): void
{
$this->identifierSearcher
->method('search')
->willReturn(new ResultSet([], 1));
$this->resultSetResponseNormalizerMock
->expects($this->once())
->method('normalize')
->willReturn([]);
$this->assertSame([], $this->subject->search($this->requestMock));
}
public function testSearchByDefaultSearch(): void
{
$this->advancedSearchCheckerMock
->expects($this->once())
->method('isEnabled')
->willReturn(false);
$this->defaultSearch
->method('query')
->willReturn(new ResultSet([], 1));
$this->resultSetResponseNormalizerMock
->expects($this->once())
->method('normalize')
->willReturn([]);
$this->assertSame([], $this->subject->search($this->requestMock));
}
public function testForceGenerisSearch(): void
{
$query = new SearchQuery(
'',
'',
GenerisRdf::CLASS_ROLE,
0,
10,
0
);
$this->searchQueryFactoryMock
->method('create')
->willReturn($query);
$this->defaultSearch
->method('query')
->willReturn($this->resultSetMock);
$this->resultSetResponseNormalizerMock
->expects($this->once())
->method('normalize')
->willReturn([]);
$this->assertSame([], $this->subject->search($this->requestMock));
}
public function testSearchWithAdvancedSearchAndNoPagination(): void
{
$this->requestMock
->method('getQueryParams')
->willReturn([]);
$this->advancedSearchCheckerMock
->expects($this->once())
->method('isEnabled')
->willReturn(true);
$this->advancedSearch
->method('query')
->willReturn($this->resultSetMock);
$this->resultSetResponseNormalizerMock
->expects($this->once())
->method('normalize')
->willReturn([]);
$this->assertSame([], $this->subject->search($this->requestMock));
}
public function testSearchWithAdvancedSearchAndPagination(): void
{
$this->requestMock
->method('getQueryParams')
->willReturn(
[
'rows' => 10,
'page' => 1,
]
);
$this->advancedSearchCheckerMock
->expects($this->once())
->method('isEnabled')
->willReturn(true);
$this->advancedSearch
->method('query')
->willReturn($this->resultSetMock);
$this->resultSetResponseNormalizerMock
->expects($this->once())
->method('normalize')
->willReturn([]);
$result = $this->subject->search($this->requestMock);
$this->assertIsArray($result);
}
public function testIsForcingDefaultSearch(): void
{
$options = $this->subject->getOption(SearchProxy::OPTION_GENERIS_SEARCH_WHITELIST, []);
$generisSearchWhitelist = array_merge(SearchProxy::GENERIS_SEARCH_DEFAULT_WHITELIST, $options);
$this->assertTrue(in_array(GenerisRdf::CLASS_ROLE, $generisSearchWhitelist));
}
}