Skip to content

Commit 90d4bdb

Browse files
committed
MQE-171:[Data] Spike - Data handler should persist required entities for simple product with category
- add JsonDefinition object - add JsonDefiniton Manager for object retrieval - modify di.xml to parse metadata - add metadata xsd - add Api Util for request submission - add Api Handler for request submission wrapping (CUD operations) - move parser for data and metadata to DataGenerator parent dir.
1 parent a4668d6 commit 90d4bdb

19 files changed

+746
-261
lines changed

etc/di.xml

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@
126126

127127
<!-- Configuration for Data.xml -->
128128

129-
<type name="Magento\AcceptanceTestFramework\DataProfileSchemaParser">
129+
<type name="Magento\AcceptanceTestFramework\DataGenerator\Parsers\DataProfileSchemaParser">
130130
<arguments>
131131
<argument name="dataProfiles" xsi:type="object">Magento\AcceptanceTestFramework\DataProfile\Config\Data</argument>
132132
</arguments>
@@ -149,13 +149,46 @@
149149
<argument name="idAttributes" xsi:type="array">
150150
<item name="/config/entity" xsi:type="string">name</item>
151151
<item name="/config/entity/data" xsi:type="string">key</item>
152+
<item name="/config/entity/array" xsi:type="string">key</item>
152153
<item name="/config/entity/required-entity" xsi:type="string">name</item>
153154
</argument>
154155
<argument name="fileName" xsi:type="string">*Data.xml</argument>
155156
<argument name="defaultScope" xsi:type="string">Data</argument>
156157
</arguments>
157158
</virtualType>
158159

160+
<!-- Configuration for Metadata.xml -->
161+
162+
<type name="Magento\AcceptanceTestFramework\DataGenerator\Parsers\MetadataParser">
163+
<arguments>
164+
<argument name="metadata" xsi:type="object">Magento\AcceptanceTestFramework\DataProfile\Config\Metadata</argument>
165+
</arguments>
166+
</type>
167+
<virtualType name="Magento\AcceptanceTestFramework\DataProfile\Config\Metadata" type="Magento\AcceptanceTestFramework\Config\Data">
168+
<arguments>
169+
<argument name="reader" xsi:type="object">Magento\AcceptanceTestFramework\Config\Reader\Metadata</argument>
170+
</arguments>
171+
</virtualType>
172+
<virtualType name="Magento\AcceptanceTestFramework\Config\SchemaLocator\Metadata" type="Magento\AcceptanceTestFramework\Config\SchemaLocator">
173+
<arguments>
174+
<argument name="schemaPath" xsi:type="string">Magento/AcceptanceTestFramework/DataGenerator/etc/EntityMetadata.xsd</argument>
175+
</arguments>
176+
</virtualType>
177+
<virtualType name="Magento\AcceptanceTestFramework\Config\Reader\Metadata" type="Magento\AcceptanceTestFramework\Config\Reader\Filesystem">
178+
<arguments>
179+
<argument name="fileResolver" xsi:type="object">Magento\AcceptanceTestFramework\Config\FileResolver\Module</argument>
180+
<argument name="converter" xsi:type="object">Magento\AcceptanceTestFramework\Config\Converter</argument>
181+
<argument name="schemaLocator" xsi:type="object">Magento\AcceptanceTestFramework\Config\SchemaLocator\Metadata</argument>
182+
<argument name="idAttributes" xsi:type="array">
183+
<item name="/config/metadata" xsi:type="string">name</item>
184+
<item name="/config/metadata/entry" xsi:type="string">key</item>
185+
<item name="/config/metadata/array" xsi:type="string">key</item>
186+
</argument>
187+
<argument name="fileName" xsi:type="string">*-meta.xml</argument>
188+
<argument name="defaultScope" xsi:type="string">Metadata</argument>
189+
</arguments>
190+
</virtualType>
191+
159192
<!-- Configuration for TestData -->
160193

