Skip to content

MQE-1173: [Dev experience] Error on test generation without reference on file #234

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Sep 25, 2018
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/

namespace Tests\unit\Magento\FunctionalTestFramework\Test\Handlers;

use Magento\FunctionalTestingFramework\Test\Objects\ActionObject;
use Magento\FunctionalTestingFramework\Test\Util\ActionMergeUtil;
use Magento\FunctionalTestingFramework\Util\MagentoTestCase;

class ActionMergeUtilTest extends MagentoTestCase
{
/**
* Test Exception Handler for merging actions
*
* @throws \Exception
*/
public function testMergeActionsException()
{
$testActionMergeUtil = new ActionMergeUtil(null, null);

$actionObject = new ActionObject('fakeAction', 'comment', [
'userInput' => '{{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]);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/

namespace Tests\unit\Magento\FunctionalTestFramework\Test\Handlers;

use AspectMock\Test as AspectMock;

use Magento\FunctionalTestingFramework\Test\Objects\ActionObject;
use Magento\FunctionalTestingFramework\Test\Objects\TestObject;
use Magento\FunctionalTestingFramework\Util\MagentoTestCase;
use Magento\FunctionalTestingFramework\Util\TestGenerator;

class TestGeneratorTest extends MagentoTestCase
{
/**
* Basic test to check exceptions for incorrect entities.
*
* @throws \Exception
*/
public function testEntityException()
{
$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, []);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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.
Expand Down Expand Up @@ -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]
);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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() . "\""
);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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() . "\"");
}
}
Expand Down