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.
*