Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
VisibilityFilterTest.php
Go to the documentation of this file.
1 <?php
7 
11 use Magento\Eav\Model\Config as EavConfig;
15 
16 class VisibilityFilterTest extends \PHPUnit\Framework\TestCase
17 {
19  private $objectManager;
20 
22  private $resource;
23 
25  private $conditionManager;
26 
28  private $storeManager;
29 
31  private $eavConfigMock;
32 
34  private $visibilityFilter;
35 
37  private $answerToLifeTheUniverseAndEverything = 42;
38 
39  protected function setUp()
40  {
42  $this->resource = $this->objectManager->create(ResourceConnection::class);
43  $this->conditionManager = $this->objectManager->create(ConditionManager::class);
44  $this->storeManager = $this->objectManager->create(StoreManagerInterface::class);
45 
46  $this->eavConfigMock = $this->getMockBuilder(EavConfig::class)
47  ->disableOriginalConstructor()
48  ->getMock();
49 
50  $this->visibilityFilter = $this->objectManager->create(
51  VisibilityFilter::class,
52  [
53  'eavConfig' => $this->eavConfigMock
54  ]
55  );
56  }
57 
62  public function testApplyWithWrongType()
63  {
64  $select = $this->resource->getConnection()->select();
65  $filter = $this->mockFilter();
66 
67  $this->visibilityFilter->apply($select, $filter, 'Luke, I am your father!');
68  }
69 
70  public function testApplyFilterAsWhere()
71  {
72  $select = $this->resource->getConnection()->select();
73  $select->from(
74  ['some_index' => 'some_table'],
75  ['entity_id' => 'entity_id']
76  );
77 
78  $filter = $this->mockFilter();
79  $attribute = $this->mockAttribute();
80 
81  $this->eavConfigMock
82  ->method('getAttribute')
83  ->willReturn($attribute);
84 
85  $resultSelect = $this->visibilityFilter->apply($select, $filter, VisibilityFilter::FILTER_BY_WHERE);
86  $expectedSelect = $this->getExpectedSelectForWhereFilter();
87 
88  $this->assertEquals(
89  (string) $expectedSelect,
90  (string) $resultSelect,
91  'Select queries must be the same'
92  );
93  }
94 
95  public function testApplyFilterAsJoin()
96  {
97  $select = $this->resource->getConnection()->select();
98  $select->from(
99  ['some_index' => 'some_table'],
100  ['entity_id' => 'entity_id']
101  );
102 
103  $filter = $this->mockFilter();
104  $attribute = $this->mockAttribute();
105 
106  $this->eavConfigMock
107  ->method('getAttribute')
108  ->willReturn($attribute);
109 
110  $resultSelect = $this->visibilityFilter->apply($select, $filter, VisibilityFilter::FILTER_BY_JOIN);
111  $expectedSelect = $this->getExpectedSelectForJoinFilter();
112 
113  $this->assertEquals(
114  (string) $expectedSelect,
115  (string) $resultSelect,
116  'Select queries must be the same'
117  );
118  }
119 
120  private function getExpectedSelectForWhereFilter()
121  {
122  $filter = $this->mockFilter();
123  $select = $this->resource->getConnection()->select();
124  $select->from(
125  ['some_index' => 'some_table'],
126  ['entity_id' => 'entity_id']
127  )->where(
128  $this->conditionManager->combineQueries(
129  [
130  $this->conditionManager->generateCondition(
131  'some_index.attribute_id',
132  '=',
133  $this->answerToLifeTheUniverseAndEverything
134  ),
135  $this->conditionManager->generateCondition(
136  'some_index.value',
137  is_array($filter->getValue()) ? 'in' : '=',
138  $filter->getValue()
139  ),
140  $this->conditionManager->generateCondition(
141  'some_index.store_id',
142  '=',
143  $this->storeManager->getStore()->getId()
144  ),
145  ],
147  )
148  );
149 
150  return $select;
151  }
152 
153  private function getExpectedSelectForJoinFilter()
154  {
155  $filter = $this->mockFilter();
156  $select = $this->resource->getConnection()->select();
157  $select->from(
158  ['some_index' => 'some_table'],
159  ['entity_id' => 'entity_id']
160  )->joinInner(
161  ['visibility_filter' => $this->resource->getTableName('catalog_product_index_eav')],
162  $this->conditionManager->combineQueries(
163  [
164  'some_index.entity_id = visibility_filter.entity_id',
165  $this->conditionManager->generateCondition(
166  'visibility_filter.attribute_id',
167  '=',
168  $this->answerToLifeTheUniverseAndEverything
169  ),
170  $this->conditionManager->generateCondition(
171  'visibility_filter.value',
172  is_array($filter->getValue()) ? 'in' : '=',
173  $filter->getValue()
174  ),
175  $this->conditionManager->generateCondition(
176  'visibility_filter.store_id',
177  '=',
178  $this->storeManager->getStore()->getId()
179  ),
180  ],
182  ),
183  []
184  );
185 
186  return $select;
187  }
188 
189  private function mockFilter()
190  {
191  return $this->getMockBuilder(Term::class)
192  ->setConstructorArgs(['name2', [42, 450], 'visibility'])
193  ->setMethods(null)
194  ->getMock();
195  }
196 
197  private function mockAttribute()
198  {
199  $attribute = $this->getMockBuilder(AbstractAttribute::class)
200  ->disableOriginalConstructor()
201  ->setMethods(['getId'])
202  ->getMockForAbstractClass();
203 
204  $attribute
205  ->method('getId')
206  ->willReturn($this->answerToLifeTheUniverseAndEverything);
207 
208  return $attribute;
209  }
210 }
const SQL_AND
Definition: Select.php:77