Skip to content

Commit cce66c4

Browse files
authored
MQE-498: Ability to pass simple values into an action group
- Added `type` to actionGroup `<argument>` elements. - Type dictates actionGroup argument resolution (i.e. string is always stringLiteral, entity tries to resolve data.field references)
1 parent 50a13d1 commit cce66c4

File tree

11 files changed

+471
-31
lines changed

11 files changed

+471
-31
lines changed

dev/tests/unit/Magento/FunctionalTestFramework/Test/Objects/ActionGroupObjectTest.php

+88-6
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Magento\FunctionalTestingFramework\Page\Objects\SectionObject;
1515
use Magento\FunctionalTestingFramework\Test\Objects\ActionGroupObject;
1616
use Magento\FunctionalTestingFramework\Test\Objects\ActionObject;
17+
use Magento\FunctionalTestingFramework\Test\Objects\ArgumentObject;
1718
use PHPUnit\Framework\TestCase;
1819
use tests\unit\Util\ActionGroupObjectBuilder;
1920
use tests\unit\Util\EntityDataObjectBuilder;
@@ -49,10 +50,29 @@ public function testGetStepsWithCustomArgs()
4950

5051
$actionGroupUnderTest = (new ActionGroupObjectBuilder())
5152
->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{arg1.field2}}'])])
53+
->withArguments([new ArgumentObject('arg1', null, 'entity')])
5254
->build();
5355

5456
$steps = $actionGroupUnderTest->getSteps(['arg1' => 'data2'], self::ACTION_GROUP_MERGE_KEY);
5557
$this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'testValue2']);
58+
59+
// entity.field as argument
60+
$actionGroupUnderTest = (new ActionGroupObjectBuilder())
61+
->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{arg1}}'])])
62+
->withArguments([new ArgumentObject('arg1', null, 'entity')])
63+
->build();
64+
65+
$steps = $actionGroupUnderTest->getSteps(['arg1' => 'data2.field2'], self::ACTION_GROUP_MERGE_KEY);
66+
$this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'testValue2']);
67+
68+
// String Data
69+
$actionGroupUnderTest = (new ActionGroupObjectBuilder())
70+
->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{simple}}'])])
71+
->withArguments([new ArgumentObject('simple', null, 'string')])
72+
->build();
73+
74+
$steps = $actionGroupUnderTest->getSteps(['simple' => 'override'], self::ACTION_GROUP_MERGE_KEY);
75+
$this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'override']);
5676
}
5777

