Skip to content

Commit 7be7497

Browse files
committed
MQE-187:[Prototype] Create a prototype Test generator for XML based PHP tests.
- add Test Generator code - add Test Object Models - add Test Parser and Configuration - add environmentally set project constants for directory resolution
1 parent d8202e8 commit 7be7497

24 files changed

+1343
-230
lines changed

.env.example

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
MAGENTO_ADMIN_USERNAME=admin
2+
MAGENTO_ADMIN_PASSWORD=test123
3+
TESTS_BP=/Users/dev/somepath/magento2ce-acceptance-tests
4+
FW_BP=/Users/dev/somepath/magento2-acceptance-test-framework

bootstrap.php

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
<?php
2-
3-
defined('FW_BP') || define('FW_BP', str_replace('\\', '/', (__DIR__)));
4-
defined('TESTS_BP') || define('TESTS_BP', dirname(dirname(dirname(FW_BP))));
52
putenv("HOSTNAME=127.0.0.1");
63
putenv("PORT=8080");
74

85
require_once __DIR__ . '/vendor/autoload.php';
96

10-
$dotenv = new Dotenv\Dotenv(TESTS_BP, '.env');
11-
$dotenv->load();
7+
8+
//$dotenv = new Dotenv\Dotenv(TESTS_BP, '.env');
9+
//Load constants from .env file
10+
$env = new \Dotenv\Loader(__DIR__ . '/.env');
11+
$env->load();
12+
define('TESTS_BP', $env->getEnvironmentVariable('TESTS_BP'));
13+
define('FW_BP', $env->getEnvironmentVariable('FW_BP'));
14+
define('TESTS_MODULE_PATH', TESTS_BP . '/tests/acceptance/Magento/AcceptanceTest');
1215

1316
$objectManager = \Magento\AcceptanceTestFramework\ObjectManagerFactory::getObjectManager();

entryPoint.php

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,7 @@
11
<?php
22

3-
defined('FW_BP') || define('FW_BP', str_replace('\\', '/', __DIR__));
4-
//defined('TESTS_BP') || define('TESTS_BP', dirname(dirname(dirname(dirname(FW_BP)))));
5-
defined('TESTS_BP') || define('TESTS_BP', FW_BP);
6-
defined('TESTS_MODULE_PATH') || define('TESTS_MODULE_PATH', FW_BP .'/src/Magento/AcceptanceTestFramework/Page');
7-
83
require_once 'bootstrap.php';
94

105
/** @var Magento\AcceptanceTestFramework\Dummy $dummy */
11-
$dummy = new Magento\AcceptanceTestFramework\DataGenerator\DataHandler('test');
12-
13-
$result = $dummy->persistData(['CustomerEntityTwo'], 'API');
14-
15-
print_r($result);
6+
$dummy = $objectManager->create(\Magento\AcceptanceTestFramework\Dummy::class);
7+
$dummy->readPageObjects();

etc/di.xml

