From 6d4b9264f142f464e716a828382697fa3de85afc Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Mon, 29 Jul 2013 20:18:47 -0700 Subject: [PATCH] CRM-12622 - CiviReportTestCase - Set missing global variables ---------------------------------------- * CRM-12622: Create framework for example report data files http://issues.civicrm.org/jira/browse/CRM-12622 --- CRM/Utils/GlobalStack.php | 97 +++++++++++++++++++ tests/phpunit/CRM/Utils/GlobalStackTest.php | 34 +++++++ tests/phpunit/CiviTest/CiviReportTestCase.php | 36 +++++-- 3 files changed, 157 insertions(+), 10 deletions(-) create mode 100644 CRM/Utils/GlobalStack.php create mode 100644 tests/phpunit/CRM/Utils/GlobalStackTest.php diff --git a/CRM/Utils/GlobalStack.php b/CRM/Utils/GlobalStack.php new file mode 100644 index 0000000000..6dedf152a0 --- /dev/null +++ b/CRM/Utils/GlobalStack.php @@ -0,0 +1,97 @@ +push(array( + * '_GET' => array( + * 'q' => 'some-value + * ), + * )); + * ...do stuff... + * $globals->pop(); + * @endcode + * + * Note: for purposes of this class, we'll refer to the array passed into + * push() as a frame. + */ +class CRM_Utils_GlobalStack { + /** + * We don't have a container or dependency-injection, so use singleton instead + * + * @var object + * @static + */ + private static $_singleton = NULL; + + private $backups = array(); + + /** + * Get or set the single instance of CRM_Utils_GlobalStack + * + * @return CRM_Utils_GlobalStack + */ + static public function singleton() { + if (self::$_singleton === NULL) { + self::$_singleton = new CRM_Utils_GlobalStack(); + } + return self::$_singleton; + } + + public function push($newFrame) { + $this->backups[] = $this->createBackup($newFrame); + $this->applyFrame($newFrame); + } + + public function pop() { + $this->applyFrame(array_pop($this->backups)); + } + + /** + * @param array $new the new, incoming frame + * @return array frame + */ + public function createBackup($new) { + $frame = array(); + foreach ($new as $globalKey => $values) { + foreach ($values as $key => $value) { + $frame[$globalKey][$key] = CRM_Utils_Array::value($key, $GLOBALS[$globalKey]); + } + } + return $frame; + } + + public function applyFrame($newFrame) { + foreach ($newFrame as $globalKey => $values) { + foreach ($values as $key => $value) { + $GLOBALS[$globalKey][$key] = $value; + } + } + } +} \ No newline at end of file diff --git a/tests/phpunit/CRM/Utils/GlobalStackTest.php b/tests/phpunit/CRM/Utils/GlobalStackTest.php new file mode 100644 index 0000000000..21008307c6 --- /dev/null +++ b/tests/phpunit/CRM/Utils/GlobalStackTest.php @@ -0,0 +1,34 @@ +assertEquals(1, $FOO['bar']); + $this->assertEquals(1, $FOO['whiz']); + $this->assertFalse(isset($FOO['bang'])); + + CRM_Utils_GlobalStack::singleton()->push(array( + 'FOO' => array( + 'bar' => 2, + 'bang' => 2, + ), + )); + + $this->assertEquals(2, $FOO['bar']); + $this->assertEquals(1, $FOO['whiz']); + $this->assertEquals(2, $FOO['bang']); + + CRM_Utils_GlobalStack::singleton()->pop(); + + $this->assertEquals(1, $FOO['bar']); + $this->assertEquals(1, $FOO['whiz']); + $this->assertEquals(NULL, $FOO['bang']); + } +} diff --git a/tests/phpunit/CiviTest/CiviReportTestCase.php b/tests/phpunit/CiviTest/CiviReportTestCase.php index 5814721645..9a4c7b8530 100644 --- a/tests/phpunit/CiviTest/CiviReportTestCase.php +++ b/tests/phpunit/CiviTest/CiviReportTestCase.php @@ -32,29 +32,45 @@ class CiviReportTestCase extends CiviUnitTestCase { parent::setUp(); } + function tearDown() { + 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; + + $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) { + CRM_Utils_GlobalStack::singleton()->pop(); + throw $e; + } + CRM_Utils_GlobalStack::singleton()->pop(); return $tmpFile; } -- 2.25.1