Skip to content

Commit e6108dc

Browse files
committed
MQE-300:[Customizability] Update action groups to use multiple arguments rather than specific entities
- add argument support to schema and object model
1 parent fd8c278 commit e6108dc

File tree

9 files changed

+180
-61
lines changed

9 files changed

+180
-61
lines changed

etc/di.xml

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@
224224
<item name="/config/cest/test" xsi:type="string">name</item>
225225
<item name="/config/cest/test/entity/data" xsi:type="string">key</item>
226226
<item name="/config/cest/test/entity/required-entity" xsi:type="string">key</item>
227+
<item name="/config/cest/test/actionGroup/argument" xsi:type="string">name</item>
227228
<item name="/config/cest/test/createData/required-entity" xsi:type="string">name</item>
228229
<item name="/config/cest/test/(acceptPopup|amOnPage|amOnUrl|appendField|assertArraySubset|attachFile|cancelPopup|checkOption|click|clickWithLeftButton|clickWithRightButton|closeTab|createData|deleteData|dontSee|dontSeeCheckboxIsChecked|dontSeeCookie|dontSeeCurrentUrlEquals|dontSeeCurrentUrlMatches|dontSeeElement|dontSeeElementInDOM|dontSeeInCurrentUrl|dontSeeInField|dontSeeInPageSource|dontSeeInSource|dontSeeInTitle|dontSeeLink|dontSeeOptionIsSelected|doubleClick|dragAndDrop|entity|executeJS|fillField|formatMoney|grabAttributeFrom|grabCookie|grabFromCurrentUrl|grabMultiple|grabPageSource|grabTextFrom|grabValueFrom|loadSessionSnapshot|loginAsAdmin|makeScreenshot|maximizeWindow|moveBack|moveForward|moveMouseOver|openNewTab|pauseExecution|performOn|pressKey|reloadPage|resetCookie|resizeWindow|scrollTo|searchAndMultiSelectOption|see|seeCheckboxIsChecked|seeCookie|seeCurrentUrlEquals|seeCurrentUrlMatches|seeElement|seeElementInDOM|seeInCurrentUrl|seeInField|seeInFormFields|seeInPageSource|seeInPopup|seeInSource|seeInTitle|seeLink|seeNumberOfElements|seeOptionIsSelected|selectOption|setCookie|switchToIFrame|switchToNextTab|switchToPreviousTab|switchToWindow|typeInPopup|uncheckOption|unselectOption|wait|waitForAjaxLoad|waitForElement|waitForElementChange|waitForElementNotVisible|waitForElementVisible|waitForJS|waitForPageLoad|waitForText)" xsi:type="string">mergeKey</item>
229230
</argument>
@@ -249,6 +250,7 @@
249250
<item name="/config/cest/after/entity/data" xsi:type="string">key</item>
250251
<item name="/config/cest/after/entity/required-entity" xsi:type="string">key</item>
251252
<item name="/config/cest/after/createData/required-entity" xsi:type="string">name</item>
253+
<item name="/config/cest/test/actionGroup/argument" xsi:type="string">name</item>
252254
</argument>
253255
<argument name="numericArrays" xsi:type="array">
254256
<item name="/config/cest/annotations/env" xsi:type="string">/config/cest/annotations/env</item>
@@ -298,19 +300,21 @@
298300
<argument name="converter" xsi:type="object">Magento\AcceptanceTestFramework\Config\ActionGroupDataConverter</argument>
299301
<argument name="schemaLocator" xsi:type="object">Magento\AcceptanceTestFramework\Config\SchemaLocator\TestData</argument>
300302
<argument name="idAttributes" xsi:type="array">
301-
<item name="/config/actions" xsi:type="string">name</item>
302-
<item name="/config/actions/(acceptPopup|amOnPage|appendField|assertArraySubset|attachFile|cancelPopup|checkOption|click|clickWithLeftButton|clickWithRightButton|closeTab|createData|deleteData|dontSee|dontSeeCheckboxIsChecked|dontSeeCookie|dontSeeCurrentUrlEquals|dontSeeCurrentUrlMatches|dontSeeElement|dontSeeElementInDOM|dontSeeInCurrentUrl|dontSeeInField|dontSeeInPageSource|dontSeeInSource|dontSeeInTitle|dontSeeLink|dontSeeOptionIsSelected|doubleClick|dragAndDrop|executeJS|fillField|formatMoney|grabAttributeFrom|grabCookie|grabFromCurrentUrl|grabMultiple|grabPageSource|grabTextFrom|grabValueFrom|loadSessionSnapshot|loginAsAdmin|makeScreenshot|maximizeWindow|moveBack|moveForward|moveMouseOver|openNewTab|pauseExecution|performOn|pressKey|reloadPage|resetCookie|resizeWindow|scrollTo|searchAndMultiSelectOption|see|seeCheckboxIsChecked|seeCookie|seeCurrentUrlEquals|seeCurrentUrlMatches|seeElement|seeElementInDOM|seeInCurrentUrl|seeInField|seeInFormFields|seeInPageSource|seeInPopup|seeInSource|seeInTitle|seeLink|seeNumberOfElements|seeOptionIsSelected|selectOption|setCookie|switchToIFrame|switchToNextTab|switchToPreviousTab|switchToWindow|typeInPopup|uncheckOption|unselectOption|wait|waitForAjaxLoad|waitForElement|waitForElementChange|waitForElementNotVisible|waitForElementVisible|waitForJS|waitForPageLoad|waitForText)" xsi:type="string">mergeKey</item>
303+
<item name="/config/actionGroup" xsi:type="string">name</item>
304+
<item name="/config/actionGroup/arguments/argument" xsi:type="string">name</item>
305+
<item name="/config/actionGroup/(acceptPopup|amOnPage|appendField|assertArraySubset|attachFile|cancelPopup|checkOption|click|clickWithLeftButton|clickWithRightButton|closeTab|createData|deleteData|dontSee|dontSeeCheckboxIsChecked|dontSeeCookie|dontSeeCurrentUrlEquals|dontSeeCurrentUrlMatches|dontSeeElement|dontSeeElementInDOM|dontSeeInCurrentUrl|dontSeeInField|dontSeeInPageSource|dontSeeInSource|dontSeeInTitle|dontSeeLink|dontSeeOptionIsSelected|doubleClick|dragAndDrop|executeJS|fillField|formatMoney|grabAttributeFrom|grabCookie|grabFromCurrentUrl|grabMultiple|grabPageSource|grabTextFrom|grabValueFrom|loadSessionSnapshot|loginAsAdmin|makeScreenshot|maximizeWindow|moveBack|moveForward|moveMouseOver|openNewTab|pauseExecution|performOn|pressKey|reloadPage|resetCookie|resizeWindow|scrollTo|searchAndMultiSelectOption|see|seeCheckboxIsChecked|seeCookie|seeCurrentUrlEquals|seeCurrentUrlMatches|seeElement|seeElementInDOM|seeInCurrentUrl|seeInField|seeInFormFields|seeInPageSource|seeInPopup|seeInSource|seeInTitle|seeLink|seeNumberOfElements|seeOptionIsSelected|selectOption|setCookie|switchToIFrame|switchToNextTab|switchToPreviousTab|switchToWindow|typeInPopup|uncheckOption|unselectOption|wait|waitForAjaxLoad|waitForElement|waitForElementChange|waitForElementNotVisible|waitForElementVisible|waitForJS|waitForPageLoad|waitForText)" xsi:type="string">mergeKey</item>
303306
</argument>
304-
<argument name="fileName" xsi:type="string">*-action_group.xml</argument>
305-
<argument name="defaultScope" xsi:type="string">Cest</argument>
307+
<argument name="fileName" xsi:type="string">*ActionGroup.xml</argument>
308+
<argument name="defaultScope" xsi:type="string">ActionGroup</argument>
306309
</arguments>
307310
</virtualType>
308311

