33 private $requestBuilder;
45 protected function setUp()
52 $document = new \DOMDocument();
54 $requestConfig = $converter->convert($document);
60 $this->requestBuilder = $this->objectManager->create(
67 $indexer = $this->objectManager->create(\
Magento\Indexer\Model\Indexer::class);
68 $indexer->load(
'catalogsearch_fulltext');
79 return __DIR__ .
'/../../_files/requests.xml';
87 $currentEngine = $this->objectManager->get(EngineResolverInterface::class)->getCurrentSearchEngine();
88 $this->assertEquals($this->searchEngine, $currentEngine);
102 private function executeQuery()
105 $queryRequest = $this->requestBuilder->create();
107 $queryResponse = $this->adapter->query($queryRequest);
109 return $queryResponse;
116 private function assertProductIds($queryResponse, $expectedIds)
119 foreach ($queryResponse as $document) {
121 $actualIds[] = $document->getId();
125 $this->assertEquals($expectedIds, $actualIds);
132 private function assertOrderedProductIds($queryResponse, $expectedIds)
135 foreach ($queryResponse as $document) {
137 $actualIds[] = $document->getId();
139 $this->assertEquals($expectedIds, $actualIds);
147 $this->requestBuilder->bind(
'fulltext_search_query',
'socks');
148 $this->requestBuilder->setRequestName(
'one_match');
150 $queryResponse = $this->executeQuery();
152 $this->assertEquals(1, $queryResponse->count());
161 $expectedIds = [8, 7, 6, 5, 2];
165 $this->requestBuilder->bind(
'fulltext_search_query',
'shorts');
166 $this->requestBuilder->setRequestName(
'one_match');
167 $queryResponse = $this->executeQuery();
169 $this->assertEquals(5, $queryResponse->count());
170 $this->assertOrderedProductIds($queryResponse, $expectedIds);
178 $this->requestBuilder->bind(
'fulltext_search_query',
'peoples');
179 $this->requestBuilder->setRequestName(
'one_aggregations');
181 $queryResponse = $this->executeQuery();
183 $this->assertEquals(2, $queryResponse->count());
185 [
'weight_bucket',
'price_bucket',
'dynamic_price'],
186 $queryResponse->getAggregations()->getBucketNames()
195 $this->requestBuilder->bind(
'fulltext_search_query',
'socks');
196 $this->requestBuilder->bind(
'pidm_from', 11);
197 $this->requestBuilder->bind(
'pidm_to', 17);
198 $this->requestBuilder->bind(
'pidsh', 18);
199 $this->requestBuilder->setRequestName(
'one_match_filters');
201 $queryResponse = $this->executeQuery();
202 $this->assertEquals(1, $queryResponse->count());
212 $this->requestBuilder->bind(
'range_filter_from', 11);
213 $this->requestBuilder->bind(
'range_filter_to', 17);
214 $this->requestBuilder->setRequestName(
'range_filter');
216 $queryResponse = $this->executeQuery();
217 $this->assertEquals(3, $queryResponse->count());
227 $this->requestBuilder->bind(
'range_filter_to', 18);
228 $this->requestBuilder->setRequestName(
'range_filter_without_from_field');
230 $queryResponse = $this->executeQuery();
231 $this->assertEquals(4, $queryResponse->count());
241 $this->requestBuilder->bind(
'range_filter_from', 14);
242 $this->requestBuilder->setRequestName(
'range_filter_without_to_field');
244 $queryResponse = $this->executeQuery();
245 $this->assertEquals(4, $queryResponse->count());
255 $this->requestBuilder->bind(
'request.price', 18);
256 $this->requestBuilder->setRequestName(
'term_filter');
258 $queryResponse = $this->executeQuery();
259 $this->assertEquals(1, $queryResponse->count());
260 $this->assertEquals(4, $queryResponse->getIterator()->offsetGet(0)->getId());
270 $this->requestBuilder->bind(
'request.price', [17, 18]);
271 $this->requestBuilder->setRequestName(
'term_filter');
273 $queryResponse = $this->executeQuery();
274 $this->assertEquals(2, $queryResponse->count());
284 $expectedIds = [1, 3, 5];
285 $this->requestBuilder->bind(
'wildcard_filter',
're');
286 $this->requestBuilder->setRequestName(
'one_wildcard');
288 $queryResponse = $this->executeQuery();
289 $this->assertEquals(3, $queryResponse->count());
290 $this->assertProductIds($queryResponse, $expectedIds);
300 $this->requestBuilder->bind(
'wildcard_filter',
're');
301 $this->requestBuilder->setFrom(1);
302 $this->requestBuilder->setSize(2);
303 $this->requestBuilder->setRequestName(
'one_wildcard');
305 $queryResponse = $this->executeQuery();
306 $this->assertEquals(2, $queryResponse->count());
316 $expectedIds = [2, 3];
317 $this->requestBuilder->bind(
'must_range_filter1_from', 13);
318 $this->requestBuilder->bind(
'must_range_filter1_to', 22);
319 $this->requestBuilder->bind(
'should_term_filter1', 13);
320 $this->requestBuilder->bind(
'should_term_filter2', 15);
321 $this->requestBuilder->bind(
'should_term_filter3', 17);
322 $this->requestBuilder->bind(
'should_term_filter4', 18);
323 $this->requestBuilder->bind(
'not_term_filter1', 13);
324 $this->requestBuilder->bind(
'not_term_filter2', 18);
325 $this->requestBuilder->setRequestName(
'bool_filter');
327 $queryResponse = $this->executeQuery();
328 $this->assertEquals(count($expectedIds), $queryResponse->count());
329 $this->assertProductIds($queryResponse, $expectedIds);
340 $this->requestBuilder->bind(
'not_range_filter_from', 14);
341 $this->requestBuilder->bind(
'not_range_filter_to', 20);
342 $this->requestBuilder->bind(
'nested_not_term_filter', 13);
343 $this->requestBuilder->setRequestName(
'bool_filter_with_nested_bool_filter');
345 $queryResponse = $this->executeQuery();
346 $this->assertEquals(count($expectedIds), $queryResponse->count());
347 $this->assertProductIds($queryResponse, $expectedIds);
357 $expectedIds = [1, 5];
358 $this->requestBuilder->bind(
'nested_must_range_filter_from', 14);
359 $this->requestBuilder->bind(
'nested_must_range_filter_to', 18);
360 $this->requestBuilder->setRequestName(
'bool_filter_with_range_in_nested_negative_filter');
362 $queryResponse = $this->executeQuery();
363 $this->assertEquals(count($expectedIds), $queryResponse->count());
364 $this->assertProductIds($queryResponse, $expectedIds);
381 $expectedRecordsCount
383 $this->requestBuilder->bind(
'name_query', $nameQuery);
384 $this->requestBuilder->bind(
'description_query', $descriptionQuery);
385 $this->requestBuilder->bind(
'request.from_price', $rangeFilter[
'from']);
386 $this->requestBuilder->bind(
'request.to_price', $rangeFilter[
'to']);
387 $this->requestBuilder->setRequestName(
'advanced_search_test');
389 $queryResponse = $this->executeQuery();
390 $this->assertEquals($expectedRecordsCount, $queryResponse->count());
399 [
'white',
'shorts', [
'from' =>
'16',
'to' =>
'18'], 0],
400 [
'white',
'shorts',[
'from' =>
'12',
'to' =>
'18'], 1],
401 [
'black',
'tshirts', [
'from' =>
'12',
'to' =>
'20'], 0],
402 [
'shorts',
'green', [
'from' =>
'12',
'to' =>
'22'], 1],
404 [
'white',
' ', [
'from' =>
'12',
'to' =>
'22'], 1],
405 [
' ',
'green', [
'from' =>
'12',
'to' =>
'22'], 2]
413 public function testCustomFilterableAttribute()
416 $attribute = $this->objectManager->get(Attribute::class)
420 ->create(Collection::class)
426 ->create(Collection::class)
429 $this->requestBuilder->bind(
'select_attribute',
$selectOptions->getLastItem()->getId());
430 $this->requestBuilder->bind(
'multiselect_attribute',
$multiselectOptions->getLastItem()->getId());
431 $this->requestBuilder->bind(
'price.from', 98);
432 $this->requestBuilder->bind(
'price.to', 100);
433 $this->requestBuilder->bind(
'category_ids', 2);
434 $this->requestBuilder->setRequestName(
'filterable_custom_attributes');
435 $queryResponse = $this->executeQuery();
436 $this->assertEquals(1, $queryResponse->count());
447 'quick_search_container' => [
448 'quick_search_container',
451 'search_term' =>
'Simple Product',
454 'advanced_search_container' => [
455 'advanced_search_container',
458 'sku' =>
'simple_product',
461 'catalog_view_container' => [
462 'catalog_view_container',
480 public function testFilterByAttributeValues($requestName, $additionalData)
483 $attribute = $this->objectManager->get(Attribute::class)
486 $selectOptions1 = $this->objectManager
487 ->create(Collection::class)
491 $selectOptions2 = $this->objectManager
492 ->create(Collection::class)
494 $this->requestBuilder->bind(
'select_attribute_1', $selectOptions1->getLastItem()->getId());
495 $this->requestBuilder->bind(
'select_attribute_2', $selectOptions2->getLastItem()->getId());
497 foreach ($additionalData as $key =>
$value) {
498 $this->requestBuilder->bind($key,
$value);
500 $this->requestBuilder->setRequestName($requestName);
501 $queryResponse = $this->executeQuery();
502 $this->assertEquals(1, $queryResponse->count());
516 $this->requestBuilder->bind(
'date.from', $rangeFilter[
'from']);
517 $this->requestBuilder->bind(
'date.to', $rangeFilter[
'to']);
518 $this->requestBuilder->setRequestName(
'advanced_search_date_field');
520 $queryResponse = $this->executeQuery();
521 $this->assertEquals($expectedRecordsCount, $queryResponse->count());
528 public function testAdvancedSearchCompositeProductWithOutOfStockOption()
531 $attribute = $this->objectManager->get(Attribute::class)
535 ->create(Collection::class)
539 \Magento\Catalog\Model\Product\Visibility::VISIBILITY_IN_SEARCH,
540 \Magento\Catalog\Model\Product\Visibility::VISIBILITY_BOTH,
544 $firstOptionId = $firstOption->getId();
545 $this->requestBuilder->bind(
'test_configurable', $firstOptionId);
546 $this->requestBuilder->bind(
'visibility', $visibility);
547 $this->requestBuilder->setRequestName(
'filter_out_of_stock_child');
549 $queryResponse = $this->executeQuery();
550 $this->assertEquals(0, $queryResponse->count());
553 $secondOptionId = $secondOption->getId();
554 $this->requestBuilder->bind(
'test_configurable', $secondOptionId);
555 $this->requestBuilder->bind(
'visibility', $visibility);
556 $this->requestBuilder->setRequestName(
'filter_out_of_stock_child');
558 $queryResponse = $this->executeQuery();
559 $this->assertEquals(1, $queryResponse->count());
566 public function testAdvancedSearchCompositeProductWithDisabledChild()
569 $attribute = $this->objectManager->get(Attribute::class)
573 ->create(Collection::class)
577 $firstOptionId = $firstOption->getId();
578 $this->requestBuilder->bind(
'test_configurable', $firstOptionId);
579 $this->requestBuilder->setRequestName(
'filter_out_of_stock_child');
581 $queryResponse = $this->executeQuery();
582 $this->assertEquals(0, $queryResponse->count());
585 $secondOptionId = $secondOption->getId();
586 $this->requestBuilder->bind(
'test_configurable', $secondOptionId);
587 $this->requestBuilder->setRequestName(
'filter_out_of_stock_child');
589 $queryResponse = $this->executeQuery();
590 $this->assertEquals(0, $queryResponse->count());
600 public function testSearchQueryBoost()
602 $this->requestBuilder->bind(
'query',
'antarctica');
603 $this->requestBuilder->setRequestName(
'search_boost');
604 $queryResponse = $this->executeQuery();
605 $this->assertEquals(2, $queryResponse->count());
608 $products = iterator_to_array($queryResponse);
617 $this->assertEquals(1222, $firstProduct->getId());
619 $this->assertEquals(1221, $secondProduct->getId());
623 \
Magento\Catalog\Api\ProductAttributeRepositoryInterface::class
635 $this->requestBuilder->bind(
'query',
'antarctica');
636 $this->requestBuilder->setRequestName(
'search_boost_name');
637 $queryResponse = $this->executeQuery();
638 $this->assertEquals(2, $queryResponse->count());
641 $products = iterator_to_array($queryResponse);
653 $this->assertEquals(1221, $firstProduct->getId());
656 $this->assertEquals(1222, $secondProduct->getId());
662 [[
'from' =>
'2000-01-01T00:00:00Z',
'to' =>
'2000-01-01T00:00:00Z'], 1],
663 [[
'from' =>
'2000-01-01T00:00:00Z',
'to' =>
''], 1],
664 [[
'from' =>
'1999-12-31T00:00:00Z',
'to' =>
'2000-01-01T00:00:00Z'], 1],
665 [[
'from' =>
'2000-02-01T00:00:00Z',
'to' =>
''], 0],
filterByAttributeValuesDataProvider()
defined('TESTS_BP')||define('TESTS_BP' __DIR__
advancedSearchDataProvider()
testAdvancedSearchDateField($rangeFilter, $expectedRecordsCount)
testBoolFilterWithNestedRangeInNegativeBoolFilter()
testRangeFilterWithoutFromField()
testRangeFilterWithAllFields()
testBoolFilterWithNestedNegativeBoolFilter()
const CATALOG_SEARCH_MYSQL_ENGINE
$productAttributeRepository
testSimpleAdvancedSearch( $nameQuery, $descriptionQuery, $rangeFilter, $expectedRecordsCount)
static getObjectManager()
testRangeFilterWithoutToField()