Skip to content

Commit a4668d6

Browse files
authored
MQE-216: [Customizability] Update parser to handle new test schema on declarative steps
1 parent 1e11e68 commit a4668d6

File tree

3 files changed

+243
-20
lines changed

3 files changed

+243
-20
lines changed

etc/di.xml

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
</arguments>
5050
</type>
5151
<type name="Magento\AcceptanceTestFramework\Util\ModuleResolver\SequenceSorter" />
52+
5253
<!--
5354
Array item can be of any type just like an argument, including array type itself, which creates circular dependency.
5455
Proxy is used to resolve the circular dependency, so that array items undergo the same interpretation as arguments.
@@ -165,7 +166,7 @@
165166
<virtualType name="Magento\AcceptanceTestFramework\Config\Reader\TestData" type="Magento\AcceptanceTestFramework\Config\Reader\Filesystem">
166167
<arguments>
167168
<argument name="fileResolver" xsi:type="object">Magento\AcceptanceTestFramework\Config\FileResolver\Module</argument>
168-
<argument name="converter" xsi:type="object">Magento\AcceptanceTestFramework\Config\Converter</argument>
169+
<argument name="converter" xsi:type="object">Magento\AcceptanceTestFramework\Config\TestDataConverter</argument>
169170
<argument name="schemaLocator" xsi:type="object">Magento\AcceptanceTestFramework\Config\SchemaLocator\TestData</argument>
170171
<argument name="idAttributes" xsi:type="array">
171172
<item name="/config/cest" xsi:type="string">name</item>
@@ -179,13 +180,32 @@
179180
<item name="/config/cest/annotations/group" xsi:type="string">value</item>
180181
<item name="/config/cest/annotations/env" xsi:type="string">value</item>
181182
<item name="/config/cest/annotations/return" xsi:type="string">value</item>
182-
<item name="/config/cest/test/action" xsi:type="string">name</item>
183+
<item name="/config/cest/test/(acceptPopup|amOnPage|appendField|assertArraySubset|attachFile|cancelPopup|checkOption|click|clickWithLeftButton|clickWithRightButton|closeTab|dontSee|dontSeeCheckboxIsChecked|dontSeeCookie|dontSeeCurrentUrlEquals|dontSeeCurrentUrlMatches|dontSeeElement|dontSeeElementInDOM|dontSeeInCurrentUrl|dontSeeInField|dontSeeInPageSource|dontSeeInSource|dontSeeInTitle|dontSeeLink|dontSeeOptionIsSelected|doubleClick|dragAndDrop|executeJS|fillField|grabAttributeFrom|grabCookie|grabFromCurrentUrl|grabMultiple|grabTextFrom|grabValueFrom|makeScreenshot|maximizeWindow|moveBack|moveForward|moveMouseOver|openNewTab|pauseExecution|pressKey|reloadPage|resetCookie|resizeWindow|scrollTo|see|seeCheckboxIsChecked|seeCookie|seeCurrentUrlEquals|seeCurrentUrlMatches|seeElement|seeElementInDOM|seeInCurrentUrl|seeInField|seeInPageSource|seeInPopup|seeInSource|seeInTitle|seeLink|seeNumberOfElements|seeOptionIsSelected|selectOption|setCookie|switchToIFrame|switchToNextTab|switchToPreviousTab|switchToWindow|typeInPopup|uncheckOption|unselectOption|wait|waitForElement|waitForElementNotVisible|waitForElementVisible|waitForJS|waitForText)" xsi:type="string">mergeKey</item>
183184
</argument>
184185
<argument name="fileName" xsi:type="string">*Cest.xml</argument>
185186
<argument name="defaultScope" xsi:type="string">Cest</argument>
186187
</arguments>
187188
</virtualType>
188189