161194
<virtualType name="Magento\AcceptanceTestFramework\Config\SchemaLocator\TestData" type="Magento\AcceptanceTestFramework\Config\SchemaLocator">
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
<?php
2+
3+
namespace Magento\AcceptanceTestFramework\DataGenerator\Api;
4+
5+
use Magento\AcceptanceTestFramework\DataGenerator\Managers\DataManager;
6+
use Magento\AcceptanceTestFramework\DataGenerator\Managers\JsonDefinitionManager;
7+
use Magento\AcceptanceTestFramework\DataGenerator\Objects\EntityDataObject;
8+
use Magento\AcceptanceTestFramework\Util\ApiClientUtil;
9+
10+
class ApiExecutor
11+
{
12+
private $operation;
13+
private $entityObject;
14+
private $jsonDefinition;
15+
16+
private $primitives = ['string', 'boolean', 'integer', 'double', 'array'];
17+
18+
/**
19+
* ApiSubObject constructor.
20+
* @param string $operation
21+
* @param EntityDataObject $entityObject
22+
*/
23+
public function __construct($operation, $entityObject)
24+
{
25+
$this->operation = $operation;
26+
$this->entityObject = $entityObject;
27+
28+
$this->jsonDefinition = JsonDefinitionManager::getInstance()->getJsonDefinition(
29+
$this->operation,
30+
$this->entityObject->getType()
31+
);
32+
}
33+
34+
public function executeRequest()
35+
{
36+
$apiClientUrl = $this->jsonDefinition->getApiUrl();
37+
38+
$matchedParams = [];
39+
preg_match_all("/[{](.+?)[}]/", $apiClientUrl, $matchedParams);
40+
41+
if (!empty($matchedParams)) {
42+
foreach ($matchedParams[0] as $paramKey => $paramValue) {
43+
$param = $this->entityObject->getDataByName($matchedParams[1][$paramKey]);
44+
$apiClientUrl = str_replace($paramValue, $param, $apiClientUrl);
45+
}
46+
}
47+
48+
$authorization = $this->jsonDefinition->getAuth();
49+
$headers = $this->jsonDefinition->getHeaders();
50+
51+
if ($authorization) {
52+
$headers[] = $this->getAuthorizationHeader($authorization);
53+
}
54+
55+
$jsonBody = $this->getEncodedJsonString();
56+
57+
$apiClientUtil = new ApiClientUtil(
58+
$apiClientUrl,
59+
$headers,
60+
$this->jsonDefinition->getApiMethod(),
61+
empty($jsonBody) ? null : $jsonBody
62+
);
63+
64+
return $apiClientUtil->submit();
65+
}
66+
67+
/**
68+
* Returns the authorization token needed for some requests via REST call.
69+
*
70+
* @param string $authUrl
71+
* @return string
72+
*/
73+
private function getAuthorizationHeader($authUrl)
74+
{
75+
$headers = ['Content-Type: application/json'];
76+
$authCreds = [
77+
'username' => getenv('MAGENTO_ADMIN_USERNAME'),
78+
'password' => getenv('MAGENTO_ADMIN_PASSWORD')
79+
];
80+
81+
$apiClientUtil = new ApiClientUtil($authUrl, $headers, 'POST', json_encode($authCreds));
82+
$token = $apiClientUtil->submit();
83+
$authHeader = 'Authorization: Bearer ' . str_replace('"', "", $token);
84+
85+
return $authHeader;
86+
}
87+
88+
/**
89+
* This function returns an array which is structurally equal to the json which is needed by the web api for
90+
* entity creation. The function retrieves an array describing the json metadata and traverses any dependencies
91+
* recursively forming an array which represents the json structure for the api of the desired type.
92+
*
93+
* @param EntityDataObject $entityObject
94+
* @param Array $jsonDefMetadata
95+
*
96+
* @return array
97+
*/
98+
private function getJsonDataArray($entityObject, $jsonDefMetadata = null)
99+
{
100+
$jsonArrayMetadata = !$jsonDefMetadata ? JsonDefinitionManager::getInstance()->getJsonDefinition(
101+
$this->operation,
102+
$entityObject->getType()
103+
)->getJsonMetadata() : $jsonDefMetadata;
104+
105+
$jsonArray = array();
106+
107+
foreach ($jsonArrayMetadata as $jsonElement) {
108+
$jsonElementType = $jsonElement->getValue();
109+
110+
if (in_array($jsonElementType, $this->primitives)) {
111+
$jsonArray[$jsonElement->getKey()] = $this->castValue(
112+
$jsonElementType,
113+
$entityObject->getDataByName($jsonElement->getKey())
114+
);
115+
} else {
116+
$entityNamesOfType = $entityObject->getLinkedEntitiesOfType($jsonElementType);
117+
118+
foreach ($entityNamesOfType as $entityName) {
119+
$linkedEntityObj = DataManager::getInstance()->getEntity($entityName);
120+
$jsonDataSubArray = self::getJsonDataArray($linkedEntityObj);
121+
122+
if ($jsonElement->getType() == 'array') {
123+
$jsonArray[$jsonElement->getKey()][] = $jsonDataSubArray;
124+
} else {
125+
$jsonArray[$jsonElement->getKey()] = $jsonDataSubArray;
126+
}
127+
}
128+
}
129+
}
130+
131+
return $jsonArray;
132+
}
133+
134+
private function getEncodedJsonString()
135+
{
136+
$jsonArray = $this->getJsonDataArray($this->entityObject, $this->jsonDefinition->getJsonMetadata());
137+
138+
return json_encode([$this->entityObject->getType() => $jsonArray], JSON_PRETTY_PRINT);
139+
}
140+
141+
private function castValue($type, $value)
142+
{
143+
$newVal = $value;
144+
145+
switch ($type) {
146+
case 'string':
147+
break;
148+
case 'integer':
149+
$newVal = (integer)$value;
150+
break;
151+
case 'boolean':
152+
$newVal = (boolean)$value;
153+
break;
154+
case 'double':
155+
$newVal = (double)$value;
156+
break;
157+
}
158+
159+
return $newVal;
160+
}
161+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
namespace Magento\AcceptanceTestFramework\DataGenerator\Api;
4+
5+
use Magento\AcceptanceTestFramework\DataGenerator\Objects\EntityDataObject;
6+
7+
class EntityApiHandler
8+
{
9+
private $entityObject;
10+
private $createdObject;
11+
12+
/**
13+
* ApiPersistenceHandler constructor.
14+
* @param EntityDataObject $entityObject
15+
*/
16+
public function __construct($entityObject)
17+
{
18+
$this->entityObject = $entityObject;
19+
}
20+
21+
public function createEntity()
22+
{
23+
$apiExecutor = new ApiExecutor('create', $this->entityObject);
24+
$result = $apiExecutor->executeRequest();
25+
26+
$this->createdObject = new EntityDataObject(
27+
'__created' . $this->entityObject->getName(),
28+
$this->entityObject->getType(),
29+
json_decode($result, true),
30+
null
31+
);
32+
}
33+
34+
public function deleteEntity()
35+
{
36+
$apiExecutor = new ApiExecutor('delete', $this->createdObject);
37+
$result = $apiExecutor->executeRequest();
38+
39+
return $result;
40+
}
41+
42+
// TODO add update function
43+
/* public function updateEntity()
44+
{
45+
46+
}*/
47+
}

src/Magento/AcceptanceTestFramework/DataGenerator/DataGeneratorConstants.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ class DataGeneratorConstants
1212
const DATA_ELEMENT_KEY = 'key';
1313
const DATA_ELEMENT_VALUE = 'value';
1414

15+
const ARRAY_VALUES = 'array';
16+
const ARRAY_ELEMENT_KEY = 'key';
17+
const ARRAY_ELEMENT_VALUE = 'item';
18+
1519
const REQUIRED_ENTITY = 'required-entity';
1620
const REQUIRED_ENTITY_TYPE = 'type';
1721
const REQUIRED_ENTITY_VALUE = 'value';

src/Magento/AcceptanceTestFramework/DataGenerator/DataHandler.php

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

src/Magento/AcceptanceTestFramework/DataGenerator/DataModel/ApiModel/Address.php

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

0 commit comments

Comments
 (0)