/**
  * 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();
 }
Example #4
0
 /**
  * Tests invalid call to setDay on Monthly
  * @expectedException \Exception
  */
 public function testSetDayScheduledTimeMonthlyOver31()
 {
     $monthlySchedule = new Monthly();
     $monthlySchedule->setDay(32);
 }