CollectionTest.php 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Framework\Mview\Test\Unit\View;
  7. use Magento\Framework\Data\Collection\EntityFactoryInterface;
  8. use Magento\Framework\Indexer\ConfigInterface as IndexerConfigInterface;
  9. use Magento\Framework\Indexer\IndexerInterface;
  10. use Magento\Framework\Mview\ConfigInterface as MviewConfigInterface;
  11. use Magento\Framework\Mview\View\Collection;
  12. use Magento\Framework\Mview\View\State\CollectionFactory;
  13. use Magento\Framework\Mview\View\State\CollectionInterface as StateCollectionInterface;
  14. use Magento\Framework\Mview\View\StateInterface;
  15. use Magento\Framework\Mview\ViewInterface;
  16. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
  17. class CollectionTest extends \PHPUnit\Framework\TestCase
  18. {
  19. /**
  20. * @var ObjectManagerHelper
  21. */
  22. private $objectManagerHelper;
  23. /**
  24. * @var IndexerConfigInterface|\PHPUnit_Framework_MockObject_MockObject
  25. */
  26. private $indexerConfigMock;
  27. /**
  28. * @var EntityFactoryInterface|\PHPUnit_Framework_MockObject_MockObject
  29. */
  30. private $entityFactoryMock;
  31. /**
  32. * @var MviewConfigInterface|\PHPUnit_Framework_MockObject_MockObject
  33. */
  34. private $mviewConfigMock;
  35. /**
  36. * @var CollectionFactory|\PHPUnit_Framework_MockObject_MockObject
  37. */
  38. private $statesFactoryMock;
  39. /**
  40. * @var Collection
  41. */
  42. private $collection;
  43. public function setUp()
  44. {
  45. $this->objectManagerHelper = new ObjectManagerHelper($this);
  46. $this->indexerConfigMock = $this->getMockBuilder(IndexerConfigInterface::class)
  47. ->disableOriginalConstructor()
  48. ->getMockForAbstractClass();
  49. $this->entityFactoryMock = $this->getMockBuilder(EntityFactoryInterface::class)
  50. ->setMethods(['create'])
  51. ->disableOriginalConstructor()
  52. ->getMock();
  53. $this->mviewConfigMock = $this->getMockBuilder(MviewConfigInterface::class)
  54. ->disableOriginalConstructor()
  55. ->getMockForAbstractClass();
  56. $this->statesFactoryMock = $this->getMockBuilder(CollectionFactory::class)
  57. ->setMethods(['create'])
  58. ->disableOriginalConstructor()
  59. ->getMock();
  60. $this->collection = $this->objectManagerHelper->getObject(
  61. Collection::class,
  62. [
  63. 'entityFactory' => $this->entityFactoryMock,
  64. 'config' => $this->mviewConfigMock,
  65. 'statesFactory' => $this->statesFactoryMock,
  66. 'indexerConfig' => $this->indexerConfigMock,
  67. ]
  68. );
  69. }
  70. /**
  71. * @param array $indexers
  72. * @param array $views
  73. * @param array $stateMode
  74. * @param int $numDisabledViews
  75. * @param int $numEnabledViews
  76. * @dataProvider loadDataAndGetViewsByStateModeDataProvider
  77. */
  78. public function testLoadDataAndGetViewsByStateMode(
  79. array $indexers,
  80. array $views,
  81. array $stateMode,
  82. $numDisabledViews,
  83. $numEnabledViews
  84. ) {
  85. $this->indexerConfigMock
  86. ->method('getIndexers')
  87. ->willReturn($indexers);
  88. $this->mviewConfigMock
  89. ->expects($this->once())
  90. ->method('getViews')
  91. ->willReturn(array_flip($views));
  92. $orderedViews = [];
  93. foreach ($indexers as $indexerData) {
  94. $state = $this->getStateMock(['getMode'], $indexerData);
  95. $state->method('getMode')
  96. ->willReturn($stateMode[$indexerData['indexer_id']]);
  97. $view = $this->getViewMock(['setState', 'getState']);
  98. $view->expects($this->once())
  99. ->method('setState');
  100. $view->method('getState')
  101. ->willReturn($state);
  102. $orderedViews[$indexerData['view_id']] = $view;
  103. }
  104. $emptyView = $this->getViewMock();
  105. $emptyView->method('load')
  106. ->withConsecutive(
  107. ...array_map(
  108. function ($elem) {
  109. return [$elem];
  110. },
  111. array_keys($orderedViews)
  112. )
  113. )
  114. ->willReturnOnConsecutiveCalls(...array_values($orderedViews));
  115. $indexer = $this->getIndexerMock();
  116. $indexer->method('load')
  117. ->willReturnMap(array_map(
  118. function ($elem) {
  119. return [$elem['indexer_id'], $this->getIndexerMock([], $elem)];
  120. },
  121. $indexers
  122. ));
  123. $this->entityFactoryMock
  124. ->method('create')
  125. ->willReturnMap([
  126. [IndexerInterface::class, [], $indexer],
  127. [ViewInterface::class, [], $emptyView]
  128. ]);
  129. $states = $this->getMockBuilder(StateCollectionInterface::class)
  130. ->getMockForAbstractClass();
  131. $states->method('getItems')
  132. ->willReturn(array_map(
  133. function ($elem) {
  134. return $this->getStateMock([], ['view_id' => $elem]);
  135. },
  136. $views
  137. ));
  138. $this->statesFactoryMock
  139. ->expects($this->once())
  140. ->method('create')
  141. ->willReturn($states);
  142. $this->assertInstanceOf(\Magento\Framework\Mview\View\Collection::class, $this->collection->loadData());
  143. $views = $this->collection->getViewsByStateMode(StateInterface::MODE_DISABLED);
  144. $this->assertCount($numDisabledViews, $views);
  145. foreach ($views as $view) {
  146. $this->assertInstanceOf(ViewInterface::class, $view);
  147. }
  148. $views = $this->collection->getViewsByStateMode(StateInterface::MODE_ENABLED);
  149. $this->assertCount($numEnabledViews, $views);
  150. }
  151. /**
  152. * @param array $methods
  153. * @param array $data
  154. * @return StateInterface|\PHPUnit_Framework_MockObject_MockObject
  155. */
  156. private function getStateMock(array $methods = [], array $data = [])
  157. {
  158. $state = $this->getMockBuilder(StateInterface::class)
  159. ->setMethods(array_merge($methods, ['getViewId']))
  160. ->disableOriginalConstructor()
  161. ->getMockForAbstractClass();
  162. $state->method('getViewId')
  163. ->willReturn($data['view_id'] ?? '');
  164. return $state;
  165. }
  166. /**
  167. * @param array $methods
  168. * @return ViewInterface|\PHPUnit_Framework_MockObject_MockObject
  169. */
  170. private function getViewMock(array $methods = [])
  171. {
  172. $view = $this->getMockBuilder(ViewInterface::class)
  173. ->setMethods(array_merge($methods, ['load']))
  174. ->disableOriginalConstructor()
  175. ->getMockForAbstractClass();
  176. return $view;
  177. }
  178. /**
  179. * @param array $methods
  180. * @param array $data
  181. * @return \PHPUnit_Framework_MockObject_MockObject|IndexerInterface
  182. */
  183. private function getIndexerMock(array $methods = [], array $data = [])
  184. {
  185. /** @var \PHPUnit_Framework_MockObject_MockObject|IndexerInterface $indexer */
  186. $indexer = $this->getMockBuilder(IndexerInterface::class)
  187. ->setMethods(array_merge($methods, ['getId', 'getViewId']))
  188. ->disableOriginalConstructor()
  189. ->getMockForAbstractClass();
  190. $indexer->method('getId')
  191. ->willReturn($data['indexer_id'] ?? '');
  192. $indexer->method('getViewId')
  193. ->willReturn($data['view_id'] ?? []);
  194. return $indexer;
  195. }
  196. /**
  197. * @return array
  198. */
  199. public function loadDataAndGetViewsByStateModeDataProvider()
  200. {
  201. return [
  202. 'Indexers with sequence' => [
  203. 'indexers' => [
  204. 'indexer_4' => [
  205. 'indexer_id' => 'indexer_4',
  206. 'view_id' => 'view_4',
  207. ],
  208. 'indexer_2' => [
  209. 'indexer_id' => 'indexer_2',
  210. 'view_id' => 'view_2',
  211. ],
  212. 'indexer_1' => [
  213. 'indexer_id' => 'indexer_1',
  214. 'view_id' => 'view_1',
  215. ],
  216. 'indexer_3' => [
  217. 'indexer_id' => 'indexer_3',
  218. 'view_id' => 'view_3',
  219. ],
  220. ],
  221. 'views' => [
  222. 'view_1',
  223. 'view_2',
  224. 'view_3',
  225. 'view_4',
  226. ],
  227. 'state_mode' => [
  228. 'indexer_1' => StateInterface::MODE_DISABLED,
  229. 'indexer_2' => StateInterface::MODE_DISABLED,
  230. 'indexer_3' => StateInterface::MODE_DISABLED,
  231. 'indexer_4' => StateInterface::MODE_ENABLED,
  232. ],
  233. 'num_disabled_views' => 3,
  234. 'num_enabled_views' => 1,
  235. ],
  236. ];
  237. }
  238. }