5878
/**
@@ -62,10 +82,20 @@ public function testGetStepsWithPersistedArgs()
6282
{
6383
$actionGroupUnderTest = (new ActionGroupObjectBuilder())
6484
->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{arg1.field2}}'])])
85+
->withArguments([new ArgumentObject('arg1', null, 'entity')])
6586
->build();
6687

6788
$steps = $actionGroupUnderTest->getSteps(['arg1' => '$data3$'], self::ACTION_GROUP_MERGE_KEY);
6889
$this->assertOnMergeKeyAndActionValue($steps, ['userInput' => '$data3.field2$']);
90+
91+
// Simple Data
92+
$actionGroupUnderTest = (new ActionGroupObjectBuilder())
93+
->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{simple}}'])])
94+
->withArguments([new ArgumentObject('simple', null, 'string')])
95+
->build();
96+
97+
$steps = $actionGroupUnderTest->getSteps(['simple' => '$data3.field2$'], self::ACTION_GROUP_MERGE_KEY);
98+
$this->assertOnMergeKeyAndActionValue($steps, ['userInput' => '$data3.field2$']);
6999
}
70100

71101
/**
@@ -81,6 +111,7 @@ public function testGetStepsWithNoFieldArg()
81111

82112
$actionGroupUnderTest = (new ActionGroupObjectBuilder())
83113
->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{arg1}}'])])
114+
->withArguments([new ArgumentObject('arg1', null, 'entity')])
84115
->build();
85116

86117
$steps = $actionGroupUnderTest->getSteps(['arg1' => 'data2.field2'], self::ACTION_GROUP_MERGE_KEY);
@@ -111,6 +142,12 @@ public function testGetStepsWithNoArgs()
111142
*/
112143
public function testGetStepsWithParameterizedArg()
113144
{
145+
// Mock Entity Object Handler
146+
$this->setEntityObjectHandlerReturn(function ($entityName) {
147+
if ($entityName == "data2") {
148+
return (new EntityDataObjectBuilder())->withDataFields(['field2' => 'testValue2'])->build();
149+
}
150+
});
114151
// mock the section object handler response
115152
$element = new ElementObject("element1", "textArea", ".selector {{var1}}", null, null, true);
116153
$section = new SectionObject("testSection", ["element1" => $element]);
@@ -120,11 +157,55 @@ public function testGetStepsWithParameterizedArg()
120157

121158
$actionGroupUnderTest = (new ActionGroupObjectBuilder())
122159
->withActionObjects(
123-
[new ActionObject('action1', 'testAction', ['selector' => '{{section1.element1(arg1.field1)}}'])]
160+
[new ActionObject('action1', 'testAction', ['selector' => '{{section1.element1(arg1.field2)}}'])]
124161
)
162+
->withArguments([new ArgumentObject('arg1', null, 'entity')])
125163
->build();
126164

127-
$steps = $actionGroupUnderTest->getSteps(['arg1' => '$someData$'], self::ACTION_GROUP_MERGE_KEY);
165+
// XML Data
166+
$steps = $actionGroupUnderTest->getSteps(['arg1' => 'data2'], self::ACTION_GROUP_MERGE_KEY);
167+
$this->assertOnMergeKeyAndActionValue($steps, ['selector' => '.selector testValue2']);
168+
169+
// Persisted Data
170+
$steps = $actionGroupUnderTest->getSteps(['arg1' => '$data2$'], self::ACTION_GROUP_MERGE_KEY);
171+
$this->assertOnMergeKeyAndActionValue($steps, ['selector' => '.selector $data2.field2$']);
172+
}
173+
174+
/**
175+
* Tests a parameterized section reference in an action group resolved with user simpleArgs.
176+
*/
177+
public function testGetStepsWithParameterizedSimpleArg()
178+
{
179+
// Mock Entity Object Handler
180+
$this->setEntityObjectHandlerReturn(function ($entityName) {
181+
if ($entityName == "data2") {
182+
return (new EntityDataObjectBuilder())->withDataFields(['field2' => 'testValue2'])->build();
183+
}
184+
});
185+
// mock the section object handler response
186+
$element = new ElementObject("element1", "textArea", ".selector {{var1}}", null, null, true);
187+
$section = new SectionObject("testSection", ["element1" => $element]);
188+
// bypass the private constructor
189+
$sectionInstance = AspectMock::double(SectionObjectHandler::class, ['getObject' => $section])->make();
190+
AspectMock::double(SectionObjectHandler::class, ['getInstance' => $sectionInstance]);
191+
192+
$actionGroupUnderTest = (new ActionGroupObjectBuilder())
193+
->withActionObjects(
194+
[new ActionObject('action1', 'testAction', ['selector' => '{{section1.element1(simple)}}'])]
195+
)
196+
->withArguments([new ArgumentObject('simple', null, 'string')])
197+
->build();
198+
199+
// String Literal
200+
$steps = $actionGroupUnderTest->getSteps(['simple' => 'stringLiteral'], self::ACTION_GROUP_MERGE_KEY);
201+
$this->assertOnMergeKeyAndActionValue($steps, ['selector' => '.selector stringLiteral']);
202+
203+
// String Literal w/ data-like structure
204+
$steps = $actionGroupUnderTest->getSteps(['simple' => 'data2.field2'], self::ACTION_GROUP_MERGE_KEY);
205+
$this->assertOnMergeKeyAndActionValue($steps, ['selector' => '.selector data2.field2']);
206+
207+
// Persisted Data
208+
$steps = $actionGroupUnderTest->getSteps(['simple' => '$someData.field1$'], self::ACTION_GROUP_MERGE_KEY);
128209
$this->assertOnMergeKeyAndActionValue($steps, ['selector' => '.selector $someData.field1$']);
129210
}
130211