309312
<virtualType name="Magento\AcceptanceTestFramework\Test\Config\Dom\ActionGroupArrayNodeConfig" type="Magento\AcceptanceTestFramework\Config\Dom\ArrayNodeConfig">
310313
<arguments>
311314
<argument name="assocArrayAttributes" xsi:type="array">
312-
<item name="/config/actions/(acceptPopup|amOnPage|appendField|assertArraySubset|attachFile|cancelPopup|checkOption|click|clickWithLeftButton|clickWithRightButton|closeTab|createData|deleteData|dontSee|dontSeeCheckboxIsChecked|dontSeeCookie|dontSeeCurrentUrlEquals|dontSeeCurrentUrlMatches|dontSeeElement|dontSeeElementInDOM|dontSeeInCurrentUrl|dontSeeInField|dontSeeInPageSource|dontSeeInSource|dontSeeInTitle|dontSeeLink|dontSeeOptionIsSelected|doubleClick|dragAndDrop|executeJS|fillField|formatMoney|grabAttributeFrom|grabCookie|grabFromCurrentUrl|grabMultiple|grabPageSource|grabTextFrom|grabValueFrom|loadSessionSnapshot|loginAsAdmin|makeScreenshot|maximizeWindow|moveBack|moveForward|moveMouseOver|openNewTab|pauseExecution|performOn|pressKey|reloadPage|resetCookie|resizeWindow|scrollTo|searchAndMultiSelectOption|see|seeCheckboxIsChecked|seeCookie|seeCurrentUrlEquals|seeCurrentUrlMatches|seeElement|seeElementInDOM|seeInCurrentUrl|seeInField|seeInFormFields|seeInPageSource|seeInPopup|seeInSource|seeInTitle|seeLink|seeNumberOfElements|seeOptionIsSelected|selectOption|setCookie|switchToIFrame|switchToNextTab|switchToPreviousTab|switchToWindow|typeInPopup|uncheckOption|unselectOption|wait|waitForAjaxLoad|waitForElement|waitForElementChange|waitForElementNotVisible|waitForElementVisible|waitForJS|waitForPageLoad|waitForText)" xsi:type="string">mergeKey</item>
313-
<item name="/config/actions" xsi:type="string">name</item>
315+
<item name="/config/actionGroup/(acceptPopup|amOnPage|appendField|assertArraySubset|attachFile|cancelPopup|checkOption|click|clickWithLeftButton|clickWithRightButton|closeTab|createData|deleteData|dontSee|dontSeeCheckboxIsChecked|dontSeeCookie|dontSeeCurrentUrlEquals|dontSeeCurrentUrlMatches|dontSeeElement|dontSeeElementInDOM|dontSeeInCurrentUrl|dontSeeInField|dontSeeInPageSource|dontSeeInSource|dontSeeInTitle|dontSeeLink|dontSeeOptionIsSelected|doubleClick|dragAndDrop|executeJS|fillField|formatMoney|grabAttributeFrom|grabCookie|grabFromCurrentUrl|grabMultiple|grabPageSource|grabTextFrom|grabValueFrom|loadSessionSnapshot|loginAsAdmin|makeScreenshot|maximizeWindow|moveBack|moveForward|moveMouseOver|openNewTab|pauseExecution|performOn|pressKey|reloadPage|resetCookie|resizeWindow|scrollTo|searchAndMultiSelectOption|see|seeCheckboxIsChecked|seeCookie|seeCurrentUrlEquals|seeCurrentUrlMatches|seeElement|seeElementInDOM|seeInCurrentUrl|seeInField|seeInFormFields|seeInPageSource|seeInPopup|seeInSource|seeInTitle|seeLink|seeNumberOfElements|seeOptionIsSelected|selectOption|setCookie|switchToIFrame|switchToNextTab|switchToPreviousTab|switchToWindow|typeInPopup|uncheckOption|unselectOption|wait|waitForAjaxLoad|waitForElement|waitForElementChange|waitForElementNotVisible|waitForElementVisible|waitForJS|waitForPageLoad|waitForText)" xsi:type="string">mergeKey</item>
316+
<item name="/config/actionGroup" xsi:type="string">name</item>
317+
<item name="/config/actionGroup/arguments/argument" xsi:type="string">name</item>
314318
</argument>
315319
</arguments>
316320
</virtualType>

