Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ActionGroupObjectTest.php
Go to the documentation of this file.
1 <?php
8 
9 use AspectMock\Test as AspectMock;
22 
24 {
25  const ACTION_GROUP_MERGE_KEY = 'TestKey';
26 
31  public function setUp()
32  {
33  TestLoggingUtil::getInstance()->setMockLoggingUtil();
34  }
35 
39  public function testGetStepsWithDefaultCase()
40  {
42  ->withDataFields(['field1' => 'testValue'])
43  ->build();
44  $this->setEntityObjectHandlerReturn($entity);
45  $actionGroupUnderTest = (new ActionGroupObjectBuilder())->build();
46  $steps = $actionGroupUnderTest->getSteps(null, self::ACTION_GROUP_MERGE_KEY);
47  $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'literal']);
48  }
49 
53  public function testGetStepsWithCustomArgs()
54  {
55  $this->setEntityObjectHandlerReturn(function ($entityName) {
56  if ($entityName == "data2") {
57  return (new EntityDataObjectBuilder())->withDataFields(['field2' => 'testValue2'])->build();
58  }
59  });
60 
61  $actionGroupUnderTest = (new ActionGroupObjectBuilder())
62  ->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{arg1.field2}}'])])
63  ->withArguments([new ArgumentObject('arg1', null, 'entity')])
64  ->build();
65 
66  $steps = $actionGroupUnderTest->getSteps(['arg1' => 'data2'], self::ACTION_GROUP_MERGE_KEY);
67  $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'testValue2']);
68 
69  // entity.field as argument
70  $actionGroupUnderTest = (new ActionGroupObjectBuilder())
71  ->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{arg1}}'])])
72  ->withArguments([new ArgumentObject('arg1', null, 'entity')])
73  ->build();
74 
75  $steps = $actionGroupUnderTest->getSteps(['arg1' => 'data2.field2'], self::ACTION_GROUP_MERGE_KEY);
76  $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'testValue2']);
77 
78  // String Data
79  $actionGroupUnderTest = (new ActionGroupObjectBuilder())
80  ->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{simple}}'])])
81  ->withArguments([new ArgumentObject('simple', null, 'string')])
82  ->build();
83 
84  $steps = $actionGroupUnderTest->getSteps(['simple' => 'override'], self::ACTION_GROUP_MERGE_KEY);
85  $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'override']);
86  }
87 
92  {
93  $actionGroupUnderTest = (new ActionGroupObjectBuilder())
94  ->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{arg1.field2}}'])])
95  ->withArguments([new ArgumentObject('arg1', null, 'entity')])
96  ->build();
97 
98  $steps = $actionGroupUnderTest->getSteps(['arg1' => '$data3$'], self::ACTION_GROUP_MERGE_KEY);
99  $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => '$data3.field2$']);
100 
101  // Simple Data
102  $actionGroupUnderTest = (new ActionGroupObjectBuilder())
103  ->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{simple}}'])])
104  ->withArguments([new ArgumentObject('simple', null, 'string')])
105  ->build();
106 
107  $steps = $actionGroupUnderTest->getSteps(['simple' => '$data3.field2$'], self::ACTION_GROUP_MERGE_KEY);
108  $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => '$data3.field2$']);
109  }
110 
114  public function testGetStepsWithNoFieldArg()
115  {
116  $this->setEntityObjectHandlerReturn(function ($entityName) {
117  if ($entityName == "data2") {
118  return (new EntityDataObjectBuilder())->withDataFields(['field2' => 'testValue2'])->build();
119  }
120  });
121 
122  $actionGroupUnderTest = (new ActionGroupObjectBuilder())
123  ->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{arg1}}'])])
124  ->withArguments([new ArgumentObject('arg1', null, 'entity')])
125  ->build();
126 
127  $steps = $actionGroupUnderTest->getSteps(['arg1' => 'data2.field2'], self::ACTION_GROUP_MERGE_KEY);
128  $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'testValue2']);
129  }
130 
134  public function testGetStepsWithNoArgs()
135  {
136  $this->setEntityObjectHandlerReturn(function ($entityName) {
137  if ($entityName == "data1") {
138  return (new EntityDataObjectBuilder())->withDataFields(['field1' => 'testValue'])->build();
139  }
140  });
141 
142  $actionGroupUnderTest = (new ActionGroupObjectBuilder())
143  ->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{data1.field1}}'])])
144  ->build();
145 
146  $steps = $actionGroupUnderTest->getSteps(null, self::ACTION_GROUP_MERGE_KEY);
147  $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => 'testValue']);
148  }
149 
154  {
155  // Mock Entity Object Handler
156  $this->setEntityObjectHandlerReturn(function ($entityName) {
157  if ($entityName == "data2") {
158  return (new EntityDataObjectBuilder())->withDataFields(['field2' => 'testValue2'])->build();
159  }
160  });
161  // mock the section object handler response
162  $element = new ElementObject("element1", "textArea", ".selector {{var1}}", null, null, true);
163  $section = new SectionObject("testSection", ["element1" => $element]);
164  // bypass the private constructor
165  $sectionInstance = AspectMock::double(SectionObjectHandler::class, ['getObject' => $section])->make();
166  AspectMock::double(SectionObjectHandler::class, ['getInstance' => $sectionInstance]);
167 
168  $actionGroupUnderTest = (new ActionGroupObjectBuilder())
169  ->withActionObjects(
170  [new ActionObject('action1', 'testAction', ['selector' => '{{section1.element1(arg1.field2)}}'])]
171  )
172  ->withArguments([new ArgumentObject('arg1', null, 'entity')])
173  ->build();
174 
175  // XML Data
176  $steps = $actionGroupUnderTest->getSteps(['arg1' => 'data2'], self::ACTION_GROUP_MERGE_KEY);
177  $this->assertOnMergeKeyAndActionValue($steps, ['selector' => '.selector testValue2']);
178 
179  // Persisted Data
180  $steps = $actionGroupUnderTest->getSteps(['arg1' => '$data2$'], self::ACTION_GROUP_MERGE_KEY);
181  $this->assertOnMergeKeyAndActionValue($steps, ['selector' => '.selector $data2.field2$']);
182  }
183 
188  {
189  // Mock Entity Object Handler
190  $this->setEntityObjectHandlerReturn(function ($entityName) {
191  if ($entityName == "data2") {
192  return (new EntityDataObjectBuilder())->withDataFields(['field2' => 'testValue2'])->build();
193  }
194  });
195  // mock the section object handler response
196  $element = new ElementObject("element1", "textArea", ".selector {{var1}}", null, null, true);
197  $section = new SectionObject("testSection", ["element1" => $element]);
198  // bypass the private constructor
199  $sectionInstance = AspectMock::double(SectionObjectHandler::class, ['getObject' => $section])->make();
200  AspectMock::double(SectionObjectHandler::class, ['getInstance' => $sectionInstance]);
201 
202  $actionGroupUnderTest = (new ActionGroupObjectBuilder())
203  ->withActionObjects(
204  [new ActionObject('action1', 'testAction', ['selector' => '{{section1.element1(simple)}}'])]
205  )
206  ->withArguments([new ArgumentObject('simple', null, 'string')])
207  ->build();
208 
209  // String Literal
210  $steps = $actionGroupUnderTest->getSteps(['simple' => 'stringLiteral'], self::ACTION_GROUP_MERGE_KEY);
211  $this->assertOnMergeKeyAndActionValue($steps, ['selector' => '.selector stringLiteral']);
212 
213  // String Literal w/ data-like structure
214  $steps = $actionGroupUnderTest->getSteps(['simple' => 'data2.field2'], self::ACTION_GROUP_MERGE_KEY);
215  $this->assertOnMergeKeyAndActionValue($steps, ['selector' => '.selector data2.field2']);
216 
217  // Persisted Data
218  $steps = $actionGroupUnderTest->getSteps(['simple' => '$someData.field1$'], self::ACTION_GROUP_MERGE_KEY);
219  $this->assertOnMergeKeyAndActionValue($steps, ['selector' => '.selector $someData.field1$']);
220  }
221 
226  {
227  $actionGroupUnderTest = (new ActionGroupObjectBuilder())
228  ->withActionObjects([new ActionObject('action1', 'testAction', ['userInput' => '{{arg1.field1}}'])])
229  ->withArguments([new ArgumentObject('arg1', null, 'entity')])
230  ->build();
231 
232  $steps = $actionGroupUnderTest->getSteps(['arg1' => '$$someData$$'], self::ACTION_GROUP_MERGE_KEY);
233  $this->assertOnMergeKeyAndActionValue($steps, ['userInput' => '$$someData.field1$$']);
234  }
235 
240  {
241  $actionGroupUnderTest = (new ActionGroupObjectBuilder())
242  ->withArguments([new ArgumentObject('arg1', null, 'entity')])
243  ->build();
244 
245  $this->expectException(TestReferenceException::class);
246  $this->expectExceptionMessageRegExp('/Arguments missed .* for actionGroup/');
247  $actionGroupUnderTest->getSteps(['arg2' => 'data1'], self::ACTION_GROUP_MERGE_KEY);
248  }
249 
254  {
255  $actionGroupUnderTest = (new ActionGroupObjectBuilder())
256  ->withArguments([new ArgumentObject('arg1', null, 'entity')])
257  ->build();
258 
259  $this->expectException(TestReferenceException::class);
260  $this->expectExceptionMessageRegExp('/Arguments missed .* for actionGroup/');
261  $actionGroupUnderTest->getSteps(null, self::ACTION_GROUP_MERGE_KEY);
262  }
263 
269  {
270  $createStepKey = "createDataStepKey";
271  $updateStepKey = "updateDataStepKey";
272 
273  $actionGroupUnderTest = (new ActionGroupObjectBuilder())
274  ->withActionObjects([
275  new ActionObject(
276  $updateStepKey,
278  ['selector' => 'value']
279  ),
280  new ActionObject(
281  $createStepKey,
283  ['selector' => 'value']
284  )
285  ])
286  ->build();
287 
288  $result = $actionGroupUnderTest->extractStepKeys();
289 
290  $this->assertContains($updateStepKey, $result);
291  $this->assertContains($createStepKey, $result);
292  $this->assertCount(2, $result);
293  }
294 
300  {
301  $clickStepKey = "clickStepKey";
302  $fillFieldStepKey = "fillFieldStepKey";
303  $clickAction = "click";
304  $fillFieldAction ="fillField";
305 
306  $actionGroupUnderTest = (new ActionGroupObjectBuilder())
307  ->withActionObjects([
308  new ActionObject($clickStepKey, $clickAction, ['selector' => 'value']),
309  new ActionObject($fillFieldStepKey, $fillFieldAction, ['selector' => 'value'])
310  ])
311  ->build();
312 
313  $result = $actionGroupUnderTest->extractStepKeys();
314 
315  $this->assertNotContains($clickStepKey, $result);
316  $this->assertNotContains($fillFieldStepKey, $result);
317  $this->assertCount(0, $result);
318  }
319 
327  private function setEntityObjectHandlerReturn($return)
328  {
329  $instance = AspectMock::double(DataObjectHandler::class, ['getObject' => $return])
330  ->make(); // bypass the private constructor
331  AspectMock::double(DataObjectHandler::class, ['getInstance' => $instance]);
332  }
333 
343  private function assertOnMergeKeyAndActionValue($actions, $expectedValue, $expectedMergeKey = null)
344  {
345  $expectedMergeKey = $expectedMergeKey ??
347  $this->assertArrayHasKey($expectedMergeKey, $actions);
348 
349  $action = $actions[$expectedMergeKey];
350  $this->assertEquals($expectedMergeKey, $action->getStepKey());
351  $this->assertEquals($expectedValue, $action->getCustomActionAttributes());
352  }
353 
358  public static function tearDownAfterClass()
359  {
360  TestLoggingUtil::getInstance()->clearMockLoggingUtil();
361  }
362 }
$entity
Definition: element.phtml:22
$element
Definition: element.phtml:12