diff --git a/dev/tests/verification/Resources/PageReplacementTest.txt b/dev/tests/verification/Resources/PageReplacementTest.txt index d4c6d1f90..5f5d4aece 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_BACKEND_NAME") . "//backend"); + $I->amOnPage("/" . getenv("MAGENTO_BACKEND_NAME") . "//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/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/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 5557dcda2..88d45db5d 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 OLD_ASSERTION_ATTRIBUTES = ["expected", "expectedType", "actual", "actualType"]; @@ -377,6 +378,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: @@ -398,13 +404,16 @@ 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); + $replacement = $this->resolveParameterization($parameterized, $replacement, $match, $obj); + $outputString = str_replace($match, $replacement, $outputString); } return $outputString; @@ -468,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; } /** diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index ae7357d93..51360ef83 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1501,6 +1501,8 @@ private function wrapFunctionCall($actor, $action, ...$args) } $output .= ");\n"; + $output = $this->resolveEnvReferences($output, $args); + return $this->resolveTestVariable($output, $args); } @@ -1530,10 +1532,40 @@ private function wrapFunctionCallWithReturnValue($returnVariable, $actor, $actio } $output .= ");\n"; + $output = $this->resolveEnvReferences($output, $args); + return $this->resolveTestVariable($output, $args); } // @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]+)}}/"; + + $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. *