Lines changed: 56 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,6 @@
6767
</argument>
6868
</arguments>
6969
</type>
70-
<type name="Magento\AcceptanceTestFramework\DataProfileSchemaParser">
71-
<arguments>
72-
<argument name="dataProfiles" xsi:type="object">Magento\AcceptanceTestFramework\DataProfile\Config\Data</argument>
73-
</arguments>
74-
</type>
7570
<type name="Magento\AcceptanceTestFramework\Dummy">
7671
<arguments>
7772
<argument name="pageObjects" xsi:type="object">Magento\AcceptanceTestFramework\Page\Config\Data</argument>
@@ -134,6 +129,14 @@
134129
<argument name="reader" xsi:type="object">Magento\AcceptanceTestFramework\Config\Reader\Block</argument>
135130
</arguments>
136131
</virtualType>
132+
133+
<!-- Configuration for Data.xml -->
134+
135+
<type name="Magento\AcceptanceTestFramework\DataProfileSchemaParser">
136+
<arguments>
137+
<argument name="dataProfiles" xsi:type="object">Magento\AcceptanceTestFramework\DataProfile\Config\Data</argument>
138+
</arguments>
139+
</type>
137140
<virtualType name="Magento\AcceptanceTestFramework\DataProfile\Config\Data" type="Magento\AcceptanceTestFramework\Config\Data">
138141
<arguments>
139142
<argument name="reader" xsi:type="object">Magento\AcceptanceTestFramework\Config\Reader\DataProfile</argument>
@@ -150,12 +153,55 @@
150153
<argument name="converter" xsi:type="object">Magento\AcceptanceTestFramework\Config\Converter</argument>
151154
<argument name="schemaLocator" xsi:type="object">Magento\AcceptanceTestFramework\Config\SchemaLocator\DataProfile</argument>
152155
<argument name="idAttributes" xsi:type="array">
153-
<item name="/config/entities/entity" xsi:type="string">name</item>
154-
<item name="/config/entities/entity/dataObjects/dataObject" xsi:type="string">name</item>
155-
<item name="/config/entities/entity/dataObjects/dataObject/dataArray/data" xsi:type="string">key</item>
156+
<item name="/config/entity" xsi:type="string">name</item>
157+
<item name="/config/entity/data" xsi:type="string">key</item>
158+
<item name="/config/entity/required-entity" xsi:type="string">name</item>
159+
</argument>
160+
<argument name="fileName" xsi:type="string">*Data.xml</argument>
161+
<argument name="defaultScope" xsi:type="string">Data</argument>
162+
</arguments>
163+
</virtualType>
164+
165+
166+
<!-- Configuration for TestData -->
167+
168+
<virtualType name="Magento\AcceptanceTestFramework\Config\SchemaLocator\TestData" type="Magento\AcceptanceTestFramework\Config\SchemaLocator">
169+
<arguments>
170+
<argument name="schemaPath" xsi:type="string">Magento/AcceptanceTestFramework/Test/etc/testSchema.xsd</argument>
171+
</arguments>
172+
</virtualType>
173+
<virtualType name="Magento\AcceptanceTestFramework\Config\Reader\TestData" type="Magento\AcceptanceTestFramework\Config\Reader\Filesystem">
174+
<arguments>
175+
<argument name="fileResolver" xsi:type="object">Magento\AcceptanceTestFramework\Config\FileResolver\Module</argument>
176+
<argument name="converter" xsi:type="object">Magento\AcceptanceTestFramework\Config\Converter</argument>
177+
<argument name="schemaLocator" xsi:type="object">Magento\AcceptanceTestFramework\Config\SchemaLocator\TestData</argument>
178+
<argument name="idAttributes" xsi:type="array">
179+
<item name="/config/cest" xsi:type="string">name</item>
180+
<item name="/config/cest/test" xsi:type="string">name</item>
181+
<item name="/config/cest/annotations/features" xsi:type="string">value</item>
182+
<item name="/config/cest/annotations/stories" xsi:type="string">value</item>
183+
<item name="/config/cest/annotations/title" xsi:type="string">value</item>
184+
<item name="/config/cest/annotations/description" xsi:type="string">value</item>
185+
<item name="/config/cest/annotations/severity" xsi:type="string">value</item>
186+
<item name="/config/cest/annotations/testCaseId" xsi:type="string">value</item>
187+
<item name="/config/cest/annotations/group" xsi:type="string">value</item>
188+
<item name="/config/cest/annotations/env" xsi:type="string">value</item>
189+
<item name="/config/cest/annotations/return" xsi:type="string">value</item>
190+
<item name="/config/cest/test/action" xsi:type="string">name</item>
156191
</argument>
157-
<argument name="fileName" xsi:type="string">data.xml</argument>
158-
<argument name="defaultScope" xsi:type="string">*/etc</argument>
192+
<argument name="fileName" xsi:type="string">*Cest.xml</argument>
193+
<argument name="defaultScope" xsi:type="string">Cest</argument>
194+
</arguments>
195+
</virtualType>
196+
197+
<type name="Magento\AcceptanceTestFramework\Test\TestDataParser">
198+
<arguments>
199+
<argument name="testData" xsi:type="object">Magento\AcceptanceTestFramework\Test\Config\Data</argument>
200+
</arguments>
201+
</type>
202+
<virtualType name="Magento\AcceptanceTestFramework\Test\Config\Data" type="Magento\AcceptanceTestFramework\Config\Data">
203+
<arguments>
204+
<argument name="reader" xsi:type="object">Magento\AcceptanceTestFramework\Config\Reader\TestData</argument>
159205
</arguments>
160206
</virtualType>
161207
</config>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace Magento\AcceptanceTestFramework\DataGenerator;
4+
5+
class DataGeneratorConstants
6+
{
7+
const ENTITY_DATA = 'entity';
8+
const ENTITY_DATA_NAME = 'name';
9+
const ENTITY_DATA_TYPE = 'type';
10+
11+
const DATA_VALUES = 'data';
12+
const DATA_ELEMENT_KEY = 'key';
13+
const DATA_ELEMENT_VALUE = 'value';
14+
15+
const REQUIRED_ENTITY = 'required-entity';
16+
const REQUIRED_ENTITY_TYPE = 'type';
17+
const REQUIRED_ENTITY_VALUE = 'value';
18+
}

