20     private $objectManager;
    26     private $customAttributeFilter;
    29     private $eavConfigMock;
    32     private $storeManager;
    35     private $conditionManager;
    40         $this->resource = $this->objectManager->create(ResourceConnection::class);
    41         $this->storeManager = $this->objectManager->create(StoreManagerInterface::class);
    42         $this->conditionManager = $this->objectManager->create(ConditionManager::class);
    44         $this->eavConfigMock = $this->getMockBuilder(EavConfig::class)
    45             ->disableOriginalConstructor()
    48         $this->customAttributeFilter = $this->objectManager->create(
    49             CustomAttributeFilter::class,
    51                 'eavConfig' => $this->eavConfigMock
    58         $select = $this->resource->getConnection()->select();
    61         $resultSelect = $this->customAttributeFilter->apply(
$select, ...
$filters);
    65             (
string) $resultSelect,
    66             'Select queries must be the same in case when we have no filters to apply.'    76         $select = $this->resource->getConnection()->select();
    81             ->method(
'getAttribute')
    90         $select = $this->resource->getConnection()->select();
    92             [
'some_index' => 
'some_table'],
    93             [
'entity_id' => 
'entity_id']
   103             ->method(
'getAttribute')
   105             ->willReturn($firstAttribute);
   107         $resultSelect = $this->customAttributeFilter->apply(
$select, ...[$firstFilter]);
   109         $expectedSelect = $this->getSqlForOneAttributeSearch();
   112             (
string) $expectedSelect,
   113             (
string) $resultSelect,
   114             'Select queries must be the same in case when we have one filter to apply.'   120         $select = $this->resource->getConnection()->select();
   122             [
'some_index' => 
'some_table'],
   123             [
'entity_id' => 
'entity_id']
   130             ->method(
'getAttribute')
   138         $resultSelect = $this->customAttributeFilter->apply(
$select, ...
$filters);
   140         $expectedSelect = $this->getSqlForTwoAttributeSearch();
   143             (
string) $expectedSelect,
   144             (
string) $resultSelect,
   145             'Select queries must be the same in case when we have two filters to apply.'   149     private function getSqlForOneAttributeSearch()
   157             '`some_index`.`entity_id` = `field1_filter`.`entity_id`',
   158             '`some_index`.`source_id` = `field1_filter`.`source_id`',
   159             sprintf(
'`field1_filter`.`attribute_id` = %s', $firstAttribute->getId()),
   160             sprintf(
'`field1_filter`.`store_id` = %s', (
int) $this->storeManager->getStore()->getId())
   163         $select = $this->resource->getConnection()->select();
   165             [
'some_index' => 
'some_table'],
   166             [
'entity_id' => 
'entity_id']
   168             [
'field1_filter' => $this->resource->getTableName(
'catalog_product_index_eav')],
   169             $this->conditionManager->combineQueries($joinConditions, 
Select::SQL_AND),
   171         )->where(sprintf(
'`some_index`.`attribute_id` = %s', $firstAttribute->getId()))
   172         ->where(sprintf(
"`some_index`.`value` = '%s'", $firstFilter->getValue()));
   177     private function getSqlForTwoAttributeSearch()
   184             '`some_index`.`entity_id` = `field1_filter`.`entity_id`',
   185             '`some_index`.`source_id` = `field1_filter`.`source_id`',
   186             sprintf(
'`field1_filter`.`attribute_id` = %s', $firstAttribute->getId()),
   187             sprintf(
'`field1_filter`.`store_id` = %s', (
int) $this->storeManager->getStore()->getId())
   191             '`some_index`.`entity_id` = `field2_filter`.`entity_id`',
   192             '`some_index`.`source_id` = `field2_filter`.`source_id`',
   193             sprintf(
'`field2_filter`.`attribute_id` = %s', $secondAttribute->getId()),
   194             sprintf(
'`field2_filter`.`store_id` = %s', (
int) $this->storeManager->getStore()->getId())
   197         $select = $this->resource->getConnection()->select();
   199             [
'some_index' => 
'some_table'],
   200             [
'entity_id' => 
'entity_id']
   202             [
'field1_filter' => $this->resource->getTableName(
'catalog_product_index_eav')],
   203             $this->conditionManager->combineQueries($joinConditions1, 
Select::SQL_AND),
   206             [
'field2_filter' => $this->resource->getTableName(
'catalog_product_index_eav')],
   207             $this->conditionManager->combineQueries($joinConditions2, 
Select::SQL_AND),
   214     private function mockFilters()
   218         $filters[] = $this->getMockBuilder(Term::class)
   219             ->setConstructorArgs([
'name2', 
'value2', 
'field1'])
   223         $filters[] = $this->getMockBuilder(Term::class)
   224             ->setConstructorArgs([
'name3', 
'value3', 
'field2'])
   231     private function mockAttributes()
   233         $attribute1 = $this->getMockBuilder(AbstractAttribute::class)
   234             ->disableOriginalConstructor()
   235             ->setMethods([
'getId'])
   236             ->getMockForAbstractClass();
   242         $attribute2 = $this->getMockBuilder(AbstractAttribute::class)
   243             ->disableOriginalConstructor()
   244             ->setMethods([
'getId'])
   245             ->getMockForAbstractClass();
 
testApplyWithWrongAttributeFilter()
 
static getObjectManager()
 
testApplyWithoutFilters()