Skip to content

Commit 4c3cdf1

Browse files
authored
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. - PageObject no longer auto-adds backendName to url.
1 parent 8bd89ce commit 4c3cdf1

File tree

7 files changed

+60
-47
lines changed

7 files changed

+60
-47
lines changed

dev/tests/verification/Resources/PageReplacementTest.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ class PageReplacementTestCest
3939
$I->amOnPage("/John/StringLiteral2.html");
4040
$I->amOnPage("/John/" . $datakey->getCreatedDataByName('firstname') . ".html");
4141
$I->amOnPage("/" . $datakey->getCreatedDataByName('firstname') . "/StringLiteral2.html");
42-
$I->amOnPage("/admin/backend");
42+
$I->amOnPage("/" . getenv("MAGENTO_BACKEND_NAME") . "//backend");
43+
$I->amOnPage("/" . getenv("MAGENTO_BACKEND_NAME") . "//StringLiteral/page.html");
4344
$I->amOnUrl("http://myFullUrl.com/");
4445
}
4546
}

dev/tests/verification/TestModule/Page/SamplePage.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
<page name="AdminPage" url="/backend" area="admin" module="SampleTests">
2424
<section name="SampleSection"/>
2525
</page>
26+
<page name="AdminOneParamPage" url="/{{var1}}/page.html" area="admin" module="SampleTests" parameterized="true">
27+
<section name="SampleSection"/>
28+
</page>
2629
<page name="ExternalPage" url="http://myFullUrl.com/" area="external" module="SampleTests">
2730
<section name="SampleSection"/>
2831
</page>

dev/tests/verification/TestModule/Test/PageReplacementTest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
<amOnPage stepKey="twoParamPageDataPersist" url="{{TwoParamPage.url(simpleData.firstname, $datakey.firstname$)}}"/>
2020
<amOnPage stepKey="twoParamPagePersistString" url="{{TwoParamPage.url($datakey.firstname$, 'StringLiteral2')}}"/>
2121
<amOnPage stepKey="onAdminPage" url="{{AdminPage.url}}"/>
22+
<amOnPage stepKey="oneParamAdminPageString" url="{{AdminOneParamPage.url('StringLiteral')}}"/>
2223
<amOnUrl stepKey="onExternalPage" url="{{ExternalPage.url}}"/>
2324
</test>
2425
<test name="ExternalPageTestBadReference">

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

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
class DataObjectHandler implements ObjectHandlerInterface
1515
{
16-
const __ENV = '_ENV';
1716
const _ENTITY = 'entity';
1817
const _NAME = 'name';
1918
const _TYPE = 'type';
@@ -56,7 +55,6 @@ private function __construct()
5655
return;
5756
}
5857
$this->entityDataObjects = $this->processParserOutput($parserOutput);
59-
$this->entityDataObjects[self::__ENV] = $this->processEnvFile();
6058
}
6159

6260
/**
@@ -100,37 +98,6 @@ public function getAllObjects()
10098
return $this->entityDataObjects;
10199
}
102100

103-
/**
104-
* Convert the contents of the .env file into a single EntityDataObject so that the values can be accessed like
105-
* normal data.
106-
*
107-
* @return EntityDataObject|null
108-
*/
109-
private function processEnvFile()
110-
{
111-
// These constants are defined in the bootstrap file
112-
$path = PROJECT_ROOT . DIRECTORY_SEPARATOR . '.env';
113-
114-
if (file_exists($path)) {
115-
$vars = [];
116-
$lines = file($path);
117-
118-
foreach ($lines as $line) {
119-
$parts = explode("=", $line);
120-
if (count($parts) != 2) {
121-
continue;
122-
}
123-
$key = strtolower(trim($parts[0]));
124-
$value = trim($parts[1]);
125-
$vars[$key] = $value;
126-
}
127-
128-
return new EntityDataObject(self::__ENV, 'environment', $vars, null, null);
129-
}
130-
131-
return null;
132-
}
133-
134101
/**
135102
* Convert the parser output into a collection of EntityDataObjects
136103
*

src/Magento/FunctionalTestingFramework/Page/Objects/PageObject.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,6 @@ public function getName()
9494
*/
9595
public function getUrl()
9696
{
97-
if ($this->getArea() == self::ADMIN_AREA) {
98-
$url = ltrim($this->url, '/');
99-
return "/" . getenv('MAGENTO_BACKEND_NAME') . "/{$url}";
100-
}
101-
10297
return $this->url;
10398
}
10499