@@ -135,6 +216,7 @@ public function testGetStepsWithOuterScopePersistence()
135216
{
136217
$actionGroupUnderTest = (new ActionGroupObjectBuilder())
137218
->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{arg1.field1}}'])])
219+
->withArguments([new ArgumentObject('arg1', null, 'entity')])
138220
->build();
139221

140222
$steps = $actionGroupUnderTest->getSteps(['arg1' => '$$someData$$'], self::ACTION_GROUP_MERGE_KEY);
@@ -147,11 +229,11 @@ public function testGetStepsWithOuterScopePersistence()
147229
public function testExceptionOnMissingActions()
148230
{
149231
$actionGroupUnderTest = (new ActionGroupObjectBuilder())
150-
->withArguments(['arg1' => null])
232+
->withArguments([new ArgumentObject('arg1', null, 'entity')])
151233
->build();
152234

153235
$this->expectException(TestReferenceException::class);
154-
$this->expectExceptionMessageRegExp('/Argument\(s\) missed .* for actionGroup/');
236+
$this->expectExceptionMessageRegExp('/Arguments missed .* for actionGroup/');
155237
$actionGroupUnderTest->getSteps(['arg2' => 'data1'], self::ACTION_GROUP_MERGE_KEY);
156238
}
157239

@@ -161,11 +243,11 @@ public function testExceptionOnMissingActions()
161243
public function testExceptionOnMissingArguments()
162244
{
163245
$actionGroupUnderTest = (new ActionGroupObjectBuilder())
164-
->withArguments(['arg1' => null])
246+
->withArguments([new ArgumentObject('arg1', null, 'entity')])
165247
->build();
166248

167249
$this->expectException(TestReferenceException::class);
168-
$this->expectExceptionMessageRegExp('/Not enough arguments given for actionGroup .*/');
250+
$this->expectExceptionMessageRegExp('/Arguments missed .* for actionGroup/');
169251
$actionGroupUnderTest->getSteps(null, self::ACTION_GROUP_MERGE_KEY);
170252
}
171253

dev/tests/unit/Util/ActionGroupObjectBuilder.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ class ActionGroupObjectBuilder
2828
private $actionObjects = [];
2929

3030
/**
31-
* Action Group Object Builder default arguments.
31+
* Action Group Object Builder default entity arguments.
3232
*
3333
* @var array
3434
*/
35-
private $arguments = ['arg1' => 'data1'];
35+
private $arguments = [];
3636

