Skip to content

Commit 65a0f1e

Browse files
authored
MQE-334
1 parent d300744 commit 65a0f1e

File tree

5 files changed

+73
-13
lines changed

5 files changed

+73
-13
lines changed

src/Magento/FunctionalTestingFramework/DataGenerator/Api/ApiExecutor.php

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
67
namespace Magento\FunctionalTestingFramework\DataGenerator\Api;
78

89
use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler;
@@ -12,13 +13,15 @@
1213
use Magento\FunctionalTestingFramework\DataGenerator\Objects\JsonElement;
1314
use Magento\FunctionalTestingFramework\DataGenerator\Util\JsonObjectExtractor;
1415
use Magento\FunctionalTestingFramework\Util\ApiClientUtil;
16+
use Magento\Setup\Exception;
1517

1618
/**
1719
* Class ApiExecutor
1820
*/
1921
class ApiExecutor
2022
{
2123
const PRIMITIVE_TYPES = ['string', 'boolean', 'integer', 'double', 'array'];
24+
const EXCEPTION_REQUIRED_DATA = "%s of key \" %s\" in \"%s\" is required by metadata, but was not provided.";
2225

2326
/**
2427
* Describes the operation for the executor ('create','update','delete')
@@ -149,6 +152,7 @@ private function getAuthorizationHeader($authUrl)
149152
* @param EntityDataObject $entityObject
150153
* @param array $jsonArrayMetadata
151154
* @return array
155+
* @throws \Exception
152156
*/
153157
private function convertJsonArray($entityObject, $jsonArrayMetadata)
154158
{
@@ -169,20 +173,40 @@ private function convertJsonArray($entityObject, $jsonArrayMetadata)
169173
EntityDataObject::CEST_UNIQUE_VALUE
170174
);
171175

172-
if (array_key_exists($jsonElement->getKey(), $entityObject->getUniquenessData())) {
173-
$uniqueData = $entityObject->getUniquenessDataByName($jsonElement->getKey());
174-
if ($uniqueData === 'suffix') {
175-
$elementData .= (string)self::getSequence($entityObject->getName());
176-
} else {
177-
$elementData = (string)self::getSequence($entityObject->getName())
178-
. $elementData;
176+
// If data was defined at all, attempt to put it into JSON body
177+
// If data was not defined, and element is required, throw exception
178+
// If no data is defined, don't input defaults per primitive into JSON for the data
179+
if ($elementData != null) {
180+
if (array_key_exists($jsonElement->getKey(), $entityObject->getUniquenessData())) {
181+
$uniqueData = $entityObject->getUniquenessDataByName($jsonElement->getKey());
182+
if ($uniqueData === 'suffix') {
183+
$elementData .= (string)self::getSequence($entityObject->getName());
184+
} else {
185+
$elementData = (string)self::getSequence($entityObject->getName()) . $elementData;
186+
}
179187
}
188+
$jsonArray[$jsonElement->getKey()] = $this->castValue($jsonElementType, $elementData);
189+
190+
} elseif ($jsonElement->getRequired()) {
191+
throw new \Exception(sprintf(
192+
ApiExecutor::EXCEPTION_REQUIRED_DATA,
193+
$jsonElement->getType(),
194+
$jsonElement->getKey(),
195+
$this->entityObject->getName()
196+
));
180197
}
181-
182-
$jsonArray[$jsonElement->getKey()] = $this->castValue($jsonElementType, $elementData);
183198
} else {
184199
$entityNamesOfType = $entityObject->getLinkedEntitiesOfType($jsonElementType);
185200

201+
// If an element is required by metadata, but was not provided in the entity, throw an exception
202+
if ($jsonElement->getRequired() && $entityNamesOfType == null) {
203+
throw new \Exception(sprintf(
204+
ApiExecutor::EXCEPTION_REQUIRED_DATA,
205+
$jsonElement->getType(),
206+
$jsonElement->getKey(),
207+
$this->entityObject->getName()
208+
));
209+
}
186210
foreach ($entityNamesOfType as $entityName) {
187211
$jsonDataSubArray = $this->resolveNonPrimitiveElement($entityName, $jsonElement);
188212

@@ -210,7 +234,8 @@ private function resolveNonPrimitiveElement($entityName, $jsonElement)
210234
$linkedEntityObj = $this->resolveLinkedEntityObject($entityName);
211235

212236
if (!empty($jsonElement->getNestedJsonElement($jsonElement->getValue()))
213-
&& $jsonElement->getType() == 'array') {
237+
&& $jsonElement->getType() == 'array'
238+
) {
214239
$jsonSubArray = $this->convertJsonArray(
215240
$linkedEntityObj,
216241
[$jsonElement->getNestedJsonElement($jsonElement->getValue())]
@@ -285,6 +310,7 @@ private static function getSequence($entityName)
285310
}
286311

287312
// @codingStandardsIgnoreStart
313+
288314
/**
289315
* This function takes a string value and its corresponding type and returns the string cast
290316
* into its the type passed.
@@ -304,6 +330,9 @@ private function castValue($type, $value)
304330
$newVal = (integer)$value;
305331
break;
306332
case 'boolean':
333+
if (strtolower($newVal) === 'false') {
334+
return false;
335+
}
307336
$newVal = (boolean)$value;
308337
break;
309338
case 'double':

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class JsonDefinitionObjectHandler implements ObjectHandlerInterface
3737
const ENTITY_OPERATION_OBJECT_KEY = 'key';
3838
const ENTITY_OPERATION_OBJECT_VALUE = 'value';
3939
const ENTITY_OPERATION_JSON_OBJECT = 'jsonObject';
40+
const ENTITY_OPERATION_REQUIRED = 'required';
4041

4142
/**
4243
* Singleton Instance of class
@@ -164,7 +165,8 @@ private function initJsonDefinitions()
164165
$jsonMetadata[] = new JsonElement(
165166
$jsonEntryType[JsonDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY],
166167
$jsonEntryType[JsonDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE],
167-
JsonDefinitionObjectHandler::ENTITY_OPERATION_ENTRY
168+
JsonDefinitionObjectHandler::ENTITY_OPERATION_ENTRY,
169+
$jsonEntryType[JsonDefinitionObjectHandler::ENTITY_OPERATION_REQUIRED] ?? null
168170
);
169171
}
170172
}
@@ -192,6 +194,7 @@ private function initJsonDefinitions()
192194
$jsonEntryType[JsonDefinitionObjectHandler::ENTITY_OPERATION_ARRAY_KEY],
193195
$value,
194196
$type,
197+
$jsonEntryType[JsonDefinitionObjectHandler::ENTITY_OPERATION_REQUIRED] ?? null,
195198
$jsonSubMetadata
196199
);
197200
}

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,20 +43,32 @@ class JsonElement
4343
*/
4444
private $nestedMetadata = [];
4545

46+
/**
47+
* Json required attribute, used to determine if values need to be cast before insertion.
48+
* @var bool
49+
*/
50+
private $required;
51+
4652
/**
4753
* JsonElement constructor.
4854
* @param string $key
4955
* @param string $value
5056
* @param string $type
5157
* @param array $nestedElements
58+
* @param bool $required
5259
* @param array $nestedMetadata
5360
*/
54-
public function __construct($key, $value, $type, $nestedElements = [], $nestedMetadata = null)
61+
public function __construct($key, $value, $type, $required, $nestedElements = [], $nestedMetadata = null)
5562
{
5663
$this->key = $key;
5764
$this->value = $value;
5865
$this->type = $type;
5966
$this->nestedElements = $nestedElements;
67+
if ($required) {
68+
$this->required = true;
69+
} else {
70+
$this->required = false;
71+
}
6072
$this->nestedMetadata = $nestedMetadata;
6173
}
6274

@@ -90,6 +102,16 @@ public function getType()
90102
return $this->type;
91103
}
92104

105+
/**
106+
* Getter for required attribute
107+
*
108+
* @return bool
109+
*/
110+
public function getRequired()
111+
{
112+
return $this->required;
113+
}
114+
93115
/**
94116
* Returns the nested json element based on the type of entity passed
95117
*

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ public function extractJsonObject($jsonObjectArray)
7171
$jsonDefKey,
7272
$dataType,
7373
JsonObjectExtractor::JSON_OBJECT_OBJ_NAME,
74+
$jsonObjectArray[JsonDefinitionObjectHandler::ENTITY_OPERATION_REQUIRED] ?? null,
7475
$nestedJsonElements,
7576
$jsonMetadata
7677
);
@@ -89,7 +90,8 @@ private function extractJsonEntries(&$jsonMetadata, $jsonEntryArray)
8990
$jsonMetadata[] = new JsonElement(
9091
$jsonEntryType[JsonDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY],
9192
$jsonEntryType[JsonDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE],
92-
JsonDefinitionObjectHandler::ENTITY_OPERATION_ENTRY
93+
JsonDefinitionObjectHandler::ENTITY_OPERATION_ENTRY,
94+
$jsonEntryType[JsonDefinitionObjectHandler::ENTITY_OPERATION_REQUIRED] ?? null
9395
);
9496
}
9597
}
@@ -122,6 +124,7 @@ private function extractJsonArrays(&$jsonArrayData, $jsonArrayArray)
122124
$jsonEntryType[JsonDefinitionObjectHandler::ENTITY_OPERATION_ARRAY_KEY],
123125
$jsonElementValue,
124126
JsonDefinitionObjectHandler::ENTITY_OPERATION_ARRAY,
127+
$jsonEntryType[JsonDefinitionObjectHandler::ENTITY_OPERATION_REQUIRED] ?? null,
125128
$nestedJsonElements
126129
);
127130
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,14 @@
3131
</xs:choice>
3232
<xs:attribute type="xs:string" name="key"/>
3333
<xs:attribute type="xs:string" name="dataType" use="required"/>
34+
<xs:attribute type="xs:boolean" name="required" use="optional"/>
3435
</xs:complexType>
3536
<xs:complexType name="entry">
3637
<xs:simpleContent>
3738
<xs:extension base="xs:string">
3839
<xs:attribute type="xs:string" name="key" use="required"/>
3940
<xs:attribute type="xs:string" name="type" use="optional"/>
41+
<xs:attribute type="xs:boolean" name="required" use="optional"/>
4042
</xs:extension>
4143
</xs:simpleContent>
4244
</xs:complexType>
@@ -47,6 +49,7 @@
4749
</xs:choice>
4850
<xs:attribute type="xs:string" name="key" use="required"/>
4951
<xs:attribute type="xs:string" name="type" use="optional"/>
52+
<xs:attribute type="xs:boolean" name="required" use="optional"/>
5053
</xs:complexType>
5154
<xs:complexType name="header">
5255
<xs:simpleContent>

0 commit comments

Comments
 (0)