Merge pull request #1278 from totten/master-reporttestcase-2
[civicrm-core.git] / tests / phpunit / CiviTest / CiviReportTestCase.php
index 5814721645565a7e2ea0dd90510c3d3ea9e9d1b0..c1f532899151ee916c436be7488ebd9e9809578c 100644 (file)
@@ -30,31 +30,53 @@ require_once 'CiviTest/CiviUnitTestCase.php';
 class CiviReportTestCase extends CiviUnitTestCase {
   function setUp() {
     parent::setUp();
+    $this->_sethtmlGlobals();
+  }
+
+  function tearDown() {
+    // TODO Figure out how to automatically drop all temporary tables.
+    // Note that MySQL doesn't provide a way to list them, so we would need
+    // to keep track ourselves (eg CRM_Core_TemporaryTableManager) or reset
+    // the MySQL connection between test runs.
+    parent::tearDown();
   }
 
   function getReportOutputAsCsv($reportClass, $inputParams) {
     $config = CRM_Core_Config::singleton();
     $config->keyDisable = TRUE;
     $controller = new CRM_Core_Controller_Simple($reportClass, ts('some title'));
-    $reportObj =& $controller->_pages['Detail'];//FIXME - Detail is going to change
-    $_REQUEST['force'] = 1;
+    $reportObj =& $controller->_pages['Detail']; //FIXME - Detail is going to change
+
+    $tmpGlobals = array();
+    $tmpGlobals['_REQUEST']['force'] = 1;
+    $tmpGlobals['_GET'][$config->userFrameworkURLVar] = 'civicrm/placeholder';
+    $tmpGlobals['_SERVER']['QUERY_STRING'] = '';
     if (!empty($inputParams['fields'])) {
       $fields = implode(',', $inputParams['fields']);
-      $_GET['fld']  = $fields;
-      $_GET['ufld'] = 1;
+      $tmpGlobals['_GET']['fld'] = $fields;
+      $tmpGlobals['_GET']['ufld'] = 1;
     }
     if (!empty($inputParams['filters'])) {
       foreach ($inputParams['filters'] as $key => $val) {
-        $_GET[$key] = $val;
+        $tmpGlobals['_GET'][$key] = $val;
       }
     }
-    $reportObj->storeResultSet();
-    $reportObj->buildForm();
-    $rows = $reportObj->getResultSet();
+    CRM_Utils_GlobalStack::singleton()->push($tmpGlobals);
 
-    $tmpFile = $this->createTempDir() . CRM_Utils_File::makeFileName('CiviReport.csv');
-    $csvContent = CRM_Report_Utils_Report::makeCsv($reportObj, $rows);
-    file_put_contents($tmpFile, $csvContent);
+    try {
+      $reportObj->storeResultSet();
+      $reportObj->buildForm();
+      $rows = $reportObj->getResultSet();
+
+      $tmpFile = $this->createTempDir() . CRM_Utils_File::makeFileName('CiviReport.csv');
+      $csvContent = CRM_Report_Utils_Report::makeCsv($reportObj, $rows);
+      file_put_contents($tmpFile, $csvContent);
+    } catch (Exception $e) {
+      // print_r($e->getCause()->getUserInfo());
+      CRM_Utils_GlobalStack::singleton()->pop();
+      throw $e;
+    }
+    CRM_Utils_GlobalStack::singleton()->pop();
 
     return $tmpFile;
   }
@@ -69,4 +91,28 @@ class CiviReportTestCase extends CiviUnitTestCase {
     }
     return $arrFile;
   }
+
+  /**
+   * @param array $expectedCsvArray two-dimensional array representing a CSV table
+   * @param array $actualCsvArray two-dimensional array representing a CSV table
+   */
+  public function assertCsvArraysEqual($expectedCsvArray, $actualCsvArray) {
+    // TODO provide better debug output
+
+    $this->assertEquals(
+      count($actualCsvArray),
+      count($expectedCsvArray),
+      'Arrays have different number of rows; in line ' . __LINE__
+    );
+
+    foreach ($actualCsvArray as $intKey => $strVal) {
+      $this->assertNotNull($expectedCsvArray[$intKey], 'In line ' . __LINE__);
+      $this->assertEquals(
+        count($actualCsvArray[$intKey]),
+        count($expectedCsvArray[$intKey]),
+        'Arrays have different number of columns at row ' . $intKey . '; in line ' . __LINE__
+      );
+      $this->assertEquals($expectedCsvArray[$intKey], $strVal);
+    }
+  }
 }