/** * Constructor. */ public function __construct() { $schedulePeriodStr = self::getSchedulePeriod(); // created the scheduledtime instance, also, since GeoIP updates are done on tuesdays, // get new DBs on Wednesday switch ($schedulePeriodStr) { case self::SCHEDULE_PERIOD_WEEKLY: $schedulePeriod = new Weekly(); $schedulePeriod->setDay(3); break; case self::SCHEDULE_PERIOD_MONTHLY: default: $schedulePeriod = new Monthly(); $schedulePeriod->setDayOfWeek(3, 0); break; } parent::__construct($this, 'update', null, $schedulePeriod, ScheduledTask::LOWEST_PRIORITY); }
/** * Returns a new ScheduledTime instance using a string description of the scheduled period type * and a string description of the day within the period to execute the task on. * * @param string $periodType The scheduled period type. Can be `'hourly'`, `'daily'`, `'weekly'`, or `'monthly'`. * @param string|int|false $periodDay A string describing the day within the scheduled period to execute * the task on. Only valid for week and month periods. * * If `'weekly'` is supplied for `$periodType`, this should be a day * of the week, for example, `'monday'` or `'tuesday'`. * * If `'monthly'` is supplied for `$periodType`, this can be a numeric * day in the month or a day in one week of the month. For example, * `12`, `23`, `'first sunday'` or `'fourth tuesday'`. * @api */ public static function factory($periodType, $periodDay = false) { switch ($periodType) { case 'hourly': return new Hourly(); case 'daily': return new Daily(); case 'weekly': $result = new Weekly(); if ($periodDay !== false) { $result->setDay($periodDay); } return $result; case 'monthly': $result = new Monthly($periodDay); if ($periodDay !== false) { if (is_int($periodDay)) { $result->setDay($periodDay); } else { $result->setDayOfWeekFromString($periodDay); } } return $result; default: throw new Exception("Unsupported scheduled period type: '{$periodType}'. Supported values are" . " 'hourly', 'daily', 'weekly' or 'monthly'."); } }
/** * @group Plugins */ public function testGetScheduledTasks() { // stub API to control getReports() return values $report1 = self::getDailyPDFReportData($this->idSite); $report1['idreport'] = 1; $report1['hour'] = 0; $report1['deleted'] = 0; $report2 = self::getMonthlyEmailReportData($this->idSite); $report2['idreport'] = 2; $report2['idsite'] = 2; $report2['hour'] = 0; $report2['deleted'] = 0; $report3 = self::getMonthlyEmailReportData($this->idSite); $report3['idreport'] = 3; $report3['deleted'] = 1; // should not be scheduled $report4 = self::getMonthlyEmailReportData($this->idSite); $report4['idreport'] = 4; $report4['idsite'] = 1; $report4['hour'] = 8; $report4['deleted'] = 0; $report5 = self::getMonthlyEmailReportData($this->idSite); $report5['idreport'] = 5; $report5['idsite'] = 2; $report5['hour'] = 8; $report5['deleted'] = 0; // test no exception is raised when a scheduled report is set to never send $report6 = self::getMonthlyEmailReportData($this->idSite); $report6['idreport'] = 6; $report6['period'] = ScheduledTime::PERIOD_NEVER; $report6['deleted'] = 0; $stubbedAPIScheduledReports = $this->getMock('\\Piwik\\Plugins\\ScheduledReports\\API', array('getReports', 'getInstance'), $arguments = array(), $mockClassName = '', $callOriginalConstructor = false); $stubbedAPIScheduledReports->expects($this->any())->method('getReports')->will($this->returnValue(array($report1, $report2, $report3, $report4, $report5, $report6))); \Piwik\Plugins\ScheduledReports\API::setSingletonInstance($stubbedAPIScheduledReports); // initialize sites 1 and 2 Site::setSites(array(1 => array('timezone' => 'Europe/Paris'), 2 => array('timezone' => 'UTC-6.5'))); // expected tasks $scheduleTask1 = ScheduledTime::factory('daily'); $scheduleTask1->setHour(0); // paris is UTC-1, period ends at 23h UTC $scheduleTask1->setTimezone('Europe/Paris'); $scheduleTask2 = new Monthly(); $scheduleTask2->setHour(0); // site is UTC-6.5, period ends at 6h30 UTC, smallest resolution is hour $scheduleTask2->setTimezone('UTC-6.5'); $scheduleTask3 = new Monthly(); $scheduleTask3->setHour(8); // paris is UTC-1, configured to be sent at 8h $scheduleTask3->setTimezone('Europe/Paris'); $scheduleTask4 = new Monthly(); $scheduleTask4->setHour(8); // site is UTC-6.5, configured to be sent at 8h $scheduleTask4->setTimezone('UTC-6.5'); $expectedTasks = array(new ScheduledTask(APIScheduledReports::getInstance(), 'sendReport', 1, $scheduleTask1), new ScheduledTask(APIScheduledReports::getInstance(), 'sendReport', 2, $scheduleTask2), new ScheduledTask(APIScheduledReports::getInstance(), 'sendReport', 4, $scheduleTask3), new ScheduledTask(APIScheduledReports::getInstance(), 'sendReport', 5, $scheduleTask4)); $pdfReportPlugin = new Tasks(); $pdfReportPlugin->schedule(); $tasks = $pdfReportPlugin->getScheduledTasks(); $this->assertEquals($expectedTasks, $tasks); \Piwik\Plugins\ScheduledReports\API::unsetInstance(); }
/** * Tests invalid call to setDay on Monthly * @expectedException \Exception */ public function testSetDayScheduledTimeMonthlyOver31() { $monthlySchedule = new Monthly(); $monthlySchedule->setDay(32); }