diff --git a/app/code/Magento/Catalog/Api/ProductRepositoryInterface.php b/app/code/Magento/Catalog/Api/ProductRepositoryInterface.php index 18cf0bdec693cf4913c73285185bd01933ed40e6..6fddee979e07f89879312fa6ed317acff6acba27 100644 --- a/app/code/Magento/Catalog/Api/ProductRepositoryInterface.php +++ b/app/code/Magento/Catalog/Api/ProductRepositoryInterface.php @@ -72,10 +72,4 @@ interface ProductRepositoryInterface * @return \Magento\Catalog\Api\Data\ProductSearchResultsInterface */ public function getList(\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria); - - /** - * @param \Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria - * @return \Magento\Framework\Api\Search\SearchResultInterface - */ - public function search(\Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria); } diff --git a/app/code/Magento/Catalog/Model/Product/Attribute/Backend/GroupPrice/AbstractGroupPrice.php b/app/code/Magento/Catalog/Model/Product/Attribute/Backend/GroupPrice/AbstractGroupPrice.php index 4ff34b45814607a812e60d48202115cb5a1a5ee6..56631b4a8faf65ffa2a0b6360ced631e2098ab59 100644 --- a/app/code/Magento/Catalog/Model/Product/Attribute/Backend/GroupPrice/AbstractGroupPrice.php +++ b/app/code/Magento/Catalog/Model/Product/Attribute/Backend/GroupPrice/AbstractGroupPrice.php @@ -432,4 +432,14 @@ abstract class AbstractGroupPrice extends Price return $data; } + + /** + * Get resource model instance + * + * @return \Magento\Catalog\Model\Resource\Product\Attribute\Backend\GroupPrice + */ + public function getResource() + { + return $this->_getResource(); + } } diff --git a/app/code/Magento/Catalog/Model/ProductRepository.php b/app/code/Magento/Catalog/Model/ProductRepository.php index 9f753c5810db359a80941645ad0332290c13ff4c..28e8e25dfaa6b8273b50b984f0d0ec265a21aa34 100644 --- a/app/code/Magento/Catalog/Model/ProductRepository.php +++ b/app/code/Magento/Catalog/Model/ProductRepository.php @@ -135,25 +135,6 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa */ protected $extensionAttributesJoinProcessor; - /** - * @var \Magento\Framework\Search\Request\Builder - */ - private $requestBuilder; - - /** - * @var \Magento\Framework\Search\SearchEngineInterface - */ - private $searchEngine; - - /** - * @var SearchResponseBuilder - */ - private $searchResponseBuilder; - /** - * @var \Magento\Framework\App\Config\ScopeConfigInterface - */ - private $scopeConfig; - /** * @param ProductFactory $productFactory * @param \Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper $initializationHelper @@ -176,10 +157,6 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa * @param \Magento\Eav\Model\Config $eavConfig * @param ImageProcessorInterface $imageProcessor * @param \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor - * @param \Magento\Framework\Search\Request\Builder $requestBuilder - * @param \Magento\Framework\Search\SearchEngineInterface $searchEngine - * @param SearchResponseBuilder $searchResponseBuilder - * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -202,11 +179,7 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa ImageContentInterfaceFactory $contentFactory, MimeTypeExtensionMap $mimeTypeExtensionMap, ImageProcessorInterface $imageProcessor, - \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor, - \Magento\Framework\Search\Request\Builder $requestBuilder, - \Magento\Framework\Search\SearchEngineInterface $searchEngine, - SearchResponseBuilder $searchResponseBuilder, - \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig + \Magento\Framework\Api\ExtensionAttribute\JoinProcessorInterface $extensionAttributesJoinProcessor ) { $this->productFactory = $productFactory; $this->collectionFactory = $collectionFactory; @@ -228,10 +201,6 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa $this->mimeTypeExtensionMap = $mimeTypeExtensionMap; $this->imageProcessor = $imageProcessor; $this->extensionAttributesJoinProcessor = $extensionAttributesJoinProcessor; - $this->requestBuilder = $requestBuilder; - $this->searchEngine = $searchEngine; - $this->searchResponseBuilder = $searchResponseBuilder; - $this->scopeConfig = $scopeConfig; } /** @@ -703,45 +672,6 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa return $searchResult; } - /** - * @param \Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria - * @return \Magento\Framework\Api\Search\SearchResultInterface - */ - public function search(\Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria) - { - $this->requestBuilder->setRequestName($searchCriteria->getRequestName()); - - $searchTerm = $searchCriteria->getSearchTerm(); - if (!empty($searchTerm)) { - $this->requestBuilder->bind('search_term', $searchTerm); - } - - $storeId = $this->storeManager->getStore(true)->getId(); - $this->requestBuilder->bindDimension('scope', $storeId); - - foreach ($searchCriteria->getFilterGroups() as $filterGroup) { - foreach ($filterGroup->getFilters() as $filter) { - $this->addFieldToFilter($filter->getField(), $filter->getValue()); - } - } - - $priceRangeCalculation = $this->scopeConfig->getValue( - \Magento\Catalog\Model\Layer\Filter\Dynamic\AlgorithmFactory::XML_PATH_RANGE_CALCULATION, - \Magento\Store\Model\ScopeInterface::SCOPE_STORE - ); - if ($priceRangeCalculation) { - $this->requestBuilder->bind('price_dynamic_algorithm', $priceRangeCalculation); - } - - $this->requestBuilder->setFrom($searchCriteria->getCurrentPage() * $searchCriteria->getPageSize()); - $this->requestBuilder->setSize($searchCriteria->getPageSize()); - $request = $this->requestBuilder->create(); - $searchResponse = $this->searchEngine->search($request); - - return $this->searchResponseBuilder->build($searchResponse) - ->setSearchCriteria($searchCriteria); - } - /** * Helper function that adds a FilterGroup to the collection. * @@ -762,26 +692,4 @@ class ProductRepository implements \Magento\Catalog\Api\ProductRepositoryInterfa $collection->addFieldToFilter($fields); } } - - /** - * Apply attribute filter to facet collection - * - * @param string $field - * @param null $condition - * @return $this - */ - private function addFieldToFilter($field, $condition = null) - { - if (!is_array($condition) || !in_array(key($condition), ['from', 'to'])) { - $this->requestBuilder->bind($field, $condition); - } else { - if (!empty($condition['from'])) { - $this->requestBuilder->bind("{$field}.from", $condition['from']); - } - if (!empty($condition['to'])) { - $this->requestBuilder->bind("{$field}.to", $condition['to']); - } - } - return $this; - } } diff --git a/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php b/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php index 76c6c1ddabf2ee69134219feca9b0183acbc22a5..ad8341e86cfdd703d5379a82366c40fd386afef0 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php +++ b/app/code/Magento/Catalog/Test/Unit/Model/ProductRepositoryTest.php @@ -130,26 +130,6 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase */ protected $objectManager; - /** - * @var \Magento\Framework\Search\Request\Builder|\PHPUnit_Framework_MockObject_MockObject - */ - protected $requestBuilder; - - /** - * @var \Magento\Search\Model\SearchEngine|\PHPUnit_Framework_MockObject_MockObject - */ - protected $searchEngine; - - /** - * @var \Magento\Catalog\Model\SearchResponseBuilder|\PHPUnit_Framework_MockObject_MockObject - */ - protected $searchResponseBuilder; - - /** - * @var \Magento\Framework\App\Config\ScopeConfigInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $scopeConfig; - /** * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject */ @@ -241,22 +221,6 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase ['getLinkTypes'], [], '', false); $this->imageProcessorMock = $this->getMock('Magento\Framework\Api\ImageProcessorInterface', [], [], '', false); - $this->requestBuilder = $this->getMockBuilder('Magento\Framework\Search\Request\Builder') - ->disableOriginalConstructor() - ->getMock(); - - $this->searchEngine = $this->getMockBuilder('Magento\Search\Model\SearchEngine') - ->disableOriginalConstructor() - ->getMock(); - - $this->searchResponseBuilder = $this->getMockBuilder('Magento\Catalog\Model\SearchResponseBuilder') - ->disableOriginalConstructor() - ->getMock(); - - $this->scopeConfig = $this->getMockBuilder('Magento\Framework\App\Config\ScopeConfigInterface') - ->disableOriginalConstructor() - ->getMockForAbstractClass(); - $this->storeManager = $this->getMockBuilder('Magento\Store\Model\StoreManagerInterface') ->disableOriginalConstructor() ->getMockForAbstractClass(); @@ -280,10 +244,6 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase 'mimeTypeExtensionMap' => $this->mimeTypeExtensionMapMock, 'linkTypeProvider' => $this->linkTypeProviderMock, 'imageProcessor' => $this->imageProcessorMock, - 'requestBuilder' => $this->requestBuilder, - 'searchEngine' => $this->searchEngine, - 'searchResponseBuilder' => $this->searchResponseBuilder, - 'scopeConfig' => $this->scopeConfig, 'storeManager' => $this->storeManager, ] ); @@ -1236,98 +1196,4 @@ class ProductRepositoryTest extends \PHPUnit_Framework_TestCase $this->model->save($this->productMock); $this->assertEquals($expectedResult, $this->initializedProductMock->getMediaGallery('images')); } - - public function testSearch() - { - $requestName = 'requestName'; - $searchTerm = 'searchTerm'; - $storeId = 333; - $filterField = 'filterField'; - $filterValue = 'filterValue'; - $priceRangeCalculation = 'auto'; - - $filter = $this->getMockBuilder('Magento\Framework\Api\Filter') - ->disableOriginalConstructor() - ->getMock(); - $filter->expects($this->once()) - ->method('getField') - ->willReturn($filterField); - $filter->expects($this->once()) - ->method('getValue') - ->willReturn($filterValue); - - $filterGroup = $this->getMockBuilder('Magento\Framework\Api\Search\FilterGroup') - ->disableOriginalConstructor() - ->getMock(); - $filterGroup->expects($this->once()) - ->method('getFilters') - ->willReturn([$filter]); - - $searchCriteria = $this->getMockBuilder('Magento\Framework\Api\Search\SearchCriteriaInterface') - ->disableOriginalConstructor() - ->getMockForAbstractClass(); - $searchCriteria->expects($this->once()) - ->method('getRequestName') - ->willReturn($requestName); - $searchCriteria->expects($this->once()) - ->method('getSearchTerm') - ->willReturn($searchTerm); - $searchCriteria->expects($this->once()) - ->method('getFilterGroups') - ->willReturn([$filterGroup]); - - $store = $this->getMockBuilder('Magento\Store\Model\Store') - ->disableOriginalConstructor() - ->getMock(); - $store->expects($this->once()) - ->method('getId') - ->willReturn($storeId); - - $searchResult = $this->getMockBuilder('Magento\Framework\Api\Search\SearchResult') - ->disableOriginalConstructor() - ->getMockForAbstractClass(); - - $request = $this->getMockBuilder('Magento\Framework\Search\RequestInterface') - ->disableOriginalConstructor() - ->getMockForAbstractClass(); - - $response = $this->getMockBuilder('Magento\Framework\Search\ResponseInterface') - ->disableOriginalConstructor() - ->getMockForAbstractClass(); - - $this->requestBuilder->expects($this->once()) - ->method('setRequestName') - ->with($requestName); - $this->requestBuilder->expects($this->once()) - ->method('bindDimension') - ->with('scope', $storeId); - $this->requestBuilder->expects($this->any()) - ->method('bind');; - $this->requestBuilder->expects($this->once()) - ->method('create') - ->willReturn($request); - - $this->searchEngine->expects($this->once()) - ->method('search') - ->with($request) - ->willReturn($response); - - $this->searchResponseBuilder->expects($this->once()) - ->method('build') - ->with($response) - ->willReturn($searchResult); - - $this->storeManager->expects($this->once()) - ->method('getStore') - ->willReturn($store); - - $this->scopeConfig->expects($this->once()) - ->method('getValue') - ->with(AlgorithmFactory::XML_PATH_RANGE_CALCULATION, ScopeInterface::SCOPE_STORE) - ->willReturn($priceRangeCalculation); - - $searchResult = $this->model->search($searchCriteria); - - $this->assertInstanceOf('Magento\Framework\Api\Search\SearchResultInterface', $searchResult); - } } diff --git a/app/code/Magento/Catalog/etc/webapi.xml b/app/code/Magento/Catalog/etc/webapi.xml index 8ba7b4635b30aad4fd4c94e9e1229b602468c25d..ec8458cd8c9a7ebeda59b7dfdbde2fbb77b05bf6 100644 --- a/app/code/Magento/Catalog/etc/webapi.xml +++ b/app/code/Magento/Catalog/etc/webapi.xml @@ -39,12 +39,6 @@ <resource ref="anonymous" /> </resources> </route> - <route url="/V1/products/search" method="GET"> - <service class="Magento\Catalog\Api\ProductRepositoryInterface" method="search"/> - <resources> - <resource ref="anonymous" /> - </resources> - </route> <route url="/V1/products/attributes/types" method="GET"> <service class="Magento\Catalog\Api\ProductAttributeTypesListInterface" method="getItems"/> diff --git a/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php b/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php index cef79f4f73706fba4969a990a42bc5836f244701..ef70bb6fc518f2f6c8d0319b75721350d6b60e3b 100755 --- a/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php +++ b/app/code/Magento/CatalogRule/Model/Indexer/IndexBuilder.php @@ -612,6 +612,17 @@ class IndexBuilder $select->where('rp.product_id=?', $productId); } + /** + * Join group price to result + */ + $groupPriceAttr = $this->eavConfig->getAttribute(Product::ENTITY, 'group_price'); + $select->joinLeft( + ['gp' => $groupPriceAttr->getBackend()->getResource()->getMainTable()], + 'gp.entity_id=rp.product_id AND gp.customer_group_id=rp.customer_group_id AND ' + . $this->getReadAdapter()->getCheckSql('gp.website_id=0', 'TRUE', 'gp.website_id=rp.website_id'), + 'value' + ); + /** * Join default price and websites prices to result */ @@ -653,7 +664,10 @@ class IndexBuilder [] ); $select->columns([ - 'default_price' => $this->getReadAdapter()->getIfNullSql($tableAlias . '.value', 'pp_default.value'), + 'default_price' => $this->getReadAdapter()->getIfNullSql( + 'gp.value', + $this->getReadAdapter()->getIfNullSql($tableAlias . '.value', 'pp_default.value') + ), ]); return $read->query($select); diff --git a/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php index 8c41a3c24276dcad12e5733216b5eb2a21cc3640..3687d55d4710fba30b24b144e14c0691e972730f 100644 --- a/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php +++ b/app/code/Magento/CatalogRule/Test/Unit/Model/Indexer/IndexBuilderTest.php @@ -148,7 +148,7 @@ class IndexBuilderTest extends \PHPUnit_Framework_TestCase $this->priceCurrency = $this->getMock('Magento\Framework\Pricing\PriceCurrencyInterface'); $this->dateFormat = $this->getMock('Magento\Framework\Stdlib\DateTime', [], [], '', false); $this->dateTime = $this->getMock('Magento\Framework\Stdlib\DateTime\DateTime', [], [], '', false); - $this->eavConfig = $this->getMock('Magento\Eav\Model\Config', [], [], '', false); + $this->eavConfig = $this->getMock('Magento\Eav\Model\Config', ['getAttribute'], [], '', false); $this->product = $this->getMock('Magento\Catalog\Model\Product', [], [], '', false); $this->productFactory = $this->getMock('Magento\Catalog\Model\ProductFactory', ['create'], [], '', false); @@ -182,7 +182,6 @@ class IndexBuilderTest extends \PHPUnit_Framework_TestCase $this->combine->expects($this->any())->method('validate')->will($this->returnValue(true)); $this->attribute->expects($this->any())->method('getBackend')->will($this->returnValue($this->backend)); - $this->eavConfig->expects($this->any())->method('getAttribute')->will($this->returnValue($this->attribute)); $this->productFactory->expects($this->any())->method('create')->will($this->returnValue($this->product)); $this->indexBuilder = new \Magento\CatalogRule\Model\Indexer\IndexBuilder( @@ -206,6 +205,45 @@ class IndexBuilderTest extends \PHPUnit_Framework_TestCase */ public function testUpdateCatalogRuleGroupWebsiteData() { + $groupPriceAttrMock = $this->getMock( + 'Magento\Catalog\Model\Entity\Attribute', + ['getBackend'], + [], + '', + false + ); + $backendModelMock = $this->getMock( + 'Magento\Catalog\Model\Product\Attribute\Backend\GroupPrice', + ['getResource'], + [], + '', + false + ); + $resourceMock = $this->getMock( + 'Magento\Catalog\Model\Resource\Product\Attribute\Backend\GroupPrice', + ['getMainTable'], + [], + '', + false + ); + $resourceMock->expects($this->once()) + ->method('getMainTable') + ->will($this->returnValue('catalog_product_entity_group_price')); + $backendModelMock->expects($this->once()) + ->method('getResource') + ->will($this->returnValue($resourceMock)); + $groupPriceAttrMock->expects($this->once()) + ->method('getBackend') + ->will($this->returnValue($backendModelMock)); + $this->eavConfig->expects($this->at(0)) + ->method('getAttribute') + ->with(\Magento\Catalog\Model\Product::ENTITY, 'group_price') + ->will($this->returnValue($groupPriceAttrMock)); + $this->eavConfig->expects($this->at(1)) + ->method('getAttribute') + ->with(\Magento\Catalog\Model\Product::ENTITY, 'price') + ->will($this->returnValue($this->attribute)); + $this->select->expects($this->once())->method('insertFromSelect')->with('catalogrule_group_website'); $this->indexBuilder->reindexByIds([1]); diff --git a/app/code/Magento/CatalogSearch/Model/Indexer/IndexStructure.php b/app/code/Magento/CatalogSearch/Model/Indexer/IndexStructure.php index 2f3320648ad62b043412713649868ec794284d71..4c0166ea9c0fb4bff54aa8456c62d41c6b9ea8b5 100644 --- a/app/code/Magento/CatalogSearch/Model/Indexer/IndexStructure.php +++ b/app/code/Magento/CatalogSearch/Model/Indexer/IndexStructure.php @@ -10,7 +10,7 @@ use Magento\Framework\App\Resource; use Magento\Framework\DB\Adapter\AdapterInterface; use Magento\Framework\DB\Ddl\Table; use Magento\Framework\Search\Request\Dimension; -use Magento\Search\Model\ScopeResolver\IndexScopeResolver; +use Magento\Indexer\Model\ScopeResolver\IndexScopeResolver; class IndexStructure { diff --git a/app/code/Magento/CatalogSearch/Model/Indexer/IndexerHandler.php b/app/code/Magento/CatalogSearch/Model/Indexer/IndexerHandler.php index 47d49900ef231036e3f0406bda471f8d4f513fe5..cbaeb578ac1220fb02fb443ddc6bd43bbb3ea748 100644 --- a/app/code/Magento/CatalogSearch/Model/Indexer/IndexerHandler.php +++ b/app/code/Magento/CatalogSearch/Model/Indexer/IndexerHandler.php @@ -12,7 +12,7 @@ use Magento\Framework\IndexerInterface; use Magento\Framework\Search\Request\Dimension; use Magento\Framework\Search\Request\IndexScopeResolverInterface; use Magento\Indexer\Model\SaveHandler\Batch; -use Magento\Search\Model\ScopeResolver\IndexScopeResolver; +use Magento\Indexer\Model\ScopeResolver\IndexScopeResolver; class IndexerHandler implements IndexerInterface { @@ -61,7 +61,7 @@ class IndexerHandler implements IndexerInterface * @param Resource|Resource $resource * @param Config $eavConfig * @param Batch $batch - * @param IndexScopeResolver $indexScopeResolver + * @param \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver $indexScopeResolver * @param array $data * @param int $batchSize */ diff --git a/app/code/Magento/CatalogSearch/Model/Indexer/Mview/Action.php b/app/code/Magento/CatalogSearch/Model/Indexer/Mview/Action.php new file mode 100644 index 0000000000000000000000000000000000000000..03f0fb14eadced11386b44cf80806db7afe29e3f --- /dev/null +++ b/app/code/Magento/CatalogSearch/Model/Indexer/Mview/Action.php @@ -0,0 +1,42 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\CatalogSearch\Model\Indexer\Mview; + + +use Magento\CatalogSearch\Model\Indexer\Fulltext; +use Magento\Framework\Mview\ActionInterface; +use Magento\Indexer\Model\IndexerInterfaceFactory; + +class Action implements ActionInterface +{ + /** + * @var IndexerInterfaceFactory + */ + private $indexerFactory; + + /** + * @param IndexerInterfaceFactory $indexerFactory + */ + public function __construct(IndexerInterfaceFactory $indexerFactory) + { + $this->indexerFactory = $indexerFactory; + } + + /** + * Execute materialization on ids entities + * + * @param int[] $ids + * @return void + * @api + */ + public function execute($ids) + { + /** @var \Magento\Indexer\Model\IndexerInterface $indexer */ + $indexer = $this->indexerFactory->create()->load(Fulltext::INDEXER_ID); + $indexer->reindexList($ids); + } +} diff --git a/app/code/Magento/CatalogSearch/Model/Resource/Engine.php b/app/code/Magento/CatalogSearch/Model/Resource/Engine.php index 74c767a5ab9942454d18f89f666acf2ab80c38d7..a3c39528a1d0f16a8e65b3cac43a0e5b94339725 100644 --- a/app/code/Magento/CatalogSearch/Model/Resource/Engine.php +++ b/app/code/Magento/CatalogSearch/Model/Resource/Engine.php @@ -27,7 +27,7 @@ class Engine implements EngineInterface protected $catalogProductVisibility; /** - * @var \Magento\Search\Model\ScopeResolver\IndexScopeResolver + * @var \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver */ private $indexScopeResolver; @@ -35,11 +35,11 @@ class Engine implements EngineInterface * Construct * * @param \Magento\Catalog\Model\Product\Visibility $catalogProductVisibility - * @param \Magento\Search\Model\ScopeResolver\IndexScopeResolver $indexScopeResolver + * @param \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver $indexScopeResolver */ public function __construct( \Magento\Catalog\Model\Product\Visibility $catalogProductVisibility, - \Magento\Search\Model\ScopeResolver\IndexScopeResolver $indexScopeResolver + \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver $indexScopeResolver ) { $this->catalogProductVisibility = $catalogProductVisibility; $this->indexScopeResolver = $indexScopeResolver; diff --git a/app/code/Magento/CatalogSearch/Model/Search/IndexBuilder.php b/app/code/Magento/CatalogSearch/Model/Search/IndexBuilder.php index 4e6648b6f5c0805fa270b1ba20a4c1e862a6ee20..6ae4e1ba0cf88ac0a3a9f747c83ae6e1f57f7fa8 100644 --- a/app/code/Magento/CatalogSearch/Model/Search/IndexBuilder.php +++ b/app/code/Magento/CatalogSearch/Model/Search/IndexBuilder.php @@ -12,11 +12,10 @@ use Magento\Framework\DB\Select; use Magento\Framework\Search\Adapter\Mysql\ConditionManager; use Magento\Framework\Search\Adapter\Mysql\IndexBuilderInterface; use Magento\Framework\Search\Request\Dimension; -use Magento\Framework\Search\Request\Query\Bool; use Magento\Framework\Search\Request\QueryInterface; use Magento\Framework\Search\Request\QueryInterface as RequestQueryInterface; use Magento\Framework\Search\RequestInterface; -use Magento\Search\Model\ScopeResolver\IndexScopeResolver; +use Magento\Indexer\Model\ScopeResolver\IndexScopeResolver; use Magento\Store\Model\ScopeInterface; use Magento\Store\Model\StoreManagerInterface; diff --git a/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/IndexBuilderTest.php b/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/IndexBuilderTest.php index 33ca04f2b95d2d435131ae19b30cba5676eaabb4..5e93d20132e38849d704ccd9d48dc58b83563659 100644 --- a/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/IndexBuilderTest.php +++ b/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/IndexBuilderTest.php @@ -84,7 +84,7 @@ class IndexBuilderTest extends \PHPUnit_Framework_TestCase $this->storeManager = $this->getMockBuilder('Magento\Store\Model\StoreManagerInterface')->getMock(); - $this->scopeResolver = $this->getMockBuilder('\Magento\Search\Model\ScopeResolver\IndexScopeResolver') + $this->scopeResolver = $this->getMockBuilder('\Magento\Indexer\Model\ScopeResolver\IndexScopeResolver') ->disableOriginalConstructor() ->getMock(); diff --git a/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/Indexer/IndexStructureTest.php b/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/Indexer/IndexStructureTest.php index a589de77d66c63b267260970eba6c4898a6ef8d3..1acbcbc51d1e93e6f8c4e8bcca1960cc0abd9f42 100644 --- a/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/Indexer/IndexStructureTest.php +++ b/app/code/Magento/CatalogSearch/Test/Unit/Model/Search/Indexer/IndexStructureTest.php @@ -16,7 +16,7 @@ use \Magento\Framework\TestFramework\Unit\Helper\ObjectManager; class IndexStructureTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\Search\Model\ScopeResolver\IndexScopeResolver|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver|\PHPUnit_Framework_MockObject_MockObject */ private $indexScopeResolver; /** @@ -46,11 +46,11 @@ class IndexStructureTest extends \PHPUnit_Framework_TestCase ->method('getConnection') ->with(\Magento\Framework\App\Resource::DEFAULT_WRITE_RESOURCE) ->willReturn($this->adapter); - $this->indexScopeResolver = $this->getMockBuilder('\Magento\Search\Model\ScopeResolver\IndexScopeResolver') + $this->indexScopeResolver = $this->getMockBuilder('\Magento\Indexer\Model\ScopeResolver\IndexScopeResolver') ->setMethods(['resolve']) ->disableOriginalConstructor() ->getMock(); - $this->flatScopeResolver = $this->getMockBuilder('\Magento\Search\Model\ScopeResolver\FlatScopeResolver') + $this->flatScopeResolver = $this->getMockBuilder('\Magento\Indexer\Model\ScopeResolver\FlatScopeResolver') ->setMethods(['resolve']) ->disableOriginalConstructor() ->getMock(); diff --git a/app/code/Magento/CatalogSearch/etc/mview.xml b/app/code/Magento/CatalogSearch/etc/mview.xml index dac32882981e509d2df360180f9754f818352fa6..8e9fb605186ddb7392a5d87ff38efac9df69f7f4 100644 --- a/app/code/Magento/CatalogSearch/etc/mview.xml +++ b/app/code/Magento/CatalogSearch/etc/mview.xml @@ -6,7 +6,7 @@ */ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Mview/etc/mview.xsd"> - <view id="catalogsearch_fulltext" class="Magento\CatalogSearch\Model\Indexer\Fulltext" group="indexer"> + <view id="catalogsearch_fulltext" class="\Magento\CatalogSearch\Model\Indexer\Mview\Action" group="indexer"> <subscriptions> <table name="catalog_product_entity" entity_column="entity_id" /> <table name="catalog_product_entity_int" entity_column="entity_id" /> diff --git a/app/code/Magento/Indexer/Model/IndexStructure.php b/app/code/Magento/Indexer/Model/IndexStructure.php index d7c673cf504654d05eae352fb49e2d67d19cf887..0443b6deecd771009f0905145464c067c71bf34d 100644 --- a/app/code/Magento/Indexer/Model/IndexStructure.php +++ b/app/code/Magento/Indexer/Model/IndexStructure.php @@ -11,8 +11,8 @@ use Magento\Framework\App\Resource; use Magento\Framework\DB\Adapter\AdapterInterface; use Magento\Framework\DB\Ddl\Table; use Magento\Framework\Search\Request\Dimension; -use Magento\Search\Model\ScopeResolver\FlatScopeResolver; -use Magento\Search\Model\ScopeResolver\IndexScopeResolver; +use Magento\Indexer\Model\ScopeResolver\FlatScopeResolver; +use Magento\Indexer\Model\ScopeResolver\IndexScopeResolver; class IndexStructure { @@ -21,7 +21,7 @@ class IndexStructure */ private $resource; /** - * @var IndexScopeResolver + * @var \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver */ private $indexScopeResolver; /** @@ -41,7 +41,7 @@ class IndexStructure /** * @param Resource|Resource $resource * @param IndexScopeResolver $indexScopeResolver - * @param FlatScopeResolver $flatScopeResolver + * @param \Magento\Indexer\Model\ScopeResolver\FlatScopeResolver $flatScopeResolver * @param array $columnTypesMap */ public function __construct( diff --git a/app/code/Magento/Indexer/Model/SaveHandler/IndexerHandler.php b/app/code/Magento/Indexer/Model/SaveHandler/IndexerHandler.php index 9059a96aadf5659a1e227e336bd85c7a550c318f..37257f1f560714816e3b61637141ad44a4c65c89 100644 --- a/app/code/Magento/Indexer/Model/SaveHandler/IndexerHandler.php +++ b/app/code/Magento/Indexer/Model/SaveHandler/IndexerHandler.php @@ -11,8 +11,8 @@ use Magento\Framework\IndexerInterface; use Magento\Indexer\Model\IndexStructure; use Magento\Framework\Search\Request\Dimension; use Magento\Framework\Search\Request\IndexScopeResolverInterface; -use Magento\Search\Model\ScopeResolver\FlatScopeResolver; -use Magento\Search\Model\ScopeResolver\IndexScopeResolver; +use Magento\Indexer\Model\ScopeResolver\FlatScopeResolver; +use Magento\Indexer\Model\ScopeResolver\IndexScopeResolver; class IndexerHandler implements IndexerInterface { @@ -60,8 +60,8 @@ class IndexerHandler implements IndexerInterface * @param IndexStructure $indexStructure * @param Resource $resource * @param Batch $batch - * @param IndexScopeResolver $indexScopeResolver - * @param FlatScopeResolver $flatScopeResolver + * @param \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver $indexScopeResolver + * @param \Magento\Indexer\Model\ScopeResolver\FlatScopeResolver $flatScopeResolver * @param array $data * @param int $batchSize */ diff --git a/app/code/Magento/Search/Model/ScopeResolver/FlatScopeResolver.php b/app/code/Magento/Indexer/Model/ScopeResolver/FlatScopeResolver.php similarity index 89% rename from app/code/Magento/Search/Model/ScopeResolver/FlatScopeResolver.php rename to app/code/Magento/Indexer/Model/ScopeResolver/FlatScopeResolver.php index 98241dae0b2e6ccb8715c84cf16c9ab6827b14c5..8e415be17131e8340e5ccbc0b30722469dc825ca 100644 --- a/app/code/Magento/Search/Model/ScopeResolver/FlatScopeResolver.php +++ b/app/code/Magento/Indexer/Model/ScopeResolver/FlatScopeResolver.php @@ -4,10 +4,11 @@ * See COPYING.txt for license details. */ -namespace Magento\Search\Model\ScopeResolver; +namespace Magento\Indexer\Model\ScopeResolver; use Magento\Framework\Search\Request\Dimension; use Magento\Framework\Search\Request\IndexScopeResolverInterface; +use Magento\Indexer\Model\ScopeResolver\IndexScopeResolver; class FlatScopeResolver implements IndexScopeResolverInterface { diff --git a/app/code/Magento/Search/Model/ScopeResolver/IndexScopeResolver.php b/app/code/Magento/Indexer/Model/ScopeResolver/IndexScopeResolver.php similarity index 97% rename from app/code/Magento/Search/Model/ScopeResolver/IndexScopeResolver.php rename to app/code/Magento/Indexer/Model/ScopeResolver/IndexScopeResolver.php index 381f20c79ed97310fb9afb2c3ba3cf0954f2e428..696d6af0041b2dd1695b56b5a49c08a7f21ca7ce 100644 --- a/app/code/Magento/Search/Model/ScopeResolver/IndexScopeResolver.php +++ b/app/code/Magento/Indexer/Model/ScopeResolver/IndexScopeResolver.php @@ -4,7 +4,7 @@ * See COPYING.txt for license details. */ -namespace Magento\Search\Model\ScopeResolver; +namespace Magento\Indexer\Model\ScopeResolver; use Magento\Framework\App\Resource; diff --git a/app/code/Magento/Indexer/Test/Unit/Model/IndexStructureTest.php b/app/code/Magento/Indexer/Test/Unit/Model/IndexStructureTest.php index a6884d22d03bf136b28200a0df6e8ace767bf9a3..aa002ea18a56c384eccbf2c121d2e4e691a6cd79 100644 --- a/app/code/Magento/Indexer/Test/Unit/Model/IndexStructureTest.php +++ b/app/code/Magento/Indexer/Test/Unit/Model/IndexStructureTest.php @@ -16,12 +16,12 @@ use \Magento\Framework\TestFramework\Unit\Helper\ObjectManager; class IndexStructureTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\Search\Model\ScopeResolver\IndexScopeResolver|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver|\PHPUnit_Framework_MockObject_MockObject */ private $indexScopeResolver; /** - * @var \Magento\Search\Model\ScopeResolver\FlatScopeResolver|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Indexer\Model\ScopeResolver\FlatScopeResolver|\PHPUnit_Framework_MockObject_MockObject */ private $flatScopeResolver; @@ -53,11 +53,11 @@ class IndexStructureTest extends \PHPUnit_Framework_TestCase ->method('getConnection') ->with('write') ->willReturn($this->adapter); - $this->indexScopeResolver = $this->getMockBuilder('\Magento\Search\Model\ScopeResolver\IndexScopeResolver') + $this->indexScopeResolver = $this->getMockBuilder('\Magento\Indexer\Model\ScopeResolver\IndexScopeResolver') ->setMethods(['resolve']) ->disableOriginalConstructor() ->getMock(); - $this->flatScopeResolver = $this->getMockBuilder('\Magento\Search\Model\ScopeResolver\FlatScopeResolver') + $this->flatScopeResolver = $this->getMockBuilder('\Magento\Indexer\Model\ScopeResolver\FlatScopeResolver') ->setMethods(['resolve']) ->disableOriginalConstructor() ->getMock(); diff --git a/app/code/Magento/Search/Test/Unit/Model/ScopeResolver/IndexScopeResolverTest.php b/app/code/Magento/Indexer/Test/Unit/Model/ScopeResolver/IndexScopeResolverTest.php similarity index 93% rename from app/code/Magento/Search/Test/Unit/Model/ScopeResolver/IndexScopeResolverTest.php rename to app/code/Magento/Indexer/Test/Unit/Model/ScopeResolver/IndexScopeResolverTest.php index 9c3dc151b999884c0348e29d5d9b3c90029955d3..a64005d658ebac18cc46d6cdaf3f1b300c44c54e 100644 --- a/app/code/Magento/Search/Test/Unit/Model/ScopeResolver/IndexScopeResolverTest.php +++ b/app/code/Magento/Indexer/Test/Unit/Model/ScopeResolver/IndexScopeResolverTest.php @@ -4,13 +4,13 @@ * See COPYING.txt for license details. */ -namespace Magento\Search\Test\Unit\Model\ScopeResolver; +namespace Magento\Indexer\Test\Unit\Model\ScopeResolver; use Magento\Framework\Search\Request\Dimension; use \Magento\Framework\TestFramework\Unit\Helper\ObjectManager; /** - * Test for \Magento\Search\Model\ScopeResolver\IndexScopeResolver + * Test for \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver */ class IndexScopeResolverTest extends \PHPUnit_Framework_TestCase { @@ -25,7 +25,7 @@ class IndexScopeResolverTest extends \PHPUnit_Framework_TestCase private $resource; /** - * @var \Magento\Search\Model\ScopeResolver\IndexScopeResolver + * @var \Magento\Indexer\Model\ScopeResolver\IndexScopeResolver */ private $target; @@ -45,7 +45,7 @@ class IndexScopeResolverTest extends \PHPUnit_Framework_TestCase $objectManager = new ObjectManager($this); $this->target = $objectManager->getObject( - '\Magento\Search\Model\ScopeResolver\IndexScopeResolver', + '\Magento\Indexer\Model\ScopeResolver\IndexScopeResolver', [ 'resource' => $this->resource, 'scopeResolver' => $this->scopeResolver diff --git a/app/code/Magento/Indexer/composer.json b/app/code/Magento/Indexer/composer.json index b3d895056ef1cdccd1e683a3d5477c78a2fb738a..b7f27e0e6bf74fb4f9739d465afb670ca251651c 100644 --- a/app/code/Magento/Indexer/composer.json +++ b/app/code/Magento/Indexer/composer.json @@ -5,7 +5,6 @@ "php": "~5.5.0|~5.6.0", "magento/module-store": "0.74.0-beta16", "magento/module-backend": "0.74.0-beta16", - "magento/module-search": "0.74.0-beta16", "magento/module-page-cache": "0.74.0-beta16", "magento/framework": "0.74.0-beta16", "magento/magento-composer-installer": "*" diff --git a/app/code/Magento/Indexer/etc/module.xml b/app/code/Magento/Indexer/etc/module.xml index 3eb6e8433c1cee29f3f4d8e46ab94bb28196ca64..f03aca19f0cc4ce32b6ce1b4b168d3d1ab391c37 100644 --- a/app/code/Magento/Indexer/etc/module.xml +++ b/app/code/Magento/Indexer/etc/module.xml @@ -9,7 +9,6 @@ <module name="Magento_Indexer" setup_version="2.0.0"> <sequence> <module name="Magento_Store"/> - <module name="Magento_Search"/> </sequence> </module> </config> diff --git a/app/code/Magento/Search/Api/SearchInterface.php b/app/code/Magento/Search/Api/SearchInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..4e53ba17fde129c834b3f319c96c3fc14494440f --- /dev/null +++ b/app/code/Magento/Search/Api/SearchInterface.php @@ -0,0 +1,20 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Search\Api; + +/** + * @api + */ +interface SearchInterface +{ + /** + * Make Full Text Search and return found Documents + * + * @param \Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria + * @return \Magento\Framework\Api\Search\SearchResultInterface + */ + public function search(\Magento\Framework\Api\Search\SearchCriteriaInterface $searchCriteria); +} diff --git a/app/code/Magento/Search/Model/Search.php b/app/code/Magento/Search/Model/Search.php new file mode 100644 index 0000000000000000000000000000000000000000..58f6d2a6c39d48e5d8fa0e8390875a091d62877c --- /dev/null +++ b/app/code/Magento/Search/Model/Search.php @@ -0,0 +1,102 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Search\Model; + +use Magento\Framework\Api\Search\SearchCriteriaInterface; +use Magento\Framework\App\Config\ScopeConfigInterface; +use Magento\Framework\Search\Request\Builder; +use Magento\Framework\Search\SearchEngineInterface; +use Magento\Search\Api\SearchInterface; +use Magento\Store\Model\ScopeInterface; +use Magento\Store\Model\StoreManagerInterface; + +class Search implements SearchInterface +{ + /** + * @var Builder + */ + private $requestBuilder; + + /** + * @var StoreManagerInterface + */ + private $storeManager; + + /** + * @var SearchEngineInterface + */ + private $searchEngine; + + /** + * @var SearchResponseBuilder + */ + private $searchResponseBuilder; + + /** + * @param Builder $requestBuilder + * @param StoreManagerInterface $storeManager + * @param SearchEngineInterface $searchEngine + * @param SearchResponseBuilder $searchResponseBuilder + */ + public function __construct( + Builder $requestBuilder, + StoreManagerInterface $storeManager, + SearchEngineInterface $searchEngine, + SearchResponseBuilder $searchResponseBuilder + ) { + $this->requestBuilder = $requestBuilder; + $this->storeManager = $storeManager; + $this->searchEngine = $searchEngine; + $this->searchResponseBuilder = $searchResponseBuilder; + } + + /** + * {@inheritdoc} + */ + public function search(SearchCriteriaInterface $searchCriteria) + { + $this->requestBuilder->setRequestName($searchCriteria->getRequestName()); + + $storeId = $this->storeManager->getStore(true)->getId(); + $this->requestBuilder->bindDimension('scope', $storeId); + + foreach ($searchCriteria->getFilterGroups() as $filterGroup) { + foreach ($filterGroup->getFilters() as $filter) { + $this->addFieldToFilter($filter->getField(), $filter->getValue()); + } + } + + $this->requestBuilder->setFrom($searchCriteria->getCurrentPage() * $searchCriteria->getPageSize()); + $this->requestBuilder->setSize($searchCriteria->getPageSize()); + $request = $this->requestBuilder->create(); + $searchResponse = $this->searchEngine->search($request); + + return $this->searchResponseBuilder->build($searchResponse) + ->setSearchCriteria($searchCriteria); + } + + /** + * Apply attribute filter to facet collection + * + * @param string $field + * @param null $condition + * @return $this + */ + private function addFieldToFilter($field, $condition = null) + { + if (!is_array($condition) || !in_array(key($condition), ['from', 'to'])) { + $this->requestBuilder->bind($field, $condition); + } else { + if (!empty($condition['from'])) { + $this->requestBuilder->bind("{$field}.from", $condition['from']); + } + if (!empty($condition['to'])) { + $this->requestBuilder->bind("{$field}.to", $condition['to']); + } + } + return $this; + } +} diff --git a/app/code/Magento/Catalog/Model/SearchResponseBuilder.php b/app/code/Magento/Search/Model/SearchResponseBuilder.php similarity index 98% rename from app/code/Magento/Catalog/Model/SearchResponseBuilder.php rename to app/code/Magento/Search/Model/SearchResponseBuilder.php index 36e552b32409e908a1a71e79902a26582f7aeeb7..bf827763ebb6987848f82b772fe2c1747f8ea543 100644 --- a/app/code/Magento/Catalog/Model/SearchResponseBuilder.php +++ b/app/code/Magento/Search/Model/SearchResponseBuilder.php @@ -3,7 +3,7 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\Catalog\Model; +namespace Magento\Search\Model; use Magento\Framework\Api\Search\SearchResultInterface; use Magento\Framework\Api\Search\DocumentFactory; diff --git a/app/code/Magento/Catalog/Test/Unit/Model/SearchResponseBuilderTest.php b/app/code/Magento/Search/Test/Unit/Model/SearchResponseBuilderTest.php similarity index 96% rename from app/code/Magento/Catalog/Test/Unit/Model/SearchResponseBuilderTest.php rename to app/code/Magento/Search/Test/Unit/Model/SearchResponseBuilderTest.php index 72021021884e68fbe193b6eb6177b2608742d558..d0e3b7f183d0c8be2f540144826fe02b5ce25206 100644 --- a/app/code/Magento/Catalog/Test/Unit/Model/SearchResponseBuilderTest.php +++ b/app/code/Magento/Search/Test/Unit/Model/SearchResponseBuilderTest.php @@ -3,7 +3,7 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ -namespace Magento\Catalog\Test\Unit\Model; +namespace Magento\Search\Test\Unit\Model; use Magento\Framework\Api\Search\SearchResultInterface; use Magento\Framework\Search\Response\QueryResponse; @@ -12,7 +12,7 @@ use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; class SearchResponseBuilderTest extends \PHPUnit_Framework_TestCase { /** - * @var \Magento\Catalog\Model\SearchResponseBuilder + * @var \Magento\Search\Model\SearchResponseBuilder */ private $model; @@ -36,7 +36,7 @@ class SearchResponseBuilderTest extends \PHPUnit_Framework_TestCase ->disableOriginalConstructor() ->getMock(); - $this->model = (new ObjectManager($this))->getObject('Magento\Catalog\Model\SearchResponseBuilder', [ + $this->model = (new ObjectManager($this))->getObject('Magento\Search\Model\SearchResponseBuilder', [ 'documentFactory' => $this->documentFactory, 'searchResultFactory' => $this->searchResultFactory, ]); diff --git a/app/code/Magento/Search/Test/Unit/Model/SearchTest.php b/app/code/Magento/Search/Test/Unit/Model/SearchTest.php new file mode 100644 index 0000000000000000000000000000000000000000..02af8490fcc954117b6b555f3573a0a2ee9859ec --- /dev/null +++ b/app/code/Magento/Search/Test/Unit/Model/SearchTest.php @@ -0,0 +1,150 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Search\Test\Unit\Model; + +use Magento\Catalog\Model\Layer\Filter\Dynamic\AlgorithmFactory; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; +use Magento\Store\Model\ScopeInterface; + +class SearchTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Search\Model\Search + */ + protected $model; + + /** + * @var \Magento\Framework\Search\Request\Builder|\PHPUnit_Framework_MockObject_MockObject + */ + protected $requestBuilder; + + /** + * @var \Magento\Search\Model\SearchEngine|\PHPUnit_Framework_MockObject_MockObject + */ + protected $searchEngine; + + /** + * @var \Magento\Search\Model\SearchResponseBuilder|\PHPUnit_Framework_MockObject_MockObject + */ + protected $searchResponseBuilder; + + /** + * @var \Magento\Store\Model\StoreManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $storeManager; + + protected function setUp() + { + $objectManager = new ObjectManager($this); + + $this->requestBuilder = $this->getMockBuilder('Magento\Framework\Search\Request\Builder') + ->disableOriginalConstructor() + ->getMock(); + + $this->searchEngine = $this->getMockBuilder('Magento\Search\Model\SearchEngine') + ->disableOriginalConstructor() + ->getMock(); + + $this->searchResponseBuilder = $this->getMockBuilder('Magento\Search\Model\SearchResponseBuilder') + ->disableOriginalConstructor() + ->getMock(); + + $this->storeManager = $this->getMockBuilder('Magento\Store\Model\StoreManagerInterface') + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $this->model = $objectManager->getObject('Magento\Search\Model\Search', [ + 'requestBuilder' => $this->requestBuilder, + 'searchEngine' => $this->searchEngine, + 'searchResponseBuilder' => $this->searchResponseBuilder, + 'storeManager' => $this->storeManager, + ]); + } + + public function testSearch() + { + $requestName = 'requestName'; + $storeId = 333; + $filterField = 'filterField'; + $filterValue = 'filterValue'; + + $filter = $this->getMockBuilder('Magento\Framework\Api\Filter') + ->disableOriginalConstructor() + ->getMock(); + $filter->expects($this->once()) + ->method('getField') + ->willReturn($filterField); + $filter->expects($this->once()) + ->method('getValue') + ->willReturn($filterValue); + + $filterGroup = $this->getMockBuilder('Magento\Framework\Api\Search\FilterGroup') + ->disableOriginalConstructor() + ->getMock(); + $filterGroup->expects($this->once()) + ->method('getFilters') + ->willReturn([$filter]); + + $searchCriteria = $this->getMockBuilder('Magento\Framework\Api\Search\SearchCriteriaInterface') + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + $searchCriteria->expects($this->once()) + ->method('getRequestName') + ->willReturn($requestName); + $searchCriteria->expects($this->once()) + ->method('getFilterGroups') + ->willReturn([$filterGroup]); + + $store = $this->getMockBuilder('Magento\Store\Model\Store') + ->disableOriginalConstructor() + ->getMock(); + $store->expects($this->once()) + ->method('getId') + ->willReturn($storeId); + + $searchResult = $this->getMockBuilder('Magento\Framework\Api\Search\SearchResult') + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $request = $this->getMockBuilder('Magento\Framework\Search\RequestInterface') + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $response = $this->getMockBuilder('Magento\Framework\Search\ResponseInterface') + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $this->requestBuilder->expects($this->once()) + ->method('setRequestName') + ->with($requestName); + $this->requestBuilder->expects($this->once()) + ->method('bindDimension') + ->with('scope', $storeId); + $this->requestBuilder->expects($this->any()) + ->method('bind'); + $this->requestBuilder->expects($this->once()) + ->method('create') + ->willReturn($request); + + $this->searchEngine->expects($this->once()) + ->method('search') + ->with($request) + ->willReturn($response); + + $this->searchResponseBuilder->expects($this->once()) + ->method('build') + ->with($response) + ->willReturn($searchResult); + + $this->storeManager->expects($this->once()) + ->method('getStore') + ->willReturn($store); + + $searchResult = $this->model->search($searchCriteria); + + $this->assertInstanceOf('Magento\Framework\Api\Search\SearchResultInterface', $searchResult); + } +} diff --git a/app/code/Magento/Search/etc/di.xml b/app/code/Magento/Search/etc/di.xml index a8b7dfd5bc687879ef00d13673fae36764758d81..26f8d94c1a502521dd3787da8069527f823471cd 100644 --- a/app/code/Magento/Search/etc/di.xml +++ b/app/code/Magento/Search/etc/di.xml @@ -7,6 +7,7 @@ --> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd"> + <preference for="Magento\Search\Api\SearchInterface" type="Magento\Search\Model\Search"/> <type name="Magento\Framework\Module\Setup\Migration"> <arguments> <argument name="compositeModules" xsi:type="array"> diff --git a/app/code/Magento/Search/etc/webapi.xml b/app/code/Magento/Search/etc/webapi.xml new file mode 100644 index 0000000000000000000000000000000000000000..d06beccfa8d80ad2d498bbbaaaa41047d800e3a5 --- /dev/null +++ b/app/code/Magento/Search/etc/webapi.xml @@ -0,0 +1,18 @@ +<?xml version="1.0"?> +<!-- +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +--> +<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="../../../../../app/code/Magento/Webapi/etc/webapi.xsd"> + + <route url="/V1/search" method="GET"> + <service class="Magento\Search\Api\SearchInterface" method="search"/> + <resources> + <resource ref="anonymous" /> + </resources> + </route> + +</routes> diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFilesTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFilesTest.php new file mode 100644 index 0000000000000000000000000000000000000000..2a69f64be343ee3f155b2862cc2f227b5ad3b1b5 --- /dev/null +++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFilesTest.php @@ -0,0 +1,104 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Theme\Test\Unit\Controller\Adminhtml\System\Design\Wysiwyg\Files; + +class DeleteFilesTest extends \PHPUnit_Framework_TestCase +{ + /** @var \Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg\Files */ + protected $controller; + + /** @var \PHPUnit_Framework_MockObject_MockObject|\PHPUnit_Framework_MockObject_MockObject*/ + protected $objectManager; + + /** @var \Magento\Theme\Helper\Storage|\PHPUnit_Framework_MockObject_MockObject */ + protected $storage; + + /** @var \Magento\Framework\App\RequestInterface|\PHPUnit_Framework_MockObject_MockObject */ + protected $request; + + /** @var \Magento\Framework\App\Response\Http|\PHPUnit_Framework_MockObject_MockObject */ + protected $response; + + public function setUp() + { + $this->objectManager = $this->getMock('Magento\Framework\ObjectManagerInterface'); + $this->storage = $this->getMock('Magento\Theme\Model\Wysiwyg\Storage', [], [], '', false); + $this->response = $this->getMock('Magento\Framework\App\Response\Http', [], [], '', false); + $this->request = $this->getMockForAbstractClass( + 'Magento\Framework\App\RequestInterface', + [], + '', + false, + false, + true, + ['isPost', 'getParam'] + ); + + $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->controller = $helper->getObject( + 'Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg\Files\DeleteFiles', + [ + 'objectManager' => $this->objectManager, + 'request' => $this->request, + 'response' => $this->response, + ] + ); + } + + public function testExecuteWithWrongRequest() + { + $this->request->expects($this->once()) + ->method('isPost') + ->willReturn(false); + + $jsonData = $this->getMock('Magento\Framework\Json\Helper\Data', [], [], '', false); + $jsonData->expects($this->once()) + ->method('jsonEncode') + ->with(['error' => true, 'message' => 'Wrong request']) + ->willReturn('{"error":"true","message":"Wrong request"}'); + + $this->objectManager->expects($this->once()) + ->method('get') + ->with('Magento\Framework\Json\Helper\Data') + ->willReturn($jsonData); + + $this->response->expects($this->once()) + ->method('representJson') + ->with('{"error":"true","message":"Wrong request"}'); + + $this->controller->execute(); + } + + public function testExecute() + { + $this->request->expects($this->once()) + ->method('isPost') + ->willReturn(true); + $this->request->expects($this->once()) + ->method('getParam') + ->with('files') + ->willReturn('{"files":"file"}'); + + $jsonData = $this->getMock('Magento\Framework\Json\Helper\Data', [], [], '', false); + $jsonData->expects($this->once()) + ->method('jsonDecode') + ->with('{"files":"file"}') + ->willReturn(['files' => 'file']); + $this->objectManager->expects($this->at(0)) + ->method('get') + ->with('Magento\Framework\Json\Helper\Data') + ->willReturn($jsonData); + $this->objectManager->expects($this->at(1)) + ->method('get') + ->with('Magento\Theme\Model\Wysiwyg\Storage') + ->willReturn($this->storage); + $this->storage->expects($this->once()) + ->method('deleteFile') + ->with('file'); + + $this->controller->execute(); + } +} diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFolderTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFolderTest.php new file mode 100644 index 0000000000000000000000000000000000000000..9bd042cfe2e5864a6f86e5afa848ad63b9ca1a79 --- /dev/null +++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/DeleteFolderTest.php @@ -0,0 +1,71 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Theme\Test\Unit\Controller\Adminhtml\System\Design\Wysiwyg\Files; + +class DeleteFolderTest extends \PHPUnit_Framework_TestCase +{ + /** @var \Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg\Files */ + protected $controller; + + /** @var \PHPUnit_Framework_MockObject_MockObject|\PHPUnit_Framework_MockObject_MockObject*/ + protected $objectManager; + + /** @var \Magento\Framework\App\Response\Http|\PHPUnit_Framework_MockObject_MockObject */ + protected $response; + + /** @var \Magento\Theme\Helper\Storage|\PHPUnit_Framework_MockObject_MockObject */ + protected $storage; + + /** @var \Magento\Theme\Helper\Storage|\PHPUnit_Framework_MockObject_MockObject */ + protected $storageHelper; + + public function setUp() + { + $this->objectManager = $this->getMock('Magento\Framework\ObjectManagerInterface'); + $this->response = $this->getMock('Magento\Framework\App\Response\Http', [], [], '', false); + $this->storage = $this->getMock('Magento\Theme\Model\Wysiwyg\Storage', [], [], '', false); + $this->storageHelper = $this->getMock('Magento\Theme\Helper\Storage', [], [], '', false); + + $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->controller = $helper->getObject( + 'Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg\Files\DeleteFolder', + [ + 'objectManager' => $this->objectManager, + 'response' => $this->response, + 'storage' => $this->storageHelper + ] + ); + } + + public function testExecute() + { + $this->storageHelper->expects($this->once()) + ->method('getCurrentPath') + ->willReturn('/current/path/'); + + $this->objectManager->expects($this->at(0)) + ->method('get') + ->with('Magento\Theme\Model\Wysiwyg\Storage') + ->willReturn($this->storage); + $this->storage->expects($this->once()) + ->method('deleteDirectory') + ->with('/current/path/') + ->willThrowException(new \Exception('Message')); + + $jsonData = $this->getMock('Magento\Framework\Json\Helper\Data', [], [], '', false); + $jsonData->expects($this->once()) + ->method('jsonEncode') + ->with(['error' => true, 'message' => 'Message']) + ->willReturn('{"error":"true","message":"Message"}'); + + $this->objectManager->expects($this->at(1)) + ->method('get') + ->with('Magento\Framework\Json\Helper\Data') + ->willReturn($jsonData); + + $this->controller->execute(); + } +} diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/IndexTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/IndexTest.php new file mode 100644 index 0000000000000000000000000000000000000000..63884649f39f4baf66a5886619757abb381a529a --- /dev/null +++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/IndexTest.php @@ -0,0 +1,39 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Theme\Test\Unit\Controller\Adminhtml\System\Design\Wysiwyg\Files; + +class IndexTest extends \PHPUnit_Framework_TestCase +{ + /** @var \Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg\Files */ + protected $controller; + + /** @var \Magento\Framework\App\ViewInterface|\PHPUnit_Framework_MockObject_MockObject */ + protected $view; + + public function setUp() + { + $this->view = $this->getMock('\Magento\Framework\App\ViewInterface', [], [], '', false); + + $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->controller = $helper->getObject( + 'Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg\Files\Index', + [ + 'view' => $this->view, + ] + ); + } + + public function testExecute() + { + $this->view ->expects($this->once()) + ->method('loadLayout') + ->with('overlay_popup'); + $this->view ->expects($this->once()) + ->method('renderLayout'); + + $this->controller->execute(); + } +} diff --git a/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/OnInsertTest.php b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/OnInsertTest.php new file mode 100644 index 0000000000000000000000000000000000000000..0061013ed728c00cc216b889f9dcd4ec2b4e28c4 --- /dev/null +++ b/app/code/Magento/Theme/Test/Unit/Controller/Adminhtml/System/Design/Wysiwyg/Files/OnInsertTest.php @@ -0,0 +1,59 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Theme\Test\Unit\Controller\Adminhtml\System\Design\Wysiwyg\Files; + +class OnInsertTest extends \PHPUnit_Framework_TestCase +{ + /** @var \Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg\Files */ + protected $controller; + + /** @var \Magento\Framework\App\ViewInterface|\PHPUnit_Framework_MockObject_MockObject */ + protected $view; + + /** @var \PHPUnit_Framework_MockObject_MockObject|\PHPUnit_Framework_MockObject_MockObject */ + protected $objectManager; + + /** @var \Magento\Theme\Helper\Storage|\PHPUnit_Framework_MockObject_MockObject */ + protected $storageHelper; + + /** @var \Magento\Framework\App\Response\Http|\PHPUnit_Framework_MockObject_MockObject */ + protected $response; + + public function setUp() + { + $this->objectManager = $this->getMock('Magento\Framework\ObjectManagerInterface'); + $this->view = $this->getMock('\Magento\Framework\App\ViewInterface', [], [], '', false); + $this->storageHelper = $this->getMock('Magento\Theme\Helper\Storage', [], [], '', false); + $this->response = $this->getMock('Magento\Framework\App\Response\Http', ['setBody'], [], '', false); + + $helper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); + $this->controller = $helper->getObject( + 'Magento\Theme\Controller\Adminhtml\System\Design\Wysiwyg\Files\OnInsert', + [ + 'objectManager' => $this->objectManager, + 'view' => $this->view, + 'response' => $this->response + ] + ); + } + + public function testExecute() + { + $this->objectManager->expects($this->once()) + ->method('get') + ->with('Magento\Theme\Helper\Storage') + ->willReturn($this->storageHelper); + $this->storageHelper + ->expects($this->once()) + ->method('getRelativeUrl') + ->willReturn('http://relative.url/'); + $this->response->expects($this->once()) + ->method('setBody') + ->with('http://relative.url/'); + + $this->controller->execute(); + } +} diff --git a/app/code/Magento/Wishlist/Test/Unit/Model/ItemTest.php b/app/code/Magento/Wishlist/Test/Unit/Model/ItemTest.php index 76b46f13538da68b31514bce752b669cda2b9194..f31a0ced59d6143fc7f1db6a97f1f3d6338f2423 100644 --- a/app/code/Magento/Wishlist/Test/Unit/Model/ItemTest.php +++ b/app/code/Magento/Wishlist/Test/Unit/Model/ItemTest.php @@ -165,7 +165,7 @@ class ItemTest extends \PHPUnit_Framework_TestCase $this->model->addOption($option); $this->assertEquals(1, count($this->model->getOptions())); $this->model->removeOption($code); - $actualOptions = $this->model->getOptions(); + $actualOptions = $this->model->getOptions(); $actualOption = array_pop($actualOptions); $this->assertTrue($actualOption->isDeleted()); } @@ -185,7 +185,7 @@ class ItemTest extends \PHPUnit_Framework_TestCase ->getMock(); return [ ['first_key', ['code' => 'first_key', 'value' => 'first_data']], - ['second_key',$optionMock], + ['second_key', $optionMock], ['third_key', new \Magento\Framework\Object(['code' => 'third_key', 'product' => $productMock])], ]; } @@ -262,4 +262,63 @@ class ItemTest extends \PHPUnit_Framework_TestCase $this->assertFalse($result); } + + public function testSetAndSaveItemOptions() + { + $this->assertEmpty($this->model->getOptions()); + $firstOptionMock = $this->getMockBuilder('Magento\Wishlist\Model\Item\Option') + ->disableOriginalConstructor() + ->setMethods(['getCode', 'isDeleted', 'delete', '__wakeup']) + ->getMock(); + $firstOptionMock->expects($this->any()) + ->method('getCode') + ->willReturn('first_code'); + $firstOptionMock->expects($this->any()) + ->method('isDeleted') + ->willReturn(true); + $firstOptionMock->expects($this->once()) + ->method('delete'); + + $secondOptionMock = $this->getMockBuilder('Magento\Wishlist\Model\Item\Option') + ->disableOriginalConstructor() + ->setMethods(['getCode', 'save', '__wakeup']) + ->getMock(); + $secondOptionMock->expects($this->any()) + ->method('getCode') + ->willReturn('second_code'); + $secondOptionMock->expects($this->once()) + ->method('save'); + + $this->model->setOptions([$firstOptionMock, $secondOptionMock]); + $this->assertNull($this->model->isOptionsSaved()); + $this->model->saveItemOptions(); + $this->assertTrue($this->model->isOptionsSaved()); + } + + public function testGetProductWithException() + { + $this->setExpectedException('Magento\Framework\Exception\LocalizedException', __('Cannot specify product.')); + $this->model->getProduct(); + } + + public function testGetProduct() + { + $productId = 1; + $storeId = 0; + $this->model->setData('product_id', $productId); + $this->model->setData('store_id', $storeId); + $productMock = $this->getMockBuilder('Magento\Catalog\Model\Product') + ->disableOriginalConstructor() + ->getMock(); + $productMock->expects($this->any()) + ->method('setFinalPrice') + ->with(null); + $productMock->expects($this->any()) + ->method('setCustomOprtions') + ->with([]); + $this->productRepository->expects($this->once()) + ->method('getById') + ->willReturn($productMock); + $this->assertEquals($productMock, $this->model->getProduct()); + } } diff --git a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php index 8adda8f9d9b7322f3683bf5aba9bc6d56219b0c1..d33e1456bc363e80830d3d1a32229fbccaaebc69 100644 --- a/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php +++ b/dev/tests/api-functional/testsuite/Magento/Catalog/Api/ProductRepositoryInterfaceTest.php @@ -36,48 +36,6 @@ class ProductRepositoryInterfaceTest extends WebapiAbstract ], ]; - /** - * @magentoApiDataFixture Magento/Catalog/_files/product_simple.php - */ - public function testSearch() - { - $searchCriteria = [ - 'searchCriteria' => [ - 'search_term' => 'simple', - 'request_name' => 'quick_search_container', - 'filter_groups' => [], - 'page_size' => 20000000000000, - 'current_page' => 1, - ], - ]; - - $serviceInfo = [ - 'rest' => [ - 'resourcePath' => self::RESOURCE_PATH . '/search' . '?' . http_build_query($searchCriteria), - 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET, - ], - 'soap' => [ - 'service' => self::SERVICE_NAME, - 'serviceVersion' => self::SERVICE_VERSION, - 'operation' => self::SERVICE_NAME . 'Search', - ], - ]; - - $response = $this->_webApiCall($serviceInfo, $searchCriteria); - - $this->assertArrayHasKey('search_criteria', $response); - $this->assertArrayHasKey('total_count', $response); - $this->assertArrayHasKey('items', $response); - - $this->assertEquals($searchCriteria['searchCriteria'], $response['search_criteria']); - $this->assertTrue($response['total_count'] > 0); - $this->assertTrue(count($response['items']) > 0); - - $this->assertNotNull($response['items'][0]['id']); - $this->assertEquals('relevance', $response['items'][0]['custom_attributes'][0]['attribute_code']); - $this->assertTrue($response['items'][0]['custom_attributes'][0]['value'] > 0); - } - /** * @magentoApiDataFixture Magento/Catalog/_files/products_related.php */ diff --git a/dev/tests/api-functional/testsuite/Magento/Search/Api/SearchTest.php b/dev/tests/api-functional/testsuite/Magento/Search/Api/SearchTest.php new file mode 100644 index 0000000000000000000000000000000000000000..ae6fd1cfc39eb5b9577675a77ff15dd5a24cd802 --- /dev/null +++ b/dev/tests/api-functional/testsuite/Magento/Search/Api/SearchTest.php @@ -0,0 +1,70 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Search\Api; + +use Magento\TestFramework\TestCase\WebapiAbstract; + +class SearchTest extends WebapiAbstract +{ + const SERVICE_NAME = 'searchV1'; + const SERVICE_VERSION = 'V1'; + const RESOURCE_PATH = '/V1/search'; + + /** + * @magentoApiDataFixture Magento/Catalog/_files/product_simple.php + * @covers \Magento\Search\Model\Search::search + */ + public function testCatalogSearch() + { + $searchCriteria = [ + 'searchCriteria' => [ + 'request_name' => 'quick_search_container', + 'filter_groups' => [ + [ + 'filters' => [ + [ + 'field' => 'search_term', + 'value' => 'simple', + ], + [ + 'field' => 'price_dynamic_algorithm', + 'value' => 'auto', + ] + ] + ] + ], + 'page_size' => 20000000000000, + 'current_page' => 1, + ], + ]; + + $serviceInfo = [ + 'rest' => [ + 'resourcePath' => self::RESOURCE_PATH . '?' . http_build_query($searchCriteria), + 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET, + ], + 'soap' => [ + 'service' => self::SERVICE_NAME, + 'serviceVersion' => self::SERVICE_VERSION, + 'operation' => self::SERVICE_NAME . 'Search', + ], + ]; + + $response = $this->_webApiCall($serviceInfo, $searchCriteria); + + $this->assertArrayHasKey('search_criteria', $response); + $this->assertArrayHasKey('total_count', $response); + $this->assertArrayHasKey('items', $response); + + $this->assertEquals($searchCriteria['searchCriteria'], $response['search_criteria']); + $this->assertTrue($response['total_count'] > 0); + $this->assertTrue(count($response['items']) > 0); + + $this->assertNotNull($response['items'][0]['id']); + $this->assertEquals('relevance', $response['items'][0]['custom_attributes'][0]['attribute_code']); + $this->assertTrue($response['items'][0]['custom_attributes'][0]['value'] > 0); + } +} diff --git a/lib/internal/Magento/Framework/Api/Search/SearchCriteria.php b/lib/internal/Magento/Framework/Api/Search/SearchCriteria.php index 626e830864d9f4e6296f567f96a648e509f4d8b2..dece9d9876bade3198f2915607385994f21b552d 100644 --- a/lib/internal/Magento/Framework/Api/Search/SearchCriteria.php +++ b/lib/internal/Magento/Framework/Api/Search/SearchCriteria.php @@ -10,25 +10,8 @@ use Magento\Framework\Api\Search\SearchCriteriaInterface; class SearchCriteria extends BaseSearchCriteria implements SearchCriteriaInterface { - const SEARCH_TERM = 'search_term'; const REQUEST_NAME = 'request_name'; - /** - * {@inheritdoc} - */ - public function getSearchTerm() - { - return $this->_get(self::SEARCH_TERM); - } - - /** - * {@inheritdoc} - */ - public function setSearchTerm($searchTerm) - { - return $this->setData(self::SEARCH_TERM, $searchTerm); - } - /** * {@inheritdoc} */ diff --git a/lib/internal/Magento/Framework/Api/Search/SearchCriteriaInterface.php b/lib/internal/Magento/Framework/Api/Search/SearchCriteriaInterface.php index e952763d3fd93ca208a02325ac106ebbce01277c..1c8fe9772fb403957a06945e7e72938b300e9ef3 100644 --- a/lib/internal/Magento/Framework/Api/Search/SearchCriteriaInterface.php +++ b/lib/internal/Magento/Framework/Api/Search/SearchCriteriaInterface.php @@ -9,17 +9,6 @@ use Magento\Framework\Api\SearchCriteriaInterface as BaseSearchCriteriaInterface interface SearchCriteriaInterface extends BaseSearchCriteriaInterface { - /** - * @return string - */ - public function getSearchTerm(); - - /** - * @param string $searchTerm - * @return $this - */ - public function setSearchTerm($searchTerm); - /** * @return string */