ManagerTest.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Ui\Test\Unit\Model;
  7. use Magento\Framework\Config\CacheInterface;
  8. use Magento\Framework\View\Element\UiComponent\ArrayObjectFactory;
  9. use Magento\Framework\View\Element\UiComponent\Config\DomMergerInterface;
  10. use Magento\Framework\View\Element\UiComponent\Config\FileCollector\AggregatedFileCollector;
  11. use Magento\Framework\View\Element\UiComponent\Config\FileCollector\AggregatedFileCollectorFactory;
  12. use Magento\Framework\View\Element\UiComponent\Config\UiReaderInterface;
  13. use Magento\Ui\Model\Manager;
  14. use Magento\Framework\View\Element\UiComponent\Config\Provider\Component\Definition as ComponentDefinition;
  15. use Magento\Framework\Data\Argument\InterpreterInterface;
  16. use Magento\Framework\View\Element\UiComponent\Config\ManagerInterface;
  17. use Magento\Framework\View\Element\UiComponent\Config\Converter;
  18. /**
  19. * Class ManagerTest
  20. *
  21. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  22. */
  23. class ManagerTest extends \PHPUnit\Framework\TestCase
  24. {
  25. /**
  26. * @var Manager
  27. */
  28. protected $manager;
  29. /**
  30. * @var ComponentDefinition|\PHPUnit_Framework_MockObject_MockObject
  31. */
  32. protected $componentConfigProvider;
  33. /**
  34. * @var CacheInterface|\PHPUnit_Framework_MockObject_MockObject
  35. */
  36. protected $cacheConfig;
  37. /**
  38. * @var InterpreterInterface|\PHPUnit_Framework_MockObject_MockObject
  39. */
  40. protected $argumentInterpreter;
  41. /**
  42. * @var UiReaderInterface|\PHPUnit_Framework_MockObject_MockObject
  43. */
  44. protected $uiReader;
  45. /**
  46. * @var \Magento\Framework\View\Element\UiComponent\Config\ReaderFactory|\PHPUnit_Framework_MockObject_MockObject
  47. */
  48. protected $readerFactory;
  49. /**
  50. * @var AggregatedFileCollector|\PHPUnit_Framework_MockObject_MockObject
  51. */
  52. protected $aggregatedFileCollector;
  53. /**
  54. * @var DomMergerInterface|\PHPUnit_Framework_MockObject_MockObject
  55. */
  56. protected $domMerger;
  57. /**
  58. * @var ArrayObjectFactory|\PHPUnit_Framework_MockObject_MockObject
  59. */
  60. protected $arrayObjectFactory;
  61. /**
  62. * @var AggregatedFileCollectorFactory|\PHPUnit_Framework_MockObject_MockObject
  63. */
  64. protected $aggregatedFileCollectorFactory;
  65. /** @var \Magento\Framework\Serialize\SerializerInterface|\PHPUnit_Framework_MockObject_MockObject */
  66. private $serializer;
  67. protected function setUp()
  68. {
  69. $this->componentConfigProvider = $this->getMockBuilder(
  70. \Magento\Framework\View\Element\UiComponent\Config\Provider\Component\Definition::class
  71. )->disableOriginalConstructor()->getMock();
  72. $this->domMerger = $this->getMockBuilder(
  73. \Magento\Framework\View\Element\UiComponent\Config\DomMergerInterface::class
  74. )->getMockForAbstractClass();
  75. $this->aggregatedFileCollector = $this->getMockBuilder(
  76. \Magento\Framework\View\Element\UiComponent\Config\FileCollector\AggregatedFileCollector::class
  77. )->disableOriginalConstructor()->getMock();
  78. $this->aggregatedFileCollectorFactory = $this->getMockBuilder(
  79. \Magento\Framework\View\Element\UiComponent\Config\FileCollector\AggregatedFileCollectorFactory::class
  80. )->disableOriginalConstructor()->getMock();
  81. $this->arrayObjectFactory = $this->getMockBuilder(
  82. \Magento\Framework\View\Element\UiComponent\ArrayObjectFactory::class
  83. )->disableOriginalConstructor()->getMock();
  84. $this->arrayObjectFactory->expects($this->at(0))
  85. ->method('create')
  86. ->willReturn(new \ArrayObject([]));
  87. $this->uiReader = $this->getMockBuilder(
  88. \Magento\Framework\View\Element\UiComponent\Config\UiReaderInterface::class
  89. )->getMockForAbstractClass();
  90. $this->readerFactory = $this->getMockBuilder(
  91. \Magento\Framework\View\Element\UiComponent\Config\ReaderFactory::class
  92. )->disableOriginalConstructor()->getMock();
  93. $this->cacheConfig = $this->getMockBuilder(\Magento\Framework\Config\CacheInterface::class)
  94. ->getMockForAbstractClass();
  95. $this->argumentInterpreter = $this->getMockBuilder(\Magento\Framework\Data\Argument\InterpreterInterface::class)
  96. ->getMockForAbstractClass();
  97. $this->serializer = $this->getMockBuilder(
  98. \Magento\Framework\Serialize\SerializerInterface::class
  99. )->getMockForAbstractClass();
  100. $this->serializer->expects($this->any())
  101. ->method('serialize')
  102. ->willReturnCallback(
  103. function ($value) {
  104. return json_encode($value);
  105. }
  106. );
  107. $this->serializer->expects($this->any())
  108. ->method('unserialize')
  109. ->willReturnCallback(
  110. function ($value) {
  111. return json_decode($value, true);
  112. }
  113. );
  114. $this->manager = new Manager(
  115. $this->componentConfigProvider,
  116. $this->domMerger,
  117. $this->readerFactory,
  118. $this->arrayObjectFactory,
  119. $this->aggregatedFileCollectorFactory,
  120. $this->cacheConfig,
  121. $this->argumentInterpreter,
  122. $this->serializer
  123. );
  124. }
  125. public function testGetReader()
  126. {
  127. $this->readerFactory->expects($this->once())
  128. ->method('create')
  129. ->with(['fileCollector' => $this->aggregatedFileCollector, 'domMerger' => $this->domMerger])
  130. ->willReturn($this->uiReader);
  131. $this->aggregatedFileCollectorFactory->expects($this->once())
  132. ->method('create')
  133. ->willReturn($this->aggregatedFileCollector);
  134. $this->assertEquals($this->uiReader, $this->manager->getReader('some_name'));
  135. }
  136. public function testPrepareDataWithoutName()
  137. {
  138. $this->expectException(\Magento\Framework\Exception\LocalizedException::class);
  139. $this->expectExceptionMessage(
  140. (string)__('The "" UI component element name is invalid. Verify the name and try again.')
  141. );
  142. $this->manager->prepareData(null);
  143. }
  144. /**
  145. * @dataProvider getComponentData()
  146. */
  147. public function testPrepareGetData($componentName, $componentData, $isCached, $readerData, $expectedResult)
  148. {
  149. $this->readerFactory->expects($this->any())
  150. ->method('create')
  151. ->with(['fileCollector' => $this->aggregatedFileCollector, 'domMerger' => $this->domMerger])
  152. ->willReturn($this->uiReader);
  153. $this->aggregatedFileCollectorFactory->expects($this->any())
  154. ->method('create')
  155. ->willReturn($this->aggregatedFileCollector);
  156. $this->argumentInterpreter->expects($this->any())
  157. ->method('evaluate')
  158. ->willReturnCallback(function ($argument) {
  159. return ['argument' => $argument['value']];
  160. });
  161. $this->arrayObjectFactory->expects($this->any())
  162. ->method('create')
  163. ->willReturn($componentData);
  164. $this->cacheConfig->expects($this->any())
  165. ->method('load')
  166. ->with(Manager::CACHE_ID . '_' . $componentName)
  167. ->willReturn($isCached);
  168. $this->uiReader->expects($this->any())
  169. ->method('read')
  170. ->willReturn($readerData);
  171. $this->assertEquals(
  172. $expectedResult,
  173. $this->manager->prepareData($componentName)->getData($componentName)
  174. );
  175. }
  176. /**
  177. * @return array
  178. */
  179. public function getComponentData()
  180. {
  181. $cachedData = new \ArrayObject(
  182. ['test_component1' =>
  183. [
  184. ManagerInterface::COMPONENT_ARGUMENTS_KEY => ['argument_name1' => ['value' => 'value1']],
  185. ManagerInterface::CHILDREN_KEY => [
  186. 'custom' => [
  187. ManagerInterface::COMPONENT_ARGUMENTS_KEY =>
  188. ['custom_name1' => ['value' => 'custom_value1']],
  189. ManagerInterface::CHILDREN_KEY => [],
  190. ],
  191. ],
  192. ]
  193. ]
  194. );
  195. return [
  196. [
  197. 'test_component1',
  198. new \ArrayObject(),
  199. json_encode($cachedData->getArrayCopy()),
  200. [],
  201. [
  202. 'test_component1' => [
  203. ManagerInterface::COMPONENT_ARGUMENTS_KEY => ['argument_name1' => ['argument' => 'value1']],
  204. ManagerInterface::CHILDREN_KEY => [
  205. 'custom' => [
  206. ManagerInterface::COMPONENT_ARGUMENTS_KEY =>
  207. ['custom_name1' => ['argument' => 'custom_value1']],
  208. ManagerInterface::CHILDREN_KEY => [],
  209. ]
  210. ]
  211. ],
  212. ],
  213. ],
  214. [
  215. 'test_component2',
  216. new \ArrayObject(
  217. ['test_component2' =>
  218. [
  219. ManagerInterface::COMPONENT_ARGUMENTS_KEY => ['argument_name2' => ['value' => 'value2']],
  220. ManagerInterface::CHILDREN_KEY => [
  221. 'test_component21' => [
  222. ManagerInterface::COMPONENT_ARGUMENTS_KEY =>
  223. ['argument_name21' => ['value' => 'value21']],
  224. ManagerInterface::CHILDREN_KEY => [],
  225. ],
  226. ],
  227. ]
  228. ]
  229. ),
  230. false,
  231. ['componentGroup' => [0 => [
  232. Converter::DATA_ARGUMENTS_KEY => ['argument_name2' => ['value' => 'value2']],
  233. Converter::DATA_ATTRIBUTES_KEY => ['name' => 'attribute_name2'],
  234. 'test_component21' => [0 => [
  235. Converter::DATA_ARGUMENTS_KEY => ['argument_name21' => ['value' => 'value21']],
  236. Converter::DATA_ATTRIBUTES_KEY => ['name' => 'attribute_name21'],
  237. ]
  238. ],
  239. ]]],
  240. [
  241. 'test_component2' => [
  242. ManagerInterface::COMPONENT_ARGUMENTS_KEY => ['argument_name2' => ['argument' => 'value2']],
  243. ManagerInterface::COMPONENT_ATTRIBUTES_KEY => ['name' => 'attribute_name2'],
  244. ManagerInterface::CHILDREN_KEY => [
  245. 'attribute_name21' => [
  246. ManagerInterface::COMPONENT_ARGUMENTS_KEY =>
  247. ['argument_name21' => ['argument' => 'value21']],
  248. ManagerInterface::COMPONENT_ATTRIBUTES_KEY => ['name' => 'attribute_name21'],
  249. ManagerInterface::CHILDREN_KEY => [],
  250. ],
  251. ],
  252. ],
  253. ],
  254. ],
  255. ];
  256. }
  257. /**
  258. * @dataProvider getComponentDataProvider()
  259. */
  260. public function testCreateRawComponentData($componentName, $configData, $componentData, $needEvaluate)
  261. {
  262. $this->componentConfigProvider->expects($this->any())
  263. ->method('getComponentData')
  264. ->willReturn($configData);
  265. if ($needEvaluate === true) {
  266. $this->argumentInterpreter->expects($this->once())
  267. ->method('evaluate')
  268. ->willReturnCallback(function ($argument) {
  269. return ['argument' => $argument['value']];
  270. });
  271. } else {
  272. $this->argumentInterpreter->expects($this->never())->method('evaluate');
  273. }
  274. $this->assertEquals($componentData, $this->manager->createRawComponentData($componentName, $needEvaluate));
  275. }
  276. /**
  277. * @return array
  278. */
  279. public function getComponentDataProvider()
  280. {
  281. return [
  282. [
  283. 'test_component1',
  284. [
  285. Converter::DATA_ATTRIBUTES_KEY => ['name' => 'attribute_name1'],
  286. ],
  287. [
  288. ManagerInterface::COMPONENT_ATTRIBUTES_KEY => ['name' => 'attribute_name1'],
  289. ManagerInterface::COMPONENT_ARGUMENTS_KEY => [],
  290. ],
  291. false,
  292. ],
  293. [
  294. 'test_component2',
  295. [
  296. Converter::DATA_ARGUMENTS_KEY => ['argument_name2' => ['value' => 'value2']],
  297. ],
  298. [
  299. ManagerInterface::COMPONENT_ATTRIBUTES_KEY => [],
  300. ManagerInterface::COMPONENT_ARGUMENTS_KEY => ['argument_name2' => ['value' => 'value2']],
  301. ],
  302. false,
  303. ],
  304. [
  305. 'test_component3',
  306. [
  307. Converter::DATA_ATTRIBUTES_KEY => ['name' => 'attribute_name3'],
  308. Converter::DATA_ARGUMENTS_KEY => ['argument_name3' => ['value' => 'value3']],
  309. ],
  310. [
  311. ManagerInterface::COMPONENT_ATTRIBUTES_KEY => ['name' => 'attribute_name3'],
  312. ManagerInterface::COMPONENT_ARGUMENTS_KEY => ['argument_name3' => ['argument' => 'value3']],
  313. ],
  314. true,
  315. ],
  316. ];
  317. }
  318. }