Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ObjectExtensionUtilTest.php
Go to the documentation of this file.
1 <?php
7 
8 use AspectMock\Proxy\Verifier;
9 use AspectMock\Test as AspectMock;
17 use Monolog\Handler\TestHandler;
18 use Monolog\Logger;
19 use PHPUnit\Framework\TestCase;
22 
23 class ObjectExtensionUtilTest extends TestCase
24 {
29  public function setUp()
30  {
31  TestLoggingUtil::getInstance()->setMockLoggingUtil();
32  }
33 
38  public function testGenerateExtendedTest()
39  {
40  $mockActions = [
41  "mockStep" => ["nodeName" => "mockNode", "stepKey" => "mockStep"]
42  ];
43 
44  $testDataArrayBuilder = new TestDataArrayBuilder();
45  $mockSimpleTest = $testDataArrayBuilder
46  ->withName('simpleTest')
47  ->withAnnotations(['title'=>[['value' => 'simpleTest']]])
48  ->withTestActions($mockActions)
49  ->build();
50 
51  $mockExtendedTest = $testDataArrayBuilder
52  ->withName('extendedTest')
53  ->withAnnotations(['title'=>[['value' => 'extendedTest']]])
54  ->withTestReference("simpleTest")
55  ->build();
56 
57  $mockTestData = ['tests' => array_merge($mockSimpleTest, $mockExtendedTest)];
58  $this->setMockTestOutput($mockTestData);
59 
60  // parse and generate test object with mocked data
61  $testObject = TestObjectHandler::getInstance()->getObject('extendedTest');
62 
63  // assert log statement is correct
64  TestLoggingUtil::getInstance()->validateMockLogStatement(
65  'debug',
66  'extending test',
67  ['parent' => 'simpleTest', 'test' => 'extendedTest']
68  );
69 
70  // assert that expected test is generated
71  $this->assertEquals($testObject->getParentName(), "simpleTest");
72  $this->assertArrayHasKey("mockStep", $testObject->getOrderedActions());
73  }
74 
80  {
81  $mockBeforeHooks = [
82  "beforeHookAction" => ["nodeName" => "mockNodeBefore", "stepKey" => "mockStepBefore"]
83  ];
84  $mockAfterHooks = [
85  "afterHookAction" => ["nodeName" => "mockNodeAfter", "stepKey" => "mockStepAfter"]
86  ];
87 
88  $testDataArrayBuilder = new TestDataArrayBuilder();
89  $mockSimpleTest = $testDataArrayBuilder
90  ->withName('simpleTest')
91  ->withAnnotations(['title'=>[['value' => 'simpleTest']]])
92  ->withBeforeHook($mockBeforeHooks)
93  ->withAfterHook($mockAfterHooks)
94  ->build();
95 
96  $mockExtendedTest = $testDataArrayBuilder
97  ->withName('extendedTest')
98  ->withAnnotations(['title'=>[['value' => 'extendedTest']]])
99  ->withTestReference("simpleTest")
100  ->build();
101 
102  $mockTestData = ['tests' => array_merge($mockSimpleTest, $mockExtendedTest)];
103  $this->setMockTestOutput($mockTestData);
104 
105  // parse and generate test object with mocked data
106  $testObject = TestObjectHandler::getInstance()->getObject('extendedTest');
107 
108  // assert log statement is correct
109  TestLoggingUtil::getInstance()->validateMockLogStatement(
110  'debug',
111  'extending test',
112  ['parent' => 'simpleTest', 'test' => 'extendedTest']
113  );
114 
115  // assert that expected test is generated
116  $this->assertEquals($testObject->getParentName(), "simpleTest");
117  $this->assertArrayHasKey("mockStepBefore", $testObject->getHooks()['before']->getActions());
118  $this->assertArrayHasKey("mockStepAfter", $testObject->getHooks()['after']->getActions());
119  }
120 
125  public function testExtendedTestNoParent()
126  {
127  $testDataArrayBuilder = new TestDataArrayBuilder();
128  $mockExtendedTest = $testDataArrayBuilder
129  ->withName('extendedTest')
130  ->withTestReference("simpleTest")
131  ->build();
132 
133  $mockTestData = ['tests' => array_merge($mockExtendedTest)];
134  $this->setMockTestOutput($mockTestData);
135 
136  // parse and generate test object with mocked data
137  TestObjectHandler::getInstance()->getObject('extendedTest');
138 
139  // validate log statement
140  TestLoggingUtil::getInstance()->validateMockLogStatement(
141  'debug',
142  "parent test not defined. test will be skipped",
143  ['parent' => 'simpleTest', 'test' => 'extendedTest']
144  );
145  }
146 
151  public function testExtendingExtendedTest()
152  {
153  $testDataArrayBuilder = new TestDataArrayBuilder();
154  $mockParentTest = $testDataArrayBuilder
155  ->withName('anotherTest')
156  ->withTestActions()
157  ->build();
158 
159  $mockSimpleTest = $testDataArrayBuilder
160  ->withName('simpleTest')
161  ->withAnnotations(['title'=>[['value' => 'simpleTest']]])
162  ->withTestActions()
163  ->withTestReference("anotherTest")
164  ->build();
165 
166  $mockExtendedTest = $testDataArrayBuilder
167  ->withName('extendedTest')
168  ->withAnnotations(['title'=>[['value' => 'extendedTest']]])
169  ->withTestReference("simpleTest")
170  ->build();
171 
172  $mockTestData = ['tests' => array_merge($mockParentTest, $mockSimpleTest, $mockExtendedTest)];
173  $this->setMockTestOutput($mockTestData);
174 
175  $this->expectExceptionMessage("Cannot extend a test that already extends another test. Test: simpleTest");
176 
177  // parse and generate test object with mocked data
178  TestObjectHandler::getInstance()->getObject('extendedTest');
179 
180  // validate log statement
181  TestLoggingUtil::getInstance()->validateMockLogStatement(
182  'debug',
183  "parent test not defined. test will be skipped",
184  ['parent' => 'simpleTest', 'test' => 'extendedTest']
185  );
186  $this->expectOutputString("Extending Test: anotherTest => simpleTest" . PHP_EOL);
187  }
188 
194  {
195  $mockSimpleActionGroup = [
196  "nodeName" => "actionGroup",
197  "name" => "mockSimpleActionGroup",
198  "filename" => "someFile",
199  "commentHere" => [
200  "nodeName" => "comment",
201  "selector" => "selector",
202  "stepKey" => "commentHere"
203  ],
204  "parentComment" => [
205  "nodeName" => "comment",
206  "selector" => "parentSelector",
207  "stepKey" => "parentComment"
208  ],
209  ];
210 
211  $mockExtendedActionGroup = [
212  "nodeName" => "actionGroup",
213  "name" => "mockExtendedActionGroup",
214  "filename" => "someFile",
215  "extends" => "mockSimpleActionGroup",
216  "commentHere" => [
217  "nodeName" => "comment",
218  "selector" => "otherSelector",
219  "stepKey" => "commentHere"
220  ],
221  ];
222 
223  $mockActionGroupData = [
224  'actionGroups' => [
225  'mockSimpleActionGroup' => $mockSimpleActionGroup,
226  'mockExtendedActionGroup' => $mockExtendedActionGroup
227  ]
228  ];
229  $this->setMockTestOutput(null, $mockActionGroupData);
230 
231  // parse and generate test object with mocked data
232  $actionGroupObject = ActionGroupObjectHandler::getInstance()->getObject('mockExtendedActionGroup');
233 
234  // validate log statement
235  TestLoggingUtil::getInstance()->validateMockLogStatement(
236  'debug',
237  'extending action group:',
238  ['parent' => $mockSimpleActionGroup['name'], 'actionGroup' => $mockExtendedActionGroup['name']]
239  );
240 
241  // assert that expected test is generated
242  $this->assertEquals("mockSimpleActionGroup", $actionGroupObject->getParentName());
243  $actions = $actionGroupObject->getActions();
244  $this->assertEquals("otherSelector", $actions["commentHere"]->getCustomActionAttributes()["selector"]);
245  $this->assertEquals("parentSelector", $actions["parentComment"]->getCustomActionAttributes()["selector"]);
246  }
247 
253  {
254  $mockExtendedActionGroup = [
255  "nodeName" => "actionGroup",
256  "name" => "mockSimpleActionGroup",
257  "filename" => "someFile",
258  "extends" => "mockSimpleActionGroup",
259  "commentHere" => [
260  "nodeName" => "comment",
261  "selector" => "otherSelector",
262  "stepKey" => "commentHere"
263  ],
264  ];
265 
266  $mockActionGroupData = [
267  'actionGroups' => [
268  'mockExtendedActionGroup' => $mockExtendedActionGroup
269  ]
270  ];
271  $this->setMockTestOutput(null, $mockActionGroupData);
272 
273  $this->expectExceptionMessage(
274  "Parent Action Group mockSimpleActionGroup not defined for Test " . $mockExtendedActionGroup['extends']
275  );
276 
277  // parse and generate test object with mocked data
278  ActionGroupObjectHandler::getInstance()->getObject('mockExtendedActionGroup');
279  }
280 
286  {
287  $mockParentActionGroup = [
288  "nodeName" => "actionGroup",
289  "name" => "mockParentActionGroup",
290  "filename" => "someFile"
291  ];
292 
293  $mockSimpleActionGroup = [
294  "nodeName" => "actionGroup",
295  "name" => "mockSimpleActionGroup",
296  "filename" => "someFile",
297  "extends" => "mockParentActionGroup",
298  ];
299 
300  $mockExtendedActionGroup = [
301  "nodeName" => "actionGroup",
302  "name" => "mockSimpleActionGroup",
303  "filename" => "someFile",
304  "extends" => "mockSimpleActionGroup",
305  ];
306 
307  $mockActionGroupData = [
308  'actionGroups' => [
309  'mockParentActionGroup' => $mockParentActionGroup,
310  'mockSimpleActionGroup' => $mockSimpleActionGroup,
311  'mockExtendedActionGroup' => $mockExtendedActionGroup
312  ]
313  ];
314  $this->setMockTestOutput(null, $mockActionGroupData);
315 
316  $this->expectExceptionMessage(
317  "Cannot extend an action group that already extends another action group. " . $mockSimpleActionGroup['name']
318  );
319 
320  // parse and generate test object with mocked data
321  try {
322  ActionGroupObjectHandler::getInstance()->getObject('mockExtendedActionGroup');
323  } catch (\Exception $e) {
324  // validate log statement
325  TestLoggingUtil::getInstance()->validateMockLogStatement(
326  'error',
327  "Cannot extend an action group that already extends another action group. " .
328  $mockSimpleActionGroup['name'],
329  ['parent' => $mockSimpleActionGroup['name'], 'actionGroup' => $mockSimpleActionGroup['name']]
330  );
331 
332  throw $e;
333  }
334  }
335 
342  private function setMockTestOutput($testData = null, $actionGroupData = null)
343  {
344  // clear test object handler value to inject parsed content
345  $property = new \ReflectionProperty(TestObjectHandler::class, 'testObjectHandler');
346  $property->setAccessible(true);
347  $property->setValue(null);
348 
349  // clear test object handler value to inject parsed content
350  $property = new \ReflectionProperty(ActionGroupObjectHandler::class, 'ACTION_GROUP_OBJECT_HANDLER');
351  $property->setAccessible(true);
352  $property->setValue(null);
353 
354  $mockDataParser = AspectMock::double(TestDataParser::class, ['readTestData' => $testData])->make();
355  $mockActionGroupParser = AspectMock::double(
356  ActionGroupDataParser::class,
357  ['readActionGroupData' => $actionGroupData]
358  )->make();
359  $instance = AspectMock::double(
360  ObjectManager::class,
361  ['create' => function ($clazz) use (
362  $mockDataParser,
363  $mockActionGroupParser
364  ) {
365  if ($clazz == TestDataParser::class) {
366  return $mockDataParser;
367  }
368  if ($clazz == ActionGroupDataParser::class) {
369  return $mockActionGroupParser;
370  }
371  }]
372  )->make();
373  // bypass the private constructor
374  AspectMock::double(ObjectManagerFactory::class, ['getObjectManager' => $instance]);
375  }
376 
381  public static function tearDownAfterClass()
382  {
383  TestLoggingUtil::getInstance()->clearMockLoggingUtil();
384  }
385 }