Skip to content

Commit 6a37b76

Browse files
committedDec 21, 2017
Merge branch 'MQE-545' into sprint-develop
2 parents f8f433f + 47d74fe commit 6a37b76

File tree

1 file changed

+365
-2
lines changed

1 file changed

+365
-2
lines changed
 

‎dev/tests/unit/Magento/FunctionalTestFramework/DataGenerator/Handlers/OperationDefinitionObjectHandlerTest.php

Lines changed: 365 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,378 @@
66

77
namespace tests\unit\Magento\FunctionalTestFramework\DataGenerator\Handlers;
88

9+
use AspectMock\Test as AspectMock;
10+
use Magento\FunctionalTestingFramework\DataGenerator\Objects\OperationDefinitionObject;
11+
use Magento\FunctionalTestingFramework\DataGenerator\Objects\OperationElement;
12+
use Magento\FunctionalTestingFramework\ObjectManager;
13+
use Magento\FunctionalTestingFramework\ObjectManagerFactory;
14+
use Magento\FunctionalTestingFramework\DataGenerator\Handlers\OperationDefinitionObjectHandler;
15+
use Magento\FunctionalTestingFramework\DataGenerator\Parsers\OperationDefinitionParser;
916
use PHPUnit\Framework\TestCase;
1017

1118
/**
1219
* Class OperationDefinitionObjectHandlerTest
1320
*/
1421
class OperationDefinitionObjectHandlerTest extends TestCase
1522
{
16-
public function testTodo()
23+
public function testGetMultipleObjects()
1724
{
18-
$this->markTestIncomplete('TODO');
25+
// Data Variables for Assertions
26+
$dataType1 = "type1";
27+
$operationType1 = "create";
28+
$operationType2 = "update";
29+
30+
/**
31+
* Parser Output. Just two simple pieces of metadata with 1 field each
32+
* operationName
33+
* createType1
34+
* has field
35+
* key=id, value=integer
36+
* updateType1
37+
* has field
38+
* key=id, value=integer
39+
*/
40+
$mockData = [OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [
41+
"testOperationName" => [
42+
OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType1,
43+
OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType1,
44+
OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => "auth",
45+
OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => "V1/Type1",
46+
OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => "POST",
47+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [
48+
0 => [
49+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => "id",
50+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => "integer"
51+
],
52+
]
53+
],[
54+
OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType1,
55+
OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType2,
56+
OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => "auth",
57+
OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => "V1/Type1/{id}",
58+
OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => "PUT",
59+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [
60+
0 => [
61+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => "id",
62+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => "integer"
63+
],
64+
]
65+
]]];
66+
$this->setMockParserOutput($mockData);
67+
68+
//Perform Assertions
69+
$operationDefinitionManager = OperationDefinitionObjectHandler::getInstance();
70+
$operations = $operationDefinitionManager->getAllObjects();
71+
$this->assertArrayHasKey($operationType1 . $dataType1, $operations);
72+
$this->assertArrayHasKey($operationType2 . $dataType1, $operations);
73+
74+
}
75+
76+
public function testObjectCreation()
77+
{
78+
// Data Variables for Assertions
79+
$testDataTypeName1 = "type1";
80+
$testAuth = "auth";
81+
$testUrl = "V1/dataType";
82+
$testOperationType = "create";
83+
$testMethod = "POST";
84+
$testSuccessRegex = "/messages-message-success/";
85+
$testContentType = "application/json";
86+
$testHeaderParam = "testParameter";
87+
$testHeaderValue = "testHeader";
88+
// Nested Object variables
89+
$nestedObjectKey = "objectKey";
90+
$nestedObjectType = "objectType";
91+
$nestedEntryKey1 = "id";
92+
$nestedEntryValue1 = "integer";
93+
$nestedEntryKey2 = "name";
94+
$nestedEntryValue2 = "string";
95+
$nestedEntryRequired2 = "true";
96+
$nestedEntryKey3 = "active";
97+
$nestedEntryValue3 = "boolean";
98+
99+
/**
100+
* Complex Object
101+
* testOperation
102+
* createType1
103+
* has contentType
104+
* has headers
105+
* has URL
106+
* has successRegex
107+
* has nested object
108+
* key nestedKey type nestedType
109+
* has 3 fields
110+
* key id, value integer
111+
* key name, value string, required TRUE
112+
* key active, value boolean
113+
*
114+
*/
115+
$mockData = [OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [
116+
"testOperationName" => [
117+
OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $testDataTypeName1,
118+
OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $testOperationType,
119+
OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => $testAuth,
120+
OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => $testUrl,
121+
OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => $testMethod,
122+
OperationDefinitionObjectHandler::ENTITY_OPERATION_SUCCESS_REGEX => $testSuccessRegex,
123+
OperationDefinitionObjectHandler::ENTITY_OPERATION_CONTENT_TYPE => [
124+
0 => [
125+
"value" => $testContentType
126+
]
127+
],
128+
OperationDefinitionObjectHandler::ENTITY_OPERATION_HEADER => [
129+
0 => [
130+
OperationDefinitionObjectHandler::ENTITY_OPERATION_HEADER_PARAM => $testHeaderParam,
131+
OperationDefinitionObjectHandler::ENTITY_OPERATION_HEADER_VALUE => $testHeaderValue,
132+
]
133+
],
134+
OperationDefinitionObjectHandler::ENTITY_OPERATION_URL_PARAM => [
135+
0 => [
136+
OperationDefinitionObjectHandler::ENTITY_OPERATION_URL_PARAM_KEY => "testUrlParamKey",
137+
OperationDefinitionObjectHandler::ENTITY_OPERATION_URL_PARAM_VALUE => "testUrlParamValue"
138+
]
139+
],
140+
OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT => [
141+
0 => [
142+
OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT_KEY => $nestedObjectKey,
143+
OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $nestedObjectType,
144+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [
145+
0 => [
146+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => $nestedEntryKey1,
147+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => $nestedEntryValue1
148+
],
149+
1 => [
150+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => $nestedEntryKey2,
151+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => $nestedEntryValue2,
152+
OperationDefinitionObjectHandler::ENTITY_OPERATION_REQUIRED => $nestedEntryRequired2
153+
],
154+
2 => [
155+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => $nestedEntryKey3,
156+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => $nestedEntryValue3
157+
]
158+
]
159+
]
160+
],
161+
]]];
162+
// Prepare objects to compare against
163+
$field = OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY;
164+
$expectedNestedField = new OperationElement($nestedEntryKey1, $nestedEntryValue1, $field, false, [], null);
165+
$expectedNestedField2 = new OperationElement(
166+
$nestedEntryKey2,
167+
$nestedEntryValue2,
168+
$field,
169+
$nestedEntryRequired2,
170+
[],
171+
null
172+
);
173+
$expectedNestedField3 = new OperationElement($nestedEntryKey3, $nestedEntryValue3, $field, false, [], null);
174+
$expectedOperation = new OperationElement(
175+
$nestedObjectKey,
176+
$nestedObjectType,
177+
OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT,
178+
false,
179+
[],
180+
[0 => $expectedNestedField, 1 => $expectedNestedField2, 2 =>$expectedNestedField3]
181+
);
182+
183+
// Set up mocked data output
184+
$this->setMockParserOutput($mockData);
185+
186+
// Get Operation
187+
$operationDefinitionManager = OperationDefinitionObjectHandler::getInstance();
188+
$operation = $operationDefinitionManager->getOperationDefinition($testOperationType, $testDataTypeName1);
189+
190+
// Perform Asserts
191+
$this->assertEquals(
192+
[0 => "{$testHeaderParam}: {$testHeaderValue}",
193+
1 => OperationDefinitionObject::HTTP_CONTENT_TYPE_HEADER . ": {$testContentType}"],
194+
$operation->getHeaders()
195+
);
196+
$this->assertEquals($testOperationType, $operation->getOperation());
197+
$this->assertEquals($testMethod, $operation->getApiMethod());
198+
$this->assertEquals($testUrl, $operation->getApiUrl());
199+
$this->assertEquals($testDataTypeName1, $operation->getDataType());
200+
$this->assertEquals($testContentType, $operation->getContentType());
201+
$this->assertEquals($testAuth, $operation->getAuth());
202+
$this->assertEquals($testSuccessRegex, $operation->getSuccessRegex());
203+
204+
// perform asserts on the instantiated metadata in the $createOperationByName
205+
$this->assertEquals($expectedOperation, $operation->getOperationMetadata()[0]);
206+
}
207+
208+
public function testObjectArrayCreation()
209+
{
210+
// Data Variables for Assertions
211+
$dataType1 = "type1";
212+
$operationType1 = "create";
213+
$objectArrayKey = "ObjectArray";
214+
$twiceNestedObjectKey = "nestedObjectKey";
215+
$twiceNestedObjectType = "nestedObjectType";
216+
$twiceNestedEntryKey = "nestedFieldKey";
217+
$twiceNestedEntryValue = "string";
218+
// Parser Output
219+
/**
220+
* Metadata with nested array of objects, with a single field
221+
* OperationName
222+
* createType1
223+
* has array with key ObjectArray
224+
* objects with key = nestedObjectKey, type = nestedObjectType
225+
* has field with key = nestedFieldKey, value = string
226+
*/
227+
$mockData = [OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [
228+
"testOperationName" => [
229+
OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType1,
230+
OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType1,
231+
OperationDefinitionObjectHandler::ENTITY_OPERATION_AUTH => "auth",
232+
OperationDefinitionObjectHandler::ENTITY_OPERATION_URL => "V1/Type1",
233+
OperationDefinitionObjectHandler::ENTITY_OPERATION_METHOD => "POST",
234+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY => [
235+
0 => [
236+
OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT_KEY => $objectArrayKey,
237+
OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT => [
238+
0 => [
239+
OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT_KEY => $twiceNestedObjectKey,
240+
OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $twiceNestedObjectType,
241+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [
242+
0 => [
243+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY =>
244+
$twiceNestedEntryKey,
245+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE =>
246+
$twiceNestedEntryValue
247+
]
248+
]
249+
]
250+
]
251+
]
252+
]]]];
253+
// Prepare Objects to compare against
254+
$twoLevelNestedMetadata = new OperationElement(
255+
$twiceNestedEntryKey,
256+
$twiceNestedEntryValue,
257+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY,
258+
false,
259+
[],
260+
null
261+
);
262+
263+
$oneLevelNestedMetadata = new OperationElement(
264+
$twiceNestedObjectKey,
265+
$twiceNestedObjectType,
266+
OperationDefinitionObjectHandler::ENTITY_OPERATION_OBJECT,
267+
false,
268+
[],
269+
[0 => $twoLevelNestedMetadata]
270+
);
271+
272+
$expectedOperation = new OperationElement(
273+
$objectArrayKey,
274+
$twiceNestedObjectType,
275+
$twiceNestedObjectKey,
276+
false,
277+
[$twiceNestedObjectKey => $oneLevelNestedMetadata],
278+
null
279+
);
280+
281+
// Set up mocked data output
282+
$this->setMockParserOutput($mockData);
283+
284+
// Get Operation
285+
$operationDefinitionManager = OperationDefinitionObjectHandler::getInstance();
286+
$operation = $operationDefinitionManager->getOperationDefinition($operationType1, $dataType1);
287+
// Make Assertions
288+
289+
$this->assertEquals($expectedOperation, $operation->getOperationMetadata()[0]);
290+
}
291+
292+
public function testLooseJsonCreation()
293+
{
294+
// Data Variables for Assertions
295+
$dataType = "dataType";
296+
$operationType = "create";
297+
$entryKey = "id";
298+
$entryValue = "integer";
299+
$arrayKey = "arrayKey";
300+
$arrayValue = "string";
301+
/**
302+
* Operation with no objects, just an entry and an array of strings
303+
* testOperationName
304+
* createDataType
305+
* has entry key = id, value = integer
306+
* has array key = arrayKey
307+
* fields of value = string
308+
*/
309+
$mockData = [OperationDefinitionObjectHandler::ENTITY_OPERATION_ROOT_TAG => [
310+
"testOperationName" => [
311+
OperationDefinitionObjectHandler::ENTITY_OPERATION_DATA_TYPE => $dataType,
312+
OperationDefinitionObjectHandler::ENTITY_OPERATION_TYPE => $operationType,
313+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY => [
314+
0 => [
315+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_KEY => $entryKey,
316+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => $entryValue
317+
]
318+
],
319+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY => [
320+
0 => [
321+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY_KEY => $arrayKey,
322+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY_VALUE => [
323+
0 => [
324+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY_VALUE => $arrayValue
325+
]
326+
]
327+
]
328+
]
329+
]
330+
]];
331+
// Prepare Objects to assert against
332+
$entry = new OperationElement(
333+
$entryKey,
334+
$entryValue,
335+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ENTRY,
336+
false,
337+
[],
338+
null
339+
);
340+
$array = new OperationElement(
341+
$arrayKey,
342+
$arrayValue,
343+
OperationDefinitionObjectHandler::ENTITY_OPERATION_ARRAY,
344+
false,
345+
[],
346+
null
347+
);
348+
349+
// Set up mocked data output
350+
$this->setMockParserOutput($mockData);
351+
352+
// get Operations
353+
$operationDefinitionManager = OperationDefinitionObjectHandler::getInstance();
354+
$operation = $operationDefinitionManager->getOperationDefinition($operationType, $dataType);
355+
356+
// Perform Assertions
357+
$this->assertEquals($entry, $operation->getOperationMetadata()[0]);
358+
$this->assertEquals($array, $operation->getOperationMetadata()[1]);
359+
}
360+
361+
/**
362+
* Function used to set mock for parser return and force init method to run between tests.
363+
*
364+
* @param array $data
365+
*/
366+
private function setMockParserOutput($data)
367+
{
368+
// clear Operation object handler value to inject parsed content
369+
$property = new \ReflectionProperty(
370+
OperationDefinitionObjectHandler::class,
371+
'DATA_DEFINITION_OBJECT_HANDLER'
372+
);
373+
$property->setAccessible(true);
374+
$property->setValue(null);
375+
376+
$mockOperationParser = AspectMock::double(
377+
OperationDefinitionParser::class,
378+
["readOperationMetadata" => $data]
379+
)->make();
380+
$instance = AspectMock::double(ObjectManager::class, ['create' => $mockOperationParser])->make();
381+
AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]);
19382
}
20383
}

0 commit comments

Comments
 (0)