Skip to content

Commit b3bd18b

Browse files
committed
MQE-231: Allow data to extend other data
- Added simple test and adjusted so data could extend other data
1 parent 15d7407 commit b3bd18b

File tree

9 files changed

+201
-6
lines changed

9 files changed

+201
-6
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
namespace Magento\AcceptanceTest\_default\Backend;
3+
4+
use Magento\FunctionalTestingFramework\AcceptanceTester;
5+
use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler;
6+
use Magento\FunctionalTestingFramework\DataGenerator\Persist\DataPersistenceHandler;
7+
use Magento\FunctionalTestingFramework\DataGenerator\Objects\EntityDataObject;
8+
use \Codeception\Util\Locator;
9+
use Yandex\Allure\Adapter\Annotation\Features;
10+
use Yandex\Allure\Adapter\Annotation\Stories;
11+
use Yandex\Allure\Adapter\Annotation\Title;
12+
use Yandex\Allure\Adapter\Annotation\Description;
13+
use Yandex\Allure\Adapter\Annotation\Parameter;
14+
use Yandex\Allure\Adapter\Annotation\Severity;
15+
use Yandex\Allure\Adapter\Model\SeverityLevel;
16+
use Yandex\Allure\Adapter\Annotation\TestCaseId;
17+
18+
/**
19+
*/
20+
class ExtendedParameterArrayTestCest
21+
{
22+
/**
23+
* @Features({"TestModule"})
24+
* @Parameter(name = "AcceptanceTester", value="$I")
25+
* @param AcceptanceTester $I
26+
* @return void
27+
* @throws \Exception
28+
*/
29+
public function ExtendedParameterArrayTest(AcceptanceTester $I)
30+
{
31+
$I->amGoingTo("create entity that has the stepKey: simpleDataKey");
32+
$testExtendSimpleParamData = DataObjectHandler::getInstance()->getObject("testExtendSimpleParamData");
33+
$simpleDataKey = new DataPersistenceHandler($testExtendSimpleParamData, []);
34+
$simpleDataKey->createEntity();
35+
$I->searchAndMultiSelectOption("#selector", ["otherName"]);
36+
$I->searchAndMultiSelectOption("#selector", ["extendName"]);
37+
}
38+
}

dev/tests/verification/TestModule/Data/ParameterArrayData.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,8 @@
1818
<requiredEntity type="test">originalValue</requiredEntity>
1919
<requiredEntity type="test3">originalValue3</requiredEntity>
2020
</entity>
21+
<entity name="testExtendSimpleParamData" type="data" extends="simpleParamData">
22+
<data key="name">otherName</data>
23+
<data key="nameExtend">extendName</data>
24+
</entity>
2125
</entities>

dev/tests/verification/TestModule/Test/ParameterArrayTest.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,10 @@
2828
<unselectOption selector="#selector" parameterArray="[$simpleDataKey.name$]" stepKey="005"/>
2929
<unselectOption selector="#selector" parameterArray="[{{simpleParamData.name}}, $simpleDataKey.name$]" stepKey="006"/>
3030
</test>
31+
32+
<test name="ExtendedParameterArrayTest">
33+
<createData entity="testExtendSimpleParamData" stepKey="simpleDataKey"/>
34+
<searchAndMultiSelectOption selector="#selector" parameterArray="[{{testExtendSimpleParamData.name}}]" stepKey="xmlSimpleReplace"/>
35+
<searchAndMultiSelectOption selector="#selector" parameterArray="[{{testExtendSimpleParamData.nameExtend}}]" stepKey="xmlSimpleReplace2"/>
36+
</test>
3137
</tests>

dev/tests/verification/Tests/ParameterArrayTest.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,15 @@ public function testParameterArrayGeneration()
1919
{
2020
$this->generateAndCompareTest('ParameterArrayTest');
2121
}
22+
23+
/**
24+
* Tests flat generation of a hardcoded test file with no external references.
25+
*
26+
* @throws \Exception
27+
* @throws \Magento\FunctionalTestingFramework\Exceptions\TestReferenceException
28+
*/
29+
public function testExtendedParameterArrayGeneration()
30+
{
31+
$this->generateAndCompareTest('ExtendedParameterArrayTest');
32+
}
2233
}

src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,20 @@
66

77
namespace Magento\FunctionalTestingFramework\DataGenerator\Handlers;
88

