Skip to content

Commit cc12906

Browse files
committed
AC-670: Create phpcs static check for LayoutTest
1 parent 1ba56bb commit cc12906

File tree

6 files changed

+256
-34
lines changed

6 files changed

+256
-34
lines changed

Magento2/Sniffs/Legacy/LayoutSniff.php

Lines changed: 7 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class LayoutSniff implements Sniff
2121
private const ERROR_CODE_OBSOLETE = 'Obsolete';
2222
private const ERROR_CODE_OBSOLETE_CLASS = 'ObsoleteClass';
2323
private const ERROR_CODE_ATTRIBUTE_NOT_VALID = 'AttributeNotValid';
24-
private const ERROR_CODE_METHOD_NOT_ALLOWED = 'MethodNot';
24+
private const ERROR_CODE_METHOD_NOT_ALLOWED = 'MethodNotAllowed';
2525
private const ERROR_CODE_HELPER_ATTRIBUTE_CHARACTER_NOT_ALLOWED = 'CharacterNotAllowedInAttribute';
2626
private const ERROR_CODE_HELPER_ATTRIBUTE_CHARACTER_EXPECTED = 'CharacterExpectedInAttribute';
2727

@@ -230,14 +230,13 @@ public function process(File $phpcsFile, $stackPtr)
230230
$this->testHelperAttribute($layout, $phpcsFile);
231231
$this->testListText($layout, $phpcsFile);
232232
$this->testActionNodeMethods($layout, $phpcsFile);
233-
//$this->testWithComponentRegistrar($layout, $phpcsFile);
234233
}
235234

