mirror of
https://github.com/e107inc/e107.git
synced 2025-07-31 03:40:37 +02:00
Fixes #5096 - Cron timezone issue. eShims::strftime issue. CronParser test added.
This commit is contained in:
5
cron.php
5
cron.php
@@ -44,6 +44,11 @@ if ((PHP_SAPI === "apache" || PHP_SAPI === "litespeed") && $_E107['debug'] === f
|
|||||||
|
|
||||||
require_once(realpath(__DIR__ . "/class2.php"));
|
require_once(realpath(__DIR__ . "/class2.php"));
|
||||||
|
|
||||||
|
if(!empty($_E107['debug']))
|
||||||
|
{
|
||||||
|
error_reporting(E_ALL);
|
||||||
|
}
|
||||||
|
|
||||||
require_once(e_HANDLER . "cron_class.php");
|
require_once(e_HANDLER . "cron_class.php");
|
||||||
|
|
||||||
$cron = new cronScheduler();
|
$cron = new cronScheduler();
|
||||||
|
@@ -69,7 +69,7 @@ trait StrftimeTrait
|
|||||||
self::getSensibleLocale(),
|
self::getSensibleLocale(),
|
||||||
\IntlDateFormatter::NONE,
|
\IntlDateFormatter::NONE,
|
||||||
\IntlDateFormatter::NONE,
|
\IntlDateFormatter::NONE,
|
||||||
null,
|
'GMT'.date('O'), // More accurate timezone. @see https://stackoverflow.com/questions/31707395/why-php-intldateformatter-returns-wrong-date-1-hour
|
||||||
null,
|
null,
|
||||||
$format
|
$format
|
||||||
);
|
);
|
||||||
|
@@ -157,7 +157,13 @@ class _system_cron
|
|||||||
function sendEmail() // Test Email.
|
function sendEmail() // Test Email.
|
||||||
{
|
{
|
||||||
global $pref, $_E107;
|
global $pref, $_E107;
|
||||||
if($_E107['debug']) { echo "<br />sendEmail() executed"; }
|
|
||||||
|
if($_E107['debug'])
|
||||||
|
{
|
||||||
|
echo "sendEmail() executed";
|
||||||
|
error_log('e107: Cron running _system_cron::sendEmail(); ', E_USER_NOTICE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// require_once(e_HANDLER.'mail.php');
|
// require_once(e_HANDLER.'mail.php');
|
||||||
$message = "Your Cron test worked correctly. Sent on ".date("r").".";
|
$message = "Your Cron test worked correctly. Sent on ".date("r").".";
|
||||||
@@ -205,7 +211,10 @@ class _system_cron
|
|||||||
'body' => $message
|
'body' => $message
|
||||||
);
|
);
|
||||||
|
|
||||||
e107::getEmail()->sendEmail($pref['siteadminemail'], $pref['siteadmin'], $eml);
|
if(!e107::getEmail()->sendEmail($pref['siteadminemail'], $pref['siteadmin'], $eml))
|
||||||
|
{
|
||||||
|
error_log('e107: Cron _system_cron::sendEmail() failed to send email.', E_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
// sendemail($pref['siteadminemail'], "e107 - TEST Email Sent by cron.".date("r"), $message, $pref['siteadmin'],SITEEMAIL, $pref['siteadmin']);
|
// sendemail($pref['siteadminemail'], "e107 - TEST Email Sent by cron.".date("r"), $message, $pref['siteadmin'],SITEEMAIL, $pref['siteadmin']);
|
||||||
}
|
}
|
||||||
@@ -397,6 +406,7 @@ class CronParser
|
|||||||
var $bits = Array(); //exploded String like 0 1 * * *
|
var $bits = Array(); //exploded String like 0 1 * * *
|
||||||
var $now = Array(); //Array of cron-style entries for time()
|
var $now = Array(); //Array of cron-style entries for time()
|
||||||
var $lastRan; //Timestamp of last ran time.
|
var $lastRan; //Timestamp of last ran time.
|
||||||
|
private $lastDue;
|
||||||
var $taken;
|
var $taken;
|
||||||
var $debug;
|
var $debug;
|
||||||
var $year;
|
var $year;
|
||||||
@@ -416,6 +426,16 @@ class CronParser
|
|||||||
return explode(",", eShims::strftime("%M,%H,%d,%m,%w,%Y", $this->lastRan)); //Get the values for now in a format we can use
|
return explode(",", eShims::strftime("%M,%H,%d,%m,%w,%Y", $this->lastRan)); //Get the values for now in a format we can use
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getLastDue()
|
||||||
|
{
|
||||||
|
return $this->lastDue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getNow()
|
||||||
|
{
|
||||||
|
return $this->now;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
@@ -432,26 +452,25 @@ class CronParser
|
|||||||
return $this->debug;
|
return $this->debug;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setDebug($bool)
|
||||||
|
{
|
||||||
|
$this->debug = (bool) $bool;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param $str
|
* @param $str
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
function debug($str)
|
function debug($str)
|
||||||
{
|
{
|
||||||
if (is_array($str))
|
if(!$this->debug)
|
||||||
{
|
{
|
||||||
$this->debug .= "\nArray: ";
|
return;
|
||||||
foreach($str as $k=>$v)
|
}
|
||||||
{
|
|
||||||
$this->debug .= "$k=>$v, ";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
$text = (is_array($str) ? print_r($str,true) : $str);
|
||||||
else
|
error_log('e107: Cron '.$text);
|
||||||
{
|
echo $text."\n";
|
||||||
$this->debug .= "\n$str";
|
|
||||||
}
|
|
||||||
//echo nl2br($this->debug);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -513,9 +532,10 @@ class CronParser
|
|||||||
*/
|
*/
|
||||||
function calcLastRan($string)
|
function calcLastRan($string)
|
||||||
{
|
{
|
||||||
|
$this->debug(__METHOD__.' ('.__LINE__.'): '.date_default_timezone_get());
|
||||||
|
|
||||||
$tstart = microtime(true);
|
$tstart = microtime(true);
|
||||||
$this->debug = "";
|
|
||||||
$this->lastRan = 0;
|
$this->lastRan = 0;
|
||||||
$this->year = NULL;
|
$this->year = NULL;
|
||||||
$this->month = NULL;
|
$this->month = NULL;
|
||||||
@@ -526,20 +546,20 @@ class CronParser
|
|||||||
$this->minutes_arr = array();
|
$this->minutes_arr = array();
|
||||||
$this->months_arr = array();
|
$this->months_arr = array();
|
||||||
|
|
||||||
$string = preg_replace('/[\s]{2,}/', ' ', $string);
|
$string = preg_replace('/\s{2,}/', ' ', $string);
|
||||||
|
|
||||||
if (preg_match('/[^-,* \\d]/', $string) !== 0)
|
if (preg_match('/[^-,* \\d]/', $string) !== 0)
|
||||||
{
|
{
|
||||||
$this->debug("Cron String contains invalid character");
|
$this->debug("e107: Cron string contains invalid character: ".$string);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->debug("<b>Working on cron schedule: $string</b>");
|
$this->debug("\n----- Working on cron schedule: $string ----");
|
||||||
$this->bits = @explode(" ", $string);
|
$this->bits = @explode(" ", $string);
|
||||||
|
|
||||||
if (count($this->bits) != 5)
|
if (count($this->bits) != 5)
|
||||||
{
|
{
|
||||||
$this->debug("Cron string is invalid. Too many or too little sections after explode");
|
$this->debug("e107: Cron string is invalid. Too many or too little sections after explode.".print_r($this->bits,true));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -656,8 +676,12 @@ class CronParser
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$this->debug("LAST DUE: " . $this->hour . ":" . $this->minute . " on " . $this->day . "/" . $this->month . "/" . $this->year);
|
$lastDue = $this->year.'-'.(strlen($this->month) === 1 ? '0'.$this->month : $this->month).'-'.(strlen($this->day) === 1 ? '0'.$this->day : $this->day).'T'.(strlen($this->hour) === 1 ? '0'.$this->hour : $this->hour) . ":" . (strlen($this->minute) === 1 ? '0'.$this->minute : $this->minute);
|
||||||
|
$this->debug(__METHOD__.' ('.__LINE__.'): '.date_default_timezone_get());
|
||||||
|
$this->debug(__METHOD__.' ('.__LINE__.'): Setting lastDue to ' . $lastDue);
|
||||||
|
$this->lastDue = $lastDue;
|
||||||
$this->lastRan = mktime($this->hour, $this->minute, 0, $this->month, $this->day, $this->year);
|
$this->lastRan = mktime($this->hour, $this->minute, 0, $this->month, $this->day, $this->year);
|
||||||
|
$this->debug(__METHOD__.' ('.__LINE__.'): Setting lastRan to '.date('c', $this->lastRan));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -914,7 +938,7 @@ class CronParser
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
$this->debug("Days array matching weekdays for $year-$month");
|
$this->debug("Days array matching weekdays for $year-$month");
|
||||||
$this->debug($days);
|
//$this->debug($days);
|
||||||
return $days;
|
return $days;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -959,8 +983,8 @@ class CronParser
|
|||||||
$hours = $this->_sanitize($hours, 0, 23);
|
$hours = $this->_sanitize($hours, 0, 23);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->debug("Hour array");
|
// $this->debug("Hour array");
|
||||||
$this->debug($hours);
|
// $this->debug($hours);
|
||||||
$this->hours_arr = $hours;
|
$this->hours_arr = $hours;
|
||||||
}
|
}
|
||||||
return $this->hours_arr;
|
return $this->hours_arr;
|
||||||
@@ -987,8 +1011,8 @@ class CronParser
|
|||||||
$minutes = $this->expand_ranges($this->bits[0]);
|
$minutes = $this->expand_ranges($this->bits[0]);
|
||||||
$minutes = $this->_sanitize($minutes, 0, 59);
|
$minutes = $this->_sanitize($minutes, 0, 59);
|
||||||
}
|
}
|
||||||
$this->debug("Minutes array");
|
// $this->debug("Minutes array");
|
||||||
$this->debug($minutes);
|
// $this->debug($minutes);
|
||||||
$this->minutes_arr = $minutes;
|
$this->minutes_arr = $minutes;
|
||||||
}
|
}
|
||||||
return $this->minutes_arr;
|
return $this->minutes_arr;
|
||||||
@@ -1014,8 +1038,8 @@ class CronParser
|
|||||||
$months = $this->expand_ranges($this->bits[3]);
|
$months = $this->expand_ranges($this->bits[3]);
|
||||||
$months = $this->_sanitize($months, 1, 12);
|
$months = $this->_sanitize($months, 1, 12);
|
||||||
}
|
}
|
||||||
$this->debug("Months array");
|
// $this->debug("Months array");
|
||||||
$this->debug($months);
|
// $this->debug($months);
|
||||||
$this->months_arr = $months;
|
$this->months_arr = $months;
|
||||||
}
|
}
|
||||||
return $this->months_arr;
|
return $this->months_arr;
|
||||||
@@ -1067,6 +1091,7 @@ class cronScheduler
|
|||||||
|
|
||||||
$this->cron = new CronParser();
|
$this->cron = new CronParser();
|
||||||
$this->debug = $_E107['debug'];
|
$this->debug = $_E107['debug'];
|
||||||
|
$this->cron->setDebug($_E107['debug']);
|
||||||
$this->pref = e107::getPref();
|
$this->pref = e107::getPref();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1083,24 +1108,23 @@ class cronScheduler
|
|||||||
{
|
{
|
||||||
if($this->debug)
|
if($this->debug)
|
||||||
{
|
{
|
||||||
error_log('e107: Invalid token used for cron class');
|
$this->cron->debug('e107: Invalid token used for cron class');
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!@file_put_contents(e_CACHE . 'cronLastLoad.php', time()))
|
if(!@file_put_contents(e_CACHE . 'cronLastLoad.php', time()))
|
||||||
{
|
{
|
||||||
error_log('e107: Unable to write to: '.e_CACHE . 'cronLastLoad.php. Permissions issue?');
|
$this->cron->debug('e107: Unable to write to: '.e_CACHE . 'cronLastLoad.php. Permissions issue?');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Get active cron jobs.
|
// Get active cron jobs.
|
||||||
$cron_jobs = $this->getCronJobs(true);
|
$cron_jobs = $this->getCronJobs(true);
|
||||||
|
|
||||||
if($this->debug && $_SERVER['QUERY_STRING'])
|
if($this->debug)
|
||||||
{
|
{
|
||||||
echo "<h1>Cron Lists</h1>";
|
$this->cron->debug('e107: Cron Jobs Found: '.print_r($cron_jobs,true));
|
||||||
print_a($cron_jobs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach($cron_jobs as $job)
|
foreach($cron_jobs as $job)
|
||||||
@@ -1129,8 +1153,16 @@ class cronScheduler
|
|||||||
{
|
{
|
||||||
$status = false;
|
$status = false;
|
||||||
|
|
||||||
|
$this->cron->debug(__METHOD__.' ('.__LINE__.'): '.date_default_timezone_get());
|
||||||
|
$this->cron->debug(__METHOD__.' ('.__LINE__.'): Current time: '.date('c'));
|
||||||
|
|
||||||
if(empty($job['active']))
|
if(empty($job['active']))
|
||||||
{
|
{
|
||||||
|
if($this->debug)
|
||||||
|
{
|
||||||
|
error_log('e107: Cron job not active: '.print_r($job,true), E_NOTICE);
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1138,24 +1170,33 @@ class cronScheduler
|
|||||||
$this->cron->calcLastRan($job['tab']);
|
$this->cron->calcLastRan($job['tab']);
|
||||||
$due = $this->cron->getLastRanUnix();
|
$due = $this->cron->getLastRanUnix();
|
||||||
|
|
||||||
if($this->debug)
|
$this->cron->debug(__METHOD__.' ('.__LINE__.'): '.date_default_timezone_get());
|
||||||
{
|
$triggerTime = (time() - 45);
|
||||||
echo "<br />Cron: " . $job['function'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if($due <= (time() - 45))
|
|
||||||
|
$this->cron->debug(__METHOD__.' ('.__LINE__.'): Current Time (-45): '.date('c',$triggerTime));
|
||||||
|
|
||||||
|
if($due <= $triggerTime)
|
||||||
{
|
{
|
||||||
|
if($this->debug)
|
||||||
|
{
|
||||||
|
$job['_lastRun'] = date('c',$due);
|
||||||
|
$job['_triggerTime'] = date('c',$triggerTime);
|
||||||
|
$this->cron->debug(__METHOD__.' ('.__LINE__.'): NOT running cron method because: _lastRun < _triggerTime ');
|
||||||
|
$this->cron->debug($job);
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if($job['path'] != '_system' && !is_readable(e_PLUGIN . $job['path'] . "/e_cron.php"))
|
if($job['path'] != '_system' && !is_readable(e_PLUGIN . $job['path'] . "/e_cron.php"))
|
||||||
{
|
{
|
||||||
|
$this->cron->debug('e107: Cron file not readable: '.e_PLUGIN . $job['path'] . "/e_cron.php", E_ERROR);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if($this->debug)
|
if($this->debug)
|
||||||
{
|
{
|
||||||
echo "<br />Running Now...<br />path: " . $job['path'];
|
$this->cron->debug('e107: Cron is running: '.print_r($job,true), E_NOTICE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is correct.
|
// This is correct.
|
||||||
@@ -1170,7 +1211,7 @@ class cronScheduler
|
|||||||
{
|
{
|
||||||
if($this->debug)
|
if($this->debug)
|
||||||
{
|
{
|
||||||
echo "<br />Couldn't find class: " . $class;
|
$this->cron->debug('e107: Cron could not find class: '.$class, E_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $status;
|
return $status;
|
||||||
@@ -1182,7 +1223,7 @@ class cronScheduler
|
|||||||
{
|
{
|
||||||
if($this->debug)
|
if($this->debug)
|
||||||
{
|
{
|
||||||
echo "<br />Couldn't find method: " . $job['function'];
|
$this->cron->debug('e107: Cron could not find method: '.$job['function'], E_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $status;
|
return $status;
|
||||||
@@ -1190,7 +1231,7 @@ class cronScheduler
|
|||||||
|
|
||||||
if($this->debug)
|
if($this->debug)
|
||||||
{
|
{
|
||||||
echo "<br />Method Found: " . $class . "::" . $job['function'] . "()";
|
$this->cron->debug('e107: Cron could not find method: '.$class . "::" . $job['function'].'()', E_NOTICE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Exception handling.
|
// Exception handling.
|
||||||
@@ -1215,6 +1256,8 @@ class cronScheduler
|
|||||||
'subject' => 'e107 - Cron Schedule Exception',
|
'subject' => 'e107 - Cron Schedule Exception',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
error_log('e107: Cron Exception occurred: '.$msg, E_ERROR);
|
||||||
|
|
||||||
$this->sendMail($mail);
|
$this->sendMail($mail);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1222,13 +1265,11 @@ class cronScheduler
|
|||||||
// message (send email, logs).
|
// message (send email, logs).
|
||||||
if($status && true !== $status)
|
if($status && true !== $status)
|
||||||
{
|
{
|
||||||
if($this->debug)
|
|
||||||
{
|
|
||||||
echo "<br />Method returned message: [$class::" . $job['function'] . '] ' . $status;
|
|
||||||
}
|
|
||||||
|
|
||||||
$msg = 'Method returned message: [{' . $class . '}::' . $job['function'] . '] ' . $status;
|
$msg = 'Method returned message: [{' . $class . '}::' . $job['function'] . '] ' . $status;
|
||||||
|
|
||||||
|
error_log('e107: Cron Method returned message: '.$msg, E_NOTICE);
|
||||||
|
|
||||||
$mail = array(
|
$mail = array(
|
||||||
'to_mail' => $this->pref['siteadminemail'],
|
'to_mail' => $this->pref['siteadminemail'],
|
||||||
'to_name' => $this->pref['siteadmin'],
|
'to_name' => $this->pref['siteadmin'],
|
||||||
|
147
e107_tests/tests/unit/CronParserTest.php
Normal file
147
e107_tests/tests/unit/CronParserTest.php
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
class CronParserTest extends \Codeception\Test\Unit
|
||||||
|
{
|
||||||
|
|
||||||
|
/** @var CronParser */
|
||||||
|
protected $cp;
|
||||||
|
|
||||||
|
protected function _before()
|
||||||
|
{
|
||||||
|
require_once(e_HANDLER."cron_class.php");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$this->cp = $this->make('CronParser');
|
||||||
|
}
|
||||||
|
|
||||||
|
catch(Exception $e)
|
||||||
|
{
|
||||||
|
$this->fail($e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
public function test_getLastMinute()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_getHoursArray()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_prevMonth()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_getLastDay()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_getLastMonth()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetDays()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_getMinutesArray()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetLastRanUnix()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testDaysinmonth()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_getMonthsArray()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
public function testCalcLastRan()
|
||||||
|
{
|
||||||
|
$lastTimeZone = date_default_timezone_get();
|
||||||
|
date_default_timezone_set('America/Chihuahua');
|
||||||
|
|
||||||
|
$this->cp->calcLastRan('* * * * *');
|
||||||
|
|
||||||
|
$due = $this->cp->getLastDue();
|
||||||
|
$now = $this->cp->getNow();
|
||||||
|
|
||||||
|
list($date, $time) = explode('T', $due);
|
||||||
|
list($year,$month,$day) = explode('-', $date);
|
||||||
|
list($hour,$minute) = explode(':', $time);
|
||||||
|
|
||||||
|
$this->assertSame($minute, $now[0]);
|
||||||
|
$this->assertSame($hour, $now[1]);
|
||||||
|
$this->assertSame($day, $now[2]);
|
||||||
|
$this->assertSame($month, $now[3]);
|
||||||
|
$this->assertSame($year, $now[5]);
|
||||||
|
|
||||||
|
date_default_timezone_set($lastTimeZone);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
public function testGetLastRan()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_prevDay()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testDebug()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_sanitize()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetDebug()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_getLastHour()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_getDaysArray()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_prevHour()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testExpand_ranges()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@@ -167,7 +167,7 @@ class e_formTest extends \Codeception\Test\Unit
|
|||||||
"id": ""
|
"id": ""
|
||||||
}
|
}
|
||||||
]',
|
]',
|
||||||
'datestamp_001' => 1454367600,
|
'datestamp_001' => 1699048024,
|
||||||
'date_001' => '2018-08-23',
|
'date_001' => '2018-08-23',
|
||||||
'userclass_001' => 0,
|
'userclass_001' => 0,
|
||||||
'userclasses_001' => '0,1',
|
'userclasses_001' => '0,1',
|
||||||
@@ -426,20 +426,21 @@ class e_formTest extends \Codeception\Test\Unit
|
|||||||
|
|
||||||
public function testDatepicker()
|
public function testDatepicker()
|
||||||
{
|
{
|
||||||
|
$prevTimeZone = date_default_timezone_get();
|
||||||
date_default_timezone_set('UTC');
|
date_default_timezone_set('UTC');
|
||||||
$time = strtotime('January 1st, 2018 1am');
|
$time = strtotime('January 1st, 2023 1am');
|
||||||
$actual = $this->_frm->datepicker('date_field',$time,'type=datetime&format=MM, dd, yyyy hh:ii');
|
$actual = $this->_frm->datepicker('date_field',$time,'type=datetime&format=MM, dd, yyyy hh:ii');
|
||||||
$expected = "<input class='tbox e-datetime input-xlarge form-control' type='text' size='40' id='e-datepicker-date-field' value='January, 01, 2018 01:00' data-date-unix ='true' data-date-format='MM, dd, yyyy hh:ii' data-date-ampm='false' data-date-language='en' data-date-firstday='0' /><input type='hidden' name='date_field' id='date-field' value='1514768400' />";
|
$expected = "<input class='tbox e-datetime input-xlarge form-control' type='text' size='40' id='e-datepicker-date-field' value='January, 01, 2023 01:00' data-date-unix ='true' data-date-format='MM, dd, yyyy hh:ii' data-date-ampm='false' data-date-language='en' data-date-firstday='0' /><input type='hidden' name='date_field' id='date-field' value='1672534800' />";
|
||||||
|
|
||||||
$this->assertEquals($expected, $actual);
|
$this->assertEquals($expected, $actual);
|
||||||
|
|
||||||
// test timezone change...
|
// test timezone change...
|
||||||
date_default_timezone_set('America/Los_Angeles');
|
date_default_timezone_set('America/Los_Angeles');
|
||||||
$actual = $this->_frm->datepicker('date_field',$time,'type=datetime&format=MM, dd, yyyy hh:ii');
|
$actual = $this->_frm->datepicker('date_field',$time,'type=datetime&format=MM, dd, yyyy hh:ii');
|
||||||
$expected = "<input class='tbox e-datetime input-xlarge form-control' type='text' size='40' id='e-datepicker-date-field' value='December, 31, 2017 17:00' data-date-unix ='true' data-date-format='MM, dd, yyyy hh:ii' data-date-ampm='false' data-date-language='en' data-date-firstday='0' /><input type='hidden' name='date_field' id='date-field' value='1514768400' />";
|
$expected = "<input class='tbox e-datetime input-xlarge form-control' type='text' size='40' id='e-datepicker-date-field' value='December, 31, 2022 18:00' data-date-unix ='true' data-date-format='MM, dd, yyyy hh:ii' data-date-ampm='false' data-date-language='en' data-date-firstday='0' /><input type='hidden' name='date_field' id='date-field' value='1672534800' />";
|
||||||
|
|
||||||
$this->assertEquals($expected, $actual);
|
$this->assertEquals($expected, $actual);
|
||||||
|
date_default_timezone_set($prevTimeZone);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testUserlist()
|
public function testUserlist()
|
||||||
@@ -1143,7 +1144,7 @@ class e_formTest extends \Codeception\Test\Unit
|
|||||||
|
|
||||||
'file_001' => '<a href="'.SITEURL.'e107_media/000000test/files/test.zip" title="Direct link to {e_MEDIA_FILE}test.zip" rel="external">{e_MEDIA_FILE}test.zip</a>',
|
'file_001' => '<a href="'.SITEURL.'e107_media/000000test/files/test.zip" title="Direct link to {e_MEDIA_FILE}test.zip" rel="external">{e_MEDIA_FILE}test.zip</a>',
|
||||||
'files_001' => '<ol><li>{e_MEDIA_FILE}test.zip</li></ol>',
|
'files_001' => '<ol><li>{e_MEDIA_FILE}test.zip</li></ol>',
|
||||||
'datestamp_001' => '01 Feb 2016 : 15:00',
|
'datestamp_001' => '03 Nov 2023 : 14:47',
|
||||||
'date_001' => '2018-08-23',
|
'date_001' => '2018-08-23',
|
||||||
'userclass_001' => 'Everyone (public)',
|
'userclass_001' => 'Everyone (public)',
|
||||||
'userclasses_001' => 'Everyone (public)<br />PRIVATEMENU',
|
'userclasses_001' => 'Everyone (public)<br />PRIVATEMENU',
|
||||||
@@ -1261,7 +1262,7 @@ class e_formTest extends \Codeception\Test\Unit
|
|||||||
|
|
||||||
'file_001' => "<input type='hidden' name='file_001' id='file-001' value='{e_MEDIA_FILE}test.zip' style='width:400px' /><a title='Media Manager : _common_file' class='e-modal' data-modal-submit='true' data-modal-caption='Media Manager' data-cache='false' data-target='#uiModal' href='/e107_admin/image.php?mode=main&action=dialog&for=_common_file&tagid=file-001&iframe=1'><span id='file-001_prev' class='btn btn-default btn-secondary btn-small'>{e_MEDIA_FILE}test.zip</span></a>",
|
'file_001' => "<input type='hidden' name='file_001' id='file-001' value='{e_MEDIA_FILE}test.zip' style='width:400px' /><a title='Media Manager : _common_file' class='e-modal' data-modal-submit='true' data-modal-caption='Media Manager' data-cache='false' data-target='#uiModal' href='/e107_admin/image.php?mode=main&action=dialog&for=_common_file&tagid=file-001&iframe=1'><span id='file-001_prev' class='btn btn-default btn-secondary btn-small'>{e_MEDIA_FILE}test.zip</span></a>",
|
||||||
'files_001' => "<ol><li><input type='hidden' name='files_001[0][path]' id='files-001-0-path' value='{e_MEDIA_FILE}test.zip' /><input type='hidden' name='files_001[0][name]' id='files-001-0-name' value='test.zip' /><input type='hidden' name='files_001[0][id]' id='files-001-0-id' value='171' /><a title='Media Manager : _common_file' class='e-modal' data-modal-submit='true' data-modal-caption='Media Manager' data-cache='false' data-target='#uiModal' href='/e107_admin/image.php?mode=main&action=dialog&for=_common_file&tagid=files-001-0&iframe=1'><span id='files-001-0_prev' class='btn btn-default btn-secondary btn-small'>{e_MEDIA_FILE}test.zip</span></a></li><li><input type='hidden' name='files_001[1][path]' id='files-001-1-path' value='' /><input type='hidden' name='files_001[1][name]' id='files-001-1-name' value='' /><input type='hidden' name='files_001[1][id]' id='files-001-1-id' value='' /><a title='Media Manager : _common_file' class='e-modal' data-modal-submit='true' data-modal-caption='Media Manager' data-cache='false' data-target='#uiModal' href='/e107_admin/image.php?mode=main&action=dialog&for=_common_file&tagid=files-001-1&iframe=1'><span id='files-001-1_prev' class='btn btn-default btn-secondary btn-small'>Choose a file</span></a></li><li><input type='hidden' name='files_001[2][path]' id='files-001-2-path' value='' /><input type='hidden' name='files_001[2][name]' id='files-001-2-name' value='' /><input type='hidden' name='files_001[2][id]' id='files-001-2-id' value='' /><a title='Media Manager : _common_file' class='e-modal' data-modal-submit='true' data-modal-caption='Media Manager' data-cache='false' data-target='#uiModal' href='/e107_admin/image.php?mode=main&action=dialog&for=_common_file&tagid=files-001-2&iframe=1'><span id='files-001-2_prev' class='btn btn-default btn-secondary btn-small'>Choose a file</span></a></li><li><input type='hidden' name='files_001[3][path]' id='files-001-3-path' value='' /><input type='hidden' name='files_001[3][name]' id='files-001-3-name' value='' /><input type='hidden' name='files_001[3][id]' id='files-001-3-id' value='' /><a title='Media Manager : _common_file' class='e-modal' data-modal-submit='true' data-modal-caption='Media Manager' data-cache='false' data-target='#uiModal' href='/e107_admin/image.php?mode=main&action=dialog&for=_common_file&tagid=files-001-3&iframe=1'><span id='files-001-3_prev' class='btn btn-default btn-secondary btn-small'>Choose a file</span></a></li><li><input type='hidden' name='files_001[4][path]' id='files-001-4-path' value='' /><input type='hidden' name='files_001[4][name]' id='files-001-4-name' value='' /><input type='hidden' name='files_001[4][id]' id='files-001-4-id' value='' /><a title='Media Manager : _common_file' class='e-modal' data-modal-submit='true' data-modal-caption='Media Manager' data-cache='false' data-target='#uiModal' href='/e107_admin/image.php?mode=main&action=dialog&for=_common_file&tagid=files-001-4&iframe=1'><span id='files-001-4_prev' class='btn btn-default btn-secondary btn-small'>Choose a file</span></a></li></ol>",
|
'files_001' => "<ol><li><input type='hidden' name='files_001[0][path]' id='files-001-0-path' value='{e_MEDIA_FILE}test.zip' /><input type='hidden' name='files_001[0][name]' id='files-001-0-name' value='test.zip' /><input type='hidden' name='files_001[0][id]' id='files-001-0-id' value='171' /><a title='Media Manager : _common_file' class='e-modal' data-modal-submit='true' data-modal-caption='Media Manager' data-cache='false' data-target='#uiModal' href='/e107_admin/image.php?mode=main&action=dialog&for=_common_file&tagid=files-001-0&iframe=1'><span id='files-001-0_prev' class='btn btn-default btn-secondary btn-small'>{e_MEDIA_FILE}test.zip</span></a></li><li><input type='hidden' name='files_001[1][path]' id='files-001-1-path' value='' /><input type='hidden' name='files_001[1][name]' id='files-001-1-name' value='' /><input type='hidden' name='files_001[1][id]' id='files-001-1-id' value='' /><a title='Media Manager : _common_file' class='e-modal' data-modal-submit='true' data-modal-caption='Media Manager' data-cache='false' data-target='#uiModal' href='/e107_admin/image.php?mode=main&action=dialog&for=_common_file&tagid=files-001-1&iframe=1'><span id='files-001-1_prev' class='btn btn-default btn-secondary btn-small'>Choose a file</span></a></li><li><input type='hidden' name='files_001[2][path]' id='files-001-2-path' value='' /><input type='hidden' name='files_001[2][name]' id='files-001-2-name' value='' /><input type='hidden' name='files_001[2][id]' id='files-001-2-id' value='' /><a title='Media Manager : _common_file' class='e-modal' data-modal-submit='true' data-modal-caption='Media Manager' data-cache='false' data-target='#uiModal' href='/e107_admin/image.php?mode=main&action=dialog&for=_common_file&tagid=files-001-2&iframe=1'><span id='files-001-2_prev' class='btn btn-default btn-secondary btn-small'>Choose a file</span></a></li><li><input type='hidden' name='files_001[3][path]' id='files-001-3-path' value='' /><input type='hidden' name='files_001[3][name]' id='files-001-3-name' value='' /><input type='hidden' name='files_001[3][id]' id='files-001-3-id' value='' /><a title='Media Manager : _common_file' class='e-modal' data-modal-submit='true' data-modal-caption='Media Manager' data-cache='false' data-target='#uiModal' href='/e107_admin/image.php?mode=main&action=dialog&for=_common_file&tagid=files-001-3&iframe=1'><span id='files-001-3_prev' class='btn btn-default btn-secondary btn-small'>Choose a file</span></a></li><li><input type='hidden' name='files_001[4][path]' id='files-001-4-path' value='' /><input type='hidden' name='files_001[4][name]' id='files-001-4-name' value='' /><input type='hidden' name='files_001[4][id]' id='files-001-4-id' value='' /><a title='Media Manager : _common_file' class='e-modal' data-modal-submit='true' data-modal-caption='Media Manager' data-cache='false' data-target='#uiModal' href='/e107_admin/image.php?mode=main&action=dialog&for=_common_file&tagid=files-001-4&iframe=1'><span id='files-001-4_prev' class='btn btn-default btn-secondary btn-small'>Choose a file</span></a></li></ol>",
|
||||||
'datestamp_001' => "<input class='tbox e-date input-xlarge form-control' type='text' size='40' id='e-datepicker-datestamp-001' value='Monday, 01 Feb, 2016' data-date-unix ='true' data-date-format='DD, dd M, yyyy' data-date-ampm='false' data-date-language='en' data-date-firstday='0' /><input type='hidden' name='datestamp_001' id='datestamp-001' value='1454367600' />",
|
'datestamp_001' => "<input class='tbox e-date input-xlarge form-control' type='text' size='40' id='e-datepicker-datestamp-001' value='Friday, 03 Nov, 2023' data-date-unix ='true' data-date-format='DD, dd M, yyyy' data-date-ampm='false' data-date-language='en' data-date-firstday='0' /><input type='hidden' name='datestamp_001' id='datestamp-001' value='1699048024' />",
|
||||||
'date_001' => "<input class='tbox e-date input-xlarge form-control' type='text' size='40' id='e-datepicker-date-001' value='Thursday, 23 Aug, 2018' data-date-unix ='true' data-date-format='DD, dd M, yyyy' data-date-ampm='false' data-date-language='en' data-date-firstday='0' /><input type='hidden' name='date_001' id='date-001' value='1535007600' />",
|
'date_001' => "<input class='tbox e-date input-xlarge form-control' type='text' size='40' id='e-datepicker-date-001' value='Thursday, 23 Aug, 2018' data-date-unix ='true' data-date-format='DD, dd M, yyyy' data-date-ampm='false' data-date-language='en' data-date-firstday='0' /><input type='hidden' name='date_001' id='date-001' value='1535007600' />",
|
||||||
'userclass_001' => "<select name='userclass_001' id='userclass-001' class='tbox select form-control' tabindex='18'><option value='0' selected='selected'>Everyone (public)</option><option value='254'> Admin</option><option value='249'> Admins and Mods</option><option value='2'> CONTACT PEOPLE</option><option value='248'> Forum Moderators</option><option value='252'> Guests</option><option value='250'> Main Admin</option><option value='253'> Members</option><option value='1'> PRIVATEMENU</option><option value='255'>No One (inactive)</option><option value='3'> NEWSLETTER</option><optgroup label='Everyone but..'><option value='-254'> Not Admin</option><option value='-249'> Not Admins and Mods</option><option value='-2'> Not CONTACT PEOPLE</option><option value='-248'> Not Forum Moderators</option><option value='-252'> Not Guests</option><option value='-250'> Not Main Admin</option><option value='-253'> Not Members</option><option value='-1'> Not PRIVATEMENU</option><option value='-3'> Not NEWSLETTER</option></optgroup></select>",
|
'userclass_001' => "<select name='userclass_001' id='userclass-001' class='tbox select form-control' tabindex='18'><option value='0' selected='selected'>Everyone (public)</option><option value='254'> Admin</option><option value='249'> Admins and Mods</option><option value='2'> CONTACT PEOPLE</option><option value='248'> Forum Moderators</option><option value='252'> Guests</option><option value='250'> Main Admin</option><option value='253'> Members</option><option value='1'> PRIVATEMENU</option><option value='255'>No One (inactive)</option><option value='3'> NEWSLETTER</option><optgroup label='Everyone but..'><option value='-254'> Not Admin</option><option value='-249'> Not Admins and Mods</option><option value='-2'> Not CONTACT PEOPLE</option><option value='-248'> Not Forum Moderators</option><option value='-252'> Not Guests</option><option value='-250'> Not Main Admin</option><option value='-253'> Not Members</option><option value='-1'> Not PRIVATEMENU</option><option value='-3'> Not NEWSLETTER</option></optgroup></select>",
|
||||||
'userclasses_001' => "<select name='userclasses_001[]' id='userclasses-001' class='tbox select form-control' tabindex='19' multiple='multiple'><option value='0'>Everyone (public)</option><option value='254'> Admin</option><option value='249'> Admins and Mods</option><option value='2'> CONTACT PEOPLE</option><option value='248'> Forum Moderators</option><option value='252'> Guests</option><option value='250'> Main Admin</option><option value='253'> Members</option><option value='1' selected='selected'> PRIVATEMENU</option><option value='255'>No One (inactive)</option><option value='3'> NEWSLETTER</option><optgroup label='Everyone but..'><option value='-254'> Not Admin</option><option value='-249'> Not Admins and Mods</option><option value='-2'> Not CONTACT PEOPLE</option><option value='-248'> Not Forum Moderators</option><option value='-252'> Not Guests</option><option value='-250'> Not Main Admin</option><option value='-253'> Not Members</option><option value='-1'> Not PRIVATEMENU</option><option value='-3'> Not NEWSLETTER</option></optgroup></select>",
|
'userclasses_001' => "<select name='userclasses_001[]' id='userclasses-001' class='tbox select form-control' tabindex='19' multiple='multiple'><option value='0'>Everyone (public)</option><option value='254'> Admin</option><option value='249'> Admins and Mods</option><option value='2'> CONTACT PEOPLE</option><option value='248'> Forum Moderators</option><option value='252'> Guests</option><option value='250'> Main Admin</option><option value='253'> Members</option><option value='1' selected='selected'> PRIVATEMENU</option><option value='255'>No One (inactive)</option><option value='3'> NEWSLETTER</option><optgroup label='Everyone but..'><option value='-254'> Not Admin</option><option value='-249'> Not Admins and Mods</option><option value='-2'> Not CONTACT PEOPLE</option><option value='-248'> Not Forum Moderators</option><option value='-252'> Not Guests</option><option value='-250'> Not Main Admin</option><option value='-253'> Not Members</option><option value='-1'> Not PRIVATEMENU</option><option value='-3'> Not NEWSLETTER</option></optgroup></select>",
|
||||||
|
Reference in New Issue
Block a user