diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ActionMergeUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ActionMergeUtilTest.php new file mode 100644 index 000000000..913b106a7 --- /dev/null +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ActionMergeUtilTest.php @@ -0,0 +1,34 @@ + '{{someEntity.entity}}' + ]); + + $this->expectExceptionMessage("Could not resolve entity reference \"{{someEntity.entity}}\" " . + "in Action with stepKey \"fakeAction\".\n" . + "Exception occurred parsing action at StepKey \"fakeAction\""); + + $testActionMergeUtil->resolveActionSteps(["merge123" => $actionObject]); + } +} diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php new file mode 100644 index 000000000..097150888 --- /dev/null +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -0,0 +1,41 @@ + '{{someEntity.entity}}' + ]); + + $testObject = new TestObject("sampleTest", ["merge123" => $actionObject], [], [], "filename"); + + $testGeneratorObject = TestGenerator::getInstance("", ["sampleTest" => $testObject]); + + AspectMock::double(TestGenerator::class, ['loadAllTestObjects' => ["sampleTest" => $testObject]]); + + $this->expectExceptionMessage("Could not resolve entity reference \"{{someEntity.entity}}\" " . + "in Action with stepKey \"fakeAction\".\n" . + "Exception occurred parsing action at StepKey \"fakeAction\" in Test \"sampleTest\""); + + $testGeneratorObject->createAllTestFiles(null, []); + } +} diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php index 1efb0f603..c91ebaf5c 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php @@ -658,7 +658,7 @@ private function resolveEntityDataObjectReference($obj, $match) private function resolveParameterization($isParameterized, $replacement, $match, $object) { if ($isParameterized) { - $parameterList = $this->stripAndReturnParameters($match); + $parameterList = $this->stripAndReturnParameters($match) ?: []; $resolvedReplacement = $this->matchParameterReferences($replacement, $parameterList); } else { $resolvedReplacement = $replacement; @@ -682,26 +682,7 @@ private function matchParameterReferences($reference, $parameters) { preg_match_all('/{{[\w.]+}}/', $reference, $varMatches); $varMatches[0] = array_unique($varMatches[0]); - if (count($varMatches[0]) > count($parameters)) { - if (is_array($parameters)) { - $parametersGiven = implode(",", $parameters); - } elseif ($parameters == null) { - $parametersGiven = "NONE"; - } else { - $parametersGiven = $parameters; - } - throw new TestReferenceException( - "Parameter Resolution Failed: Not enough parameters given for reference " . - $reference . ". Parameters Given: " . $parametersGiven, - ["reference" => $reference, "parametersGiven" => $parametersGiven] - ); - } elseif (count($varMatches[0]) < count($parameters)) { - throw new TestReferenceException( - "Parameter Resolution Failed: Too many parameters given for reference " . - $reference . ". Parameters Given: " . implode(", ", $parameters), - ["reference" => $reference, "parametersGiven" => $parameters] - ); - } + $this->checkParameterCount($varMatches[0], $parameters, $reference); //Attempt to Resolve {{data}} references to actual output. Trim parameter for whitespace before processing it. //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) } return $reference; } + + /** + * Checks count of parameters versus matches + * + * @param array $matches + * @param array $parameters + * @param string $reference + * @return void + * @throws \Exception + */ + private function checkParameterCount($matches, $parameters, $reference) + { + if (count($matches) > count($parameters)) { + if (is_array($parameters)) { + $parametersGiven = implode(",", $parameters); + } elseif ($parameters == null) { + $parametersGiven = "NONE"; + } else { + $parametersGiven = $parameters; + } + throw new TestReferenceException( + "Parameter Resolution Failed: Not enough parameters given for reference " . + $reference . ". Parameters Given: " . $parametersGiven, + ["reference" => $reference, "parametersGiven" => $parametersGiven] + ); + } elseif (count($matches) < count($parameters)) { + throw new TestReferenceException( + "Parameter Resolution Failed: Too many parameters given for reference " . + $reference . ". Parameters Given: " . implode(", ", $parameters), + ["reference" => $reference, "parametersGiven" => $parameters] + ); + } elseif (count($matches) == 0) { + throw new TestReferenceException( + "Parameter Resolution Failed: No parameter matches found in parameterized element with selector " . + $reference, + ["reference" => $reference] + ); + } + } } diff --git a/src/Magento/FunctionalTestingFramework/Test/Util/ActionMergeUtil.php b/src/Magento/FunctionalTestingFramework/Test/Util/ActionMergeUtil.php index 0a6bc7957..65fe7c857 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Util/ActionMergeUtil.php +++ b/src/Magento/FunctionalTestingFramework/Test/Util/ActionMergeUtil.php @@ -266,11 +266,19 @@ private function insertReadinessSkips() private function sortActions($parsedSteps) { foreach ($parsedSteps as $parsedStep) { - $parsedStep->resolveReferences(); - if ($parsedStep->getLinkedAction()) { - $this->stepsToMerge[$parsedStep->getStepKey()] = $parsedStep; - } else { - $this->orderedSteps[$parsedStep->getStepKey()] = $parsedStep; + try { + $parsedStep->resolveReferences(); + + if ($parsedStep->getLinkedAction()) { + $this->stepsToMerge[$parsedStep->getStepKey()] = $parsedStep; + } else { + $this->orderedSteps[$parsedStep->getStepKey()] = $parsedStep; + } + } catch (\Exception $e) { + throw new TestReferenceException( + $e->getMessage() . + ".\nException occurred parsing action at StepKey \"" . $parsedStep->getStepKey() . "\"" + ); } } } diff --git a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php index 7afbfb5e6..533e09a51 100644 --- a/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php +++ b/src/Magento/FunctionalTestingFramework/Util/TestGenerator.php @@ -1577,7 +1577,7 @@ private function generateTestPhp($test) } else { try { $steps = $this->generateStepsPhp($test->getOrderedActions()); - } catch (TestReferenceException $e) { + } catch (\Exception $e) { throw new TestReferenceException($e->getMessage() . " in Test \"" . $test->getName() . "\""); } }