PageRenderTime 36ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/vendor/magento/magento2-base/dev/tests/static/testsuite/Magento/Test/Legacy/LayoutTest.php

https://gitlab.com/yousafsyed/easternglamor
PHP | 361 lines | 307 code | 13 blank | 41 comment | 8 complexity | 3780bf7b5dc0d8ac83f23591dc66549b MD5 | raw file
  1. <?php
  2. /**
  3. * Copyright © 2016 Magento. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. /**
  7. * Coverage of obsolete nodes in layout
  8. */
  9. namespace Magento\Test\Legacy;
  10. use Magento\Framework\Component\ComponentRegistrar;
  11. class LayoutTest extends \PHPUnit_Framework_TestCase
  12. {
  13. /**
  14. * List of obsolete nodes
  15. *
  16. * @var array
  17. */
  18. protected $_obsoleteNodes = [
  19. 'PRODUCT_TYPE_simple',
  20. 'PRODUCT_TYPE_configurable',
  21. 'PRODUCT_TYPE_grouped',
  22. 'PRODUCT_TYPE_bundle',
  23. 'PRODUCT_TYPE_virtual',
  24. 'PRODUCT_TYPE_downloadable',
  25. 'PRODUCT_TYPE_giftcard',
  26. 'catalog_category_default',
  27. 'catalog_category_layered',
  28. 'catalog_category_layered_nochildren',
  29. 'customer_logged_in',
  30. 'customer_logged_out',
  31. 'customer_logged_in_psc_handle',
  32. 'customer_logged_out_psc_handle',
  33. 'cms_page',
  34. 'sku_failed_products_handle',
  35. 'catalog_product_send',
  36. 'reference',
  37. ];
  38. /**
  39. * List of obsolete references per handle
  40. *
  41. * @var array
  42. */
  43. protected $_obsoleteReferences = [
  44. 'adminhtml_user_edit' => [
  45. 'adminhtml.permissions.user.edit.tabs',
  46. 'adminhtml.permission.user.edit.tabs',
  47. 'adminhtml.permissions.user.edit',
  48. 'adminhtml.permission.user.edit',
  49. 'adminhtml.permissions.user.roles.grid.js',
  50. 'adminhtml.permission.user.roles.grid.js',
  51. 'adminhtml.permissions.user.edit.tab.roles',
  52. 'adminhtml.permissions.user.edit.tab.roles.js',
  53. ],
  54. 'adminhtml_user_role_index' => [
  55. 'adminhtml.permission.role.index',
  56. 'adminhtml.permissions.role.index',
  57. 'adminhtml.permissions.role.grid',
  58. ],
  59. 'adminhtml_user_role_rolegrid' => ['adminhtml.permission.role.grid', 'adminhtml.permissions.role.grid'],
  60. 'adminhtml_user_role_editrole' => [
  61. 'adminhtml.permissions.editroles',
  62. 'adminhtml.permissions.tab.rolesedit',
  63. 'adminhtml.permission.roles.users.grid.js',
  64. 'adminhtml.permissions.roles.users.grid.js',
  65. 'adminhtml.permission.role.buttons',
  66. 'adminhtml.permissions.role.buttons',
  67. 'adminhtml.permission.role.edit.gws',
  68. ],
  69. 'adminhtml_user_role_editrolegrid' => [
  70. 'adminhtml.permission.role.grid.user',
  71. 'adminhtml.permissions.role.grid.user',
  72. ],
  73. 'adminhtml_user_index' => ['adminhtml.permission.user.index', 'adminhtml.permissions.user.index'],
  74. 'adminhtml_user_rolegrid' => [
  75. 'adminhtml.permissions.user.rolegrid',
  76. 'adminhtml.permission.user.rolegrid',
  77. ],
  78. 'adminhtml_user_rolesgrid' => [
  79. 'adminhtml.permissions.user.rolesgrid',
  80. 'adminhtml.permission.user.rolesgrid',
  81. ],
  82. ];
  83. public function testLayoutFile()
  84. {
  85. $invoker = new \Magento\Framework\App\Utility\AggregateInvoker($this);
  86. $invoker(
  87. /**
  88. * @param string $layoutFile
  89. */
  90. function ($layoutFile) {
  91. $layoutXml = simplexml_load_file($layoutFile);
  92. $this->_testObsoleteReferences($layoutXml);
  93. $this->_testObsoleteAttributes($layoutXml);
  94. $selectorHeadBlock = '(name()="block" or name()="referenceBlock") and ' .
  95. '(@name="head" or @name="convert_root_head" or @name="vde_head")';
  96. $this->assertSame(
  97. [],
  98. $layoutXml->xpath(
  99. '//block[@class="Magento\Theme\Block\Html\Head\Css" ' .
  100. 'or @class="Magento\Theme\Block\Html\Head\Link" ' .
  101. 'or @class="Magento\Theme\Block\Html\Head\Script"]' .
  102. '/parent::*[not(' .
  103. $selectorHeadBlock .
  104. ')]'
  105. ),
  106. 'Blocks \Magento\Theme\Block\Html\Head\{Css,Link,Script} ' .
  107. 'are allowed within the "head" block only. ' .
  108. 'Verify integrity of the nodes nesting.'
  109. );
  110. $this->assertSame(
  111. [],
  112. $layoutXml->xpath('/layout//*[@output="toHtml"]'),
  113. 'output="toHtml" is obsolete. Use output="1"'
  114. );
  115. foreach ($layoutXml as $handle) {
  116. $this->assertNotContains(
  117. (string)$handle['id'],
  118. $this->_obsoleteNodes,
  119. 'This layout handle is obsolete.'
  120. );
  121. }
  122. foreach ($layoutXml->xpath('@helper') as $action) {
  123. $this->assertNotContains('/', $action->getAttribute('helper'));
  124. $this->assertContains('::', $action->getAttribute('helper'));
  125. }
  126. $componentRegistrar = new ComponentRegistrar();
  127. if (false !== strpos(
  128. $layoutFile,
  129. $componentRegistrar->getPath(ComponentRegistrar::MODULE, 'Magento_Sales')
  130. . '/view/adminhtml/layout/sales_order'
  131. ) || false !== strpos(
  132. $layoutFile,
  133. $componentRegistrar->getPath(ComponentRegistrar::MODULE, 'Magento_Shipping')
  134. . '/view/adminhtml/layout/adminhtml_order'
  135. )
  136. ) {
  137. $this->markTestIncomplete(
  138. "The file {$layoutFile} has to use \\Magento\\Core\\Block\\Text\\List, \n" .
  139. 'there is no solution to get rid of it right now.'
  140. );
  141. }
  142. $this->assertSame(
  143. [],
  144. $layoutXml->xpath('/layout//block[@class="Magento\Framework\View\Element\Text\ListText"]'),
  145. 'The class \Magento\Framework\View\Element\Text\ListTest' .
  146. ' is not supposed to be used in layout anymore.'
  147. );
  148. },
  149. \Magento\Framework\App\Utility\Files::init()->getLayoutFiles()
  150. );
  151. }
  152. /**
  153. * @param SimpleXMLElement $layoutXml
  154. */
  155. protected function _testObsoleteReferences($layoutXml)
  156. {
  157. foreach ($layoutXml as $handle) {
  158. if (isset($this->_obsoleteReferences[$handle->getName()])) {
  159. foreach ($handle->xpath('reference') as $reference) {
  160. $this->assertNotContains(
  161. (string)$reference['name'],
  162. $this->_obsoleteReferences[$handle->getName()],
  163. 'The block being referenced is removed.'
  164. );
  165. }
  166. }
  167. }
  168. }
  169. /**
  170. * Tests the attributes of the top-level Layout Node.
  171. * Verifies there are no longer attributes of "parent" or "owner"
  172. *
  173. * @param SimpleXMLElement $layoutXml
  174. */
  175. protected function _testObsoleteAttributes($layoutXml)
  176. {
  177. $issues = [];
  178. $type = $layoutXml['type'];
  179. $parent = $layoutXml['parent'];
  180. $owner = $layoutXml['owner'];
  181. if ((string)$type === 'page') {
  182. if ($parent) {
  183. $issues[] = 'Attribute "parent" is not valid';
  184. }
  185. }
  186. if ((string)$type === 'fragment') {
  187. if ($owner) {
  188. $issues[] = 'Attribute "owner" is not valid';
  189. }
  190. }
  191. if ($issues) {
  192. $this->fail("Issues found in handle declaration:\n" . implode("\n", $issues) . "\n");
  193. }
  194. }
  195. public function testActionNodeMethods()
  196. {
  197. $invoker = new \Magento\Framework\App\Utility\AggregateInvoker($this);
  198. $invoker(
  199. /**
  200. * @param string $layoutFile
  201. */
  202. function ($layoutFile) {
  203. $layoutXml = simplexml_load_file($layoutFile);
  204. $methodFilter = '@method!="' . implode('" and @method!="', $this->getAllowedActionNodeMethods()) . '"';
  205. foreach ($layoutXml->xpath('//action[' . $methodFilter . ']') as $node) {
  206. $attributes = $node->attributes();
  207. $this->fail(
  208. sprintf(
  209. 'Call of method "%s" via layout instruction <action> is not allowed.',
  210. $attributes['method']
  211. )
  212. );
  213. }
  214. },
  215. \Magento\Framework\App\Utility\Files::init()->getLayoutFiles()
  216. );
  217. }
  218. /**
  219. * List of currently allowed (i.e. not refactored yet) methods for use in <action method="someMethod"/> layout
  220. * instruction.
  221. *
  222. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  223. * Temporary method existing until <action> instruction in layout is not eliminated, no need to split it.
  224. *
  225. * @return string[]
  226. */
  227. public function getAllowedActionNodeMethods()
  228. {
  229. return [
  230. 'addBodyClass',
  231. 'addButtons',
  232. 'addColumnCountLayoutDepend',
  233. 'addCrumb',
  234. 'addDatabaseBlock',
  235. 'addInputTypeTemplate',
  236. 'addNotice',
  237. 'addReportTypeOption',
  238. 'addTab',
  239. 'addTabAfter',
  240. 'addText',
  241. 'append',
  242. 'removeTab',
  243. 'setActive',
  244. 'setAddressType',
  245. 'setAfterCondition',
  246. 'setAfterTotal',
  247. 'setAtCall',
  248. 'setAtCode',
  249. 'setAtLabel',
  250. 'setAuthenticationStartMode',
  251. 'setBeforeCondition',
  252. 'setBlockId',
  253. 'setBugreportUrl',
  254. 'setCanLoadExtJs',
  255. 'setCanLoadRulesJs',
  256. 'setCanLoadTinyMce',
  257. 'setClassName',
  258. 'setColClass',
  259. 'setColumnCount',
  260. 'setColumnsLimit',
  261. 'setCssClass',
  262. 'setDefaultFilter',
  263. 'setDefaultStoreName',
  264. 'setDestElementId',
  265. 'setDisplayArea',
  266. 'setDontDisplayContainer',
  267. 'setEmptyGridMessage',
  268. 'setEntityModelClass',
  269. 'setFieldOption',
  270. 'setFieldVisibility',
  271. 'setFormCode',
  272. 'setFormId',
  273. 'setFormPrefix',
  274. 'setGiftRegistryTemplate',
  275. 'setGiftRegistryUrl',
  276. 'setGridHtmlClass',
  277. 'setGridHtmlCss',
  278. 'setGridHtmlId',
  279. 'setHeaderTitle',
  280. 'setHideBalance',
  281. 'setHideLink',
  282. 'setHideRequiredNotice',
  283. 'setHtmlClass',
  284. 'setId',
  285. 'setImageType',
  286. 'setImgAlt',
  287. 'setImgHeight',
  288. 'setImgSrc',
  289. 'setImgWidth',
  290. 'setInList',
  291. 'setInfoTemplate',
  292. 'setIsCollapsed',
  293. 'setIsDisabled',
  294. 'setIsEnabled',
  295. 'setIsGuestNote',
  296. 'setIsHandle',
  297. 'setIsLinkMode',
  298. 'setIsPlaneMode',
  299. 'setIsTitleHidden',
  300. 'setIsViewCurrent',
  301. 'setItemLimit',
  302. 'setLabel',
  303. 'setLabelProperties',
  304. 'setLayoutCode',
  305. 'setLinkUrl',
  306. 'setListCollection',
  307. 'setListModes',
  308. 'setListOrders',
  309. 'setMAPTemplate',
  310. 'setMethodFormTemplate',
  311. 'setMyClass',
  312. 'setPageLayout',
  313. 'setPageTitle',
  314. 'setParentType',
  315. 'setControllerPath',
  316. 'setPosition',
  317. 'setPositioned',
  318. 'setRewardMessage',
  319. 'setRewardQtyLimitationMessage',
  320. 'setShouldPrepareInfoTabs',
  321. 'setShowPart',
  322. 'setSignupLabel',
  323. 'setSourceField',
  324. 'setStoreVarName',
  325. 'setStrong',
  326. 'setTemplate',
  327. 'setText',
  328. 'setThemeName',
  329. 'setTierPriceTemplate',
  330. 'setTitle',
  331. 'setTitleClass',
  332. 'setTitleId',
  333. 'setToolbarBlockName',
  334. 'setType',
  335. 'setUseConfirm',
  336. 'setValueProperties',
  337. 'setViewAction',
  338. 'setViewColumn',
  339. 'setViewLabel',
  340. 'setViewMode',
  341. 'setWrapperClass',
  342. 'unsetChild',
  343. 'unsetChildren',
  344. 'updateButton',
  345. 'setIsProductListingContext'
  346. ];
  347. }
  348. }