ItemTest.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Backend\Test\Unit\Model\Menu;
  7. /**
  8. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  9. */
  10. class ItemTest extends \PHPUnit\Framework\TestCase
  11. {
  12. /**
  13. * @var \Magento\Backend\Model\Menu\Item
  14. */
  15. protected $_model;
  16. /**
  17. * @var \PHPUnit_Framework_MockObject_MockObject
  18. */
  19. protected $_aclMock;
  20. /**
  21. * @var \PHPUnit_Framework_MockObject_MockObject
  22. */
  23. protected $_menuFactoryMock;
  24. /**
  25. * @var \PHPUnit_Framework_MockObject_MockObject
  26. */
  27. protected $_urlModelMock;
  28. /**
  29. * @var \PHPUnit_Framework_MockObject_MockObject
  30. */
  31. protected $_scopeConfigMock;
  32. /**
  33. * @var \PHPUnit_Framework_MockObject_MockObject
  34. */
  35. protected $_moduleManager;
  36. /**
  37. * @var \PHPUnit_Framework_MockObject_MockObject
  38. */
  39. protected $_moduleListMock;
  40. /** @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager */
  41. private $objectManager;
  42. /**
  43. * @var array
  44. */
  45. protected $_params = [
  46. 'id' => 'item',
  47. 'title' => 'Item Title',
  48. 'action' => '/system/config',
  49. 'resource' => 'Magento_Config::config',
  50. 'dependsOnModule' => 'Magento_Backend',
  51. 'dependsOnConfig' => 'system/config/isEnabled',
  52. 'toolTip' => 'Item tooltip',
  53. ];
  54. protected function setUp()
  55. {
  56. $this->_aclMock = $this->createMock(\Magento\Framework\AuthorizationInterface::class);
  57. $this->_scopeConfigMock = $this->createMock(\Magento\Framework\App\Config\ScopeConfigInterface::class);
  58. $this->_menuFactoryMock = $this->createPartialMock(\Magento\Backend\Model\MenuFactory::class, ['create']);
  59. $this->_urlModelMock = $this->createMock(\Magento\Backend\Model\Url::class);
  60. $this->_moduleManager = $this->createMock(\Magento\Framework\Module\Manager::class);
  61. $validatorMock = $this->createMock(\Magento\Backend\Model\Menu\Item\Validator::class);
  62. $validatorMock->expects($this->any())->method('validate');
  63. $this->_moduleListMock = $this->createMock(\Magento\Framework\Module\ModuleListInterface::class);
  64. $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
  65. $this->_model = $this->objectManager->getObject(
  66. \Magento\Backend\Model\Menu\Item::class,
  67. [
  68. 'validator' => $validatorMock,
  69. 'authorization' => $this->_aclMock,
  70. 'scopeConfig' => $this->_scopeConfigMock,
  71. 'menuFactory' => $this->_menuFactoryMock,
  72. 'urlModel' => $this->_urlModelMock,
  73. 'moduleList' => $this->_moduleListMock,
  74. 'moduleManager' => $this->_moduleManager,
  75. 'data' => $this->_params
  76. ]
  77. );
  78. }
  79. public function testGetUrlWithEmptyActionReturnsHashSign()
  80. {
  81. $this->_params['action'] = '';
  82. $item = $this->objectManager->getObject(
  83. \Magento\Backend\Model\Menu\Item::class,
  84. ['menuFactory' => $this->_menuFactoryMock, 'data' => $this->_params]
  85. );
  86. $this->assertEquals('#', $item->getUrl());
  87. }
  88. public function testGetUrlWithValidActionReturnsUrl()
  89. {
  90. $this->_urlModelMock->expects(
  91. $this->once()
  92. )->method(
  93. 'getUrl'
  94. )->with(
  95. $this->equalTo('/system/config')
  96. )->will(
  97. $this->returnValue('Url')
  98. );
  99. $this->assertEquals('Url', $this->_model->getUrl());
  100. }
  101. public function testHasClickCallbackReturnsFalseIfItemHasAction()
  102. {
  103. $this->assertFalse($this->_model->hasClickCallback());
  104. }
  105. public function testHasClickCallbackReturnsTrueIfItemHasNoAction()
  106. {
  107. $this->_params['action'] = '';
  108. $item = $this->objectManager->getObject(
  109. \Magento\Backend\Model\Menu\Item::class,
  110. ['menuFactory' => $this->_menuFactoryMock, 'data' => $this->_params]
  111. );
  112. $this->assertTrue($item->hasClickCallback());
  113. }
  114. public function testGetClickCallbackReturnsStoppingJsIfItemDoesntHaveAction()
  115. {
  116. $this->_params['action'] = '';
  117. $item = $this->objectManager->getObject(
  118. \Magento\Backend\Model\Menu\Item::class,
  119. ['menuFactory' => $this->_menuFactoryMock, 'data' => $this->_params]
  120. );
  121. $this->assertEquals('return false;', $item->getClickCallback());
  122. }
  123. public function testGetClickCallbackReturnsEmptyStringIfItemHasAction()
  124. {
  125. $this->assertEquals('', $this->_model->getClickCallback());
  126. }
  127. public function testIsDisabledReturnsTrueIfModuleOutputIsDisabled()
  128. {
  129. $this->_moduleManager->expects($this->once())->method('isOutputEnabled')->will($this->returnValue(false));
  130. $this->assertTrue($this->_model->isDisabled());
  131. }
  132. public function testIsDisabledReturnsTrueIfModuleDependenciesFail()
  133. {
  134. $this->_moduleManager->expects($this->once())->method('isOutputEnabled')->will($this->returnValue(true));
  135. $this->_moduleListMock->expects($this->once())->method('has')->will($this->returnValue(true));
  136. $this->assertTrue($this->_model->isDisabled());
  137. }
  138. public function testIsDisabledReturnsTrueIfConfigDependenciesFail()
  139. {
  140. $this->_moduleManager->expects($this->once())->method('isOutputEnabled')->will($this->returnValue(true));
  141. $this->_moduleListMock->expects($this->once())->method('has')->will($this->returnValue(true));
  142. $this->assertTrue($this->_model->isDisabled());
  143. }
  144. public function testIsDisabledReturnsFalseIfNoDependenciesFail()
  145. {
  146. $this->_moduleManager->expects($this->once())->method('isOutputEnabled')->will($this->returnValue(true));
  147. $this->_moduleListMock->expects($this->once())->method('has')->will($this->returnValue(true));
  148. $this->_scopeConfigMock->expects($this->once())->method('isSetFlag')->will($this->returnValue(true));
  149. $this->assertFalse($this->_model->isDisabled());
  150. }
  151. public function testIsAllowedReturnsTrueIfResourceIsAvailable()
  152. {
  153. $this->_aclMock->expects(
  154. $this->once()
  155. )->method(
  156. 'isAllowed'
  157. )->with(
  158. 'Magento_Config::config'
  159. )->will(
  160. $this->returnValue(true)
  161. );
  162. $this->assertTrue($this->_model->isAllowed());
  163. }
  164. public function testIsAllowedReturnsFalseIfResourceIsNotAvailable()
  165. {
  166. $this->_aclMock->expects(
  167. $this->once()
  168. )->method(
  169. 'isAllowed'
  170. )->with(
  171. 'Magento_Config::config'
  172. )->will(
  173. $this->throwException(new \Magento\Framework\Exception\LocalizedException(__('Error')))
  174. );
  175. $this->assertFalse($this->_model->isAllowed());
  176. }
  177. public function testGetChildrenCreatesSubmenuOnFirstCall()
  178. {
  179. $menuMock = $this->createMock(\Magento\Backend\Model\Menu::class);
  180. $this->_menuFactoryMock->expects($this->once())->method('create')->will($this->returnValue($menuMock));
  181. $this->_model->getChildren();
  182. $this->_model->getChildren();
  183. }
  184. /**
  185. * @param array $data
  186. * @param array $expected
  187. * @dataProvider toArrayDataProvider
  188. */
  189. public function testToArray(array $data, array $expected)
  190. {
  191. $menuMock = $this->createMock(\Magento\Backend\Model\Menu::class);
  192. $this->_menuFactoryMock->method('create')->will($this->returnValue($menuMock));
  193. $menuMock->method('toArray')
  194. ->willReturn($data['sub_menu']);
  195. $model = $this->objectManager->getObject(
  196. \Magento\Backend\Model\Menu\Item::class,
  197. [
  198. 'authorization' => $this->_aclMock,
  199. 'scopeConfig' => $this->_scopeConfigMock,
  200. 'menuFactory' => $this->_menuFactoryMock,
  201. 'urlModel' => $this->_urlModelMock,
  202. 'moduleList' => $this->_moduleListMock,
  203. 'moduleManager' => $this->_moduleManager,
  204. 'data' => $data
  205. ]
  206. );
  207. $this->assertEquals($expected, $model->toArray());
  208. }
  209. /**
  210. * @return array
  211. */
  212. public function toArrayDataProvider()
  213. {
  214. return include __DIR__ . '/../_files/menu_item_data.php';
  215. }
  216. /**
  217. * @param array $constructorData
  218. * @param array $populateFromData
  219. * @param array $expected
  220. * @dataProvider populateFromArrayDataProvider
  221. */
  222. public function testPopulateFromArray(
  223. array $constructorData,
  224. array $populateFromData,
  225. array $expected
  226. ) {
  227. $menuMock = $this->createMock(\Magento\Backend\Model\Menu::class);
  228. $this->_menuFactoryMock->method('create')->willReturn($menuMock);
  229. $menuMock->method('toArray')
  230. ->willReturn(['submenuArray']);
  231. $model = $this->objectManager->getObject(
  232. \Magento\Backend\Model\Menu\Item::class,
  233. [
  234. 'authorization' => $this->_aclMock,
  235. 'scopeConfig' => $this->_scopeConfigMock,
  236. 'menuFactory' => $this->_menuFactoryMock,
  237. 'urlModel' => $this->_urlModelMock,
  238. 'moduleList' => $this->_moduleListMock,
  239. 'moduleManager' => $this->_moduleManager,
  240. 'data' => $constructorData
  241. ]
  242. );
  243. $model->populateFromArray($populateFromData);
  244. $this->assertEquals($expected, $model->toArray());
  245. }
  246. /**
  247. * @return array
  248. */
  249. public function populateFromArrayDataProvider()
  250. {
  251. return include __DIR__ . '/../_files/menu_item_constructor_data.php';
  252. }
  253. }