From 7ec58d2b68267a966fe207626d561bade263e516 Mon Sep 17 00:00:00 2001 From: Jon goldberg Date: Wed, 28 Mar 2018 21:56:44 +1300 Subject: [PATCH] CRM-21148 change form function to wrap Date function --- CRM/Report/Form.php | 12 +--- CRM/Utils/Date.php | 19 +++--- tests/phpunit/CRM/Report/FormTest.php | 90 +++++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 21 deletions(-) create mode 100644 tests/phpunit/CRM/Report/FormTest.php diff --git a/CRM/Report/Form.php b/CRM/Report/Form.php index 181cf0d7cd..6e41d5e1e6 100644 --- a/CRM/Report/Form.php +++ b/CRM/Report/Form.php @@ -2065,17 +2065,7 @@ class CRM_Report_Form extends CRM_Core_Form { * @return array */ public function getFromTo($relative, $from, $to, $fromTime = NULL, $toTime = '235959') { - //FIX ME not working for relative - if ($relative) { - list($term, $unit) = CRM_Utils_System::explode('.', $relative, 2); - $dateRange = CRM_Utils_Date::relativeToAbsolute($term, $unit); - $from = substr($dateRange['from'], 0, 8); - //Take only Date Part, Sometime Time part is also present in 'to' - $to = substr($dateRange['to'], 0, 8); - } - $from = CRM_Utils_Date::processDate($from, $fromTime); - $to = CRM_Utils_Date::processDate($to, $toTime); - return array($from, $to); + return CRM_Utils_Date::getFromTo($relative, $from, $to, $fromTime, $toTime); } /** diff --git a/CRM/Utils/Date.php b/CRM/Utils/Date.php index bad74c87db..947dcb62e9 100644 --- a/CRM/Utils/Date.php +++ b/CRM/Utils/Date.php @@ -791,8 +791,8 @@ class CRM_Utils_Date { * Get start date and end from * the given relative term and unit * - * @param date $relative - * Eg: term.unit. + * @param string $relative Relative format in the format term.unit. + * Eg: previous.day * * @param string $from * @param string $to @@ -808,14 +808,13 @@ class CRM_Utils_Date { $dateRange = self::relativeToAbsolute($term, $unit); $from = substr($dateRange['from'], 0, 8); $to = substr($dateRange['to'], 0, 8); - // relativeToAbsolute returns 8 char date strings or 14 char - // time strings. - if (strlen($dateRange['from']) === 14) { - $fromTime = substr($dateRange['from'], -6, 6); - } - if (strlen($dateRange['to']) === 14) { - $fromTime = substr($dateRange['to'], -6, 6); - } + // @todo fix relativeToAbsolute & add tests + // relativeToAbsolute returns 8 char date strings + // or 14 char date + time strings. + // We should use those. However, it turns out to be unreliable. + // e.g. this.week does NOT return 235959 for 'from' + // so our defaults are more reliable. + // Currently relativeToAbsolute only supports 'whole' days so that is ok } $from = self::processDate($from, $fromTime); diff --git a/tests/phpunit/CRM/Report/FormTest.php b/tests/phpunit/CRM/Report/FormTest.php new file mode 100644 index 0000000000..80a926c10b --- /dev/null +++ b/tests/phpunit/CRM/Report/FormTest.php @@ -0,0 +1,90 @@ + + */ + +/** + * Test CRM_Report_Form functions. + * + * @package CiviCRM + * @group headless + */ +class CRM_Report_FormTest extends CiviUnitTestCase { + + public function setUp() { + // There are only unit tests here at present, we can skip database loading. + return TRUE; + } + + public function tearDown() { + // There are only unit tests here at present, we can skip database loading. + return TRUE; + } + + public function fromToData() { + $cases = array(); + // Absolute dates + $cases[] = array('20170901000000', '20170913235959', 0, '09/01/2017', '09/13/2017'); + // "Today" relative date filter + $date = new DateTime(); + $expectedFrom = $date->format('Ymd') . '000000'; + $expectedTo = $date->format('Ymd') . '235959'; + $cases[] = array($expectedFrom, $expectedTo, 'this.day', '', ''); + // "yesterday" relative date filter + $date = new DateTime(); + $date->sub(new DateInterval('P1D')); + $expectedFrom = $date->format('Ymd') . '000000'; + $expectedTo = $date->format('Ymd') . '235959'; + $cases[] = array($expectedFrom, $expectedTo, 'previous.day', '', ''); + return $cases; + } + + /** + * Test that getFromTo returns the correct dates. + * + * @dataProvider fromToData + * @param $expectedFrom + * @param $expectedTo + * @param $relative + * @param $from + * @param $to + */ + public function testGetFromTo($expectedFrom, $expectedTo, $relative, $from, $to) { + $obj = new CRM_Report_Form(); + list($calculatedFrom, $calculatedTo) = $obj->getFromTo($relative, $from, $to); + $this->assertEquals($expectedFrom, $calculatedFrom); + $this->assertEquals($expectedTo, $calculatedTo); + } + +} -- 2.25.1