src/Magento/AcceptanceTestFramework/DataGenerator/DataGeneratorXMLConstants.php

Lines changed: 0 additions & 21 deletions
This file was deleted.

src/Magento/AcceptanceTestFramework/DataGenerator/DataHandler.php

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Magento\AcceptanceTestFramework\DataGenerator;
44

5-
use Magento\AcceptanceTestFramework\DataGenerator\Objects\EntityXmlObject;
5+
use Magento\AcceptanceTestFramework\DataGenerator\Objects\EntityDataObject;
66
use Magento\AcceptanceTestFramework\DataProfileSchemaParser;
77
use Magento\AcceptanceTestFramework\ObjectManagerFactory;
88

@@ -24,15 +24,16 @@ public function generateData($mapEntities = false)
2424
$entityParser = $this->objectManager->create(DataProfileSchemaParser::class);
2525
$entities = $entityParser->readDataProfiles();
2626

27-
foreach ($entities[DataGeneratorXMLConstants::ENTITY_DATA] as $entityName => $entity) {
28-
$entityXmlObject = new EntityXmlObject(
29-
$entityName,
30-
$entity[DataGeneratorXMLConstants::ENTITY_DATA_TYPE],
31-
$entity[DataGeneratorXMLConstants::ENTITY_DATA_CONFIG],
32-
$entity[DataGeneratorXMLConstants::DATA_OBJECT]
33-
);
27+
foreach ($entities[DataGeneratorConstants::ENTITY_DATA] as $entityName => $entity) {
28+
$entityType = $entity[DataGeneratorConstants::ENTITY_DATA_TYPE];
3429

35-
if ($mapEntities) {
30+
if (strcasecmp($entityType, $type) == 0) {
31+
$entityXmlObject = new EntityDataObject(
32+
$entityName,
33+
$entityType,
34+
$entity[DataGeneratorConstants::DATA_VALUES] ?? null,
35+
$entity[DataGeneratorConstants::REQUIRED_ENTITY] ?? null
36+
);
3637
$entityObjects[$entityXmlObject->getName()] = $entityXmlObject;
3738
} else {
3839
$entityObjects[] = $entityXmlObject;
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?php
2+
/**
3+
* Created by PhpStorm.
4+
* User: imeron
5+
* Date: 6/22/17
6+
* Time: 2:13 PM
7+
*/
8+
9+
namespace Magento\AcceptanceTestFramework\DataGenerator\Managers;
10+
11+
use Magento\AcceptanceTestFramework\DataGenerator\DataGeneratorConstants;
12+
use Magento\AcceptanceTestFramework\DataGenerator\Objects\EntityDataObject;
13+
use Magento\AcceptanceTestFramework\DataProfileSchemaParser;
14+
use Magento\AcceptanceTestFramework\ObjectManagerFactory;
15+
16+
class DataManager
17+
{
18+
private $data = []; // an array of entity names to the entity data objects themselves
19+
20+
public function __construct($type)
21+
{
22+
$this->data = $this->parseDataEntities($type);
23+
}
24+
25+
private function parseDataEntities($type)
26+
{
27+
$entityObjects = array();
28+
$objectManager = ObjectManagerFactory::getObjectManager();
29+
$entityParser = $objectManager->create(DataProfileSchemaParser::class);
30+
$entities = $entityParser->readDataProfiles();
31+
32+
foreach ($entities[DataGeneratorConstants::ENTITY_DATA] as $entityName => $entity) {
33+
$entityType = $entity[DataGeneratorConstants::ENTITY_DATA_TYPE];
34+
35+
if (strcasecmp($entityType, $type) == 0) {
36+
$entityXmlObject = new EntityDataObject(
37+
$entityName,
38+
$entityType,
39+
$entity[DataGeneratorConstants::DATA_VALUES] ?? null,
40+
$entity[DataGeneratorConstants::REQUIRED_ENTITY] ?? null
41+
);
42+
43+
$entityObjects[$entityXmlObject->getName()] = $entityXmlObject;
44+
}
45+
}
46+
unset($entityName);
47+
unset($entity);
48+
49+
return $entityObjects;
50+
}
51+
52+
public function getEntity($entityName)
53+
{
54+
return $this->data[$entityName];
55+
}
56+
57+
public function getAllEntities()
58+
{
59+
return $this->data;
60+
}
61+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace Magento\AcceptanceTestFramework\DataGenerator\Managers;
4+
5+
class EntityDataManager
6+
{
7+
private static $entityManagers = [];
8+
9+
public static function getDataManager($type)
10+
{
11+
$typeManagerName = $type . 'EntityManager';
12+
if (!array_key_exists($typeManagerName, self::$entityManagers)) {
13+
self::$entityManagers[$typeManagerName] = new DataManager($type);
14+
}
15+
16+
return self::$entityManagers[$typeManagerName];
17+
}
18+
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
<?php
2+
3+
namespace Magento\AcceptanceTestFramework\DataGenerator\Objects;
4+
5+
use Magento\AcceptanceTestFramework\DataGenerator\DataGeneratorConstants;
6+
use Magento\AcceptanceTestFramework\DataGenerator\Managers\EntityDataManager;
7+
8+
class EntityDataObject
9+
{
10+
private $name;
11+
private $type;
12+
private $linkedEntities = []; //array of required entity name to corresponding type
13+
private $data = []; //array of Data Name to Data Value
14+
15+
16+
public function __construct($entityName, $entityType, $data, $linkedEntities)
17+
{
18+
$this->name = $entityName;
19+
$this->type = $entityType;
20+
21+
if ($data) {
22+
foreach ($data as $dataElement) {
23+
$dataElementKey = $dataElement[DataGeneratorConstants::DATA_ELEMENT_KEY];
24+
$dataElementValue = $dataElement[DataGeneratorConstants::DATA_ELEMENT_VALUE];
25+
26+
$this->data[$dataElementKey] = $dataElementValue;
27+
}
28+
unset($dataElement);
29+
}
30+
31+
if ($linkedEntities) {
32+
foreach ($linkedEntities as $linkedEntity) {
33+
$linkedEntityName = $linkedEntity[DataGeneratorConstants::REQUIRED_ENTITY_VALUE];
34+
$linkedEntityType = $linkedEntity[DataGeneratorConstants::REQUIRED_ENTITY_TYPE];
35+
36+
$this->linkedEntities[$linkedEntityName] = $linkedEntityType;
37+
}
38+
unset($linkedEntity);
39+
}
40+
}
41+
42+
public function hasLinkedEntity($entityName)
43+
{
44+
return array_key_exists($entityName, $this->linkedEntities);
45+
}
46+
47+
public function getName()
48+
{
49+
return $this->name;
50+
}
51+
52+
public function getType()
53+
{
54+
return $this->type;
55+
}
56+
57+
/**
58+
* This function retrieves data from an entity defined in xml. The data can be defined explicitly by the entity or
59+
* within any entity linked to or required by the entity. The function will evaluate in the following order:
60+
* 1) Data declared explicitly by the entity
61+
* 2) Data declared explicitly as a known linked entity
62+
* 3) Data declared by entities linked to linked entities
63+
* @param string $name
64+
* @param string $entityName
65+
* @return string
66+
*/
67+
public function getDataByName($name, $entityName = null)
68+
{
69+
if ($entityName == null) {
70+
return $this->data[$name];
71+
} elseif ($this->hasLinkedEntity($entityName)) {
72+
$entityTypeManager = EntityDataManager::getDataManager($this->linkedEntities[$entityName]);
73+
return $entityTypeManager->getEntity($entityName)->getDataByName($name);
74+
} else {
75+
foreach ($this->linkedEntities as $linkedEntityName => $linkedEntityType) {
76+
$result = EntityDataManager::getDataManager($linkedEntityType)->getEntity($linkedEntityName)
77+
->getDataByName($name, $entityName);
78+
79+
if ($result) {
80+
return $result;
81+
}
82+
}
83+
}
84+
}
85+
86+
public function persistEntity()
87+
{
88+
$this->persistDependencies();
89+
// TODO fetch json representation and api persistence mechanism
90+
}
91+
92+
private function persistDependencies()
93+
{
94+
// TODO call method to fetch json representation and api persistence mechanism
95+
}
96+
}

0 commit comments

Comments
 (0)