Skip to content

Commit 76f9cdc

Browse files
committed
MQE-434: Create operation api unit tests
- add new unit tests - refactor old unit test to use new mock tool - AspectMock
1 parent 4feb793 commit 76f9cdc

File tree

8 files changed

+780
-82
lines changed

8 files changed

+780
-82
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,347 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
namespace tests\unit\Magento\FunctionalTestFramework\DataGenerator\Persist;
7+
8+
use AspectMock\Test as AspectMock;
9+
use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler;
10+
use Magento\FunctionalTestingFramework\DataGenerator\Handlers\OperationDefinitionObjectHandler;
11+
use Magento\FunctionalTestingFramework\DataGenerator\Persist\OperationDataArrayResolver;
12+
use PHPUnit\Framework\TestCase;
13+
use tests\unit\Util\EntityDataObjectBuilder;
14+
use tests\unit\Util\OperationDefinitionBuilder;
15+
use tests\unit\Util\OperationElementBuilder;
16+
17+
class OperationDataArrayResolverTest extends TestCase
18+
{
19+
const NESTED_METADATA_EXPECTED_RESULT = ["parentType" => [
20+
"name" => "Hopper",
21+
"address" => ["city" => "Hawkins", "state" => "Indiana", "zip" => 78758],
22+
"isPrimary" => true,
23+
"gpa" => 3.5,
24+
"phone" => 5555555
25+
]];
26+
27+
const NESTED_METADATA_ARRAY_RESULT = ["parentType" => [
28+
"name" => "Hopper",
29+
"isPrimary" => true,
30+
"gpa" => 3.5,
31+
"phone" => 5555555,
32+
"address" => [
33+
["city" => "Hawkins", "state" => "Indiana", "zip" => 78758],
34+
["city" => "Austin", "state" => "Texas", "zip" => 78701],
35+
]
36+
]];
37+
38+
/**
39+
* Test a basic metadata resolve between primitive values and a primitive data set
40+
* <object>
41+
* <field>stringField</field>
42+
* <field>intField</field>
43+
* <field>boolField</field>
44+
* <field>doubleField</field>
45+
* </object>
46+
*/
47+
public function testBasicPrimitiveMetadataResolve()
48+
{
49+
// set up data object
50+
$entityObjectBuilder = new EntityDataObjectBuilder();
51+
$testDataObject = $entityObjectBuilder->build();
52+
53+
// set up meta data operation elements
54+
$operationElementBuilder = new OperationElementBuilder();
55+
$operationElement = $operationElementBuilder->build();
56+
57+
// resolve data object and metadata array
58+
$operationDataArrayResolver = new OperationDataArrayResolver();
59+
$result = $operationDataArrayResolver->resolveOperationDataArray(
60+
$testDataObject,
61+
[$operationElement],
62+
'create'
63+
);
64+
65+
// assert on result
66+
$expectedResult = ["testType" => [
67+
"name" => "Hopper",
68+
"gpa" => 3.5,
69+
"phone" => 5555555,
70+
"isPrimary" => true
71+
]];
72+
73+
$this->assertEquals($expectedResult, $result);
74+
}
75+
76+
/**
77+
* Test a nested metadata operation resolve:
78+
* <object>
79+
* <field>someField</field>
80+
* <field>objectRef</field>
81+
* </object>
82+
*/
83+
public function testNestedMetadataResolve()
84+
{
85+
// set up data objects
86+
$entityDataObjBuilder = new EntityDataObjectBuilder();
87+
$parentDataObject = $entityDataObjBuilder
88+
->withName("parentObject")
89+
->withType("parentType")
90+
->withLinkedEntities(['childObject' => 'childType'])
91+
->build();
92+
93+
$childDataObject = $entityDataObjBuilder
94+
->withName("childObject")
95+
->withType("childType")
96+
->withDataFields(["city" => "Hawkins", "state" => "Indiana", "zip" => "78758"])
97+
->build();
98+
99+
// mock data object handler
100+
$mockDOHInstance = AspectMock::double(DataObjectHandler::class, ['getObject' => $childDataObject])->make();
101+
AspectMock::double(DataObjectHandler::class, ['getInstance' => $mockDOHInstance]);
102+
103+
// set up metadata objects
104+
$parentOpElementBuilder = new OperationElementBuilder();
105+
$parentElement = $parentOpElementBuilder
106+
->withKey("parentType")
107+
->withType("parentType")
108+
->addFields(["address" => "childType"])
109+
->build();
110+
111+
$operationDefinitionBuilder = new OperationDefinitionBuilder();
112+
$childOperationDefinition = $operationDefinitionBuilder
113+
->withName("createChildType")
114+
->withOperation("create")
115+
->withType("childType")
116+
->withMetadata([
117+
"city" => "string",
118+
"state" => "string",
119+
"zip" => "integer"
120+
])->build();
121+
122+
// mock meta data object handler
123+
$mockDOHInstance = AspectMock::double(
124+
OperationDefinitionObjectHandler::class,
125+
['getObject' => $childOperationDefinition]
126+
)->make();
127+
AspectMock::double(OperationDefinitionObjectHandler::class, ['getInstance' => $mockDOHInstance]);
128+
129+
// resolve data object and metadata array
130+
$operationResolver = new OperationDataArrayResolver();
131+
$result = $operationResolver->resolveOperationDataArray($parentDataObject, [$parentElement], "create", false);
132+
133+
// assert on the result
134+
$this->assertEquals(self::NESTED_METADATA_EXPECTED_RESULT, $result);
135+
}
136+
137+
/**
138+
* Test a nested metadata operation:
139+
* <object>
140+
* <field>someField</field>
141+
* <object>
142+
* <field>anotherField</field>
143+
* </object>
144+
* </object>
145+
*/
146+
public function testNestedMetadata()
147+
{
148+
// set up data objects
149+
$entityDataObjectBuilder = new EntityDataObjectBuilder();
150+
$parentDataObject = $entityDataObjectBuilder
151+
->withName("parentObject")
152+
->withType("parentType")
153+
->withLinkedEntities(['childObject' => 'childType'])
154+
->build();
155+
156+
$childDataObject = $entityDataObjectBuilder
157+
->withName("childObject")
158+
->withType("childType")
159+
->withDataFields(["city" => "Hawkins", "state" => "Indiana", "zip" => "78758"])
160+
->build();
161+
162+
// mock data object handler
163+
$mockDOHInstance = AspectMock::double(DataObjectHandler::class, ['getObject' => $childDataObject])->make();
164+
AspectMock::double(DataObjectHandler::class, ['getInstance' => $mockDOHInstance]);
165+
166+
// set up metadata objects
167+
$childOpElementBuilder = new OperationElementBuilder();
168+
$childElement = $childOpElementBuilder
169+
->withKey("address")
170+
->withType("childType")
171+
->withFields(["city" => "string", "state" => "string", "zip" => "integer"])
172+
->build();
173+
174+
$parentOpElementBuilder = new OperationElementBuilder();
175+
$parentElement = $parentOpElementBuilder
176+
->withKey("parentType")
177+
->withType("parentType")
178+
->addElements(["address" => $childElement])
179+
->build();
180+
181+
// resolve data object and metadata array
182+
$operationResolver = new OperationDataArrayResolver();
183+
$result = $operationResolver->resolveOperationDataArray($parentDataObject, [$parentElement], "create", false);
184+
185+
// assert on the result
186+
$this->assertEquals(self::NESTED_METADATA_EXPECTED_RESULT, $result);
187+
}
188+
189+
/**
190+
* Test a nested metadata operation with a declared object:
191+
* <object>
192+
* <field>someField</field>
193+
* <array>
194+
* <object>
195+
* <field>anotherField</field>
196+
* </object>
197+
* </array
198+
* </object>
199+
*/
200+
public function testNestedMetadataArrayOfObjects()
201+
{
202+
// set up data objects
203+
$entityDataObjectBuilder = new EntityDataObjectBuilder();
204+
$parentDataObject = $entityDataObjectBuilder
205+
->withName("parentObject")
206+
->withType("parentType")
207+
->withLinkedEntities(['childObject1' => 'childType', 'childObject2' => 'childType'])
208+
->build();
209+
210+
// mock data object handler
211+
$mockDOHInstance = AspectMock::double(DataObjectHandler::class, ["getObject" => function ($name) {
212+
$entityDataObjectBuilder = new EntityDataObjectBuilder();
213+
214+
if ($name == "childObject1") {
215+
return $entityDataObjectBuilder
216+
->withName("childObject1")
217+
->withType("childType")
218+
->withDataFields(["city" => "Hawkins", "state" => "Indiana", "zip" => "78758"])
219+
->build();
220+
}
221+
222+
if ($name == "childObject2") {
223+
return $entityDataObjectBuilder
224+
->withName("childObject2")
225+
->withType("childType")
226+
->withDataFields(["city" => "Austin", "state" => "Texas", "zip" => "78701"])
227+
->build();
228+
}
229+
}])->make();
230+
AspectMock::double(DataObjectHandler::class, ['getInstance' => $mockDOHInstance]);
231+
232+
// set up metadata objects
233+
$childOpElementBuilder = new OperationElementBuilder();
234+
$childElement = $childOpElementBuilder
235+
->withKey("childType")
236+
->withType("childType")
237+
->withFields(["city" => "string", "state" => "string", "zip" => "integer"])
238+
->build();
239+
240+
$arrayOpElementBuilder = new OperationElementBuilder();
241+
$arrayElement = $arrayOpElementBuilder
242+
->withKey("address")
243+
->withType("childType")
244+
->withFields([])
245+
->withElementType(OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY)
246+
->withNestedElements(["childType" => $childElement])
247+
->build();
248+
249+
$parentOpElementBuilder = new OperationElementBuilder();
250+
$parentElement = $parentOpElementBuilder
251+
->withKey("parentType")
252+
->withType("parentType")
253+
->addElements(["address" => $arrayElement])
254+
->build();
255+
256+
// resolve data object and metadata array
257+
$operationResolver = new OperationDataArrayResolver();
258+
$result = $operationResolver->resolveOperationDataArray($parentDataObject, [$parentElement], "create", false);
259+
260+
// Do assert on result here
261+
$this->assertEquals(self::NESTED_METADATA_ARRAY_RESULT, $result);
262+
}
263+
264+
/**
265+
* Test a nested metadata operation with a value pointing to an object ref:
266+
* <object>
267+
* <field>someField</field>
268+
* <array>
269+
* <value>object</value>
270+
* </array
271+
* </object>
272+
*/
273+
public function testNestedMetadataArrayOfValue()
274+
{
275+
// set up data objects
276+
$entityDataObjectBuilder = new EntityDataObjectBuilder();
277+
$parentDataObject = $entityDataObjectBuilder
278+
->withName("parentObject")
279+
->withType("parentType")
280+
->withLinkedEntities(['childObject1' => 'childType', 'childObject2' => 'childType'])
281+
->build();
282+
283+
// mock data object handler
284+
$mockDOHInstance = AspectMock::double(DataObjectHandler::class, ["getObject" => function ($name) {
285+
$entityDataObjectBuilder = new EntityDataObjectBuilder();
286+
287+
if ($name == "childObject1") {
288+
return $entityDataObjectBuilder
289+
->withName("childObject1")
290+
->withType("childType")
291+
->withDataFields(["city" => "Hawkins", "state" => "Indiana", "zip" => "78758"])
292+
->build();
293+
};
294+
295+
if ($name == "childObject2") {
296+
return $entityDataObjectBuilder
297+
->withName("childObject2")
298+
->withType("childType")
299+
->withDataFields(["city" => "Austin", "state" => "Texas", "zip" => "78701"])
300+
->build();
301+
}
302+
}])->make();
303+
AspectMock::double(DataObjectHandler::class, ['getInstance' => $mockDOHInstance]);
304+
305+
// set up metadata objects
306+
$arrayOpElementBuilder = new OperationElementBuilder();
307+
$arrayElement = $arrayOpElementBuilder
308+
->withKey("address")
309+
->withType("childType")
310+
->withElementType(OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY)
311+
->withNestedElements([])
312+
->withFields([])
313+
->build();
314+
315+
$parentOpElementBuilder = new OperationElementBuilder();
316+
$parentElement = $parentOpElementBuilder
317+
->withKey("parentType")
318+
->withType("parentType")
319+
->addElements(["address" => $arrayElement])
320+
->build();
321+
322+
$operationDefinitionBuilder = new OperationDefinitionBuilder();
323+
$childOperationDefinition = $operationDefinitionBuilder
324+
->withName("createChildType")
325+
->withOperation("create")
326+
->withType("childType")
327+
->withMetadata([
328+
"city" => "string",
329+
"state" => "string",
330+
"zip" => "integer"
331+
])->build();
332+
333+
// mock meta data object handler
334+
$mockDOHInstance = AspectMock::double(
335+
OperationDefinitionObjectHandler::class,
336+
['getObject' => $childOperationDefinition]
337+
)->make();
338+
AspectMock::double(OperationDefinitionObjectHandler::class, ['getInstance' => $mockDOHInstance]);
339+
340+
// resolve data object and metadata array
341+
$operationResolver = new OperationDataArrayResolver();
342+
$result = $operationResolver->resolveOperationDataArray($parentDataObject, [$parentElement], "create", false);
343+
344+
// Do assert on result here
345+
$this->assertEquals(self::NESTED_METADATA_ARRAY_RESULT, $result);
346+
}
347+
}