236235
/**
237236
* @param SimpleXMLElement $layout
238237
* @param File $phpcsFile
239238
*/
240-
private function testObsoleteReferences(SimpleXMLElement $layout, File $phpcsFile)
239+
private function testObsoleteReferences(SimpleXMLElement $layout, File $phpcsFile): void
241240
{
242241
foreach ($layout as $handle) {
243242
if (!isset($this->_obsoleteReferences[$handle->getName()])) {
@@ -273,7 +272,7 @@ private function getFormattedXML(File $phpcsFile)
273272
* @param SimpleXMLElement $layout
274273
* @param File $phpcsFile
275274
*/
276-
private function testHeadBlocks(SimpleXMLElement $layout, File $phpcsFile)
275+
private function testHeadBlocks(SimpleXMLElement $layout, File $phpcsFile): void
277276
{
278277
$selectorHeadBlock = '(name()="block" or name()="referenceBlock") and ' .
279278
'(@name="head" or @name="convert_root_head" or @name="vde_head")';
@@ -315,10 +314,11 @@ private function testOutputAttribute(SimpleXMLElement $layout, File $phpcsFile):
315314
* Tests the attributes of the top-level Layout Node.
316315
* Verifies there are no longer attributes of "parent" or "owner"
317316
*
317+
* @todo missing test
318318
* @param SimpleXMLElement $layout
319319
* @param File $phpcsFile
320320
*/
321-
private function testObsoleteAttributes(SimpleXMLElement $layout, File $phpcsFile)
321+
private function testObsoleteAttributes(SimpleXMLElement $layout, File $phpcsFile): void
322322
{
323323
$type = $layout['type'];
324324
$parent = $layout['parent'];
@@ -362,7 +362,7 @@ private function getAttribute(SimpleXMLElement $element, string $name): string
362362
*/
363363
private function testHelperAttribute(SimpleXMLElement $layout, File $phpcsFile): void
364364
{
365-
foreach ($layout->xpath('@helper') as $action) {
365+
foreach ($layout->xpath('//*[@helper]') as $action) {
366366
if (strpos($this->getAttribute($action, 'helper'), '/') !== false) {
367367
$phpcsFile->addError(
368368
"'helper' attribute contains '/'",
@@ -401,7 +401,7 @@ private function testListText(SimpleXMLElement $layout, File $phpcsFile): void
401401
* @param SimpleXMLElement $layout
402402
* @param File $phpcsFile
403403
*/
404-
private function testActionNodeMethods(SimpleXMLElement $layout, File $phpcsFile)
404+
private function testActionNodeMethods(SimpleXMLElement $layout, File $phpcsFile): void
405405
{
406406
$methodFilter = '@method!="' . implode('" and @method!="', $this->allowedActionNodeMethods) . '"';
407407
foreach ($layout->xpath('//action[' . $methodFilter . ']') as $node) {
@@ -416,31 +416,4 @@ private function testActionNodeMethods(SimpleXMLElement $layout, File $phpcsFile
416416
);
417417
}
418418
}
419-
420-
private function testWithComponentRegistrar(SimpleXMLElement $layout, File $phpcsFile)
421-
{
422-
/*
423-
* $componentRegistrar = new ComponentRegistrar();
424-
if (false !== strpos(
425-
$layoutFile,
426-
$componentRegistrar->getPath(ComponentRegistrar::MODULE, 'Magento_Sales')
427-
. '/view/adminhtml/layout/sales_order'
428-
) || false !== strpos(
429-
$layoutFile,
430-
$componentRegistrar->getPath(ComponentRegistrar::MODULE, 'Magento_Shipping')
431-
. '/view/adminhtml/layout/adminhtml_order'
432-
)
433-
|| false !== strpos(
434-
$layoutFile,
435-
$componentRegistrar->getPath(ComponentRegistrar::MODULE, 'Magento_Catalog')
436-
. '/view/adminhtml/layout/catalog_product_grid.xml'
437-
)
438-
) {
439-
$this->markTestIncomplete(
440-
"The file {$layoutFile} has to use \\Magento\\Core\\Block\\Text\\List, \n" .
441-
'there is no solution to get rid of it right now.'
442-
);
443-
}
444-
*/
445-
}
446419
}
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<page layout="3columns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
9+
<update handle="default_head_blocks"/>
10+
<body>
11+
<attribute name="id" value="html-body"/>
12+
<block name="require.js" class="Magento\Framework\View\Element\Template" template="Magento_Theme::page/js/require_js.phtml" />
13+
<referenceContainer name="after.body.start">
14+
<block class="Magento\RequireJs\Block\Html\Head\Config" name="requirejs-config"/>
15+
<block class="Magento\Framework\View\Element\Js\Cookie" name="js_cookies" template="Magento_Theme::js/cookie.phtml">
16+
<arguments>
17+
<argument name="session_config" xsi:type="object">Magento\Theme\ViewModel\Block\SessionConfig</argument>
18+
</arguments>
19+
</block>
20+
<block class="Magento\Theme\Block\Html\Notices" name="global_notices" template="Magento_Theme::html/notices.phtml"/>
21+
</referenceContainer>
22+
<referenceBlock name="top.links">
23+
<block class="Magento\Theme\Block\Html\Head\Css">
24+
</block>
25+
<block class="Magento\Theme\Block\Html\Header" name="header" as="header" before="-">
26+
<arguments>
27+
<argument name="show_part" xsi:type="string">welcome</argument>
28+
</arguments>
29+
</block>
30+
</referenceBlock>
31+
<referenceContainer name="main.content">
32+
<block class="Magento\Framework\View\Element\Template" name="skip_to_content.target" before="-" template="Magento_Theme::html/skiptarget.phtml">
33+
<arguments>
34+
<argument name="target_id" xsi:type="string">contentarea</argument>
35+
</arguments>
36+
</block>
37+
</referenceContainer>
38+
<referenceContainer name="header.container">
39+
<container name="header.panel.wrapper" htmlClass="panel wrapper" htmlTag="div" before="-">
40+
<container name="header.panel" label="Page Header Panel" htmlTag="div" htmlClass="panel header">
41+
<block class="Magento\Framework\View\Element\Template" name="skip_to_content" template="Magento_Theme::html/skip.phtml">
42+
<arguments>
43+
<argument name="target" xsi:type="string">contentarea</argument>
44+
<argument name="label" translate="true" xsi:type="string">Skip to Content</argument>
45+
</arguments>
46+
</block>
47+
<block class="Magento\Store\Block\Switcher" name="store_language" as="store_language" template="Magento_Store::switch/languages.phtml">
48+
<arguments>
49+
<argument name="view_model" xsi:type="object">Magento\Store\ViewModel\SwitcherUrlProvider</argument>
50+
</arguments>
51+
</block>
52+
<block class="Magento\Customer\Block\Account\Navigation" name="top.links">
53+
<arguments>
54+
<argument name="css_class" xsi:type="string">header links</argument>
55+
</arguments>
56+
</block>
57+
</container>
58+
</container>
59+
<container name="header-wrapper" label="Page Header" as="header-wrapper" htmlTag="div" htmlClass="header content">
60+
<block class="Magento\Theme\Block\Html\Header\Logo" name="logo">
61+
<arguments>
62+
<argument name="logoPathResolver" xsi:type="object">Magento\Theme\ViewModel\Block\Html\Header\LogoPathResolver</argument>
63+
<argument name="logo_size_resolver" xsi:type="object">Magento\Theme\ViewModel\Block\Html\Header\LogoSizeResolver</argument>
64+
</arguments>
65+
</block>
66+
</container>
67+
</referenceContainer>
68+
<referenceContainer name="page.top">
69+
<block class="Magento\Framework\View\Element\Template" name="navigation.sections" before="-" template="Magento_Theme::html/sections.phtml">
70+
<arguments>
71+
<argument name="group_name" xsi:type="string">navigation-sections</argument>
72+
<argument name="group_css" xsi:type="string">nav-sections</argument>
73+
</arguments>
74+
<block class="Magento\Framework\View\Element\Template" name="store.menu" group="navigation-sections" template="Magento_Theme::html/container.phtml">
75+
<arguments>
76+
<argument name="title" translate="true" xsi:type="string">Menu</argument>
77+
</arguments>
78+
<block class="Magento\Theme\Block\Html\Topmenu" name="catalog.topnav" template="Magento_Theme::html/topmenu.phtml" ttl="3600" before="-"/>
79+
</block>
80+
<block class="Magento\Framework\View\Element\Text" name="store.links" group="navigation-sections">
81+
<arguments>
82+
<argument name="title" translate="true" xsi:type="string">Account</argument>
83+
<argument name="use_force" xsi:type="boolean">true</argument>
84+
<argument name="text" xsi:type="string"><![CDATA[<!-- Account links -->]]></argument>
85+
</arguments>
86+
</block>
87+
<block class="Magento\Framework\View\Element\Template" name="store.settings" group="navigation-sections" template="Magento_Theme::html/container.phtml">
88+
<arguments>
89+
<argument name="title" translate="true" xsi:type="string">Settings</argument>
90+
</arguments>
91+
<block class="Magento\Store\Block\Switcher" name="store.settings.language" template="Magento_Store::switch/languages.phtml">
92+
<arguments>
93+
<argument name="id_modifier" xsi:type="string">nav</argument>
94+
<argument name="view_model" xsi:type="object">Magento\Store\ViewModel\SwitcherUrlProvider</argument>
95+
</arguments>
96+
</block>
97+
<block class="Magento\Directory\Block\Currency" name="store.settings.currency" template="Magento_Directory::currency.phtml">
98+
<arguments>
99+
<argument name="id_modifier" xsi:type="string">nav</argument>
100+
</arguments>
101+
</block>
102+
</block>
103+
</block>
104+
<container name="top.container" as="topContainer" label="After Page Header Top" htmlTag="div" htmlClass="top-container"/>
105+
<block class="Magento\Theme\Block\Html\Breadcrumbs" name="breadcrumbs" as="breadcrumbs"/>
106+
</referenceContainer>
107+
<referenceContainer name="columns.top">
108+
<block class="Magento\Theme\Block\Html\Title" name="page.main.title" template="Magento_Theme::html/title.phtml"/>
109+
<container name="page.messages" htmlTag="div" htmlClass="page messages">
110+
<block class="Magento\Framework\View\Element\Template" name="ajax.message.placeholder" template="Magento_Theme::html/messages.phtml"/>
111+
<block class="Magento\Framework\View\Element\Messages" name="messages" as="messages" template="Magento_Theme::messages.phtml"/>
112+
</container>
113+
</referenceContainer>
114+
<referenceContainer name="main">
115+
<container name="content.top" label="Main Content Top">
116+
<block name="main_css_preloader" as="main_css_preloader" template="Magento_Theme::html/main_css_preloader.phtml" ifconfig="dev/css/use_css_critical_path"/>
117+
</container>
118+
<container name="content" label="Main Content Area"/>
119+
<container name="content.aside" label="Main Content Aside"/>
120+
<container name="content.bottom" label="Main Content Bottom"/>
121+
</referenceContainer>
122+
<referenceContainer name="page.bottom.container">
123+
<container name="page.bottom" label="Before Page Footer" htmlTag="div" htmlClass="content"/>
124+
</referenceContainer>
125+
<referenceContainer name="footer-container">
126+
<container name="footer" as="footer" label="Page Footer" htmlTag="div" htmlClass="footer content">
127+
<block class="Magento\Store\Block\Switcher" name="store_switcher" as="store_switcher" template="Magento_Store::switch/stores.phtml"/>
128+
<block class="Magento\Framework\View\Element\Html\Links" name="footer_links">
129+
<arguments>
130+
<argument name="css_class" xsi:type="string">footer links</argument>
131+
</arguments>
132+
</block>
133+
<block class="Magento\Theme\Block\Html\Footer" name="copyright" template="Magento_Theme::html/copyright.phtml"/>
134+
<block class="Magento\Framework\View\Element\Template" name="report.bugs" template="Magento_Theme::html/bugreport.phtml" ifconfig="design/footer/report_bugs"/>
135+
</container>
136+
</referenceContainer>
137+
<referenceContainer name="before.body.end">
138+
<block class="Magento\Theme\Block\Html\Footer" name="absolute_footer" template="Magento_Theme::html/absolute_footer.phtml" />
139+
</referenceContainer>
140+
<referenceContainer name="content">
141+
<block class="Magento\Framework\View\Element\FormKey" name="formkey"/>
142+
</referenceContainer>
143+
<referenceContainer name="form.additional.info">
144+
<block class="Magento\Captcha\Block\Captcha" name="captcha" cacheable="false">
145+
<action method="notAllowedMethod">
146+
<argument name="formId" xsi:type="string">backend_login</argument>
147+
</action>
148+
<action method="anotherNotallowedMethod">
149+
<argument name="width" xsi:type="string">226</argument>
150+
</action>
151+
<action method="setImgHeight">
152+
<argument name="width" xsi:type="string">50</argument>
153+
</action>
154+
</block>
155+
</referenceContainer>
156+
</body>
157+
</page>
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_layout.xsd">
9+
<update handle="2columns-left" />
10+
11+
<container name="columns.top.wrapper" htmlTag="div" htmlClass="page-main" output="toHtml"/>
12+
<move element="columns.top" destination="columns.top.wrapper"/>
13+
<move element="columns.top.wrapper" destination="page.wrapper" after="page.top"/>
14+
<move element="category.view.container" destination="page.wrapper" after="columns.top.wrapper"/>
15+
16+
<container name="category.image.wrapper" htmlTag="div" htmlClass="page-main"/>
17+
<move element="category.image" destination="category.image.wrapper"/>
18+
<move element="category.image.wrapper" destination="category.view.container"/>
19+
20+
<container name="category.description.wrapper" htmlTag="div"/>
21+
<move element="category.description" destination="category.description.wrapper"/>
22+
<move element="category.description.wrapper" destination="category.view.container" after="category.image.wrapper"/>
23+
24+
<container name="category.cms.wrapper" htmlTag="div" htmlClass="page-main"/>
25+
<move element="category.cms" destination="category.cms.wrapper"/>
26+
<move element="category.cms.wrapper" destination="category.view.container" after="category.description.wrapper"/>
27+
28+
<block name="list" class="Magento\Framework\View\Element\Text\ListText" />
29+
</layout>
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
9+
<body>
10+
<referenceContainer name="checkout.onepage.review.info.items.after">
11+
<block class="Magento\Paypal\Block\Iframe" name="paypal.iframe" cacheable="false"/>
12+
</referenceContainer>
13+
<referenceBlock name="checkout.onepage.review.button">
14+
<action method="setTemplate">
15+
<argument name="template" xsi:type="helper" helper="Magento\Paypal\Helper\Hss">
16+
<param name="name">Magento_Paypal::hss/review/button.phtml</param>
17+
</argument>
18+
<argument name="template" xsi:type="helper" helper="Magento/Paypal/Helper/Hss::getReviewButtonTemplate">
19+
<param name="name">Magento_Paypal::hss/review/button.phtml</param>
20+
</argument>
21+
<argument name="template" xsi:type="helper" helper="Magento\Paypal\Helper\Hss::getReviewButtonTemplate">
22+
<param name="name">Magento_Paypal::hss/review/button.phtml</param>
23+
</argument>
24+
</action>
25+
</referenceBlock>
26+
</body>
27+
</page>
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
/**
3+
* Copyright © Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento2\Tests\Legacy;
7+
8+
use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest;
9+
10+
class LayoutUnitTest extends AbstractSniffUnitTest
11+
{
12+
/**
13+
* @inheritdoc
14+
*/
15+
public function getErrorList($testFile = '')
16+
{
17+
if ($testFile === 'LayoutUnitTest.1.xml') {
18+
return [
19+
];
20+
}
21+
return [];
22+
}
23+
24+
/**
25+
* @inheritdoc
26+
*/
27+
public function getWarningList($testFile = '')
28+
{
29+
return [];
30+
}
31+
}

Magento2/ruleset.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,11 @@
144144
<type>error</type>
145145
<exclude-pattern>*\.xml$</exclude-pattern>
146146
</rule>
147+
<rule ref="Magento2.Legacy.LayoutSniff">
148+
<severity>10</severity>
149+
<type>error</type>
150+
<include-pattern>*/view/(adminhtml|frontend|base)/*\/.xml</include-pattern>
151+
</rule>
147152
<!-- Severity 9 warnings: Possible security and issues that may cause bugs. -->
148153
<rule ref="Generic.Files.ByteOrderMark">
149154
<severity>9</severity>

0 commit comments

Comments
 (0)