src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
*/
2020
class ActionObject
2121
{
22+
const __ENV = "_ENV";
2223
const DATA_ENABLED_ATTRIBUTES = ["userInput", "parameterArray", "expected", "actual"];
2324
const SELECTOR_ENABLED_ATTRIBUTES = ['selector', 'dependentSelector', "selector1", "selector2", "function"];
2425
const OLD_ASSERTION_ATTRIBUTES = ["expected", "expectedType", "actual", "actualType"];
@@ -377,6 +378,11 @@ private function findAndReplaceReferences($objectHandler, $inputString)
377378

378379
$obj = $objectHandler->getObject($objName);
379380

381+
// Leave {{_ENV.VARIABLE}} references to be replaced in TestGenerator with getenv("VARIABLE")
382+
if ($objName === ActionObject::__ENV) {
383+
continue;
384+
}
385+
380386
// specify behavior depending on field
381387
switch (get_class($obj)) {
382388
case PageObject::class:
@@ -398,13 +404,16 @@ private function findAndReplaceReferences($objectHandler, $inputString)
398404
break;
399405
}
400406

401-
if ($replacement == null && get_class($objectHandler) != DataObjectHandler::class) {
402-
return $this->findAndReplaceReferences(DataObjectHandler::getInstance(), $outputString);
403-
} elseif ($replacement == null) {
404-
throw new TestReferenceException("Could not resolve entity reference " . $inputString);
407+
if ($replacement == null) {
408+
if (get_class($objectHandler) != DataObjectHandler::class) {
409+
return $this->findAndReplaceReferences(DataObjectHandler::getInstance(), $outputString);
410+
} else {
411+
throw new TestReferenceException("Could not resolve entity reference " . $inputString);
412+
}
405413
}
406414

407-
$replacement = $this->resolveParameterization($parameterized, $replacement, $match);
415+
$replacement = $this->resolveParameterization($parameterized, $replacement, $match, $obj);
416+
408417
$outputString = str_replace($match, $replacement, $outputString);
409418
}
410419
return $outputString;
@@ -468,16 +477,21 @@ private function resolveEntityDataObjectReference($obj, $match)
468477
* @param boolean $isParameterized
469478
* @param string $replacement
470479
* @param string $match
480+
* @param object $object
471481
* @return string
472482
*/
473-
private function resolveParameterization($isParameterized, $replacement, $match)
483+
private function resolveParameterization($isParameterized, $replacement, $match, $object)
474484
{
475485
if ($isParameterized) {
476486
$parameterList = $this->stripAndReturnParameters($match);
477-
return $this->matchParameterReferences($replacement, $parameterList);
487+
$resolvedReplacement = $this->matchParameterReferences($replacement, $parameterList);
478488
} else {
479-
return $replacement;
489+
$resolvedReplacement = $replacement;
490+
}
491+
if (get_class($object) == PageObject::class && $object->getArea() == PageObject::ADMIN_AREA) {
492+
$resolvedReplacement = "/{{_ENV.MAGENTO_BACKEND_NAME}}/" . $resolvedReplacement;
480493
}
494+
return $resolvedReplacement;
481495
}
482496

483497
/**

src/Magento/FunctionalTestingFramework/Util/TestGenerator.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1501,6 +1501,8 @@ private function wrapFunctionCall($actor, $action, ...$args)
15011501
}
15021502
$output .= ");\n";
15031503

1504+
$output = $this->resolveEnvReferences($output, $args);
1505+
15041506
return $this->resolveTestVariable($output, $args);
15051507
}
15061508

@@ -1530,10 +1532,40 @@ private function wrapFunctionCallWithReturnValue($returnVariable, $actor, $actio
15301532
}
15311533
$output .= ");\n";
15321534

1535+
$output = $this->resolveEnvReferences($output, $args);
1536+
15331537
return $this->resolveTestVariable($output, $args);
15341538
}
15351539
// @codingStandardsIgnoreEnd
15361540

1541+
/**
1542+
* Resolves {{_ENV.variable}} into getenv("variable") for test-runtime ENV referencing.
1543+
* @param string $inputString
1544+
* @param array $args
1545+
* @return string
1546+
*/
1547+
private function resolveEnvReferences($inputString, $args)
1548+
{
1549+
$envRegex = "/{{_ENV\.([\w]+)}}/";
1550+
1551+
$outputString = $inputString;
1552+
1553+
foreach ($args as $arg) {
1554+
preg_match_all($envRegex, $arg, $matches);
1555+
if (!empty($matches[0])) {
1556+
$fullMatch = $matches[0][0];
1557+
$envVariable = $matches[1][0];
1558+
unset($matches);
1559+
$replacement = "getenv(\"{$envVariable}\")";
1560+
1561+
$outputArg = $this->processQuoteBreaks($fullMatch, $arg, $replacement);
1562+
$outputString = str_replace($arg, $outputArg, $outputString);
1563+
}
1564+
}
1565+
1566+
return $outputString;
1567+
}
1568+
15371569
/**
15381570
* Validates parameter array format, making sure user has enclosed string with square brackets.
15391571
*

0 commit comments

Comments
 (0)