From 98a678d3e74290c0fa2804744ba924af999f89e0 Mon Sep 17 00:00:00 2001 From: Soumya Unnikrishnan Date: Tue, 28 Jul 2020 09:04:54 -0500 Subject: [PATCH 1/4] MQE-1974: Report used deprecated metadata in Test --- .../Handlers/DataObjectHandler.php | 53 +++++++++++-------- .../OperationDefinitionObjectHandler.php | 4 +- .../Handlers/PersistedObjectHandler.php | 4 +- .../Objects/OperationDefinitionObject.php | 18 +++++++ .../DataGenerator/Persist/CurlHandler.php | 2 +- .../Persist/DataPersistenceHandler.php | 2 +- .../Page/Handlers/PageObjectHandler.php | 4 +- .../Page/Handlers/SectionObjectHandler.php | 4 +- .../Test/Util/ActionGroupObjectExtractor.php | 4 +- .../Util/Logger/MftfLogger.php | 20 +++---- 10 files changed, 68 insertions(+), 47 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php index 5a4b42dc4..6f025b515 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php @@ -75,8 +75,10 @@ class DataObjectHandler implements ObjectHandlerInterface /** * Constructor + * @param bool $validateName Set to false to disable name validations + * @throws XmlException */ - private function __construct() + private function __construct($validateName = true) { $parser = ObjectManagerFactory::getObjectManager()->create(DataProfileSchemaParser::class); $parserOutput = $parser->readDataProfiles(); @@ -85,20 +87,21 @@ private function __construct() } $this->entityNameValidator = new NameValidationUtil(); $this->entityKeyValidator = new NameValidationUtil(); - $this->entityDataObjects = $this->processParserOutput($parserOutput); + $this->entityDataObjects = $this->processParserOutput($parserOutput, $validateName); $this->extendUtil = new DataExtensionUtil(); } /** * Return the singleton instance of this class. Initialize it if needed. * + * @param bool $validateName * @return DataObjectHandler * @throws \Exception */ - public static function getInstance() + public static function getInstance($validateName = true) { if (!self::$INSTANCE) { - self::$INSTANCE = new DataObjectHandler(); + self::$INSTANCE = new DataObjectHandler($validateName); } return self::$INSTANCE; } @@ -135,11 +138,12 @@ public function getAllObjects() * Convert the parser output into a collection of EntityDataObjects * * @param string[] $parserOutput Primitive array output from the Magento parser. + * @param bool $validateName * @return EntityDataObject[] * @throws XmlException * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - private function processParserOutput($parserOutput) + private function processParserOutput($parserOutput, $validateName = true) { $entityDataObjects = []; $rawEntities = $parserOutput[self::_ENTITY]; @@ -150,11 +154,13 @@ private function processParserOutput($parserOutput) } $filename = $rawEntity[self::_FILENAME] ?? null; - $this->entityNameValidator->validatePascalCase( - $name, - NameValidationUtil::DATA_ENTITY_NAME, - $filename - ); + if ($validateName) { + $this->entityNameValidator->validatePascalCase( + $name, + NameValidationUtil::DATA_ENTITY_NAME, + $filename + ); + } $type = $rawEntity[self::_TYPE] ?? null; $data = []; $deprecated = null; @@ -164,7 +170,7 @@ private function processParserOutput($parserOutput) $parentEntity = null; if (array_key_exists(self::_DATA, $rawEntity)) { - $data = $this->processDataElements($rawEntity); + $data = $this->processDataElements($rawEntity, $validateName); $uniquenessData = $this->processUniquenessData($rawEntity); } @@ -191,8 +197,8 @@ private function processParserOutput($parserOutput) if (array_key_exists(self::OBJ_DEPRECATED, $rawEntity)) { $deprecated = $rawEntity[self::OBJ_DEPRECATED]; LoggingUtil::getInstance()->getLogger(self::class)->deprecation( - $deprecated, - ["dataName" => $filename, "deprecatedEntity" => $deprecated] + "The data entity '{$name}' is deprecated.", + ["fileName" => $filename, "deprecatedMessage" => $deprecated] ); } @@ -210,8 +216,10 @@ private function processParserOutput($parserOutput) $entityDataObjects[$entityDataObject->getName()] = $entityDataObject; } - $this->entityNameValidator->summarize(NameValidationUtil::DATA_ENTITY_NAME); - $this->entityKeyValidator->summarize(NameValidationUtil::DATA_ENTITY_KEY); + if ($validateName) { + $this->entityNameValidator->summarize(NameValidationUtil::DATA_ENTITY_NAME); + $this->entityKeyValidator->summarize(NameValidationUtil::DATA_ENTITY_KEY); + } return $entityDataObjects; } @@ -237,19 +245,22 @@ private function processArray($arrayItems, $data, $key) * Parses elements in an entity, and returns them as an array of "lowerKey"=>value. * * @param string[] $entityData + * @param bool $validateName * @return string[] */ - private function processDataElements($entityData) + private function processDataElements($entityData, $validateName = true) { $dataValues = []; foreach ($entityData[self::_DATA] as $dataElement) { $originalDataElementKey = $dataElement[self::_KEY]; $filename = $entityData[self::_FILENAME] ?? null; - $this->entityKeyValidator->validateCamelCase( - $originalDataElementKey, - NameValidationUtil::DATA_ENTITY_KEY, - $filename - ); + if ($validateName) { + $this->entityKeyValidator->validateCamelCase( + $originalDataElementKey, + NameValidationUtil::DATA_ENTITY_KEY, + $filename + ); + } $dataElementKey = strtolower($originalDataElementKey); $dataElementValue = $dataElement[self::_VALUE] ?? ""; $dataValues[$dataElementKey] = $dataElementValue; diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/OperationDefinitionObjectHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/OperationDefinitionObjectHandler.php index 2c8ab7530..eb4651b3e 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/OperationDefinitionObjectHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/OperationDefinitionObjectHandler.php @@ -215,8 +215,8 @@ private function initialize() if ($deprecated !== null) { LoggingUtil::getInstance()->getLogger(self::class)->deprecation( - $deprecated, - ["operationName" => $dataDefName, "deprecatedOperation" => $deprecated] + $message = "The operation {$dataDefName} is deprecated.", + ["operationType" => $operation, "deprecatedMessage" => $deprecated] ); } diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/PersistedObjectHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/PersistedObjectHandler.php index 49da76697..a36e3aeca 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/PersistedObjectHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/PersistedObjectHandler.php @@ -87,7 +87,7 @@ public function createEntity( $retrievedDependentObjects[] = $this->retrieveEntity($objectKey, $scope); } - $retrievedEntity = DataObjectHandler::getInstance()->getObject($entity); + $retrievedEntity = DataObjectHandler::getInstance(false)->getObject($entity); if ($retrievedEntity === null) { throw new TestReferenceException( @@ -163,7 +163,7 @@ public function getEntity($key, $scope, $entity, $dependentObjectKeys = [], $sto $retrievedDependentObjects[] = $this->retrieveEntity($objectKey, $scope); } - $retrievedEntity = DataObjectHandler::getInstance()->getObject($entity); + $retrievedEntity = DataObjectHandler::getInstance(false)->getObject($entity); $persistedObject = new DataPersistenceHandler( $retrievedEntity, $retrievedDependentObjects diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Objects/OperationDefinitionObject.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Objects/OperationDefinitionObject.php index 67fe48300..ef1a7faa5 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Objects/OperationDefinitionObject.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Objects/OperationDefinitionObject.php @@ -6,6 +6,8 @@ namespace Magento\FunctionalTestingFramework\DataGenerator\Objects; +use Magento\FunctionalTestingFramework\Util\Logger\LoggingUtil; + /** * Class OperationDefinitionObject * @SuppressWarnings(PHPMD) @@ -341,4 +343,20 @@ public function addQueryParams() $this->apiUrl = $this->apiUrl . $paramName . "=" . $paramValue; } } + + /** + * Function to log a referenced deprecated operation at runtime. + * + * @return void + */ + public function logDeprecated() + { + if ($this->deprecated != null) { + LoggingUtil::getInstance()->getLogger(self::class)->deprecation( + $message = "The operation {$this->name} is deprecated.", + ["operationType" => $this->operation, "deprecatedMessage" => $this->deprecated], + true + ); + } + } } diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php index 362d25e75..52c14ac20 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php @@ -92,6 +92,7 @@ public function __construct($operation, $entityObject, $storeCode = null) $this->operation, $this->entityObject->getType() ); + $this->operationDefinition->logDeprecated(); $this->isJson = false; } @@ -125,7 +126,6 @@ public function executeRequest($dependentEntities) $method = $this->operationDefinition->getApiMethod(); AllureHelper::addAttachmentToCurrentStep($apiUrl, 'API Endpoint'); AllureHelper::addAttachmentToCurrentStep(json_encode($headers, JSON_PRETTY_PRINT), 'Request Headers'); - $operationDataResolver = new OperationDataArrayResolver($dependentEntities); $this->requestData = $operationDataResolver->resolveOperationDataArray( $this->entityObject, diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php index 73ee2be19..2e76e2cec 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php @@ -110,7 +110,7 @@ public function updateEntity($updateDataName, $updateDependentObjects = []) foreach ($updateDependentObjects as $dependentObject) { $this->dependentObjects[] = $dependentObject->getCreatedObject(); } - $updateEntityObject = DataObjectHandler::getInstance()->getObject($updateDataName); + $updateEntityObject = DataObjectHandler::getInstance(false)->getObject($updateDataName); $curlHandler = new CurlHandler('update', $updateEntityObject, $this->storeCode); $result = $curlHandler->executeRequest(array_merge($this->dependentObjects, [$this->createdObject])); $this->setCreatedObject( diff --git a/src/Magento/FunctionalTestingFramework/Page/Handlers/PageObjectHandler.php b/src/Magento/FunctionalTestingFramework/Page/Handlers/PageObjectHandler.php index 73695c182..8f4302077 100644 --- a/src/Magento/FunctionalTestingFramework/Page/Handlers/PageObjectHandler.php +++ b/src/Magento/FunctionalTestingFramework/Page/Handlers/PageObjectHandler.php @@ -79,8 +79,8 @@ private function __construct() if ($deprecated !== null) { LoggingUtil::getInstance()->getLogger(self::class)->deprecation( - $deprecated, - ["pageName" => $filename, "deprecatedPage" => $deprecated] + "The page '{$pageName}' is deprecated.", + ["fileName" => $filename, "deprecatedMessage" => $deprecated] ); } diff --git a/src/Magento/FunctionalTestingFramework/Page/Handlers/SectionObjectHandler.php b/src/Magento/FunctionalTestingFramework/Page/Handlers/SectionObjectHandler.php index 5d658bac0..6ac3456fd 100644 --- a/src/Magento/FunctionalTestingFramework/Page/Handlers/SectionObjectHandler.php +++ b/src/Magento/FunctionalTestingFramework/Page/Handlers/SectionObjectHandler.php @@ -89,8 +89,8 @@ private function __construct() $elementDeprecated = $elementData[self::OBJ_DEPRECATED] ?? null; if ($elementDeprecated !== null) { LoggingUtil::getInstance()->getLogger(ElementObject::class)->deprecation( - $elementDeprecated, - ["elementName" => $elementName, "deprecatedElement" => $elementDeprecated] + "The element '{$elementName}' is deprecated.", + ["fileName" => $filename, "deprecatedMessage" => $elementDeprecated] ); } $elements[$elementName] = new ElementObject( diff --git a/src/Magento/FunctionalTestingFramework/Test/Util/ActionGroupObjectExtractor.php b/src/Magento/FunctionalTestingFramework/Test/Util/ActionGroupObjectExtractor.php index 618cddc09..84b960f1b 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Util/ActionGroupObjectExtractor.php +++ b/src/Magento/FunctionalTestingFramework/Test/Util/ActionGroupObjectExtractor.php @@ -65,8 +65,8 @@ public function extractActionGroup($actionGroupData) if (array_key_exists(self::OBJ_DEPRECATED, $actionGroupData)) { $deprecated = $actionGroupData[self::OBJ_DEPRECATED]; LoggingUtil::getInstance()->getLogger(ActionGroupObject::class)->deprecation( - $deprecated, - ["actionGroupName" => $actionGroupData[self::FILENAME], "deprecatedActionGroup" => $deprecated] + "The action group '{$actionGroupData[self::NAME]}' is deprecated.", + ["fileName" => $actionGroupData[self::FILENAME], "deprecatedMessage" => $deprecated] ); } $actionGroupReference = $actionGroupData[self::EXTENDS_ACTION_GROUP] ?? null; diff --git a/src/Magento/FunctionalTestingFramework/Util/Logger/MftfLogger.php b/src/Magento/FunctionalTestingFramework/Util/Logger/MftfLogger.php index 5955235ce..f791afa29 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Logger/MftfLogger.php +++ b/src/Magento/FunctionalTestingFramework/Util/Logger/MftfLogger.php @@ -36,7 +36,6 @@ public function __construct($name, array $handlers = [], array $processors = []) /** * Prints a deprecation warning, as well as adds a log at the WARNING level. - * Suppresses logging during execution phase. * * @param string $message The log message. * @param array $context The log context. @@ -46,14 +45,11 @@ public function __construct($name, array $handlers = [], array $processors = []) public function deprecation($message, array $context = [], $verbose = false) { $message = "DEPRECATION: " . $message; - // print during test generation - if ($this->phase === MftfApplicationConfig::GENERATION_PHASE && $verbose) { + // Suppress print during unit testing + if ($this->phase !== MftfApplicationConfig::UNIT_TEST_PHASE && $verbose) { print ($message . json_encode($context) . "\n"); } - // suppress logging during test execution - if ($this->phase !== MftfApplicationConfig::EXECUTION_PHASE) { - parent::warning($message, $context); - } + parent::warning($message, $context); } /** @@ -76,7 +72,6 @@ public function criticalFailure($message, array $context = [], $verbose = false) /** * Adds a log record at the NOTICE level. - * Suppresses logging during execution phase. * * @param string $message * @param array $context @@ -86,13 +81,10 @@ public function criticalFailure($message, array $context = [], $verbose = false) public function notification($message, array $context = [], $verbose = false) { $message = "NOTICE: " . $message; - // print during test generation - if ($this->phase === MftfApplicationConfig::GENERATION_PHASE && $verbose) { + // Suppress print during unit testing + if ($this->phase !== MftfApplicationConfig::UNIT_TEST_PHASE && $verbose) { print ($message . json_encode($context) . "\n"); } - // suppress logging during test execution - if ($this->phase !== MftfApplicationConfig::EXECUTION_PHASE) { - parent::notice($message, $context); - } + parent::notice($message, $context); } } From cc367434ac79d27860f20f84baf54d0d8e512293 Mon Sep 17 00:00:00 2001 From: Soumya Unnikrishnan Date: Tue, 28 Jul 2020 16:17:03 -0500 Subject: [PATCH 2/4] MQE-1974: Report used deprecated metadata in Test --- .../DataGenerator/Handlers/DataObjectHandler.php | 9 +++++---- .../DataGenerator/Persist/CurlHandler.php | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php index 6f025b515..29056b597 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php @@ -75,7 +75,7 @@ class DataObjectHandler implements ObjectHandlerInterface /** * Constructor - * @param bool $validateName Set to false to disable name validations + * @param boolean $validateName Set to false to disable name validations. * @throws XmlException */ private function __construct($validateName = true) @@ -94,7 +94,7 @@ private function __construct($validateName = true) /** * Return the singleton instance of this class. Initialize it if needed. * - * @param bool $validateName + * @param boolean $validateName * @return DataObjectHandler * @throws \Exception */ @@ -138,10 +138,11 @@ public function getAllObjects() * Convert the parser output into a collection of EntityDataObjects * * @param string[] $parserOutput Primitive array output from the Magento parser. - * @param bool $validateName + * @param boolean $validateName * @return EntityDataObject[] * @throws XmlException * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.NPathComplexity) */ private function processParserOutput($parserOutput, $validateName = true) { @@ -245,7 +246,7 @@ private function processArray($arrayItems, $data, $key) * Parses elements in an entity, and returns them as an array of "lowerKey"=>value. * * @param string[] $entityData - * @param bool $validateName + * @param boolean $validateName * @return string[] */ private function processDataElements($entityData, $validateName = true) diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php index 52c14ac20..1ebfb7d5c 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php @@ -126,6 +126,7 @@ public function executeRequest($dependentEntities) $method = $this->operationDefinition->getApiMethod(); AllureHelper::addAttachmentToCurrentStep($apiUrl, 'API Endpoint'); AllureHelper::addAttachmentToCurrentStep(json_encode($headers, JSON_PRETTY_PRINT), 'Request Headers'); + $operationDataResolver = new OperationDataArrayResolver($dependentEntities); $this->requestData = $operationDataResolver->resolveOperationDataArray( $this->entityObject, From f8dd6db60a3abce857e00508e6db5d924d812716 Mon Sep 17 00:00:00 2001 From: Soumya Unnikrishnan Date: Fri, 31 Jul 2020 15:25:01 -0500 Subject: [PATCH 3/4] MQE-1974: Report used deprecated metadata in Test --- .../Handlers/DataObjectHandler.php | 50 +++++++------------ .../Handlers/PersistedObjectHandler.php | 4 +- .../DataGenerator/Persist/CurlHandler.php | 2 +- .../Persist/DataPersistenceHandler.php | 2 +- .../Util/Logger/MftfLogger.php | 22 +++++--- 5 files changed, 39 insertions(+), 41 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php index 29056b597..87dc6a13d 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php @@ -75,10 +75,8 @@ class DataObjectHandler implements ObjectHandlerInterface /** * Constructor - * @param boolean $validateName Set to false to disable name validations. - * @throws XmlException */ - private function __construct($validateName = true) + private function __construct() { $parser = ObjectManagerFactory::getObjectManager()->create(DataProfileSchemaParser::class); $parserOutput = $parser->readDataProfiles(); @@ -87,21 +85,20 @@ private function __construct($validateName = true) } $this->entityNameValidator = new NameValidationUtil(); $this->entityKeyValidator = new NameValidationUtil(); - $this->entityDataObjects = $this->processParserOutput($parserOutput, $validateName); + $this->entityDataObjects = $this->processParserOutput($parserOutput); $this->extendUtil = new DataExtensionUtil(); } /** * Return the singleton instance of this class. Initialize it if needed. * - * @param boolean $validateName * @return DataObjectHandler * @throws \Exception */ - public static function getInstance($validateName = true) + public static function getInstance() { if (!self::$INSTANCE) { - self::$INSTANCE = new DataObjectHandler($validateName); + self::$INSTANCE = new DataObjectHandler(); } return self::$INSTANCE; } @@ -138,13 +135,11 @@ public function getAllObjects() * Convert the parser output into a collection of EntityDataObjects * * @param string[] $parserOutput Primitive array output from the Magento parser. - * @param boolean $validateName * @return EntityDataObject[] * @throws XmlException * @SuppressWarnings(PHPMD.CyclomaticComplexity) - * @SuppressWarnings(PHPMD.NPathComplexity) */ - private function processParserOutput($parserOutput, $validateName = true) + private function processParserOutput($parserOutput) { $entityDataObjects = []; $rawEntities = $parserOutput[self::_ENTITY]; @@ -155,13 +150,11 @@ private function processParserOutput($parserOutput, $validateName = true) } $filename = $rawEntity[self::_FILENAME] ?? null; - if ($validateName) { - $this->entityNameValidator->validatePascalCase( - $name, - NameValidationUtil::DATA_ENTITY_NAME, - $filename - ); - } + $this->entityNameValidator->validatePascalCase( + $name, + NameValidationUtil::DATA_ENTITY_NAME, + $filename + ); $type = $rawEntity[self::_TYPE] ?? null; $data = []; $deprecated = null; @@ -171,7 +164,7 @@ private function processParserOutput($parserOutput, $validateName = true) $parentEntity = null; if (array_key_exists(self::_DATA, $rawEntity)) { - $data = $this->processDataElements($rawEntity, $validateName); + $data = $this->processDataElements($rawEntity); $uniquenessData = $this->processUniquenessData($rawEntity); } @@ -217,10 +210,8 @@ private function processParserOutput($parserOutput, $validateName = true) $entityDataObjects[$entityDataObject->getName()] = $entityDataObject; } - if ($validateName) { - $this->entityNameValidator->summarize(NameValidationUtil::DATA_ENTITY_NAME); - $this->entityKeyValidator->summarize(NameValidationUtil::DATA_ENTITY_KEY); - } + $this->entityNameValidator->summarize(NameValidationUtil::DATA_ENTITY_NAME); + $this->entityKeyValidator->summarize(NameValidationUtil::DATA_ENTITY_KEY); return $entityDataObjects; } @@ -246,22 +237,19 @@ private function processArray($arrayItems, $data, $key) * Parses elements in an entity, and returns them as an array of "lowerKey"=>value. * * @param string[] $entityData - * @param boolean $validateName * @return string[] */ - private function processDataElements($entityData, $validateName = true) + private function processDataElements($entityData) { $dataValues = []; foreach ($entityData[self::_DATA] as $dataElement) { $originalDataElementKey = $dataElement[self::_KEY]; $filename = $entityData[self::_FILENAME] ?? null; - if ($validateName) { - $this->entityKeyValidator->validateCamelCase( - $originalDataElementKey, - NameValidationUtil::DATA_ENTITY_KEY, - $filename - ); - } + $this->entityKeyValidator->validateCamelCase( + $originalDataElementKey, + NameValidationUtil::DATA_ENTITY_KEY, + $filename + ); $dataElementKey = strtolower($originalDataElementKey); $dataElementValue = $dataElement[self::_VALUE] ?? ""; $dataValues[$dataElementKey] = $dataElementValue; diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/PersistedObjectHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/PersistedObjectHandler.php index a36e3aeca..49da76697 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/PersistedObjectHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/PersistedObjectHandler.php @@ -87,7 +87,7 @@ public function createEntity( $retrievedDependentObjects[] = $this->retrieveEntity($objectKey, $scope); } - $retrievedEntity = DataObjectHandler::getInstance(false)->getObject($entity); + $retrievedEntity = DataObjectHandler::getInstance()->getObject($entity); if ($retrievedEntity === null) { throw new TestReferenceException( @@ -163,7 +163,7 @@ public function getEntity($key, $scope, $entity, $dependentObjectKeys = [], $sto $retrievedDependentObjects[] = $this->retrieveEntity($objectKey, $scope); } - $retrievedEntity = DataObjectHandler::getInstance(false)->getObject($entity); + $retrievedEntity = DataObjectHandler::getInstance()->getObject($entity); $persistedObject = new DataPersistenceHandler( $retrievedEntity, $retrievedDependentObjects diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php index 1ebfb7d5c..89055b83f 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/CurlHandler.php @@ -92,7 +92,6 @@ public function __construct($operation, $entityObject, $storeCode = null) $this->operation, $this->entityObject->getType() ); - $this->operationDefinition->logDeprecated(); $this->isJson = false; } @@ -124,6 +123,7 @@ public function executeRequest($dependentEntities) $returnRegex = $this->operationDefinition->getReturnRegex(); $returnIndex = $this->operationDefinition->getReturnIndex(); $method = $this->operationDefinition->getApiMethod(); + $this->operationDefinition->logDeprecated(); AllureHelper::addAttachmentToCurrentStep($apiUrl, 'API Endpoint'); AllureHelper::addAttachmentToCurrentStep(json_encode($headers, JSON_PRETTY_PRINT), 'Request Headers'); diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php index 2e76e2cec..73ee2be19 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Persist/DataPersistenceHandler.php @@ -110,7 +110,7 @@ public function updateEntity($updateDataName, $updateDependentObjects = []) foreach ($updateDependentObjects as $dependentObject) { $this->dependentObjects[] = $dependentObject->getCreatedObject(); } - $updateEntityObject = DataObjectHandler::getInstance(false)->getObject($updateDataName); + $updateEntityObject = DataObjectHandler::getInstance()->getObject($updateDataName); $curlHandler = new CurlHandler('update', $updateEntityObject, $this->storeCode); $result = $curlHandler->executeRequest(array_merge($this->dependentObjects, [$this->createdObject])); $this->setCreatedObject( diff --git a/src/Magento/FunctionalTestingFramework/Util/Logger/MftfLogger.php b/src/Magento/FunctionalTestingFramework/Util/Logger/MftfLogger.php index f791afa29..880dd9736 100644 --- a/src/Magento/FunctionalTestingFramework/Util/Logger/MftfLogger.php +++ b/src/Magento/FunctionalTestingFramework/Util/Logger/MftfLogger.php @@ -36,6 +36,7 @@ public function __construct($name, array $handlers = [], array $processors = []) /** * Prints a deprecation warning, as well as adds a log at the WARNING level. + * Suppresses logging during execution phase. * * @param string $message The log message. * @param array $context The log context. @@ -45,11 +46,16 @@ public function __construct($name, array $handlers = [], array $processors = []) public function deprecation($message, array $context = [], $verbose = false) { $message = "DEPRECATION: " . $message; - // Suppress print during unit testing - if ($this->phase !== MftfApplicationConfig::UNIT_TEST_PHASE && $verbose) { + // print during test generation including metadata + if ((array_key_exists('operationType', $context) || + $this->phase === MftfApplicationConfig::GENERATION_PHASE) && $verbose) { print ($message . json_encode($context) . "\n"); } - parent::warning($message, $context); + // suppress logging during test execution except metadata + if (array_key_exists('operationType', $context) || + $this->phase !== MftfApplicationConfig::EXECUTION_PHASE) { + parent::warning($message, $context); + } } /** @@ -72,6 +78,7 @@ public function criticalFailure($message, array $context = [], $verbose = false) /** * Adds a log record at the NOTICE level. + * Suppresses logging during execution phase. * * @param string $message * @param array $context @@ -81,10 +88,13 @@ public function criticalFailure($message, array $context = [], $verbose = false) public function notification($message, array $context = [], $verbose = false) { $message = "NOTICE: " . $message; - // Suppress print during unit testing - if ($this->phase !== MftfApplicationConfig::UNIT_TEST_PHASE && $verbose) { + // print during test generation + if ($this->phase === MftfApplicationConfig::GENERATION_PHASE && $verbose) { print ($message . json_encode($context) . "\n"); } - parent::notice($message, $context); + // suppress logging during test execution + if ($this->phase !== MftfApplicationConfig::EXECUTION_PHASE) { + parent::notice($message, $context); + } } } From 474e2d6238b653a82d6920e47b02f1504b551fdd Mon Sep 17 00:00:00 2001 From: Soumya Unnikrishnan Date: Mon, 3 Aug 2020 08:48:10 -0500 Subject: [PATCH 4/4] MQE-1974: Report used deprecated metadata in Test verification tests --- .../Handlers/DataObjectHandlerTest.php | 51 ++++++++++++++ .../OperationDefinitionObjectHandlerTest.php | 67 +++++++++++++++++++ .../Page/Handlers/PageObjectHandlerTest.php | 41 ++++++++++++ .../Handlers/SectionObjectHandlerTest.php | 47 +++++++++++++ .../Util/ActionGroupObjectExtractorTest.php | 26 ++++++- 5 files changed, 231 insertions(+), 1 deletion(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php index c9ec92ba8..9f1ca7b5c 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/DataObjectHandlerTest.php @@ -13,12 +13,21 @@ use Magento\FunctionalTestingFramework\ObjectManager; use Magento\FunctionalTestingFramework\ObjectManagerFactory; use tests\unit\Util\MagentoTestCase; +use tests\unit\Util\TestLoggingUtil; /** * Class DataObjectHandlerTest */ class DataObjectHandlerTest extends MagentoTestCase { + /** + * Setup method + */ + public function setUp(): void + { + TestLoggingUtil::getInstance()->setMockLoggingUtil(); + } + // All tests share this array, feel free to add but be careful modifying or removing const PARSER_OUTPUT = [ 'entity' => [ @@ -44,6 +53,22 @@ class DataObjectHandlerTest extends MagentoTestCase ] ]; + const PARSER_OUTPUT_DEPRECATED = [ + 'entity' => [ + 'EntityOne' => [ + 'type' => 'testType', + 'data' => [ + 0 => [ + 'key' => 'testKey', + 'value' => 'testValue' + ] + ], + 'deprecated' => "deprecation message", + 'filename' => "filename.xml" + ], + ] + ]; + const PARSER_OUTPUT_WITH_EXTEND = [ 'entity' => [ 'EntityOne' => [ @@ -134,6 +159,24 @@ public function testGetAllObjects() $this->assertEquals($expected, $actual['EntityOne']); } + /** + * test deprecated data object + */ + public function testDeprecatedDataObject() + { + $this->setUpMockDataObjectHander(self::PARSER_OUTPUT_DEPRECATED); + + // Call the method under test + $actual = DataObjectHandler::getInstance()->getAllObjects(); + + //validate deprecation warning + TestLoggingUtil::getInstance()->validateMockLogStatement( + 'warning', + "DEPRECATION: The data entity 'EntityOne' is deprecated.", + ["fileName" => "filename.xml", "deprecatedMessage" => "deprecation message"] + ); + } + /** * getObject should return the expected data object if it exists */ @@ -269,4 +312,12 @@ private function setUpMockDataObjectHander($entityDataArray) 'getObjectManager' => $mockObjectManager ]); } + + /** + * clean up function runs after all tests + */ + public static function tearDownAfterClass(): void + { + TestLoggingUtil::getInstance()->clearMockLoggingUtil(); + } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php index 9ca10c7f2..570e8d95a 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php @@ -14,12 +14,21 @@ use Magento\FunctionalTestingFramework\DataGenerator\Handlers\OperationDefinitionObjectHandler; use Magento\FunctionalTestingFramework\DataGenerator\Parsers\OperationDefinitionParser; use tests\unit\Util\MagentoTestCase; +use tests\unit\Util\TestLoggingUtil; /** * Class OperationDefinitionObjectHandlerTest */ class OperationDefinitionObjectHandlerTest extends MagentoTestCase { + /** + * Setup method + */ + public function setUp(): void + { + TestLoggingUtil::getInstance()->setMockLoggingUtil(); + } + public function testGetMultipleObjects() { // Data Variables for Assertions @@ -72,6 +81,56 @@ public function testGetMultipleObjects() $this->assertArrayHasKey($operationType2 . $dataType1, $operations); } + public function testDeprecatedOperation() + { + // Data Variables for Assertions + $dataType1 = "type1"; + $operationType1 = "create"; + + /** + * Parser Output. Just one metadata with 1 field + * operationName + * createType1 + * has field + * key=id, value=integer + */ + $mockData = [OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [ + "testOperationName" => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType1, + OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType1, + OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => "auth", + OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => "V1/Type1", + OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => "POST", + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [ + 0 => [ + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => "id", + OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => "integer" + ], + ], + OperationDefinitionObjectHandler::OBJ_DEPRECATED => 'deprecation message' + ]]]; + $this->setMockParserOutput($mockData); + + //Perform Assertions + $operationDefinitionManager = OperationDefinitionObjectHandler::getInstance(); + $operations = $operationDefinitionManager->getAllObjects(); + + $this->assertArrayHasKey($operationType1 . $dataType1, $operations); + TestLoggingUtil::getInstance()->validateMockLogStatement( + 'notice', + "NOTICE: 1 metadata operation name violations detected. See mftf.log for details.", + [] + ); + // test run time deprecation notice + $operation = $operationDefinitionManager->getOperationDefinition($operationType1, $dataType1); + $operation->logDeprecated(); + TestLoggingUtil::getInstance()->validateMockLogStatement( + 'warning', + "DEPRECATION: The operation testOperationName is deprecated.", + ['operationType' => 'create', 'deprecatedMessage' => 'deprecation message'] + ); + } + public function testObjectCreation() { // Data Variables for Assertions @@ -379,4 +438,12 @@ private function setMockParserOutput($data) $instance = AspectMock::double(ObjectManager::class, ['create' => $mockOperationParser])->make(); AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]); } + + /** + * clean up function runs after all tests + */ + public static function tearDownAfterClass(): void + { + TestLoggingUtil::getInstance()->clearMockLoggingUtil(); + } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php index 1a0ba5fc2..c934b680b 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/PageObjectHandlerTest.php @@ -12,9 +12,18 @@ use Magento\FunctionalTestingFramework\Page\Handlers\PageObjectHandler; use Magento\FunctionalTestingFramework\XmlParser\PageParser; use tests\unit\Util\MagentoTestCase; +use tests\unit\Util\TestLoggingUtil; class PageObjectHandlerTest extends MagentoTestCase { + /** + * Setup method + */ + public function setUp(): void + { + TestLoggingUtil::getInstance()->setMockLoggingUtil(); + } + public function testGetPageObject() { $mockData = [ @@ -70,6 +79,30 @@ public function testGetEmptyPage() $this->addToAssertionCount(1); } + public function testDeprecatedPage() + { + $mockData = [ + "testPage1" => [ + "url" => "testURL1", + "module" => "testModule1", + "section" => [ + ], + "area" => "test", + "deprecated" => "deprecation message", + "filename" => "filename.xml" + ]]; + $this->setMockParserOutput($mockData); + + // get pages + $page = PageObjectHandler::getInstance()->getObject('testPage1'); + + TestLoggingUtil::getInstance()->validateMockLogStatement( + 'notice', + "NOTICE: 1 Page name violations detected. See mftf.log for details.", + [] + ); + } + /** * Function used to set mock for parser return and force init method to run between tests. * @@ -86,4 +119,12 @@ private function setMockParserOutput($data) $instance = AspectMock::double(ObjectManager::class, ['get' => $mockSectionParser])->make(); AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]); } + + /** + * clean up function runs after all tests + */ + public static function tearDownAfterClass(): void + { + TestLoggingUtil::getInstance()->clearMockLoggingUtil(); + } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php index b8bcf3dfb..39e26caf9 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Page/Handlers/SectionObjectHandlerTest.php @@ -12,9 +12,18 @@ use Magento\FunctionalTestingFramework\Page\Handlers\SectionObjectHandler; use Magento\FunctionalTestingFramework\XmlParser\SectionParser; use tests\unit\Util\MagentoTestCase; +use tests\unit\Util\TestLoggingUtil; class SectionObjectHandlerTest extends MagentoTestCase { + /** + * Setup method + */ + public function setUp(): void + { + TestLoggingUtil::getInstance()->setMockLoggingUtil(); + } + public function testGetSectionObject() { $mockData = [ @@ -52,6 +61,36 @@ public function testGetSectionObject() $this->assertNull($invalidSection); } + public function testDeprecatedSection() + { + $mockData = [ + "testSection1" => [ + "element" => [ + "testElement" => [ + "type" => "input", + "selector" => "#element", + "deprecated" => "element deprecation message" + ] + ], + "filename" => "filename.xml", + "deprecated" => "section deprecation message" + ] + ]; + + $this->setMockParserOutput($mockData); + + // get sections + $sectionHandler = SectionObjectHandler::getInstance(); + $section = $sectionHandler->getObject("testSection1"); + + //validate deprecation warning + TestLoggingUtil::getInstance()->validateMockLogStatement( + 'notice', + "NOTICE: 1 Section name violations detected. See mftf.log for details.", + [] + ); + } + /** * Set the mock parser return value * @@ -68,4 +107,12 @@ private function setMockParserOutput($data) $instance = AspectMock::double(ObjectManager::class, ["get" => $mockSectionParser])->make(); AspectMock::double(ObjectManagerFactory::class, ["getObjectManager" => $instance]); } + + /** + * clean up function runs after all tests + */ + public static function tearDownAfterClass(): void + { + TestLoggingUtil::getInstance()->clearMockLoggingUtil(); + } } diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionGroupObjectExtractorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionGroupObjectExtractorTest.php index 2c9e171d5..1fea7e848 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionGroupObjectExtractorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionGroupObjectExtractorTest.php @@ -34,23 +34,47 @@ public function testEmptyStepKey() $this->testActionGroupObjectExtractor->extractActionGroup($this->createBasicActionObjectArray("")); } + /** + * Tests deprecation message for an action group + */ + public function testDeprecationMessage() + { + $this->testActionGroupObjectExtractor->extractActionGroup( + $this->createBasicActionObjectArray( + "testDeprecatedAction1", + "actionGroup", + "filename1.xml", + "message" + ) + ); + + TestLoggingUtil::getInstance()->validateMockLogStatement( + 'warning', + "DEPRECATION: The action group 'actionGroup' is deprecated.", + ["fileName" => "filename1.xml", "deprecatedMessage" => "message"] + ); + } + /** * Utility function to return mock parser output for testing extraction into ActionObjects. * * @param string $stepKey * @param string $actionGroup * @param string $filename + * @param string $deprecated * @return array */ private function createBasicActionObjectArray( $stepKey = 'testAction1', $actionGroup = "actionGroup", - $filename = "filename.xml" + $filename = "filename.xml", + $deprecated = null ) { $baseArray = [ 'nodeName' => 'actionGroup', 'name' => $actionGroup, 'filename' => $filename, + 'deprecated' => $deprecated, $stepKey => [ "nodeName" => "sampleAction", "stepKey" => $stepKey,