Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
SelectContainerBuilderTest.php
Go to the documentation of this file.
1 <?php
8 
11 use Magento\CatalogSearch\Model\Search\SelectContainer\SelectContainerFactory;
23 
27 class SelectContainerBuilderTest extends \PHPUnit\Framework\TestCase
28 {
32  private $selectContainerFactoryMock;
33 
37  private $fullTextSearchCheckMock;
38 
42  private $customAttributeFilterCheckMock;
43 
47  private $filtersExtractorMock;
48 
52  private $scopeConfigInterfaceMock;
53 
57  private $resourceConnectionMock;
58 
62  private $requestMock;
63 
67  private $selectContainerBuilder;
68 
69  public function setUp()
70  {
71  $this->selectContainerFactoryMock = $this->getMockBuilder(SelectContainerFactory::class)
72  ->disableOriginalConstructor()
73  ->setMethods(['create'])
74  ->getMock();
75 
76  $this->fullTextSearchCheckMock = $this->getMockBuilder(FullTextSearchCheck::class)
77  ->disableOriginalConstructor()
78  ->getMock();
79 
80  $this->customAttributeFilterCheckMock = $this->getMockBuilder(CustomAttributeFilterCheck::class)
81  ->disableOriginalConstructor()
82  ->getMock();
83 
84  $this->filtersExtractorMock = $this->getMockBuilder(FiltersExtractor::class)
85  ->disableOriginalConstructor()
86  ->getMock();
87 
88  $this->scopeConfigInterfaceMock = $this->getMockBuilder(ScopeConfigInterface::class)
89  ->disableOriginalConstructor()
90  ->getMockForAbstractClass();
91 
92  $this->resourceConnectionMock = $this->getMockBuilder(ResourceConnection::class)
93  ->disableOriginalConstructor()
94  ->getMock();
95 
96  $this->requestMock = $this->getMockBuilder(RequestInterface::class)
97  ->disableOriginalConstructor()
98  ->getMockForAbstractClass();
99 
100  $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
101  $this->selectContainerBuilder = $objectManagerHelper->getObject(
102  SelectContainerBuilder::class,
103  [
104  'selectContainerFactory' => $this->selectContainerFactoryMock,
105  'fullTextSearchCheck' => $this->fullTextSearchCheckMock,
106  'customAttributeFilterCheck' => $this->customAttributeFilterCheckMock,
107  'filtersExtractor' => $this->filtersExtractorMock,
108  'scopeConfig' => $this->scopeConfigInterfaceMock,
109  'resource' => $this->resourceConnectionMock
110  ]
111  );
112  }
113 
114  public function testBuildByRequest()
115  {
116  list($visibilityFilter, $customFilter, $nonCustomFilter) = $this->mockFilters();
117  $requestGetQueryResult = $this->mockQuery();
118  $requestGetIndexResult = 'space-banana';
119  $requestGetDimensionsResult = [1, 2, 3];
120  $fullTextSearchCheckResult = true;
121  $isShowOutOfStockEnabled = true;
122  $selectContainerMock = $this->getMockBuilder(SelectContainer::class)
123  ->disableOriginalConstructor()
124  ->getMock();
125 
126  $this->requestMock
127  ->method('getQuery')
128  ->willReturn($requestGetQueryResult);
129 
130  $this->requestMock
131  ->method('getIndex')
132  ->willReturn($requestGetIndexResult);
133 
134  $this->requestMock
135  ->method('getDimensions')
136  ->willReturn($requestGetDimensionsResult);
137 
138  $this->filtersExtractorMock
139  ->method('extractFiltersFromQuery')
140  ->with($requestGetQueryResult)
141  ->willReturn([$visibilityFilter, $customFilter, $nonCustomFilter]);
142 
143  $this->customAttributeFilterCheckMock
144  ->method('isCustom')
145  ->withConsecutive([$visibilityFilter], [$customFilter], [$nonCustomFilter])
146  ->will($this->onConsecutiveCalls(true, true, false));
147 
148  $this->fullTextSearchCheckMock
149  ->method('isRequiredForQuery')
150  ->with($requestGetQueryResult)
151  ->willReturn($fullTextSearchCheckResult);
152 
153  $selectMock = $this->getMockBuilder(Select::class)
154  ->disableOriginalConstructor()
155  ->getMock();
156 
157  $connectionMock = $this->getMockBuilder(AdapterInterface::class)
158  ->disableOriginalConstructor()
159  ->getMockForAbstractClass();
160 
161  $connectionMock
162  ->method('select')
163  ->willReturn($selectMock);
164 
165  $this->resourceConnectionMock
166  ->method('getConnection')
167  ->willReturn($connectionMock);
168 
169  $this->scopeConfigInterfaceMock
170  ->method('isSetFlag')
171  ->with('cataloginventory/options/show_out_of_stock', ScopeInterface::SCOPE_STORE)
172  ->willReturn($isShowOutOfStockEnabled);
173 
174  $this->selectContainerFactoryMock
175  ->method('create')
176  ->with([
177  'nonCustomAttributesFilters' => [$nonCustomFilter],
178  'customAttributesFilters' => [$customFilter],
179  'visibilityFilter' => $visibilityFilter,
180  'isFullTextSearchRequired' => $fullTextSearchCheckResult,
181  'isShowOutOfStockEnabled' => $isShowOutOfStockEnabled,
182  'usedIndex' => $requestGetIndexResult,
183  'dimensions' => $requestGetDimensionsResult,
184  'select' => $selectMock
185  ])->willReturn($selectContainerMock);
186 
187  $this->assertSame(
188  $selectContainerMock,
189  $this->selectContainerBuilder->buildByRequest($this->requestMock)
190  );
191  }
192 
196  private function mockQuery()
197  {
198  return $this->getMockBuilder(QueryInterface::class)
199  ->disableOriginalConstructor()
200  ->getMockForAbstractClass();
201  }
202 
206  private function mockFilters()
207  {
208  $visibilityFilter = $this->getMockBuilder(Term::class)
209  ->setConstructorArgs(['name1', 'value1', 'visibility'])
210  ->setMethods(null)
211  ->getMock();
212 
213  $customFilter = $this->getMockBuilder(Term::class)
214  ->setConstructorArgs(['name2', 'value2', 'field1'])
215  ->setMethods(null)
216  ->getMock();
217 
218  $nonCustomFilter = $this->getMockBuilder(Term::class)
219  ->setConstructorArgs(['name3', 'value3', 'field2'])
220  ->setMethods(null)
221  ->getMock();
222 
223  return [$visibilityFilter, $customFilter, $nonCustomFilter];
224  }
225 }