From 891e72b8fb2438a6d0eb52beb5ef5b648953e7e8 Mon Sep 17 00:00:00 2001 From: Alex Calandra Date: Fri, 21 Sep 2018 10:40:56 -0500 Subject: [PATCH 1/6] 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 --- .../Util/ActionMergeUtilTest.php | 46 +++++++++++++++++ .../Util/TestGeneratorTest.php | 50 +++++++++++++++++++ .../Test/Util/ActionMergeUtil.php | 18 +++++-- .../Util/TestGenerator.php | 2 +- 4 files changed, 110 insertions(+), 6 deletions(-) create mode 100644 dev/tests/unit/Magento/FunctionalTestFramework/Util/ActionMergeUtilTest.php create mode 100644 dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php 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..10558ef67 --- /dev/null +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ActionMergeUtilTest.php @@ -0,0 +1,46 @@ + '{{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..bd078a1b6 --- /dev/null +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -0,0 +1,50 @@ + test object conversion. + * + * @throws \Exception + */ + public function testGetTestObject() + { + $actionObject = new ActionObject('fakeAction', 'comment', [ + 'userInput' => '{{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/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() . "\""); } } From 272f90717ffd4dbcc14510b20862f862db3123c8 Mon Sep 17 00:00:00 2001 From: Alex Calandra Date: Fri, 21 Sep 2018 10:47:37 -0500 Subject: [PATCH 2/6] MQE-1173: [Dev experience] Error on test generation without reference on file - Removed unused use cases --- .../Util/ActionMergeUtilTest.php | 10 ---------- .../FunctionalTestFramework/Util/TestGeneratorTest.php | 9 --------- 2 files changed, 19 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ActionMergeUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ActionMergeUtilTest.php index 10558ef67..72722d1ce 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ActionMergeUtilTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ActionMergeUtilTest.php @@ -8,19 +8,9 @@ use AspectMock\Test as AspectMock; -use Go\Aop\Aspect; -use Magento\FunctionalTestingFramework\ObjectManager; -use Magento\FunctionalTestingFramework\ObjectManagerFactory; -use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; -use Magento\FunctionalTestingFramework\Test\Objects\TestHookObject; -use Magento\FunctionalTestingFramework\Test\Objects\TestObject; -use Magento\FunctionalTestingFramework\Test\Parsers\TestDataParser; use Magento\FunctionalTestingFramework\Test\Util\ActionMergeUtil; -use Magento\FunctionalTestingFramework\Test\Util\ActionObjectExtractor; -use Magento\FunctionalTestingFramework\Test\Util\TestObjectExtractor; use Magento\FunctionalTestingFramework\Util\MagentoTestCase; -use tests\unit\Util\TestDataArrayBuilder; class ActionMergeUtilTest extends MagentoTestCase { diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index bd078a1b6..82a237d4b 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -8,19 +8,10 @@ use AspectMock\Test as AspectMock; -use Go\Aop\Aspect; -use Magento\FunctionalTestingFramework\ObjectManager; -use Magento\FunctionalTestingFramework\ObjectManagerFactory; -use Magento\FunctionalTestingFramework\Test\Handlers\TestObjectHandler; use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; -use Magento\FunctionalTestingFramework\Test\Objects\TestHookObject; use Magento\FunctionalTestingFramework\Test\Objects\TestObject; -use Magento\FunctionalTestingFramework\Test\Parsers\TestDataParser; -use Magento\FunctionalTestingFramework\Test\Util\ActionObjectExtractor; -use Magento\FunctionalTestingFramework\Test\Util\TestObjectExtractor; use Magento\FunctionalTestingFramework\Util\MagentoTestCase; use Magento\FunctionalTestingFramework\Util\TestGenerator; -use tests\unit\Util\TestDataArrayBuilder; class TestGeneratorTest extends MagentoTestCase { From 1819578aca3ef62ab890b48fdb8f6b4dccd99314 Mon Sep 17 00:00:00 2001 From: Alex Calandra Date: Fri, 21 Sep 2018 10:48:23 -0500 Subject: [PATCH 3/6] MQE-1173: [Dev experience] Error on test generation without reference on file - Removed use --- .../FunctionalTestFramework/Util/ActionMergeUtilTest.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ActionMergeUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ActionMergeUtilTest.php index 72722d1ce..6b782147e 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ActionMergeUtilTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ActionMergeUtilTest.php @@ -6,8 +6,6 @@ namespace Tests\unit\Magento\FunctionalTestFramework\Test\Handlers; -use AspectMock\Test as AspectMock; - use Magento\FunctionalTestingFramework\Test\Objects\ActionObject; use Magento\FunctionalTestingFramework\Test\Util\ActionMergeUtil; use Magento\FunctionalTestingFramework\Util\MagentoTestCase; From 0062426781ea4af234584e882d04eda8bdbde23e Mon Sep 17 00:00:00 2001 From: Alex Calandra Date: Fri, 21 Sep 2018 15:51:55 -0500 Subject: [PATCH 4/6] MQE-1173: [Dev experience] Error on test generation without reference on file - Added setting parameter list to [] in case of no parameters --- .../FunctionalTestingFramework/Test/Objects/ActionObject.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php index 1efb0f603..32c77b605 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; From 67373ba71d65a94d14e349c6ad053957d21b185d Mon Sep 17 00:00:00 2001 From: Alex Calandra Date: Fri, 21 Sep 2018 16:14:51 -0500 Subject: [PATCH 5/6] MQE-1173: [Dev experience] Error on test generation without reference on file - Moved count out of matching method --- .../Test/Objects/ActionObject.php | 60 ++++++++++++------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php index 32c77b605..04df7d2c8 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php @@ -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 for reference " . + $reference, + ["reference" => $reference] + ); + } + } } From 95da8b67c1aa3ce58a55aad7734d32d832c98c05 Mon Sep 17 00:00:00 2001 From: Alex Calandra Date: Mon, 24 Sep 2018 14:44:00 -0500 Subject: [PATCH 6/6] MQE-1173: [Dev experience] Error on test generation without reference on file - Made requested changes - Updated unit tests to be a bit more descriptive --- .../FunctionalTestFramework/Util/ActionMergeUtilTest.php | 2 +- .../FunctionalTestFramework/Util/TestGeneratorTest.php | 4 ++-- .../FunctionalTestingFramework/Test/Objects/ActionObject.php | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ActionMergeUtilTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ActionMergeUtilTest.php index 6b782147e..913b106a7 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/ActionMergeUtilTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/ActionMergeUtilTest.php @@ -13,7 +13,7 @@ class ActionMergeUtilTest extends MagentoTestCase { /** - * Test Exception Handler + * Test Exception Handler for merging actions * * @throws \Exception */ diff --git a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php index 82a237d4b..097150888 100644 --- a/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php +++ b/dev/tests/unit/Magento/FunctionalTestFramework/Util/TestGeneratorTest.php @@ -16,11 +16,11 @@ class TestGeneratorTest extends MagentoTestCase { /** - * Basic test to validate array => test object conversion. + * Basic test to check exceptions for incorrect entities. * * @throws \Exception */ - public function testGetTestObject() + public function testEntityException() { $actionObject = new ActionObject('fakeAction', 'comment', [ 'userInput' => '{{someEntity.entity}}' diff --git a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php index 04df7d2c8..c91ebaf5c 100644 --- a/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php +++ b/src/Magento/FunctionalTestingFramework/Test/Objects/ActionObject.php @@ -744,7 +744,7 @@ private function checkParameterCount($matches, $parameters, $reference) ); } elseif (count($matches) == 0) { throw new TestReferenceException( - "Parameter Resolution Failed: No parameter matches found for reference " . + "Parameter Resolution Failed: No parameter matches found in parameterized element with selector " . $reference, ["reference" => $reference] );