190+
<virtualType name="Magento\AcceptanceTestFramework\Test\Config\Dom\ArrayNodeConfig" type="Magento\AcceptanceTestFramework\Config\Dom\ArrayNodeConfig">
191+
<arguments>
192+
<argument name="assocArrayAttributes" xsi:type="array">
193+
<item name="/config/cest/test/(acceptPopup|amOnPage|appendField|assertArraySubset|attachFile|cancelPopup|checkOption|click|clickWithLeftButton|clickWithRightButton|closeTab|dontSee|dontSeeCheckboxIsChecked|dontSeeCookie|dontSeeCurrentUrlEquals|dontSeeCurrentUrlMatches|dontSeeElement|dontSeeElementInDOM|dontSeeInCurrentUrl|dontSeeInField|dontSeeInPageSource|dontSeeInSource|dontSeeInTitle|dontSeeLink|dontSeeOptionIsSelected|doubleClick|dragAndDrop|executeJS|fillField|grabAttributeFrom|grabCookie|grabFromCurrentUrl|grabMultiple|grabTextFrom|grabValueFrom|makeScreenshot|maximizeWindow|moveBack|moveForward|moveMouseOver|openNewTab|pauseExecution|pressKey|reloadPage|resetCookie|resizeWindow|scrollTo|see|seeCheckboxIsChecked|seeCookie|seeCurrentUrlEquals|seeCurrentUrlMatches|seeElement|seeElementInDOM|seeInCurrentUrl|seeInField|seeInPageSource|seeInPopup|seeInSource|seeInTitle|seeLink|seeNumberOfElements|seeOptionIsSelected|selectOption|setCookie|switchToIFrame|switchToNextTab|switchToPreviousTab|switchToWindow|typeInPopup|uncheckOption|unselectOption|wait|waitForElement|waitForElementNotVisible|waitForElementVisible|waitForJS|waitForText)" xsi:type="string">mergeKey</item>
194+
<item name="/config/cest/test" xsi:type="string">name</item>
195+
<item name="/config/cest" xsi:type="string">name</item>
196+
</argument>
197+
<argument name="numericArrays" xsi:type="array">
198+
<item name="/config/cest/annotations/env" xsi:type="string">/config/cest/annotations/env</item>
199+
</argument>
200+
</arguments>
201+
</virtualType>
202+
203+
<virtualType name="Magento\AcceptanceTestFramework\Config\TestDataConverter" type="Magento\AcceptanceTestFramework\Test\Config\Converter\Dom\Flat">
204+
<arguments>
205+
<argument name="arrayNodeConfig" xsi:type="object">Magento\AcceptanceTestFramework\Test\Config\Dom\ArrayNodeConfig</argument>
206+
</arguments>
207+
</virtualType>
208+
189209
<type name="Magento\AcceptanceTestFramework\Test\TestDataParser">
190210
<arguments>
191211
<argument name="testData" xsi:type="object">Magento\AcceptanceTestFramework\Test\Config\Data</argument>
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
<?php
2+
/**
3+
* Copyright © 2013-2017 Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace Magento\AcceptanceTestFramework\Test\Config\Converter\Dom;
7+
8+
use Magento\AcceptanceTestFramework\Config\ConverterInterface;
9+
use Magento\AcceptanceTestFramework\Config\Dom\ArrayNodeConfig;
10+
11+
/**
12+
* Universal converter of any XML data to an array representation with no data loss
13+
*/
14+
class Flat implements ConverterInterface
15+
{
16+
/**
17+
* @var ArrayNodeConfig
18+
*/
19+
protected $arrayNodeConfig;
20+
21+
/**
22+
* Constructor
23+
*
24+
* @param ArrayNodeConfig $arrayNodeConfig
25+
*/
26+
public function __construct(ArrayNodeConfig $arrayNodeConfig)
27+
{
28+
$this->arrayNodeConfig = $arrayNodeConfig;
29+
}
30+
31+
/**
32+
* Convert config.
33+
*
34+
* @param \DOMDocument $source
35+
* @return array|string
36+
*/
37+
public function convert($source)
38+
{
39+
return $this->convertXml($source);
40+
}
41+
42+
/**
43+
* Convert dom node tree to array in general case or to string in a case of a text node
44+
*
45+
* Example:
46+
* <node attr="val">
47+
* <subnode>val2<subnode>
48+
* </node>
49+
*
50+
* is converted to
51+
*
52+
* array(
53+
* 'node' => array(
54+
* 'attr' => 'wal',
55+
* 'subnode' => 'val2'
56+
* )
57+
* )
58+
*
59+
* @param \DOMNode $source
60+
* @param string $basePath
61+
* @return string|array
62+
* @throws \UnexpectedValueException
63+
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
64+
*/
65+
public function convertXml(\DOMNode $source, $basePath = '')
66+
{
67+
$value = [];
68+
/** @var \DOMNode $node */
69+
foreach ($source->childNodes as $node) {
70+
if ($node->nodeType == XML_ELEMENT_NODE) {
71+
$nodeName = $node->nodeName;
72+
$nodePath = $basePath . '/' . $nodeName;
73+
74+
$arrayKeyAttribute = $this->arrayNodeConfig->getAssocArrayKeyAttribute($nodePath);
75+
$isNumericArrayNode = $this->arrayNodeConfig->isNumericArray($nodePath);
76+
$isArrayNode = $isNumericArrayNode || $arrayKeyAttribute;
77+
78+
if (isset($value[$nodeName]) && !$isArrayNode) {
79+
throw new \UnexpectedValueException(
80+
"Node path '{$nodePath}' is not unique, but it has not been marked as array."
81+
);
82+
}
83+
84+
$nodeData = $this->convertXml($node, $nodePath);
85+
if ($isArrayNode) {
86+
if ($isNumericArrayNode) {
87+
$value[$nodeName][] = $nodeData;
88+
} elseif (isset($nodeData[$arrayKeyAttribute])) {
89+
$arrayKeyValue = $nodeData[$arrayKeyAttribute];
90+
$value[$arrayKeyValue] = $nodeData;
91+
} else {
92+
throw new \UnexpectedValueException(
93+
"Array is expected to contain value for key '{$arrayKeyAttribute}'."
94+
);
95+
}
96+
} else {
97+
$value[$nodeName] = $nodeData;
98+
}
99+
} elseif ($node->nodeType == XML_CDATA_SECTION_NODE
100+
|| ($node->nodeType == XML_TEXT_NODE && trim($node->nodeValue) != '')
101+
) {
102+
$value = $node->nodeValue;
103+
break;
104+
}
105+
}
106+
$result = $this->getNodeAttributes($source);
107+
if (is_array($value)) {
108+
$result = array_merge($result, $value);
109+
if (!$result) {
110+
$result = '';
111+
}
112+
} else {
113+
if ($result) {
114+
$result['value'] = $value;
115+
} else {
116+
$result = $value;
117+
}
118+
}
119+
return $result;
120+
}
121+
122+
/**
123+
* Retrieve key-value pairs of node attributes
124+
*
125+
* @param \DOMNode $node
126+
* @return array
127+
*/
128+
protected function getNodeAttributes(\DOMNode $node)
129+
{
130+
$result = ['nodeName' => $node->nodeName];
131+
$attributes = $node->attributes ?: [];
132+
/** @var \DOMNode $attribute */
133+
foreach ($attributes as $attribute) {
134+
if ($attribute->nodeType == XML_ATTRIBUTE_NODE) {
135+
$result[$attribute->nodeName] = $attribute->nodeValue;
136+
}
137+
}
138+
return $result;
139+
}
140+
}

