From 208ecefbb8af58e9514e4ef132e1e4d41b78d9a5 Mon Sep 17 00:00:00 2001 From: KevinBKozan Date: Tue, 23 Jan 2018 09:54:45 -0600 Subject: [PATCH 1/9] MQE-685: References to ENV file must be done at test run-time - _ENV is no longer a created DataObject - {{_ENV}} references stay put until TestGenerator pickup. --- .../Handlers/DataObjectHandler.php | 33 ------------------- .../Test/Objects/ActionObject.php | 6 ++++ .../Util/TestGenerator.php | 26 +++++++++++++++ 3 files changed, 32 insertions(+), 33 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php index 40b64e487..3bd3cffe3 100644 --- a/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php +++ b/src/Magento/FunctionalTestingFramework/DataGenerator/Handlers/DataObjectHandler.php @@ -13,7 +13,6 @@ class DataObjectHandler implements ObjectHandlerInterface { - const __ENV = '_ENV'; const _ENTITY = 'entity'; const _NAME = 'name'; const _TYPE = 'type'; @@ -56,7 +55,6 @@ private function __construct() return; } $this->entityDataObjects = $this->processParserOutput($parserOutput); - $this->entityDataObjects[self::__ENV] = $this->processEnvFile(); } /** @@ -100,37 +98,6 @@ public function getAllObjects() return $this->entityDataObjects; } - /** - * Convert the contents of the .env file into a single EntityDataObject so that the values can be accessed like - * normal data. - * - * @return EntityDataObject|null - */ - private function processEnvFile() - { - // These constants are defined in the bootstrap file - $path = PROJECT_ROOT . DIRECTORY_SEPARATOR . '.env'; - - if (file_exists($path)) { - $vars = []; - $lines = file($path); - - foreach ($lines as $line) { - $parts = explode("=", $line); - if (count($parts) != 2) { - continue; - } - $key = strtolower(trim($parts[0])); - $value = trim($parts[1]); - $vars[$key] = $value; - } - - return new EntityDataObject(self::__ENV, 'environment', $vars, null, null); - } - - return null; - } - /** * Convert the parser output into a collection of EntityDataObjects * diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php index 592202f6e..2d1cdda6f 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php @@ -19,6 +19,7 @@ */ class ActionObject { + const __ENV = "_ENV"; const DATA_ENABLED_ATTRIBUTES = ["userInput", "parameterArray", "expected", "actual"]; const SELECTOR_ENABLED_ATTRIBUTES = ['selector', 'dependentSelector', "selector1", "selector2", "function"]; const EXTERNAL_URL_AREA_INVALID_ACTIONS = ['amOnPage']; @@ -330,6 +331,11 @@ private function findAndReplaceReferences($objectHandler, $inputString) $obj = $objectHandler->getObject($objName); + // Leave {{_ENV.VARIABLE}} references to be replaced in TestGenerator with getenv("VARIABLE") + if ($objName === ActionObject::__ENV) { + continue; + } + // specify behavior depending on field switch (get_class($obj)) { case PageObject::class: diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 0a276a075..dc28d3d82 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1482,6 +1482,8 @@ private function wrapFunctionCall($actor, $action, ...$args) } $output .= ");\n"; + $output = $this->resolveEnvReferences($output, $args); + return $this->resolveTestVariable($output, $args); } @@ -1511,10 +1513,34 @@ private function wrapFunctionCallWithReturnValue($returnVariable, $actor, $actio } $output .= ");\n"; + $output = $this->resolveEnvReferences($output, $args); + return $this->resolveTestVariable($output, $args); } // @codingStandardsIgnoreEnd + private function resolveEnvReferences($inputString, $args) + { + $envRegex = "/{{_ENV\.([\w]+)}}/"; + + $outputString = $inputString; + + foreach ($args as $arg) { + preg_match_all($envRegex, $arg, $matches); + if (!empty($matches[0])) { + $fullMatch = $matches[0][0]; + $envVariable = $matches[1][0]; + unset($matches); + $replacement = "getenv(\"{$envVariable}\")"; + + $outputArg = $this->processQuoteBreaks($fullMatch, $arg, $replacement); + $outputString = str_replace($arg, $outputArg, $outputString); + } + } + + return $outputString; + } + /** * Validates parameter array format, making sure user has enclosed string with square brackets. * From 83c2ee1412576327668620d5b54e89dea139636f Mon Sep 17 00:00:00 2001 From: KevinBKozan Date: Tue, 23 Jan 2018 09:59:44 -0600 Subject: [PATCH 2/9] MQE-685: References to ENV file must be done at test run-time - PHPCS fix --- .../FunctionalTestingFramework/Util/TestGenerator.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index dc28d3d82..208b595b9 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1519,6 +1519,12 @@ private function wrapFunctionCallWithReturnValue($returnVariable, $actor, $actio } // @codingStandardsIgnoreEnd + /** + * Resolves {{_ENV.variable}} into getenv("variable") for test-runtime ENV referencing. + * @param string $inputString + * @param array $args + * @return string + */ private function resolveEnvReferences($inputString, $args) { $envRegex = "/{{_ENV\.([\w]+)}}/"; From 0bcb461ccbc381a69df3a6498b357c10a75e08d5 Mon Sep 17 00:00:00 2001 From: KevinBKozan Date: Mon, 29 Jan 2018 10:05:07 -0600 Subject: [PATCH 3/9] MQE-685: References to ENV file must be done at test run-time - PageObject no logner auto-adds backendName to url. - Replacement is done at each object in actionObjectCase, as behaviour is now not all the same. --- dev/tests/verification/Resources/PageReplacementTest.txt | 3 ++- dev/tests/verification/TestModule/Page/SamplePage.xml | 3 +++ .../verification/TestModule/Test/PageReplacementTest.xml | 1 + .../Page/Objects/PageObject.php | 5 ----- .../Test/Objects/ActionObject.php | 9 ++++++--- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/dev/tests/verification/Resources/PageReplacementTest.txt b/dev/tests/verification/Resources/PageReplacementTest.txt index d4c6d1f90..751e1980b 100644 --- a/dev/tests/verification/Resources/PageReplacementTest.txt +++ b/dev/tests/verification/Resources/PageReplacementTest.txt @@ -39,7 +39,8 @@ class PageReplacementTestCest $I->amOnPage("/John/StringLiteral2.html"); $I->amOnPage("/John/" . $datakey->getCreatedDataByName('firstname') . ".html"); $I->amOnPage("/" . $datakey->getCreatedDataByName('firstname') . "/StringLiteral2.html"); - $I->amOnPage("/admin/backend"); + $I->amOnPage("/" . getenv("MAGENTO_BASE_URL") . "//backend"); + $I->amOnPage("/" . getenv("MAGENTO_BASE_URL") . "//StringLiteral/page.html"); $I->amOnUrl("http://myFullUrl.com/"); } } diff --git a/dev/tests/verification/TestModule/Page/SamplePage.xml b/dev/tests/verification/TestModule/Page/SamplePage.xml index c1ec87b0a..b4bf97896 100644 --- a/dev/tests/verification/TestModule/Page/SamplePage.xml +++ b/dev/tests/verification/TestModule/Page/SamplePage.xml @@ -23,6 +23,9 @@
+ +
+
diff --git a/dev/tests/verification/TestModule/Test/PageReplacementTest.xml b/dev/tests/verification/TestModule/Test/PageReplacementTest.xml index 39766f2ab..acdbbb798 100644 --- a/dev/tests/verification/TestModule/Test/PageReplacementTest.xml +++ b/dev/tests/verification/TestModule/Test/PageReplacementTest.xml @@ -19,6 +19,7 @@ + diff --git a/src/Magento/FunctionalTestingFramework/Page/Objects/PageObject.php b/src/Magento/FunctionalTestingFramework/Page/Objects/PageObject.php index 2a21deb71..30cdc89ed 100644 --- a/src/Magento/FunctionalTestingFramework/Page/Objects/PageObject.php +++ b/src/Magento/FunctionalTestingFramework/Page/Objects/PageObject.php @@ -94,11 +94,6 @@ public function getName() */ public function getUrl() { - if ($this->getArea() == self::ADMIN_AREA) { - $url = ltrim($this->url, '/'); - return "/" . getenv('MAGENTO_BACKEND_NAME') . "/{$url}"; - } - return $this->url; } diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php index 2d1cdda6f..b5d278919 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php @@ -340,8 +340,11 @@ private function findAndReplaceReferences($objectHandler, $inputString) switch (get_class($obj)) { case PageObject::class: $this->validateUrlAreaAgainstActionType($obj); - $replacement = $obj->getUrl(); $parameterized = $obj->isParameterized(); + $replacement = $this->resolveParameterization($parameterized, $obj->getUrl(), $match); + if ($obj->getArea() == PageObject::ADMIN_AREA) { + $replacement = "/{{_ENV.MAGENTO_BASE_URL}}/" . $replacement; + } break; case SectionObject::class: list(,$objField) = $this->stripAndSplitReference($match); @@ -351,9 +354,11 @@ private function findAndReplaceReferences($objectHandler, $inputString) $parameterized = $obj->getElement($objField)->isParameterized(); $replacement = $obj->getElement($objField)->getPrioritizedSelector(); $this->setTimeout($obj->getElement($objField)->getTimeout()); + $replacement = $this->resolveParameterization($parameterized, $replacement, $match); break; case EntityDataObject::class: $replacement = $this->resolveEntityDataObjectReference($obj, $match); + $replacement = $this->resolveParameterization($parameterized, $replacement, $match); break; } @@ -362,8 +367,6 @@ private function findAndReplaceReferences($objectHandler, $inputString) } elseif ($replacement == null) { throw new TestReferenceException("Could not resolve entity reference " . $inputString); } - - $replacement = $this->resolveParameterization($parameterized, $replacement, $match); $outputString = str_replace($match, $replacement, $outputString); } return $outputString; From a4397b061f29383e9216784299bf0c9f0383a1f8 Mon Sep 17 00:00:00 2001 From: KevinBKozan Date: Mon, 29 Jan 2018 10:27:30 -0600 Subject: [PATCH 4/9] MQE-685: References to ENV file must be done at test run-time - BASE_URL -> BACKEND_NAME --- .../FunctionalTestingFramework/Test/Objects/ActionObject.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php index b5d278919..5255f50fd 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php @@ -343,7 +343,7 @@ private function findAndReplaceReferences($objectHandler, $inputString) $parameterized = $obj->isParameterized(); $replacement = $this->resolveParameterization($parameterized, $obj->getUrl(), $match); if ($obj->getArea() == PageObject::ADMIN_AREA) { - $replacement = "/{{_ENV.MAGENTO_BASE_URL}}/" . $replacement; + $replacement = "/{{_ENV.BACKEND_NAME}}/" . $replacement; } break; case SectionObject::class: From 597e9a6412913a2f034f26ca22b06aa5ce9ac08a Mon Sep 17 00:00:00 2001 From: KevinBKozan Date: Mon, 29 Jan 2018 10:28:13 -0600 Subject: [PATCH 5/9] MQE-685: References to ENV file must be done at test run-time - Verification Test Update --- dev/tests/verification/Resources/PageReplacementTest.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tests/verification/Resources/PageReplacementTest.txt b/dev/tests/verification/Resources/PageReplacementTest.txt index 751e1980b..783b80f2a 100644 --- a/dev/tests/verification/Resources/PageReplacementTest.txt +++ b/dev/tests/verification/Resources/PageReplacementTest.txt @@ -39,8 +39,8 @@ class PageReplacementTestCest $I->amOnPage("/John/StringLiteral2.html"); $I->amOnPage("/John/" . $datakey->getCreatedDataByName('firstname') . ".html"); $I->amOnPage("/" . $datakey->getCreatedDataByName('firstname') . "/StringLiteral2.html"); - $I->amOnPage("/" . getenv("MAGENTO_BASE_URL") . "//backend"); - $I->amOnPage("/" . getenv("MAGENTO_BASE_URL") . "//StringLiteral/page.html"); + $I->amOnPage("/" . getenv("BACKEND_NAME") . "//backend"); + $I->amOnPage("/" . getenv("BACKEND_NAME") . "//StringLiteral/page.html"); $I->amOnUrl("http://myFullUrl.com/"); } } From 38655c906d30858e97d2c06c1b653027ef2dc45a Mon Sep 17 00:00:00 2001 From: KevinBKozan Date: Fri, 2 Feb 2018 10:48:46 -0600 Subject: [PATCH 6/9] MQE-685: References to ENV file must be done at test run-time - CR Fixes --- .../Test/Objects/ActionObject.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php index 5255f50fd..f9b005945 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php @@ -340,11 +340,8 @@ private function findAndReplaceReferences($objectHandler, $inputString) switch (get_class($obj)) { case PageObject::class: $this->validateUrlAreaAgainstActionType($obj); + $replacement = $obj->getUrl(); $parameterized = $obj->isParameterized(); - $replacement = $this->resolveParameterization($parameterized, $obj->getUrl(), $match); - if ($obj->getArea() == PageObject::ADMIN_AREA) { - $replacement = "/{{_ENV.BACKEND_NAME}}/" . $replacement; - } break; case SectionObject::class: list(,$objField) = $this->stripAndSplitReference($match); @@ -354,11 +351,9 @@ private function findAndReplaceReferences($objectHandler, $inputString) $parameterized = $obj->getElement($objField)->isParameterized(); $replacement = $obj->getElement($objField)->getPrioritizedSelector(); $this->setTimeout($obj->getElement($objField)->getTimeout()); - $replacement = $this->resolveParameterization($parameterized, $replacement, $match); break; case EntityDataObject::class: $replacement = $this->resolveEntityDataObjectReference($obj, $match); - $replacement = $this->resolveParameterization($parameterized, $replacement, $match); break; } @@ -367,6 +362,13 @@ private function findAndReplaceReferences($objectHandler, $inputString) } elseif ($replacement == null) { throw new TestReferenceException("Could not resolve entity reference " . $inputString); } + + $replacement = $this->resolveParameterization($parameterized, $replacement, $match); + + if (get_class($obj) == PageObject::class && $obj->getArea() == PageObject::ADMIN_AREA) { + $replacement = "/{{_ENV.BACKEND_NAME}}/" . $replacement; + } + $outputString = str_replace($match, $replacement, $outputString); } return $outputString; From 554c512c56c219bcf7e6dd113af8641642943314 Mon Sep 17 00:00:00 2001 From: KevinBKozan Date: Mon, 5 Feb 2018 16:03:02 -0600 Subject: [PATCH 7/9] MQE-685: References to ENV file must be done at test run-time - CR Fixes --- .../FunctionalTestingFramework/Test/Objects/ActionObject.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php index f9b005945..005b3c99e 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php @@ -366,7 +366,7 @@ private function findAndReplaceReferences($objectHandler, $inputString) $replacement = $this->resolveParameterization($parameterized, $replacement, $match); if (get_class($obj) == PageObject::class && $obj->getArea() == PageObject::ADMIN_AREA) { - $replacement = "/{{_ENV.BACKEND_NAME}}/" . $replacement; + $replacement = "/{{_ENV.MAGENTO_BACKEND_NAME}}/" . $replacement; } $outputString = str_replace($match, $replacement, $outputString); From fdc37a34cb01c18535d4dcc9f5fce55697625d5e Mon Sep 17 00:00:00 2001 From: KevinBKozan Date: Wed, 7 Feb 2018 15:35:37 -0600 Subject: [PATCH 8/9] MQE-685: References to ENV file must be done at test run-time - Last Test fixes. --- dev/tests/verification/Resources/PageReplacementTest.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tests/verification/Resources/PageReplacementTest.txt b/dev/tests/verification/Resources/PageReplacementTest.txt index 783b80f2a..5f5d4aece 100644 --- a/dev/tests/verification/Resources/PageReplacementTest.txt +++ b/dev/tests/verification/Resources/PageReplacementTest.txt @@ -39,8 +39,8 @@ class PageReplacementTestCest $I->amOnPage("/John/StringLiteral2.html"); $I->amOnPage("/John/" . $datakey->getCreatedDataByName('firstname') . ".html"); $I->amOnPage("/" . $datakey->getCreatedDataByName('firstname') . "/StringLiteral2.html"); - $I->amOnPage("/" . getenv("BACKEND_NAME") . "//backend"); - $I->amOnPage("/" . getenv("BACKEND_NAME") . "//StringLiteral/page.html"); + $I->amOnPage("/" . getenv("MAGENTO_BACKEND_NAME") . "//backend"); + $I->amOnPage("/" . getenv("MAGENTO_BACKEND_NAME") . "//StringLiteral/page.html"); $I->amOnUrl("http://myFullUrl.com/"); } } From 35a5ee68a6c7d40023b4d351e6681c989b04ef39 Mon Sep 17 00:00:00 2001 From: KevinBKozan Date: Thu, 8 Feb 2018 14:42:49 -0600 Subject: [PATCH 9/9] MQE-685: References to ENV file must be done at test run-time - PHPMD fixes. --- .../Test/Objects/ActionObject.php | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php index 0a69e8c8e..88d45db5d 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php @@ -404,17 +404,15 @@ private function findAndReplaceReferences($objectHandler, $inputString) break; } - if ($replacement == null && get_class($objectHandler) != DataObjectHandler::class) { - return $this->findAndReplaceReferences(DataObjectHandler::getInstance(), $outputString); - } elseif ($replacement == null) { - throw new TestReferenceException("Could not resolve entity reference " . $inputString); + if ($replacement == null) { + if (get_class($objectHandler) != DataObjectHandler::class) { + return $this->findAndReplaceReferences(DataObjectHandler::getInstance(), $outputString); + } else { + throw new TestReferenceException("Could not resolve entity reference " . $inputString); + } } - $replacement = $this->resolveParameterization($parameterized, $replacement, $match); - - if (get_class($obj) == PageObject::class && $obj->getArea() == PageObject::ADMIN_AREA) { - $replacement = "/{{_ENV.MAGENTO_BACKEND_NAME}}/" . $replacement; - } + $replacement = $this->resolveParameterization($parameterized, $replacement, $match, $obj); $outputString = str_replace($match, $replacement, $outputString); } @@ -479,16 +477,21 @@ private function resolveEntityDataObjectReference($obj, $match) * @param boolean $isParameterized * @param string $replacement * @param string $match + * @param object $object * @return string */ - private function resolveParameterization($isParameterized, $replacement, $match) + private function resolveParameterization($isParameterized, $replacement, $match, $object) { if ($isParameterized) { $parameterList = $this->stripAndReturnParameters($match); - return $this->matchParameterReferences($replacement, $parameterList); + $resolvedReplacement = $this->matchParameterReferences($replacement, $parameterList); } else { - return $replacement; + $resolvedReplacement = $replacement; + } + if (get_class($object) == PageObject::class && $object->getArea() == PageObject::ADMIN_AREA) { + $resolvedReplacement = "/{{_ENV.MAGENTO_BACKEND_NAME}}/" . $resolvedReplacement; } + return $resolvedReplacement; } /**