9+
use Magento\FunctionalTestingFramework\Config\Data;
910
use Magento\FunctionalTestingFramework\DataGenerator\Objects\EntityDataObject;
1011
use Magento\FunctionalTestingFramework\DataGenerator\Parsers\DataProfileSchemaParser;
1112
use Magento\FunctionalTestingFramework\Exceptions\XmlException;
1213
use Magento\FunctionalTestingFramework\ObjectManager\ObjectHandlerInterface;
1314
use Magento\FunctionalTestingFramework\ObjectManagerFactory;
15+
use Magento\FunctionalTestingFramework\DataGenerator\Util\DataExtensionUtil;
1416

1517
class DataObjectHandler implements ObjectHandlerInterface
1618
{
1719
const _ENTITY = 'entity';
1820
const _NAME = 'name';
1921
const _TYPE = 'type';
22+
const _EXTENDS = 'extends';
2023
const _DATA = 'data';
2124
const _KEY = 'key';
2225
const _VALUE = 'value';
@@ -46,6 +49,13 @@ class DataObjectHandler implements ObjectHandlerInterface
4649
*/
4750
private $entityDataObjects = [];
4851

52+
/**
53+
* Instance of DataExtensionUtil class
54+
*
55+
* @var DataExtensionUtil
56+
*/
57+
private $extendUtil;
58+
4959
/**
5060
* Constructor
5161
*/
@@ -57,6 +67,7 @@ private function __construct()
5767
return;
5868
}
5969
$this->entityDataObjects = $this->processParserOutput($parserOutput);
70+
$this->extendUtil = new DataExtensionUtil();
6071
}
6172

6273
/**
@@ -81,10 +92,9 @@ public static function getInstance()
8192
*/
8293
public function getObject($name)
8394
{
84-
$allObjects = $this->getAllObjects();
85-
86-
if (array_key_exists($name, $allObjects)) {
87-
return $allObjects[$name];
95+
if (array_key_exists($name, $this->entityDataObjects)) {
96+
$item = $this->extendDataObject($this->entityDataObjects[$name]);
97+
return $this->extendDataObject($this->entityDataObjects[$name]);
8898
}
8999

90100
return null;
@@ -97,6 +107,9 @@ public function getObject($name)
97107
*/
98108
public function getAllObjects()
99109
{
110+
foreach ($this->entityDataObjects as $entityName => $entityObject) {
111+
$this->entityDataObjects[$entityName] = $this->extendDataObject($entityObject);
112+
}
100113
return $this->entityDataObjects;
101114
}
102115

@@ -239,4 +252,18 @@ private function processVarElements($entityData)
239252
}
240253
return $vars;
241254
}
255+
256+
/**
257+
* This method checks if the data object is extended and creates a new data object accordingly
258+
*
259+
* @param EntityDataObject $dataObject
260+
* @return EntityDataObject
261+
*/
262+
private function extendDataObject($dataObject)
263+
{
264+
if ($dataObject->getParentName() != null) {
265+
return $this->extendUtil->extendEntity($dataObject);
266+
}
267+
return $dataObject;
268+
}
242269
}

src/Magento/FunctionalTestingFramework/DataGenerator/Objects/EntityDataObject.php

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,13 @@ class EntityDataObject
6363
*/
6464
private $uniquenessData = [];
6565

66+
/**
67+
* String of parent Entity
68+
*
69+
* @var string
70+
*/
71+
private $parentEntity;
72+
6673
/**
6774
* Constructor
6875
*
@@ -72,8 +79,9 @@ class EntityDataObject
7279
* @param string[] $linkedEntities
7380
* @param string[] $uniquenessData
7481
* @param string[] $vars
82+
* @param string $parentEntity
7583
*/
76-
public function __construct($name, $type, $data, $linkedEntities, $uniquenessData, $vars = [])
84+
public function __construct($name, $type, $data, $linkedEntities, $uniquenessData, $vars = [], $parentEntity = null)
7785
{
7886
$this->name = $name;
7987
$this->type = $type;
@@ -84,6 +92,7 @@ public function __construct($name, $type, $data, $linkedEntities, $uniquenessDat
8492
}
8593

8694
$this->vars = $vars;
95+
$this->parentEntity = $parentEntity;
8796
}
8897

