Skip to content

Commit 95bcb1d

Browse files
authored
MQE-1173: [Dev experience] Error on test generation without reference on file (#234)
* MQE-1173: [Dev experience] Error on test generation without reference on file - Added error messaging at Action level - Extended range of errors caught at Test level - Added unit tests for Exception catching for TestGenerator and ActionMergeUtil * MQE-1173: [Dev experience] Error on test generation without reference on file - Removed unused use cases * MQE-1173: [Dev experience] Error on test generation without reference on file - Removed use * MQE-1173: [Dev experience] Error on test generation without reference on file - Added setting parameter list to [] in case of no parameters * MQE-1173: [Dev experience] Error on test generation without reference on file - Moved count out of matching method * MQE-1173: [Dev experience] Error on test generation without reference on file - Made requested changes - Updated unit tests to be a bit more descriptive
1 parent 54a61f8 commit 95bcb1d

File tree

5 files changed

+130
-27
lines changed

5 files changed

+130
-27
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Tests\unit\Magento\FunctionalTestFramework\Test\Handlers;
8+
9+
use Magento\FunctionalTestingFramework\Test\Objects\ActionObject;
10+
use Magento\FunctionalTestingFramework\Test\Util\ActionMergeUtil;
11+
use Magento\FunctionalTestingFramework\Util\MagentoTestCase;
12+
13+
class ActionMergeUtilTest extends MagentoTestCase
14+
{
15+
/**
16+
* Test Exception Handler for merging actions
17+
*
18+
* @throws \Exception
19+
*/
20+
public function testMergeActionsException()
21+
{
22+
$testActionMergeUtil = new ActionMergeUtil(null, null);
23+
24+
$actionObject = new ActionObject('fakeAction', 'comment', [
25+
'userInput' => '{{someEntity.entity}}'
26+
]);
27+
28+
$this->expectExceptionMessage("Could not resolve entity reference \"{{someEntity.entity}}\" " .
29+
"in Action with stepKey \"fakeAction\".\n" .
30+
"Exception occurred parsing action at StepKey \"fakeAction\"");
31+
32+
$testActionMergeUtil->resolveActionSteps(["merge123" => $actionObject]);
33+
}
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Tests\unit\Magento\FunctionalTestFramework\Test\Handlers;
8+
9+
use AspectMock\Test as AspectMock;
10+
11+
use Magento\FunctionalTestingFramework\Test\Objects\ActionObject;
12+
use Magento\FunctionalTestingFramework\Test\Objects\TestObject;
13+
use Magento\FunctionalTestingFramework\Util\MagentoTestCase;
14+
use Magento\FunctionalTestingFramework\Util\TestGenerator;
15+
16+
class TestGeneratorTest extends MagentoTestCase
17+
{
18+
/**
19+
* Basic test to check exceptions for incorrect entities.
20+
*
21+
* @throws \Exception
22+
*/
23+
public function testEntityException()
24+
{
25+
$actionObject = new ActionObject('fakeAction', 'comment', [
26+
'userInput' => '{{someEntity.entity}}'
27+
]);
28+
29+
$testObject = new TestObject("sampleTest", ["merge123" => $actionObject], [], [], "filename");
30+
31+
$testGeneratorObject = TestGenerator::getInstance("", ["sampleTest" => $testObject]);
32+
33+
AspectMock::double(TestGenerator::class, ['loadAllTestObjects' => ["sampleTest" => $testObject]]);
34+
35+
$this->expectExceptionMessage("Could not resolve entity reference \"{{someEntity.entity}}\" " .
36+
"in Action with stepKey \"fakeAction\".\n" .
37+
"Exception occurred parsing action at StepKey \"fakeAction\" in Test \"sampleTest\"");
38+
39+
$testGeneratorObject->createAllTestFiles(null, []);
40+
}
41+
}

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

+41-21
Original file line numberDiff line numberDiff line change
@@ -658,7 +658,7 @@ private function resolveEntityDataObjectReference($obj, $match)
658658
private function resolveParameterization($isParameterized, $replacement, $match, $object)
659659
{
660660
if ($isParameterized) {
661-
$parameterList = $this->stripAndReturnParameters($match);
661+
$parameterList = $this->stripAndReturnParameters($match) ?: [];
662662
$resolvedReplacement = $this->matchParameterReferences($replacement, $parameterList);
663663
} else {
664664
$resolvedReplacement = $replacement;
@@ -682,26 +682,7 @@ private function matchParameterReferences($reference, $parameters)
682682
{
683683
preg_match_all('/{{[\w.]+}}/', $reference, $varMatches);
684684
$varMatches[0] = array_unique($varMatches[0]);
685-
if (count($varMatches[0]) > count($parameters)) {
686-
if (is_array($parameters)) {
687-
$parametersGiven = implode(",", $parameters);
688-
} elseif ($parameters == null) {
689-
$parametersGiven = "NONE";
690-
} else {
691-
$parametersGiven = $parameters;
692-
}
693-
throw new TestReferenceException(
694-
"Parameter Resolution Failed: Not enough parameters given for reference " .
695-
$reference . ". Parameters Given: " . $parametersGiven,
696-
["reference" => $reference, "parametersGiven" => $parametersGiven]
697-
);
698-
} elseif (count($varMatches[0]) < count($parameters)) {
699-
throw new TestReferenceException(
700-
"Parameter Resolution Failed: Too many parameters given for reference " .
701-
$reference . ". Parameters Given: " . implode(", ", $parameters),
702-
["reference" => $reference, "parametersGiven" => $parameters]
703-
);
704-
}
685+
$this->checkParameterCount($varMatches[0], $parameters, $reference);
705686

706687
//Attempt to Resolve {{data}} references to actual output. Trim parameter for whitespace before processing it.
707688
//If regex matched it means that it's either a 'StringLiteral' or $key.data$/$$key.data$$ reference.
@@ -730,4 +711,43 @@ private function matchParameterReferences($reference, $parameters)
730711
}
731712
return $reference;
732713
}
714+
715+
/**
716+
* Checks count of parameters versus matches
717+
*
718+
* @param array $matches
719+
* @param array $parameters
720+
* @param string $reference
721+
* @return void
722+
* @throws \Exception
723+
*/
724+
private function checkParameterCount($matches, $parameters, $reference)
725+
{
726+
if (count($matches) > count($parameters)) {
727+
if (is_array($parameters)) {
728+
$parametersGiven = implode(",", $parameters);
729+
} elseif ($parameters == null) {
730+
$parametersGiven = "NONE";
731+
} else {
732+
$parametersGiven = $parameters;
733+
}
734+
throw new TestReferenceException(
735+
"Parameter Resolution Failed: Not enough parameters given for reference " .
736+
$reference . ". Parameters Given: " . $parametersGiven,
737+
["reference" => $reference, "parametersGiven" => $parametersGiven]
738+
);
739+
} elseif (count($matches) < count($parameters)) {
740+
throw new TestReferenceException(
741+
"Parameter Resolution Failed: Too many parameters given for reference " .
742+
$reference . ". Parameters Given: " . implode(", ", $parameters),
743+
["reference" => $reference, "parametersGiven" => $parameters]
744+
);
745+
} elseif (count($matches) == 0) {
746+
throw new TestReferenceException(
747+
"Parameter Resolution Failed: No parameter matches found in parameterized element with selector " .
748+
$reference,
749+
["reference" => $reference]
750+
);
751+
}
752+
}
733753
}

src/Magento/FunctionalTestingFramework/Test/Util/ActionMergeUtil.php

+13-5
Original file line numberDiff line numberDiff line change
@@ -266,11 +266,19 @@ private function insertReadinessSkips()
266266
private function sortActions($parsedSteps)
267267
{
268268
foreach ($parsedSteps as $parsedStep) {
269-
$parsedStep->resolveReferences();
270-
if ($parsedStep->getLinkedAction()) {
271-
$this->stepsToMerge[$parsedStep->getStepKey()] = $parsedStep;
272-
} else {
273-
$this->orderedSteps[$parsedStep->getStepKey()] = $parsedStep;
269+
try {
270+
$parsedStep->resolveReferences();
271+
272+
if ($parsedStep->getLinkedAction()) {
273+
$this->stepsToMerge[$parsedStep->getStepKey()] = $parsedStep;
274+
} else {
275+
$this->orderedSteps[$parsedStep->getStepKey()] = $parsedStep;
276+
}
277+
} catch (\Exception $e) {
278+
throw new TestReferenceException(
279+
$e->getMessage() .
280+
".\nException occurred parsing action at StepKey \"" . $parsedStep->getStepKey() . "\""
281+
);
274282
}
275283
}
276284
}

src/Magento/FunctionalTestingFramework/Util/TestGenerator.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -1577,7 +1577,7 @@ private function generateTestPhp($test)
15771577
} else {
15781578
try {
15791579
$steps = $this->generateStepsPhp($test->getOrderedActions());
1580-
} catch (TestReferenceException $e) {
1580+
} catch (\Exception $e) {
15811581
throw new TestReferenceException($e->getMessage() . " in Test \"" . $test->getName() . "\"");
15821582
}
15831583
}

0 commit comments

Comments
 (0)