ReindexAllTest.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Elasticsearch\Model\Indexer;
  7. use Magento\Catalog\Api\ProductRepositoryInterface;
  8. use Magento\Indexer\Model\Indexer;
  9. use Magento\TestFramework\Helper\Bootstrap;
  10. use Magento\Store\Model\StoreManagerInterface;
  11. use Magento\Elasticsearch\SearchAdapter\ConnectionManager;
  12. use Magento\Elasticsearch\Model\Client\Elasticsearch as ElasticsearchClient;
  13. use Magento\Elasticsearch\Model\Config;
  14. use Magento\Elasticsearch\SearchAdapter\SearchIndexNameResolver;
  15. /**
  16. * Important: Please make sure that each integration test file works with unique elastic search index. In order to
  17. * achieve this, use @magentoConfigFixture to pass unique value for 'elasticsearch_index_prefix' for every test
  18. * method.
  19. * E.g. '@magentoConfigFixture current_store catalog/search/elasticsearch_index_prefix indexerhandlertest_configurable'
  20. *
  21. * @magentoDbIsolation disabled
  22. * @magentoAppIsolation enabled
  23. */
  24. class ReindexAllTest extends \PHPUnit\Framework\TestCase
  25. {
  26. /**
  27. * @var ConnectionManager
  28. */
  29. private $connectionManager;
  30. /**
  31. * @var ElasticsearchClient
  32. */
  33. private $client;
  34. /**
  35. * @var StoreManagerInterface
  36. */
  37. private $storeManager;
  38. /**
  39. * @var Config
  40. */
  41. private $clientConfig;
  42. /**
  43. * @var SearchIndexNameResolver
  44. */
  45. private $searchIndexNameResolver;
  46. /**
  47. * @var ProductRepositoryInterface
  48. */
  49. private $productRepository;
  50. protected function setUp()
  51. {
  52. $this->connectionManager = Bootstrap::getObjectManager()->create(ConnectionManager::class);
  53. $this->client = $this->connectionManager->getConnection();
  54. $this->storeManager = Bootstrap::getObjectManager()->create(StoreManagerInterface::class);
  55. $this->clientConfig = Bootstrap::getObjectManager()->create(Config::class);
  56. $this->searchIndexNameResolver = Bootstrap::getObjectManager()->create(SearchIndexNameResolver::class);
  57. $this->productRepository = Bootstrap::getObjectManager()->create(ProductRepositoryInterface::class);
  58. }
  59. /**
  60. * Test search of all products after full reindex
  61. *
  62. * @magentoConfigFixture default/catalog/search/engine elasticsearch6
  63. * @magentoConfigFixture current_store catalog/search/elasticsearch_index_prefix indexerhandlertest_configurable
  64. * @magentoDataFixture Magento/ConfigurableProduct/_files/configurable_products.php
  65. */
  66. public function testSearchAll()
  67. {
  68. $this->reindexAll();
  69. $result = $this->searchByName('Configurable Product');
  70. self::assertGreaterThanOrEqual(2, $result);
  71. }
  72. /**
  73. * Test search of specific product after full reindex
  74. *
  75. * @magentoConfigFixture default/catalog/search/engine elasticsearch6
  76. * @magentoConfigFixture current_store catalog/search/elasticsearch_index_prefix indexerhandlertest_configurable
  77. * @magentoDataFixture Magento/ConfigurableProduct/_files/configurable_products.php
  78. */
  79. public function testSearchSpecificProduct()
  80. {
  81. $this->reindexAll();
  82. $result = $this->searchByName('12345');
  83. self::assertCount(1, $result);
  84. $specificProduct = $this->productRepository->get('configurable_12345');
  85. self::assertEquals($specificProduct->getId(), $result[0]['_id']);
  86. }
  87. /**
  88. * @param string $text
  89. * @return array
  90. */
  91. private function searchByName($text)
  92. {
  93. $storeId = $this->storeManager->getDefaultStoreView()->getId();
  94. $searchQuery = [
  95. 'index' => $this->searchIndexNameResolver->getIndexName($storeId, 'catalogsearch_fulltext'),
  96. 'type' => $this->clientConfig->getEntityType(),
  97. 'body' => [
  98. 'query' => [
  99. 'bool' => [
  100. 'minimum_should_match' => 1,
  101. 'should' => [
  102. [
  103. 'match' => [
  104. 'name' => $text,
  105. ],
  106. ],
  107. ],
  108. ],
  109. ],
  110. ],
  111. ];
  112. $queryResult = $this->client->query($searchQuery);
  113. return isset($queryResult['hits']['hits']) ? $queryResult['hits']['hits'] : [];
  114. }
  115. /**
  116. * Make fulltext catalog search reindex
  117. *
  118. * @return void
  119. */
  120. private function reindexAll()
  121. {
  122. // Perform full reindex
  123. /** @var Indexer $indexer */
  124. $indexer = Bootstrap::getObjectManager()->create(Indexer::class);
  125. $indexer->load('catalogsearch_fulltext');
  126. $indexer->reindexAll();
  127. }
  128. }