Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
TableMapperTest.php
Go to the documentation of this file.
1 <?php
8 
9 use Magento\Catalog\Model\ResourceModel\Product\Attribute\CollectionFactory;
13 use \Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
18 
26 class TableMapperTest extends \PHPUnit\Framework\TestCase
27 {
31  private $aliasResolver;
32 
36  private $tableMapper;
37 
41  private $filterExtractorMock;
42 
46  private $filterStrategy;
47 
48  protected function setUp()
49  {
50  $objectManager = new ObjectManager($this);
51 
52  $resource = $this->getMockBuilder(\Magento\Framework\App\ResourceConnection::class)
53  ->disableOriginalConstructor()
54  ->getMock();
55 
56  $storeManager = $this->getMockBuilder(\Magento\Store\Model\StoreManagerInterface::class)
57  ->disableOriginalConstructor()
58  ->getMock();
59 
60  $attributeCollectionFactory = $this->getMockBuilder(CollectionFactory::class)
61  ->setMethods(['create'])
62  ->disableOriginalConstructor()
63  ->getMock();
64 
65  $eavConfig = $this->getMockBuilder(\Magento\Eav\Model\Config::class)
66  ->setMethods(['getAttribute'])
67  ->disableOriginalConstructor()
68  ->getMock();
69 
70  $scopeConfig = $this->getMockBuilder(ScopeConfigInterface::class)
71  ->disableOriginalConstructor()
72  ->getMockForAbstractClass();
73 
74  $this->aliasResolver = $this->getMockBuilder(AliasResolver::class)
75  ->disableOriginalConstructor()
76  ->getMock();
77 
78  $this->filterExtractorMock = $this->getMockBuilder(FiltersExtractor::class)
79  ->disableOriginalConstructor()
80  ->getMock();
81 
82  $this->filterStrategy = $this->getMockBuilder(FilterStrategyInterface::class)
83  ->disableOriginalConstructor()
84  ->getMockForAbstractClass();
85 
86  $this->tableMapper = $objectManager->getObject(
87  \Magento\CatalogSearch\Model\Search\TableMapper::class,
88  [
89  'resource' => $resource,
90  'storeManager' => $storeManager,
91  'attributeCollectionFactory' => $attributeCollectionFactory,
92  'eavConfig' => $eavConfig,
93  'scopeConfig' => $scopeConfig,
94  'filterStrategy' => $this->filterStrategy,
95  'aliasResolver' => $this->aliasResolver,
96  'filtersExtractor' => $this->filterExtractorMock
97  ]
98  );
99  }
100 
101  public function testRequestHasNoFilters()
102  {
103  $select = $this->getSelectMock();
104  $request = $this->getRequestMock();
105  $query = $this->getQueryMock();
106 
107  $request
108  ->method('getQuery')
109  ->willReturn($query);
110 
111  $this->filterExtractorMock
112  ->method('extractFiltersFromQuery')
113  ->with($query)
114  ->willReturn([]);
115 
116  $this->aliasResolver
117  ->expects($this->never())
118  ->method('getAlias');
119 
120  $this->filterStrategy
121  ->expects($this->never())
122  ->method('apply');
123 
124  $this->tableMapper->addTables($select, $request);
125  }
126 
128  {
129  $select = $this->getSelectMock();
130  $request = $this->getRequestMock();
131  $query = $this->getQueryMock();
132  $filters = $this->getDifferentFiltersMock();
133 
134  $request
135  ->method('getQuery')
136  ->willReturn($query);
137 
138  $this->filterExtractorMock
139  ->method('extractFiltersFromQuery')
140  ->with($query)
141  ->willReturn($filters);
142 
143  $consecutiveFilters = array_map(
144  function ($filter) {
145  return [$filter];
146  },
147  $filters
148  );
149 
150  $this->aliasResolver
151  ->expects($this->exactly(count($filters)))
152  ->method('getAlias')
153  ->withConsecutive(...$consecutiveFilters)
154  ->willReturnCallback(
155  function (FilterInterface $filter) {
156  return $filter->getField() . '_alias';
157  }
158  );
159 
160  $consecutiveFilters = array_map(
161  function ($filter) use ($select) {
162  return [$filter, $select];
163  },
164  $filters
165  );
166 
167  $this->filterStrategy
168  ->expects($this->exactly(count($filters)))
169  ->method('apply')
170  ->withConsecutive(...$consecutiveFilters)
171  ->willReturn(true);
172 
173  $this->tableMapper->addTables($select, $request);
174  }
175 
176  public function testRequestHasSameFilters()
177  {
178  $select = $this->getSelectMock();
179  $request = $this->getRequestMock();
180  $query = $this->getQueryMock();
181  $filters = $this->getSameFiltersMock();
182  $uniqueFilters = [$filters[0], $filters[2]];
183 
184  $request
185  ->method('getQuery')
186  ->willReturn($query);
187 
188  $this->filterExtractorMock
189  ->method('extractFiltersFromQuery')
190  ->with($query)
191  ->willReturn($filters);
192 
193  $consecutiveFilters = array_map(
194  function ($filter) {
195  return [$filter];
196  },
197  $filters
198  );
199 
200  $this->aliasResolver
201  ->expects($this->exactly(count($filters)))
202  ->method('getAlias')
203  ->withConsecutive(...$consecutiveFilters)
204  ->willReturnCallback(
205  function (FilterInterface $filter) {
206  return $filter->getField() . '_alias';
207  }
208  );
209 
210  $consecutiveUniqueFilters = array_map(
211  function ($filter) use ($select) {
212  return [$filter, $select];
213  },
214  $uniqueFilters
215  );
216 
217  $this->filterStrategy
218  ->expects($this->exactly(count($uniqueFilters)))
219  ->method('apply')
220  ->withConsecutive(...$consecutiveUniqueFilters)
221  ->willReturn(true);
222 
223  $this->tableMapper->addTables($select, $request);
224  }
225 
227  {
228  $select = $this->getSelectMock();
229  $request = $this->getRequestMock();
230  $query = $this->getQueryMock();
231  $filters = $this->getSameFiltersMock();
232 
233  $request
234  ->method('getQuery')
235  ->willReturn($query);
236 
237  $this->filterExtractorMock
238  ->method('extractFiltersFromQuery')
239  ->with($query)
240  ->willReturn($filters);
241 
242  $consecutiveFilters = array_map(
243  function ($filter) {
244  return [$filter];
245  },
246  $filters
247  );
248 
249  $this->aliasResolver
250  ->expects($this->exactly(count($filters)))
251  ->method('getAlias')
252  ->withConsecutive(...$consecutiveFilters)
253  ->willReturnCallback(
254  function (FilterInterface $filter) {
255  return $filter->getField() . '_alias';
256  }
257  );
258 
259  $consecutiveFilters = array_map(
260  function ($filter) use ($select) {
261  return [$filter, $select];
262  },
263  $filters
264  );
265 
266  $this->filterStrategy
267  ->expects($this->exactly(count($filters)))
268  ->method('apply')
269  ->withConsecutive(...$consecutiveFilters)
270  ->willReturnCallback(
271  function (FilterInterface $filter) {
272  return !($filter->getName() === 'name1' || $filter->getName() === 'name3')
273  ? true
274  : false;
275  }
276  );
277 
278  $this->tableMapper->addTables($select, $request);
279  }
280 
284  private function getSelectMock()
285  {
286  return $this->getMockBuilder(\Magento\Framework\DB\Select::class)
287  ->disableOriginalConstructor()
288  ->getMock();
289  }
290 
294  private function getRequestMock()
295  {
296  return $this->getMockBuilder(\Magento\Framework\Search\RequestInterface::class)
297  ->disableOriginalConstructor()
298  ->getMock();
299  }
300 
304  private function getQueryMock()
305  {
306  return $this->getMockBuilder(QueryInterface::class)
307  ->disableOriginalConstructor()
308  ->getMockForAbstractClass();
309  }
310 
314  private function getDifferentFiltersMock()
315  {
316  $visibilityFilter = $this->getMockBuilder(Term::class)
317  ->setConstructorArgs(['name1', 'value1', 'visibility'])
318  ->setMethods(null)
319  ->getMock();
320 
321  $customFilter = $this->getMockBuilder(Term::class)
322  ->setConstructorArgs(['name2', 'value2', 'field1'])
323  ->setMethods(null)
324  ->getMock();
325 
326  $nonCustomFilter = $this->getMockBuilder(Term::class)
327  ->setConstructorArgs(['name3', 'value3', 'field2'])
328  ->setMethods(null)
329  ->getMock();
330 
331  return [$visibilityFilter, $customFilter, $nonCustomFilter];
332  }
333 
337  private function getSameFiltersMock()
338  {
339  $visibilityFilter1 = $this->getMockBuilder(Term::class)
340  ->setConstructorArgs(['name1', 'value1', 'visibility'])
341  ->setMethods(null)
342  ->getMock();
343 
344  $visibilityFilter2 = $this->getMockBuilder(Term::class)
345  ->setConstructorArgs(['name2', 'value2', 'visibility'])
346  ->setMethods(null)
347  ->getMock();
348 
349  $customFilter1 = $this->getMockBuilder(Term::class)
350  ->setConstructorArgs(['name3', 'value3', 'field1'])
351  ->setMethods(null)
352  ->getMock();
353 
354  $customFilter2 = $this->getMockBuilder(Term::class)
355  ->setConstructorArgs(['name4', 'value4', 'field1'])
356  ->setMethods(null)
357  ->getMock();
358 
359  return [$visibilityFilter1, $visibilityFilter2, $customFilter1, $customFilter2];
360  }
361 }
$objectManager
Definition: bootstrap.php:17
$storeManager
$resource
Definition: bulk.php:12
$filters
Definition: uploader.phtml:11