dev/tests/unit/Magento/FunctionalTestFramework/Test/Util/ActionMergeUtilTest.php

+3-10
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
*/
66
namespace tests\unit\Magento\FunctionalTestFramework\Test\Util;
77

8+
use AspectMock\Test as AspectMock;
89
use Magento\FunctionalTestingFramework\DataGenerator\Handlers\DataObjectHandler;
910
use Magento\FunctionalTestingFramework\DataGenerator\Objects\EntityDataObject;
1011
use Magento\FunctionalTestingFramework\Test\Objects\ActionObject;
11-
use Magento\FunctionalTestingFramework\Test\Objects\TestObject;
1212
use Magento\FunctionalTestingFramework\Test\Util\ActionMergeUtil;
1313
use Magento\FunctionalTestingFramework\Test\Util\ActionObjectExtractor;
1414
use PHPUnit\Framework\TestCase;
@@ -121,7 +121,6 @@ public function testResolveActionStepPageData()
121121
*/
122122
public function testResolveActionStepEntityData()
123123
{
124-
$this->markTestSkipped('This test was written using reflection instead of AspectMock. It needs refactored.');
125124
$dataObjectName = 'myObject';
126125
$dataObjectType = 'testObject';
127126
$dataFieldName = 'myfield';
@@ -137,12 +136,8 @@ public function testResolveActionStepEntityData()
137136
$mockDataObject = new EntityDataObject($dataObjectName, $dataObjectType, $mockData, null, null, null);
138137

139138
// Set up mock DataObject Handler
140-
$mockDataHandler = $this->createMock(DataObjectHandler::class);
141-
$mockDataHandler->expects($this->any())
142-
->method('getObject')
143-
->with($this->matches($dataObjectName))
144-
->willReturn($mockDataObject);
145-
DataObjectHandlerReflectionUtil::setupMock($mockDataHandler);
139+
$mockDOHInstance = AspectMock::double(DataObjectHandler::class, ['getObject' => $mockDataObject])->make();
140+
AspectMock::double(DataObjectHandler::class, ['getInstance' => $mockDOHInstance]);
146141

147142
// Create test object and action object
148143
$actionAttributes = [$userInputKey => $userinputValue];
@@ -154,7 +149,5 @@ public function testResolveActionStepEntityData()
154149
$resolvedActions = $mergeUtil->resolveActionSteps($actions);
155150

156151
$this->assertEquals($dataFieldValue, $resolvedActions[$actionName]->getCustomActionAttributes()[$userInputKey]);
157-
158-
DataObjectHandlerReflectionUtil::tearDown();
159152
}
160153
}

0 commit comments

Comments
 (0)