Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ObjectExtensionUtil.php
Go to the documentation of this file.
1 <?php
8 
19 
21 {
25  public function __construct()
26  {
27  // empty
28  }
29 
37  public function extendTest($testObject)
38  {
39  // Check to see if the parent test exists
40  try {
41  $parentTest = TestObjectHandler::getInstance()->getObject($testObject->getParentName());
42  } catch (TestReferenceException $error) {
43  if (MftfApplicationConfig::getConfig()->verboseEnabled()) {
44  LoggingUtil::getInstance()->getLogger(ObjectExtensionUtil::class)->debug(
45  "parent test not defined. test will be skipped",
46  ["parent" => $testObject->getParentName(), "test" => $testObject->getName()]
47  );
48  }
49  $skippedTest = $this->skipTest($testObject);
50  return $skippedTest;
51  }
52 
53  // Check to see if the parent test is already an extended test
54  if ($parentTest->getParentName() !== null) {
55  throw new XmlException(
56  "Cannot extend a test that already extends another test. Test: " . $parentTest->getName(),
57  ["parent" => $parentTest->getName(), "actionGroup" => $testObject->getName()]
58  );
59  }
60  if (MftfApplicationConfig::getConfig()->verboseEnabled()) {
61  LoggingUtil::getInstance()->getLogger(ObjectExtensionUtil::class)
62  ->debug("extending test", ["parent" => $parentTest->getName(), "test" => $testObject->getName()]);
63  }
64 
65  // Get steps for both the parent and the child tests
66  $referencedTestSteps = $parentTest->getUnresolvedSteps();
67  $newSteps = $this->processRemoveActions(array_merge($referencedTestSteps, $testObject->getUnresolvedSteps()));
68 
69  $testHooks = $this->resolveExtendedHooks($testObject, $parentTest);
70 
71  // Create new Test object to return
72  $extendedTest = new TestObject(
73  $testObject->getName(),
74  $newSteps,
75  $testObject->getAnnotations(),
76  $testHooks,
77  $testObject->getFilename(),
78  $testObject->getParentName()
79  );
80  return $extendedTest;
81  }
82 
90  public function extendActionGroup($actionGroupObject)
91  {
92  // Check to see if the parent action group exists
93  $parentActionGroup = ActionGroupObjectHandler::getInstance()->getObject($actionGroupObject->getParentName());
94  if ($parentActionGroup == null) {
95  throw new XmlException(
96  "Parent Action Group " .
97  $actionGroupObject->getParentName() .
98  " not defined for Test " .
99  $actionGroupObject->getName() .
100  "." .
101  PHP_EOL
102  );
103  }
104 
105  // Check to see if the parent action group is already an extended action group
106  if ($parentActionGroup->getParentName() !== null) {
107  throw new XmlException(
108  "Cannot extend an action group that already extends another action group. " .
109  $parentActionGroup->getName(),
110  ["parent" => $parentActionGroup->getName(), "actionGroup" => $actionGroupObject->getName()]
111  );
112  }
113  if (MftfApplicationConfig::getConfig()->verboseEnabled()) {
114  LoggingUtil::getInstance()->getLogger(ObjectExtensionUtil::class)->debug(
115  "extending action group:",
116  ["parent" => $parentActionGroup->getName(), "actionGroup" => $actionGroupObject->getName()]
117  );
118  }
119 
120  // Get steps for both the parent and the child action groups
121  $referencedActions = $parentActionGroup->getActions();
122  $newActions = $this->processRemoveActions(array_merge($referencedActions, $actionGroupObject->getActions()));
123 
124  $extendedArguments = array_merge(
125  $actionGroupObject->getArguments(),
126  $parentActionGroup->getArguments()
127  );
128 
129  // Create new Action Group object to return
130  $extendedActionGroup = new ActionGroupObject(
131  $actionGroupObject->getName(),
132  $extendedArguments,
133  $newActions,
134  $actionGroupObject->getParentName()
135  );
136  return $extendedActionGroup;
137  }
138 
146  private function resolveExtendedHooks($testObject, $parentTestObject)
147  {
148  $testHooks = $testObject->getHooks();
149  $parentHooks = $parentTestObject->getHooks();
150 
151  // Get the hooks for each Test merge changes from the child hooks to the parent hooks into the child hooks
152  foreach ($testHooks as $key => $hook) {
153  if (array_key_exists($key, $parentHooks)) {
154  $testHookActions = array_merge(
155  $parentHooks[$key]->getUnresolvedActions(),
156  $testHooks[$key]->getUnresolvedActions()
157  );
158  $cleanedTestHookActions = $this->processRemoveActions($testHookActions);
159 
160  $newTestHook = new TestHookObject(
161  $parentHooks[$key]->getType(),
162  $parentHooks[$key]->getParentName(),
163  $cleanedTestHookActions
164  );
165  $testHooks[$key] = $newTestHook;
166  } else {
167  $testHooks[$key] = $hook;
168  }
169  }
170 
171  // Add parent hooks to child if they did not originally exist on the child
172  foreach ($parentHooks as $key => $hook) {
173  if (!array_key_exists($key, $testHooks)) {
174  $testHooks[$key] = $hook;
175  }
176  }
177 
178  return $testHooks;
179  }
180 
188  private function processRemoveActions($actions)
189  {
190  $cleanedActions = [];
191 
192  // remove actions merged that are of type 'remove'
193  foreach ($actions as $actionName => $actionData) {
194  if ($actionData->getType() != "remove") {
195  $cleanedActions[$actionName] = $actionData;
196  }
197  }
198 
199  return $cleanedActions;
200  }
201 
208  public function skipTest($testObject)
209  {
210  $annotations = $testObject->getAnnotations();
211 
212  // Add skip to the group array if it doesn't already exist
213  if (array_key_exists('skip', $annotations)) {
214  return $testObject;
215  } elseif (!array_key_exists('skip', $annotations)) {
216  $annotations['skip'] = ['issueId' => "ParentTestDoesNotExist"];
217  }
218 
219  $skippedTest = new TestObject(
220  $testObject->getName(),
221  [],
222  $annotations,
223  [],
224  $testObject->getFilename(),
225  $testObject->getParentName()
226  );
227 
228  return $skippedTest;
229  }
230 }
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17