19 declare(strict_types=1);
35 bool $has_flexible_schedule,
37 ?
int $default_schedule_value,
41 $job_instance =
new class ($has_flexible_schedule, $default_schedule_type, $default_schedule_value, $schedule_type, $schedule_value) extends
ilCronJob {
43 private readonly
bool $has_flexible_schedule,
45 private readonly ?
int $default_schedule_value,
49 $this->schedule_type = $schedule_type;
50 $this->schedule_value = $schedule_value;
53 public function getId():
string 58 public function getTitle():
string 63 public function getDescription():
string 68 public function hasAutoActivation():
bool 73 public function hasFlexibleSchedule():
bool 75 return $this->has_flexible_schedule;
80 return $this->default_schedule_type;
83 public function getDefaultScheduleValue(): ?
int 85 return $this->default_schedule_value;
106 $offset = (((
int) $this->now->format(
'n')) - 1) % 3;
107 $this->this_quarter_start = $this->now->modify(
"first day of -$offset month midnight");
110 'Manual Run is Always Due' => [
111 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_DAILY, null, CronJobScheduleType::SCHEDULE_TYPE_DAILY, null),
114 CronJobScheduleType::SCHEDULE_TYPE_DAILY,
118 'Job Without Any Run is Always Due' => [
119 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_DAILY, null, CronJobScheduleType::SCHEDULE_TYPE_DAILY, null),
122 CronJobScheduleType::SCHEDULE_TYPE_DAILY,
126 'Daily Schedule / Did not run Today' => [
127 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_DAILY, null, CronJobScheduleType::SCHEDULE_TYPE_DAILY, null),
129 $this->now->modify(
'-1 day'),
130 CronJobScheduleType::SCHEDULE_TYPE_DAILY,
134 'Daily Schedule / Did run Today' => [
135 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_DAILY, null, CronJobScheduleType::SCHEDULE_TYPE_DAILY, null),
138 CronJobScheduleType::SCHEDULE_TYPE_DAILY,
142 'Weekly Schedule / Did not run this Week' => [
143 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_WEEKLY, null, CronJobScheduleType::SCHEDULE_TYPE_WEEKLY, null),
145 $this->now->modify(
'-1 week'),
146 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
150 'Weekly Schedule / Did run this Week' => [
151 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_WEEKLY, null, CronJobScheduleType::SCHEDULE_TYPE_WEEKLY, null),
153 $this->now->modify(
'monday this week'),
154 CronJobScheduleType::SCHEDULE_TYPE_WEEKLY,
158 'Monthly Schedule / Did not run this Month' => [
159 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_MONTHLY, null, CronJobScheduleType::SCHEDULE_TYPE_MONTHLY, null),
161 $this->now->modify(
'last day of last month'),
162 CronJobScheduleType::SCHEDULE_TYPE_MONTHLY,
166 'Monthly Schedule / Did run this Month' => [
167 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_MONTHLY, null, CronJobScheduleType::SCHEDULE_TYPE_MONTHLY, null),
169 $this->now->modify(
'first day of this month'),
170 CronJobScheduleType::SCHEDULE_TYPE_MONTHLY,
174 'Yearly Schedule / Did not run this Year' => [
177 $this->now->modify(
'-1 year'),
182 'Yearly Schedule / Did run this Year' => [
185 $this->now->modify(
'first day of January this year'),
190 'Quarterly Schedule / Did not run this Quarter' => [
191 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_QUARTERLY, null, CronJobScheduleType::SCHEDULE_TYPE_QUARTERLY, null),
193 $this->this_quarter_start->modify(
'-1 seconds'),
194 CronJobScheduleType::SCHEDULE_TYPE_QUARTERLY,
198 'Quarterly Schedule / Did run this Quarter' => [
199 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_QUARTERLY, null, CronJobScheduleType::SCHEDULE_TYPE_QUARTERLY, null),
201 $this->this_quarter_start->modify(
'+30 seconds'),
202 CronJobScheduleType::SCHEDULE_TYPE_QUARTERLY,
206 'Minutely Schedule / Did not run this Minute' => [
207 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_IN_MINUTES, 1, CronJobScheduleType::SCHEDULE_TYPE_IN_MINUTES, 1),
209 $this->now->modify(
'-1 minute'),
210 CronJobScheduleType::SCHEDULE_TYPE_IN_MINUTES,
214 'Minutely Schedule / Did run this Minute' => [
215 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_IN_MINUTES, 1, CronJobScheduleType::SCHEDULE_TYPE_IN_MINUTES, 1),
217 $this->now->modify(
'-30 seconds'),
218 CronJobScheduleType::SCHEDULE_TYPE_IN_MINUTES,
222 'Hourly Schedule / Did not run this Hour' => [
223 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_IN_HOURS, 7, CronJobScheduleType::SCHEDULE_TYPE_IN_HOURS, 7),
225 $this->now->modify(
'-7 hours'),
226 CronJobScheduleType::SCHEDULE_TYPE_IN_HOURS,
230 'Hourly Schedule / Did run this Hour' => [
231 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_IN_HOURS, 7, CronJobScheduleType::SCHEDULE_TYPE_IN_HOURS, 7),
233 $this->now->modify(
'-7 hours +30 seconds'),
234 CronJobScheduleType::SCHEDULE_TYPE_IN_HOURS,
238 'Every 5 Days Schedule / Did not run for 5 Days' => [
239 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_IN_DAYS, 5, CronJobScheduleType::SCHEDULE_TYPE_IN_DAYS, 5),
241 $this->now->modify(
'-5 days'),
242 CronJobScheduleType::SCHEDULE_TYPE_IN_DAYS,
246 'Every 5 Days Schedule / Did run withing the last 5 Days' => [
247 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_IN_DAYS, 5, CronJobScheduleType::SCHEDULE_TYPE_IN_DAYS, 5),
249 $this->now->modify(
'-4 days'),
250 CronJobScheduleType::SCHEDULE_TYPE_IN_DAYS,
265 ?
int $schedule_value,
270 $job_instance->
isDue($last_run_datetime, $schedule_type, $schedule_value, $is_manual_run),
271 'Last run: ' . ($last_run_datetime ? $last_run_datetime->format(DATE_ATOM) :
'never')
277 yield
'Different Week' => [
278 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_WEEKLY, null, CronJobScheduleType::SCHEDULE_TYPE_WEEKLY, null),
282 return $this->now->modify(
'-1 week');
287 yield
'Same Week and Year, but different Month: December (now) and January (Last run)' => [
288 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_WEEKLY, null, CronJobScheduleType::SCHEDULE_TYPE_WEEKLY, null),
297 yield
'Same Week and Year and same Month: January' => [
298 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_WEEKLY, null, CronJobScheduleType::SCHEDULE_TYPE_WEEKLY, null),
302 return $this->now->modify(
'-1 day');
307 yield
'Same Week (52nd), but Year Difference > 1' => [
308 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_WEEKLY, null, CronJobScheduleType::SCHEDULE_TYPE_WEEKLY, null),
312 return $this->now->modify(
'tuesday this week')->modify(
'-1 year');
317 yield
'Same Week (52nd) in different Years, but Turn of the Year' => [
318 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_WEEKLY, null, CronJobScheduleType::SCHEDULE_TYPE_WEEKLY, null),
322 return $this->now->modify(
'monday this week');
327 yield
'Same Week (52nd) in different Years, but not Turn of the Year' => [
328 $this->
getJob(
true, CronJobScheduleType::SCHEDULE_TYPE_WEEKLY, null, CronJobScheduleType::SCHEDULE_TYPE_WEEKLY, null),
344 callable $last_run_datetime_provider,
347 $last_run_datetime = $last_run_datetime_provider();
351 $job_instance->
isDue(
357 'Last run: ' . $last_run_datetime->format(DATE_ATOM)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
testSchedule(ilCronJob $job_instance, bool $is_manual_run, ?DateTimeImmutable $last_run_datetime, CronJobScheduleType $schedule_type, ?int $schedule_value, bool $should_be_due)
jobProvider
isDue(?DateTimeImmutable $last_run, ?CronJobScheduleType $schedule_type, ?int $schedule_value, bool $is_manually_executed=false)
testWeeklySchedules(ilCronJob $job_instance, callable $last_run_datetime_provider, bool $should_be_due)
weeklyScheduleProvider
DateTimeImmutable $this_quarter_start
Class CronJobScheduleTest.
getJob(bool $has_flexible_schedule, CronJobScheduleType $default_schedule_type, ?int $default_schedule_value, CronJobScheduleType $schedule_type, ?int $schedule_value)
getScheduleValue()
Get current schedule value (if flexible)
getScheduleType()
Get current schedule type (if flexible)