src/Magento/AcceptanceTestFramework/Test/Handlers/ActionGroupObjectHandler.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class ActionGroupObjectHandler implements ObjectHandlerInterface
1919
{
2020
const BEFORE_AFTER_ERROR_MSG = "Merge Error - Steps cannot have both before and after attributes.\tTestStep='%s'";
2121
const ACTION_GROUP_ROOT = 'config';
22-
const ACTION_GROUP = 'actions';
22+
const ACTION_GROUP = 'actionGroup';
2323

2424
/**
2525
* Single instance of class var

src/Magento/AcceptanceTestFramework/Test/Objects/ActionGroupObject.php

Lines changed: 60 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
*/
1414
class ActionGroupObject
1515
{
16+
const VAR_ATTRIBUTES = ['userInput', 'selector', 'page'];
17+
1618
/**
1719
* The name of the action group
1820
*
@@ -28,79 +30,110 @@ class ActionGroupObject
2830
private $parsedActions = [];
2931

3032
/**
31-
* A string used as the default entity if the user does not specify one
33+
* An array used to store the default entities if the user does not specify any
3234
*
33-
* @var string
35+
* @var array
3436
*/
35-
private $defaultEntity;
37+
private $arguments;
3638

3739
/**
3840
* ActionGroupObject constructor.
3941
*
4042
* @param string $name
41-
* @param string $defaultEntity
43+
* @param string $arguments
4244
* @param array $actions
4345
*/
44-
public function __construct($name, $defaultEntity, $actions)
46+
public function __construct($name, $arguments, $actions)
4547
{
4648
$this->name = $name;
47-
$this->defaultEntity = $defaultEntity;
49+
$this->arguments = $arguments;
4850
$this->parsedActions = $actions;
4951
}
5052

5153
/**
5254
* Gets the ordered steps including merged waits
5355
*
54-
* @param string $entity
56+
* @param array $arguments
5557
* @return array
5658
*/
57-
public function getSteps($entity)
59+
public function getSteps($arguments)
5860
{
5961
$mergeUtil = new ActionMergeUtil();
60-
if (!$entity) {
61-
$entity = $this->defaultEntity;
62+
$args = $this->arguments;
63+
64+
if ($arguments) {
65+
$args = array_merge($args, $arguments);
6266
}
63-
return $mergeUtil->mergeStepsAndInsertWaits($this->getResolvedActions($entity));
67+
68+
return $mergeUtil->mergeStepsAndInsertWaits($this->getResolvedActionsWithArgs($args));
6469
}
6570

6671
/**
67-
* Function which takes the name of the entity object to be appended to an action objects fields returns resulting
68-
* action objects with proper entity.field references.
72+
* Function which takes a set of arguments to be appended to an action objects fields returns resulting
73+
* action objects with proper argument.field references.
6974
*
70-
* @param string $entity
75+
* @param array $arguments
7176
* @return array
7277
*/
73-
private function getResolvedActions($entity)
78+
private function getResolvedActionsWithArgs($arguments)
7479
{
7580
$resolvedActions = [];
81+
$regexPattern = '/{{([\w]+)/';
7682

7783
foreach ($this->parsedActions as $action) {
78-
/**@var \Magento\AcceptanceTestFramework\Test\Objects\ActionObject $action **/
79-
if (array_key_exists('userInput', $action->getCustomActionAttributes())) {
80-
$regexPattern = '/{{.[\w]+}}/';
81-
preg_match_all($regexPattern, $action->getCustomActionAttributes()['userInput'], $matches);
82-
83-
$userInputString = $action->getCustomActionAttributes()['userInput'];
84-
foreach ($matches[0] as $match) {
85-
$search = str_replace('}}', '', str_replace('{{', '', $match));
86-
$userInputString = str_replace($search, $entity . $search, $userInputString);
87-
}
84+
$varAttributes = array_intersect(self::VAR_ATTRIBUTES, array_keys($action->getCustomActionAttributes()));
85+
if (!empty($varAttributes)) {
86+
$newActionAttributes = [];
87+
// 1 check to see if we have pertinent var
88+
foreach ($varAttributes as $varAttribute) {
89+
$attributeValue = $action->getCustomActionAttributes()[$varAttribute];
90+
preg_match_all($regexPattern, $attributeValue, $matches);
91+
if (empty($matches[0]) & empty($matches[1])) {
92+
continue;
93+
}
8894

89-
$attribute['userInput'] = $userInputString;
95+
$newActionAttributes[$varAttribute] = $this->resolveNewAttribute(
96+
$arguments,
97+
$attributeValue,
98+
$matches
99+
);
100+
}
90101

91102
$resolvedActions[$action->getMergeKey()] = new ActionObject(
92103
$action->getMergeKey(),
93104
$action->getType(),
94-
array_merge($action->getCustomActionAttributes(), $attribute),
105+
array_merge($action->getCustomActionAttributes(), $newActionAttributes),
95106
$action->getLinkedAction(),
96107
$action->getOrderOffset()
97108
);
98109
} else {
99110
// add action here if we do not see any userInput in this particular action
100111
$resolvedActions[$action->getMergeKey()] = $action;
101112
}
113+
102114
}
103115

104116
return $resolvedActions;
105117
}
118+
119+
/**
120+
* Function which takes an array of arguments to use for replacement of var name, the string which contains
121+
* the variable for replacement, an array of matching vars.
122+
*
123+
* @param array $arguments
124+
* @param string $attributeValue
125+
* @param array $matches
126+
* @return string
127+
*/
128+
private function resolveNewAttribute($arguments, $attributeValue, $matches)
129+
{
130+
$newAttributeVal = $attributeValue;
131+
foreach ($matches[1] as $var) {
132+
if (array_key_exists($var, $arguments)) {
133+
$newAttributeVal = str_replace($var, $arguments[$var], $newAttributeVal);
134+
}
135+
}
136+
137+
return $newAttributeVal;
138+
}
106139
}

src/Magento/AcceptanceTestFramework/Test/Objects/TestObject.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
use Magento\AcceptanceTestFramework\Test\Handlers\ActionGroupObjectHandler;
1010
use Magento\AcceptanceTestFramework\Test\Util\ActionMergeUtil;
11+
use Magento\AcceptanceTestFramework\Test\Util\ActionObjectExtractor;
1112

1213
/**
1314
* Class TestObject
@@ -114,12 +115,12 @@ private function extractActionGroups($mergedSteps)
114115

115116
foreach ($mergedSteps as $key => $mergedStep) {
116117
/**@var ActionObject $mergedStep**/
117-
if ($mergedStep->getType() == 'actions') {
118+
if ($mergedStep->getType() == ActionObjectExtractor::ACTION_GROUP_TAG) {
118119
$actionGroup = ActionGroupObjectHandler::getInstance()->getObject(
119-
$mergedStep->getCustomActionAttributes()['ref']
120+
$mergedStep->getCustomActionAttributes()[ActionObjectExtractor::ACTION_GROUP_REF]
120121
);
121-
$entity = $mergedStep->getCustomActionAttributes()['entity'] ?? null;
122-
$actionsToMerge = $actionGroup->getSteps($entity);
122+
$args = $mergedStep->getCustomActionAttributes()[ActionObjectExtractor::ACTION_GROUP_ARGUMENTS] ?? null;
123+
$actionsToMerge = $actionGroup->getSteps($args);
123124
$newOrderedList = $newOrderedList + $actionsToMerge;
124125
} else {
125126
$newOrderedList[$key] = $mergedStep;

src/Magento/AcceptanceTestFramework/Test/Util/ActionGroupObjectExtractor.php

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
*/
1414
class ActionGroupObjectExtractor extends BaseCestObjectExtractor
1515
{
16-
const DEFAULT_ENTITY = 'defaultEntity';
16+
const DEFAULT_VALUE = 'defaultValue';
17+
const ACTION_GROUP_ARGUMENTS = 'arguments';
1718

1819
/**
1920
* Action Object Extractor for converting actions into objects
@@ -38,19 +39,47 @@ public function __construct()
3839
*/
3940
public function extractActionGroup($actionGroupData)
4041
{
42+
$arguments = [];
43+
4144
$actionData = $this->stripDescriptorTags(
4245
$actionGroupData,
4346
self::NODE_NAME,
44-
self::DEFAULT_ENTITY,
47+
self::ACTION_GROUP_ARGUMENTS,
4548
self::NAME
4649
);
4750

4851
$actions = $this->actionObjectExtractor->extractActions($actionData);
4952

53+
if (array_key_exists(self::ACTION_GROUP_ARGUMENTS, $actionGroupData)) {
54+
$arguments = $this->extractArguments($actionGroupData[self::ACTION_GROUP_ARGUMENTS]);
55+
}
56+
5057
return new ActionGroupObject(
5158
$actionGroupData[self::NAME],
52-
$actionGroupData[self::DEFAULT_ENTITY],
59+
$arguments,
5360
$actions
5461
);
5562
}
63+
64+
/**
65+
* Method which extract argument declarations from an action group and returns an array of default values indexed
66+
* by argument name.
67+
*
68+
* @param array $arguments
69+
* @return array
70+
*/
71+
private function extractArguments($arguments)
72+
{
73+
$parsedArguments = [];
74+
$argData = $this->stripDescriptorTags(
75+
$arguments,
76+
self::NODE_NAME
77+
);
78+
79+
foreach ($argData as $argName => $argValue) {
80+
$parsedArguments[$argName] = $argValue[self::DEFAULT_VALUE];
81+
}
82+
83+
return $parsedArguments;
84+
}
5685
}

0 commit comments

Comments
 (0)