src/Magento/AcceptanceTestFramework/Test/etc/sampleCest.xml

Lines changed: 81 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,86 @@
77
<env value="firefox"></env>
88
</annotations>
99

10-
<test name="MinimumFieldsTest">
11-
<dependency name="\FakerDataGenerator" actor="faker"/>
12-
<dependency name="CustomerAddPage" actor="I"/>
13-
14-
<action actor="faker" function="getFakerCustomerData" returnVariable="customerData" name="getFakerCustomerData"/>
15-
<action function="selectAssociateToWebsiteDropdown" parameter="'MainWebsite'" name="selectAssociateToWebsiteDropdown"/>
16-
<action function="selectGroupDropdown" parameter="'Wholesale'" name="selectGroupDropdown"/>
17-
<action function="enterPrefixField" parameter="$customerData['prefix']" name="enterPrefixField"/>
18-
<action function="enterFirstNameField" parameter="$customerData['firstname']" name="enterFirstNameField"/>
19-
<action function="enterMiddleNameField" parameter="$customerData['middlename']" name="enterMiddleNameField"/>
20-
<action function="enterLastNameField" parameter="$customerData['lastname']" name="enterLastNameField"/>
21-
<action function="enterSuffixField" parameter="$customerData['suffix']" name="enterSuffixField"/>
22-
<action function="enterEmailField" parameter="$customerData['email']" name="enterEmailField"/>
23-
<action function="enterDateOfBirthField" parameter="$customerData['dateOfBirth']" name="enterDateOfBirthField"/>
24-
<action function="enterTaxVatNumberField" parameter="$customerData['taxVatNumber']" name="enterTaxVatNumberField"/>
25-
<action function="selectGenderDropdown" userInput="Female" name="selectGenderDropdown"/>
26-
<action function="selectSendWelcomeEmailFromDropdown" parameter="'Default Store View'" name="selectSendWelcomeEmailFromDropdown"/>
10+
<test name="sampleTest">
11+
<annotations />
12+
<acceptPopup mergeKey=""/>
13+
<amOnPage page="" mergeKey=""/>
14+
<appendField field="" value="" mergeKey=""/>
15+
<assertArraySubset subset="" array="" strict="" message="" mergeKey=""/>
16+
<attachFile field="" filename="" mergeKey=""/>
17+
<cancelPopup mergeKey=""/>
18+
<checkOption option="" mergeKey=""/>
19+
<click link="" context="" mergeKey=""/>
20+
<clickWithLeftButton cssOrXPath="" offsetX="" offsetY="" mergeKey=""/>
21+
<clickWithRightButton cssOrXPath="" offsetX="" offsetY="" mergeKey=""/>
22+
<closeTab mergeKey=""/>
23+
<dontSee text="" selector="" mergeKey=""/>
24+
<dontSeeCheckboxIsChecked checkbox="" mergeKey=""/>
25+
<dontSeeCookie cookie="" params="" mergeKey=""/>
26+
<dontSeeCurrentUrlEquals uri="" mergeKey=""/>
27+
<dontSeeCurrentUrlMatches uri="" mergeKey=""/>
28+
<dontSeeElement selector="" attributes="" mergeKey=""/>
29+
<dontSeeElementInDOM selector="" attributes="" mergeKey=""/>
30+
<dontSeeInCurrentUrl uri="" mergeKey=""/>
31+
<dontSeeInField field="" value="" mergeKey=""/>
32+
<dontSeeInPageSource text="" mergeKey=""/>
33+
<dontSeeInSource raw="" mergeKey=""/>
34+
<dontSeeInTitle title="" mergeKey=""/>
35+
<dontSeeLink text="" url="" mergeKey=""/>
36+
<dontSeeOptionIsSelected selector="" optionText="" mergeKey=""/>
37+
<doubleClick cssOrXPath="" mergeKey=""/>
38+
<dragAndDrop source="" target="" mergeKey=""/>
39+
<executeJS script="" mergeKey=""/>
40+
<fillField field="" value="" mergeKey=""/>
41+
<grabAttributeFrom cssOrXPath="" attribute="" mergeKey=""/>
42+
<grabCookie cookie="" params="" mergeKey=""/>
43+
<grabFromCurrentUrl uri="" mergeKey=""/>
44+
<grabMultiple cssOrXPath="" attribute="" mergeKey=""/>
45+
<grabTextFrom cssOrXPathOrRegex="" mergeKey=""/>
46+
<grabValueFrom field="" mergeKey=""/>
47+
<makeScreenshot name="" mergeKey=""/>
48+
<maximizeWindow mergeKey=""/>
49+
<moveBack mergeKey=""/>
50+
<moveForward mergeKey=""/>
51+
<moveMouseOver cssOrXPath="" offsetX="" offsetY="" mergeKey=""/>
52+
<openNewTab mergeKey=""/>
53+
<pauseExecution mergeKey=""/>
54+
<pressKey element="" char="" mergeKey=""/>
55+
<reloadPage mergeKey=""/>
56+
<resetCookie cookie="" params="" mergeKey=""/>
57+
<resizeWindow width="" height="" mergeKey=""/>
58+
<scrollTo selector="" offsetX="" offsetY="" mergeKey=""/>
59+
<see text="" selector="" mergeKey=""/>
60+
<seeCheckboxIsChecked checkbox="" mergeKey=""/>
61+
<seeCookie cookie="" params="" mergeKey=""/>
62+
<seeCurrentUrlEquals uri="" mergeKey=""/>
63+
<seeCurrentUrlMatches uri="" mergeKey=""/>
64+
<seeElement selector="" attributes="" mergeKey=""/>
65+
<seeElementInDOM selector="" attributes="" mergeKey=""/>
66+
<seeInCurrentUrl uri="" mergeKey=""/>
67+
<seeInField field="" value="" mergeKey=""/>
68+
<seeInPageSource text="" mergeKey=""/>
69+
<seeInPopup text="" mergeKey=""/>
70+
<seeInSource raw="" mergeKey=""/>
71+
<seeInTitle title="" mergeKey=""/>
72+
<seeLink text="" url="" mergeKey=""/>
73+
<seeNumberOfElements selector="" expected="" mergeKey=""/>
74+
<seeOptionIsSelected selector="" optionText="" mergeKey=""/>
75+
<selectOption select="" option="" mergeKey=""/>
76+
<setCookie name="" val="" params="" mergeKey=""/>
77+
<switchToIFrame name="" mergeKey=""/>
78+
<switchToNextTab offset="" mergeKey=""/>
79+
<switchToPreviousTab offset="" mergeKey=""/>
80+
<switchToWindow name="" mergeKey=""/>
81+
<typeInPopup keys="" mergeKey=""/>
82+
<uncheckOption option="" mergeKey=""/>
83+
<unselectOption select="" option="" mergeKey=""/>
84+
<wait timeout="" mergeKey=""/>
85+
<waitForElement element="" timeout="" mergeKey=""/>
86+
<waitForElementNotVisible element="" timeout="" mergeKey=""/>
87+
<waitForElementVisible element="" timeout="" mergeKey=""/>
88+
<waitForJS script="" timeout="" mergeKey=""/>
89+
<waitForText text="" timeout="" selector="" mergeKey=""/>
2790
</test>
2891
</cest>
29-
</config>
92+
</config>

0 commit comments

Comments
 (0)