8998
/**
@@ -145,6 +154,16 @@ public function getDataByName($name, $uniquenessFormat)
145154
return null;
146155
}
147156

157+
/**
158+
* Getter for data parent
159+
*
160+
* @return \string
161+
*/
162+
public function getParentName()
163+
{
164+
return $this->parentEntity;
165+
}
166+
148167
/**
149168
* Formats and returns data based on given uniqueDataFormat and prefix/suffix.
150169
*
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\FunctionalTestingFramework\DataGenerator\Util;
8+
9+
use Magento\FunctionalTestingFramework\Config\MftfApplicationConfig;
10+
use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler;
11+
use Magento\FunctionalTestingFramework\DataGenerator\Objects\EntityDataObject;
12+
use Magento\FunctionalTestingFramework\Exceptions\XmlException;
13+
14+
class DataExtensionUtil
15+
{
16+
/**
17+
* ObjectExtensionUtil constructor.
18+
*/
19+
public function __construct()
20+
{
21+
// empty
22+
}
23+
24+
/**
25+
* Resolves test references for extending test objects
26+
*
27+
* @param EntityDataObject $entityObject
28+
* @return EntityDataObject
29+
* @throws XmlException
30+
*/
31+
public function extendEntity($entityObject)
32+
{
33+
// Check to see if the parent test exists
34+
try {
35+
$parentEntity = DataObjectHandler::getInstance()->getObject($entityObject->getParentName());
36+
} catch (XmlException $error) {
37+
throw new XmlException(
38+
"Parent Entity " .
39+
$entityObject->getParentName() .
40+
" not defined for Entity " .
41+
$entityObject->getName() .
42+
"." .
43+
PHP_EOL
44+
);
45+
}
46+
47+
// Check to see if the parent test is already an extended test
48+
if ($parentEntity->getParentName() !== null) {
49+
throw new XmlException(
50+
"Cannot extend an entity that already extends another entity. Entity: " . $parentEntity->getName()
51+
);
52+
}
53+
if (MftfApplicationConfig::getConfig()->verboseEnabled()) {
54+
echo("Extending Test: " . $parentEntity->getName() . " => " . $entityObject->getName() . PHP_EOL);
55+
}
56+
57+
// Get all data for both parent and child and merge
58+
$referencedTestSteps = $parentEntity->getAllData();
59+
$newData = array_merge($referencedTestSteps, $entityObject->getAllData());
60+
61+
// Get all var references for both parent and child and merge
62+
$referencedTestSteps = $parentEntity->getVarReferences();
63+
$newVarReferences = array_merge($referencedTestSteps, $entityObject->getVarReferences());
64+
65+
// Create new Test object to return
66+
$extendedEntity = new EntityDataObject(
67+
$entityObject->getName(),
68+
$parentEntity->getType(),
69+
$newData,
70+
$parentEntity->getLinkedEntities(),
71+
$parentEntity->getUniquenessData(),
72+
$newVarReferences
73+
);
74+
return $extendedEntity;
75+
}
76+
}

src/Magento/FunctionalTestingFramework/DataGenerator/Util/OperationElementExtractor.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class OperationElementExtractor
1717
const OPERATION_OBJECT_ENTRY = 'field';
1818
const OPERATION_OBJECT_OBJ_NAME = 'object';
1919
const OPERATION_OBJECT_ARRAY_VALUE = 'value';
20+
const OPERATION_OBJECT_EXTENDS = 'extends';
2021

2122
/**
2223
* OperationElementExtractor constructor.
@@ -43,6 +44,11 @@ public function extractOperationElement($operationElementArray)
4344

4445
$operationElements = [];
4546
$nestedOperationElements = [];
47+
$operationExtends = null;
48+
49+
if (array_key_exists(OperationElementExtractor::OPERATION_OBJECT_EXTENDS, $operationElementArray)) {
50+
$operationExtends = $operationElementArray[OperationElementExtractor::OPERATION_OBJECT_EXTENDS];
51+
}
4652

4753
// extract nested entries
4854
if (array_key_exists(OperationElementExtractor::OPERATION_OBJECT_ENTRY, $operationElementArray)) {
@@ -79,7 +85,8 @@ public function extractOperationElement($operationElementArray)
7985
OperationElementExtractor::OPERATION_OBJECT_OBJ_NAME,
8086
$operationElementArray[OperationDefinitionObjectHandler::ENTITY_OPERATION_REQUIRED] ?? null,
8187
$nestedOperationElements,
82-
$operationElements
88+
$operationElements,
89+
$operationExtends
8390
);
8491
}
8592

src/Magento/FunctionalTestingFramework/DataGenerator/etc/dataProfileSchema.xsd

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,13 @@
7777
</xs:documentation>
7878
</xs:annotation>
7979
</xs:attribute>
80+
<xs:attribute type="xs:string" name="extends">
81+
<xs:annotation>
82+
<xs:documentation>
83+
Name of the entity that is extended.
84+
</xs:documentation>
85+
</xs:annotation>
86+
</xs:attribute>
8087
</xs:complexType>
8188

8289
<xs:complexType name="dataType">

0 commit comments

Comments
 (0)