CRM-19813 - CRM_Utils_Hook_UnitTests::invoke() - Fix return handling
authorTim Otten <totten@civicrm.org>
Sat, 4 Mar 2017 00:52:01 +0000 (16:52 -0800)
committerTim Otten <totten@civicrm.org>
Thu, 30 Mar 2017 22:39:52 +0000 (15:39 -0700)
The normal `runHooks()` function has a weird protocol wherein results may be
progressively merged (if they're non-empty arrays).  This revision extends
that behavior to each of the unit-test hook formulations.

The patch enables better unit-testing of CRM-19813.

CRM/Utils/Hook/UnitTests.php

index fba73256c27ddcce3fd4d390ec091ac0161d58c5..2061c30c494b78a13c4f3d30f20a88fcc7450b40 100644 (file)
@@ -99,20 +99,34 @@ class CRM_Utils_Hook_UnitTests extends CRM_Utils_Hook {
     &$arg1, &$arg2, &$arg3, &$arg4, &$arg5, &$arg6,
     $fnSuffix) {
     $params = array(&$arg1, &$arg2, &$arg3, &$arg4, &$arg5, &$arg6);
+
+    $fResult1 = $fResult2 = $fResult3 = NULL;
+
     // run standard hooks
     if ($this->civiModules === NULL) {
       $this->civiModules = array();
       $this->requireCiviModules($this->civiModules);
     }
-    $this->runHooks($this->civiModules, $fnSuffix, $numParams, $arg1, $arg2, $arg3, $arg4, $arg5, $arg6);
+    $fResult1 = $this->runHooks($this->civiModules, $fnSuffix, $numParams, $arg1, $arg2, $arg3, $arg4, $arg5, $arg6);
+
     // run mock object hooks
     if ($this->mockObject && is_callable(array($this->mockObject, $fnSuffix))) {
-      call_user_func(array($this->mockObject, $fnSuffix), $arg1, $arg2, $arg3, $arg4, $arg5, $arg6);
+      $fResult2 = call_user_func(array($this->mockObject, $fnSuffix), $arg1, $arg2, $arg3, $arg4, $arg5, $arg6);
     }
+
     // run adhoc hooks
     if (!empty($this->adhocHooks[$fnSuffix])) {
-      call_user_func_array($this->adhocHooks[$fnSuffix], $params);
+      $fResult3 = call_user_func_array($this->adhocHooks[$fnSuffix], $params);
     }
+
+    $result = array();
+    foreach (array($fResult1, $fResult2, $fResult3) as $fResult) {
+      if (!empty($fResult) && is_array($fResult)) {
+        $result = array_merge($result, $fResult);
+      }
+    }
+
+    return empty($result) ? TRUE : $result;
   }
 
 }