3737
/**
3838
* Setter for the Action Group Object name
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
namespace Magento\AcceptanceTest\_generated\Backend;
3+
4+
use Magento\FunctionalTestingFramework\AcceptanceTester;
5+
use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler;
6+
use Magento\FunctionalTestingFramework\DataGenerator\Persist\DataPersistenceHandler;
7+
use Magento\FunctionalTestingFramework\DataGenerator\Objects\EntityDataObject;
8+
use \Codeception\Util\Locator;
9+
use Yandex\Allure\Adapter\Annotation\Features;
10+
use Yandex\Allure\Adapter\Annotation\Stories;
11+
use Yandex\Allure\Adapter\Annotation\Title;
12+
use Yandex\Allure\Adapter\Annotation\Description;
13+
use Yandex\Allure\Adapter\Annotation\Parameter;
14+
use Yandex\Allure\Adapter\Annotation\Severity;
15+
use Yandex\Allure\Adapter\Model\SeverityLevel;
16+
use Yandex\Allure\Adapter\Annotation\TestCaseId;
17+
18+
/**
19+
* @Title("Action Group With Simple Data Usage From Default Argument")
20+
*/
21+
class ActionGroupWithSimpleDataUsageFromDefaultArgumentCest
22+
{
23+
/**
24+
* @Severity(level = SeverityLevel::CRITICAL)
25+
* @Parameter(name = "AcceptanceTester", value="$I")
26+
* @param AcceptanceTester $I
27+
* @return void
28+
* @throws \Exception
29+
*/
30+
public function ActionGroupWithSimpleDataUsageFromDefaultArgument(AcceptanceTester $I)
31+
{
32+
$I->see("stringLiteral", "#element .stringLiteral");
33+
}
34+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
namespace Magento\AcceptanceTest\_generated\Backend;
3+
4+
use Magento\FunctionalTestingFramework\AcceptanceTester;
5+
use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler;
6+
use Magento\FunctionalTestingFramework\DataGenerator\Persist\DataPersistenceHandler;
7+
use Magento\FunctionalTestingFramework\DataGenerator\Objects\EntityDataObject;
8+
use \Codeception\Util\Locator;
9+
use Yandex\Allure\Adapter\Annotation\Features;
10+
use Yandex\Allure\Adapter\Annotation\Stories;
11+
use Yandex\Allure\Adapter\Annotation\Title;
12+
use Yandex\Allure\Adapter\Annotation\Description;
13+
use Yandex\Allure\Adapter\Annotation\Parameter;
14+
use Yandex\Allure\Adapter\Annotation\Severity;
15+
use Yandex\Allure\Adapter\Model\SeverityLevel;
16+
use Yandex\Allure\Adapter\Annotation\TestCaseId;
17+
18+
/**
19+
* @Title("Action Group With Simple Data Usage From Passed Argument")
20+
*/
21+
class ActionGroupWithSimpleDataUsageFromPassedArgumentCest
22+
{
23+
/**
24+
* @Severity(level = SeverityLevel::CRITICAL)
25+
* @Parameter(name = "AcceptanceTester", value="$I")
26+
* @param AcceptanceTester $I
27+
* @return void
28+
* @throws \Exception
29+
*/
30+
public function ActionGroupWithSimpleDataUsageFromPassedArgument(AcceptanceTester $I)
31+
{
32+
$I->see("overrideString", "#element .overrideString");
33+
$I->see("1", "#element .1");
34+
$I->see("1.5", "#element .1.5");
35+
$I->see("true", "#element .true");
36+
$I->see("simpleData.firstname", "#element .simpleData.firstname");
37+
$I->see($persisted->getCreatedDataByName('data'), "#element ." . $persisted->getCreatedDataByName('data'));
38+
$I->see("John", "#element .John");
39+
$I->see($simpleData->getCreatedDataByName('firstname'), "#element ." . $simpleData->getCreatedDataByName('firstname'));
40+
}
41+
}

dev/tests/verification/TestModule/ActionGroup/BasicActionGroup.xml

+14
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,18 @@
3434

3535
<see selector="{{SampleSection.threeParamElement(someArgument.firstname, someArgument.lastname, 'test')}}" userInput="{{someArgument.lastname}}" stepKey="seeLastName" />
3636
</actionGroup>
37+
38+
<actionGroup name="actionGroupWithStringUsage">
39+
<arguments>
40+
<argument name="someArgument" type="string" defaultValue="stringLiteral"/>
41+
</arguments>
42+
<see selector="{{SampleSection.oneParamElement(someArgument)}}" userInput="{{someArgument}}" stepKey="see1" />
43+
</actionGroup>
44+
45+
<actionGroup name="actionGroupWithEntityUsage">
46+
<arguments>
47+
<argument name="someArgument" type="entity" defaultValue="stringLiteral"/>
48+
</arguments>
49+
<see selector="{{SampleSection.oneParamElement(someArgument)}}" userInput="{{someArgument}}" stepKey="see1" />
50+
</actionGroup>
3751
</actionGroups>

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

+41
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,45 @@
6363

6464
<actionGroup ref="actionGroupWithMultipleParameterSelectorsFromArgument" stepKey="actionGroup"/>
6565
</test>
66+
67+
<test name="ActionGroupWithSimpleDataUsageFromPassedArgument">
68+
<annotations>
69+
<severity value="CRITICAL"/>
70+
<title value="Action Group With Simple Data Usage From Passed Argument"/>
71+
</annotations>
72+
73+
<actionGroup ref="actionGroupWithStringUsage" stepKey="actionGroup1">
74+
<argument name="someArgument" value="overrideString"/>
75+
</actionGroup>
76+
<actionGroup ref="actionGroupWithStringUsage" stepKey="actionGroup11">
77+
<argument name="someArgument" value="1"/>
78+
</actionGroup>
79+
<actionGroup ref="actionGroupWithStringUsage" stepKey="actionGroup12">
80+
<argument name="someArgument" value="1.5"/>
81+
</actionGroup>
82+
<actionGroup ref="actionGroupWithStringUsage" stepKey="actionGroup13">
83+
<argument name="someArgument" value="true"/>
84+
</actionGroup>
85+
<actionGroup ref="actionGroupWithStringUsage" stepKey="actionGroup2">
86+
<argument name="someArgument" value="simpleData.firstname"/>
87+
</actionGroup>
88+
<actionGroup ref="actionGroupWithStringUsage" stepKey="actionGroup3">
89+
<argument name="someArgument" value="$persisted.data$"/>
90+
</actionGroup>
91+
92+
<actionGroup ref="actionGroupWithEntityUsage" stepKey="actionGroup4">
93+
<argument name="someArgument" value="simpleData.firstname"/>
94+
</actionGroup>
95+
<actionGroup ref="actionGroupWithStringUsage" stepKey="actionGroup5">
96+
<argument name="someArgument" value="$simpleData.firstname$"/>
97+
</actionGroup>
98+
</test>
99+
100+
<test name="ActionGroupWithSimpleDataUsageFromDefaultArgument">
101+
<annotations>
102+
<severity value="CRITICAL"/>
103+
<title value="Action Group With Simple Data Usage From Default Argument"/>
104+
</annotations>
105+
<actionGroup ref="actionGroupWithStringUsage" stepKey="actionGroup"/>
106+
</test>
66107
</tests>

dev/tests/verification/Tests/ActionGroupGenerationTest.php

+22
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,26 @@ public function testActionGroupWithMultipleParameterSelectorsFromDefaultArgument
7474
{
7575
$this->generateAndCompareTest('ActionGroupWithMultipleParameterSelectorsFromDefaultArgument');
7676
}
77+
78+
/**
79+
* Test generation of a test referencing an action group with simple passed data.
80+
*
81+
* @throws \Exception
82+
* @throws \Magento\FunctionalTestingFramework\Exceptions\TestReferenceException
83+
*/
84+
public function testActionGroupWithSimpleDataUsageFromPassedArgument()
85+
{
86+
$this->generateAndCompareTest('ActionGroupWithSimpleDataUsageFromPassedArgument');
87+
}
88+
89+
/**
90+
* Test generation of a test referencing an action group with default data.
91+
*
92+
* @throws \Exception
93+
* @throws \Magento\FunctionalTestingFramework\Exceptions\TestReferenceException
94+
*/
95+
public function testActionGroupWithSimpleDataUsageFromDefaultArgument()
96+
{
97+
$this->generateAndCompareTest('ActionGroupWithSimpleDataUsageFromDefaultArgument');
98+
}
7799
}

0 commit comments

Comments
 (0)