159 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
namespace Magento\Elasticsearch\Model\Client;
 | 
						|
 | 
						|
use Magento\AdvancedSearch\Model\Client\ClientInterface;
 | 
						|
use Magento\Indexer\Model\Indexer;
 | 
						|
use Magento\TestFramework\Helper\Bootstrap;
 | 
						|
use Magento\Store\Model\StoreManagerInterface;
 | 
						|
use Magento\Elasticsearch\SearchAdapter\ConnectionManager;
 | 
						|
use Magento\Elasticsearch\Model\Config;
 | 
						|
use Magento\Elasticsearch\SearchAdapter\SearchIndexNameResolver;
 | 
						|
use Magento\TestModuleCatalogSearch\Model\SearchEngineVersionReader;
 | 
						|
use Magento\Framework\Search\EngineResolverInterface;
 | 
						|
 | 
						|
/**
 | 
						|
 * @magentoDbIsolation enabled
 | 
						|
 * @magentoAppIsolation enabled
 | 
						|
 * @magentoDataFixture Magento/Elasticsearch/_files/configurable_products.php
 | 
						|
 */
 | 
						|
class ElasticsearchTest extends \PHPUnit\Framework\TestCase
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var ConnectionManager
 | 
						|
     */
 | 
						|
    private $connectionManager;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var ClientInterface
 | 
						|
     */
 | 
						|
    private $client;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var StoreManagerInterface
 | 
						|
     */
 | 
						|
    private $storeManager;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var Config
 | 
						|
     */
 | 
						|
    private $clientConfig;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var SearchIndexNameResolver
 | 
						|
     */
 | 
						|
    private $searchIndexNameResolver;
 | 
						|
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        $objectManager = Bootstrap::getObjectManager();
 | 
						|
        $this->connectionManager = $objectManager->create(ConnectionManager::class);
 | 
						|
        $this->client = $this->connectionManager->getConnection();
 | 
						|
        $this->storeManager = $objectManager->create(StoreManagerInterface::class);
 | 
						|
        $this->clientConfig = $objectManager->create(Config::class);
 | 
						|
        $this->searchIndexNameResolver = $objectManager->create(SearchIndexNameResolver::class);
 | 
						|
        $indexer = $objectManager->create(Indexer::class);
 | 
						|
        $indexer->load('catalogsearch_fulltext');
 | 
						|
        $indexer->reindexAll();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Make sure that correct engine is set
 | 
						|
     */
 | 
						|
    protected function assertPreConditions(): void
 | 
						|
    {
 | 
						|
        $objectManager = Bootstrap::getObjectManager();
 | 
						|
        $currentEngine = $objectManager->get(EngineResolverInterface::class)->getCurrentSearchEngine();
 | 
						|
        $installedEngine = $objectManager->get(SearchEngineVersionReader::class)->getFullVersion();
 | 
						|
        $this->assertEquals(
 | 
						|
            $installedEngine,
 | 
						|
            $currentEngine,
 | 
						|
            sprintf(
 | 
						|
                'Search engine configuration "%s" is not compatible with the installed version',
 | 
						|
                $currentEngine
 | 
						|
            )
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param string $text
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    private function search($text)
 | 
						|
    {
 | 
						|
        $storeId = $this->storeManager->getDefaultStoreView()->getId();
 | 
						|
        $searchQuery = [
 | 
						|
            'index' => $this->searchIndexNameResolver->getIndexName($storeId, 'catalogsearch_fulltext'),
 | 
						|
            'type' => $this->clientConfig->getEntityType(),
 | 
						|
            'body' => [
 | 
						|
                'query' => [
 | 
						|
                    'bool' => [
 | 
						|
                        'minimum_should_match' => 1,
 | 
						|
                        'should' => [
 | 
						|
                            [
 | 
						|
                                'match' => [
 | 
						|
                                    '_all' => $text,
 | 
						|
                                ],
 | 
						|
                            ],
 | 
						|
                        ],
 | 
						|
                    ],
 | 
						|
                ],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
        $queryResult = $this->client->query($searchQuery);
 | 
						|
        return isset($queryResult['hits']['hits']) ? $queryResult['hits']['hits'] : [];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testSearchConfigurableProductBySimpleProductName()
 | 
						|
    {
 | 
						|
        $this->assertProductWithSkuFound('configurable', $this->search('Configurable Option'));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testSearchConfigurableProductBySimpleProductAttributeMultiselect()
 | 
						|
    {
 | 
						|
        $this->assertProductWithSkuFound('configurable', $this->search('dog'));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testSearchConfigurableProductBySimpleProductAttributeSelect()
 | 
						|
    {
 | 
						|
        $this->assertProductWithSkuFound('configurable', $this->search('chair'));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testSearchConfigurableProductBySimpleProductAttributeShortDescription()
 | 
						|
    {
 | 
						|
        $this->assertProductWithSkuFound('configurable', $this->search('simpledescription'));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Assert that product with SKU is present in response
 | 
						|
     *
 | 
						|
     * @param string $sku
 | 
						|
     * @param array $result
 | 
						|
     * @return bool
 | 
						|
     */
 | 
						|
    private function assertProductWithSkuFound($sku, array $result)
 | 
						|
    {
 | 
						|
        foreach ($result as $item) {
 | 
						|
            if ($item['_source']['sku'] == $sku) {
 | 
						|
                return true;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
}
 |