ILIAS  trunk Revision v11.0_alpha-1723-g8e69f309bab
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
CronJobScheduleTest Class Reference
+ Inheritance diagram for CronJobScheduleTest:
+ Collaboration diagram for CronJobScheduleTest:

Public Member Functions

 testSchedule (CronJob $job_instance, bool $is_manual_run, ?callable $last_run_datetime_callable, JobScheduleType $schedule_type, ?int $schedule_value, bool $should_be_due)
 jobProvider More...
 
 testWeeklySchedules (CronJob $job_instance, callable $last_run_datetime_provider, bool $should_be_due)
 weeklyScheduleProvider More...
 

Static Public Member Functions

static jobProvider ()
 
static weeklyScheduleProvider ()
 

Static Private Member Functions

static getJob (bool $has_flexible_schedule, JobScheduleType $default_schedule_type, ?int $default_schedule_value, JobScheduleType $schedule_type, ?int $schedule_value)
 

Static Private Attributes

static DateTimeImmutable $now
 
static DateTimeImmutable $this_quarter_start
 

Detailed Description

Definition at line 26 of file CronJobScheduleTest.php.

Member Function Documentation

◆ getJob()

static CronJobScheduleTest::getJob ( bool  $has_flexible_schedule,
JobScheduleType  $default_schedule_type,
?int  $default_schedule_value,
JobScheduleType  $schedule_type,
?int  $schedule_value 
)
staticprivate

Definition at line 31 of file CronJobScheduleTest.php.

References ILIAS\GlobalScreen\Provider\__construct(), ILIAS\Survey\Mode\getId(), and ILIAS\GlobalScreen\Scope\Footer\Factory\getTitle().

37  : CronJob {
38  $job_instance = new class (
39  $has_flexible_schedule,
40  $default_schedule_type,
41  $default_schedule_value,
42  $schedule_type,
43  $schedule_value
44  ) extends
45  CronJob {
46  public function __construct(
47  private readonly bool $has_flexible_schedule,
48  private readonly JobScheduleType $default_schedule_type,
49  private readonly ?int $default_schedule_value,
50  JobScheduleType $schedule_type,
51  ?int $schedule_value
52  ) {
53  $this->schedule_type = $schedule_type;
54  $this->schedule_value = $schedule_value;
55  }
56 
57  public function getId(): string
58  {
59  return 'phpunit';
60  }
61 
62  public function getTitle(): string
63  {
64  return 'phpunit';
65  }
66 
67  public function getDescription(): string
68  {
69  return 'phpunit';
70  }
71 
72  public function hasAutoActivation(): bool
73  {
74  return false;
75  }
76 
77  public function hasFlexibleSchedule(): bool
78  {
79  return $this->has_flexible_schedule;
80  }
81 
82  public function getDefaultScheduleType(): JobScheduleType
83  {
84  return $this->default_schedule_type;
85  }
86 
87  public function getDefaultScheduleValue(): ?int
88  {
89  return $this->default_schedule_value;
90  }
91 
92  public function run(): JobResult
93  {
94  return new JobResult();
95  }
96  };
97 
98  $job_instance->setDateTimeProvider(function (): DateTimeImmutable {
99  return self::$now;
100  });
101 
102  return $job_instance;
103  }
__construct(Container $dic, ilPlugin $plugin)
+ Here is the call graph for this function:

◆ jobProvider()

static CronJobScheduleTest::jobProvider ( )
static
Returns
array<string, array{0: CronJob, 1: bool, 2: ?callable(): DateTimeImmutable, 3: JobScheduleType, 4: ?int, 5: bool}>

Definition at line 108 of file CronJobScheduleTest.php.

References ILIAS\Repository\int(), null, and ILIAS\Cron\Job\Schedule\YEARLY.

108  : array
109  {
110  return [
111  'Manual Run is Always Due' => [
112  self::getJob(
113  true,
114  JobScheduleType::DAILY,
115  null,
116  JobScheduleType::DAILY,
117  null
118  ),
119  true,
120  null,
121  JobScheduleType::DAILY,
122  null,
123  true
124  ],
125  'Job Without Any Run is Always Due' => [
126  self::getJob(
127  true,
128  JobScheduleType::DAILY,
129  null,
130  JobScheduleType::DAILY,
131  null
132  ),
133  false,
134  null,
135  JobScheduleType::DAILY,
136  null,
137  true
138  ],
139  'Daily Schedule / Did not run Today' => [
140  self::getJob(
141  true,
142  JobScheduleType::DAILY,
143  null,
144  JobScheduleType::DAILY,
145  null
146  ),
147  false,
148  function (): DateTimeImmutable {
149  self::$now = new DateTimeImmutable('@' . time());
150 
151  return self::$now->modify('-1 day');
152  },
153  JobScheduleType::DAILY,
154  null,
155  true
156  ],
157  'Daily Schedule / Did run Today' => [
158  self::getJob(
159  true,
160  JobScheduleType::DAILY,
161  null,
162  JobScheduleType::DAILY,
163  null
164  ),
165  false,
166  function (): DateTimeImmutable {
167  self::$now = new DateTimeImmutable('@' . time());
168 
169  return self::$now;
170  },
171  JobScheduleType::DAILY,
172  null,
173  false
174  ],
175  'Weekly Schedule / Did not run this Week' => [
176  self::getJob(
177  true,
178  JobScheduleType::WEEKLY,
179  null,
180  JobScheduleType::WEEKLY,
181  null
182  ),
183  false,
184  function (): DateTimeImmutable {
185  self::$now = new DateTimeImmutable('@' . time());
186 
187  return self::$now->modify('-1 week');
188  },
189  JobScheduleType::WEEKLY,
190  null,
191  true
192  ],
193  'Weekly Schedule / Did run this Week' => [
194  self::getJob(
195  true,
196  JobScheduleType::WEEKLY,
197  null,
198  JobScheduleType::WEEKLY,
199  null
200  ),
201  false,
202  function (): DateTimeImmutable {
203  self::$now = new DateTimeImmutable('@' . time());
204 
205  return self::$now->modify('monday this week');
206  },
207  JobScheduleType::WEEKLY,
208  null,
209  false
210  ],
211  'Monthly Schedule / Did not run this Month' => [
212  self::getJob(
213  true,
214  JobScheduleType::MONTHLY,
215  null,
216  JobScheduleType::MONTHLY,
217  null
218  ),
219  false,
220  function (): DateTimeImmutable {
221  self::$now = new DateTimeImmutable('@' . time());
222 
223  return self::$now->modify('last day of last month');
224  },
225  JobScheduleType::MONTHLY,
226  null,
227  true
228  ],
229  'Monthly Schedule / Did run this Month' => [
230  self::getJob(
231  true,
232  JobScheduleType::MONTHLY,
233  null,
234  JobScheduleType::MONTHLY,
235  null
236  ),
237  false,
238  function (): DateTimeImmutable {
239  self::$now = new DateTimeImmutable('@' . time());
240 
241  return self::$now->modify('first day of this month');
242  },
243  JobScheduleType::MONTHLY,
244  null,
245  false
246  ],
247  'Yearly Schedule / Did not run this Year' => [
248  self::getJob(
249  true,
251  null,
253  null
254  ),
255  false,
256  function (): DateTimeImmutable {
257  self::$now = new DateTimeImmutable('@' . time());
258 
259  return self::$now->modify('-1 year');
260  },
262  null,
263  true
264  ],
265  'Yearly Schedule / Did run this Year' => [
266  self::getJob(
267  true,
269  null,
271  null
272  ),
273  false,
274  function (): DateTimeImmutable {
275  self::$now = new DateTimeImmutable('@' . time());
276 
277  return self::$now->modify('first day of January this year');
278  },
280  null,
281  false
282  ],
283  'Quarterly Schedule / Did not run this Quarter' => [
284  self::getJob(
285  true,
286  JobScheduleType::QUARTERLY,
287  null,
288  JobScheduleType::QUARTERLY,
289  null
290  ),
291  false,
292  function (): DateTimeImmutable {
293  self::$now = new DateTimeImmutable('@' . time());
294 
295  $offset = (((int) self::$now->format('n')) - 1) % 3;
296  self::$this_quarter_start = self::$now->modify("first day of -$offset month midnight");
297 
298  return self::$this_quarter_start->modify('-1 seconds');
299  },
300  JobScheduleType::QUARTERLY,
301  null,
302  true
303  ],
304  'Quarterly Schedule / Did run this Quarter' => [
305  self::getJob(
306  true,
307  JobScheduleType::QUARTERLY,
308  null,
309  JobScheduleType::QUARTERLY,
310  null
311  ),
312  false,
313  function (): DateTimeImmutable {
314  self::$now = new DateTimeImmutable('@' . time());
315 
316  $offset = (((int) self::$now->format('n')) - 1) % 3;
317  self::$this_quarter_start = self::$now->modify("first day of -$offset month midnight");
318 
319  return self::$this_quarter_start->modify('+30 seconds');
320  },
321  JobScheduleType::QUARTERLY,
322  null,
323  false
324  ],
325  'Minutely Schedule / Did not run this Minute' => [
326  self::getJob(
327  true,
328  JobScheduleType::IN_MINUTES,
329  1,
330  JobScheduleType::IN_MINUTES,
331  1
332  ),
333  false,
334  function (): DateTimeImmutable {
335  self::$now = new DateTimeImmutable('@' . time());
336 
337  return self::$now->modify('-1 minute');
338  },
339  JobScheduleType::IN_MINUTES,
340  1,
341  true
342  ],
343  'Minutely Schedule / Did run this Minute' => [
344  self::getJob(
345  true,
346  JobScheduleType::IN_MINUTES,
347  1,
348  JobScheduleType::IN_MINUTES,
349  1
350  ),
351  false,
352  function (): DateTimeImmutable {
353  self::$now = new DateTimeImmutable('@' . time());
354 
355  return self::$now->modify('-30 seconds');
356  },
357  JobScheduleType::IN_MINUTES,
358  1,
359  false
360  ],
361  'Hourly Schedule / Did not run this Hour' => [
362  self::getJob(
363  true,
364  JobScheduleType::IN_HOURS,
365  7,
366  JobScheduleType::IN_HOURS,
367  7
368  ),
369  false,
370  function (): DateTimeImmutable {
371  self::$now = new DateTimeImmutable('@' . time());
372 
373  return self::$now->modify('-7 hours');
374  },
375  JobScheduleType::IN_HOURS,
376  7,
377  true
378  ],
379  'Hourly Schedule / Did run this Hour' => [
380  self::getJob(
381  true,
382  JobScheduleType::IN_HOURS,
383  7,
384  JobScheduleType::IN_HOURS,
385  7
386  ),
387  false,
388  function (): DateTimeImmutable {
389  self::$now = new DateTimeImmutable('@' . time());
390 
391  return self::$now->modify('-7 hours +30 seconds');
392  },
393  JobScheduleType::IN_HOURS,
394  7,
395  false
396  ],
397  'Every 5 Days Schedule / Did not run for 5 Days' => [
398  self::getJob(
399  true,
400  JobScheduleType::IN_DAYS,
401  5,
402  JobScheduleType::IN_DAYS,
403  5
404  ),
405  false,
406  function (): DateTimeImmutable {
407  self::$now = new DateTimeImmutable('@' . time());
408 
409  return self::$now->modify('-5 days');
410  },
411  JobScheduleType::IN_DAYS,
412  5,
413  true
414  ],
415  'Every 5 Days Schedule / Did run withing the last 5 Days' => [
416  self::getJob(
417  true,
418  JobScheduleType::IN_DAYS,
419  5,
420  JobScheduleType::IN_DAYS,
421  5
422  ),
423  false,
424  function (): DateTimeImmutable {
425  self::$now = new DateTimeImmutable('@' . time());
426 
427  return self::$now->modify('-4 days');
428  },
429  JobScheduleType::IN_DAYS,
430  5,
431  false
432  ]
433  ];
434  }
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
+ Here is the call graph for this function:

◆ testSchedule()

CronJobScheduleTest::testSchedule ( CronJob  $job_instance,
bool  $is_manual_run,
?callable  $last_run_datetime_callable,
JobScheduleType  $schedule_type,
?int  $schedule_value,
bool  $should_be_due 
)

jobProvider

Parameters
null|callable()DateTimeImmutable $last_run_datetime_callable

Definition at line 440 of file CronJobScheduleTest.php.

References ILIAS\Cron\CronJob\isDue(), and null.

447  : void {
448  $last_run_datetime = $last_run_datetime_callable ? $last_run_datetime_callable() : null;
449  self::assertEquals(
450  $should_be_due,
451  $job_instance->isDue($last_run_datetime, $schedule_type, $schedule_value, $is_manual_run),
452  'Last run: ' . ($last_run_datetime ? $last_run_datetime->format(DATE_ATOM) : 'never')
453  );
454  }
isDue(?\DateTimeImmutable $last_run, ?JobScheduleType $schedule_type, ?int $schedule_value, bool $is_manually_executed=false)
Definition: CronJob.php:162
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
+ Here is the call graph for this function:

◆ testWeeklySchedules()

CronJobScheduleTest::testWeeklySchedules ( CronJob  $job_instance,
callable  $last_run_datetime_provider,
bool  $should_be_due 
)

weeklyScheduleProvider

Parameters
callable()DateTimeImmutable $last_run_datetime_provider

Definition at line 581 of file CronJobScheduleTest.php.

References ILIAS\Cron\CronJob\getScheduleType(), ILIAS\Cron\CronJob\getScheduleValue(), and ILIAS\Cron\CronJob\isDue().

585  : void {
586  $last_run_datetime = $last_run_datetime_provider();
587 
588  self::assertSame(
589  $should_be_due,
590  $job_instance->isDue(
591  $last_run_datetime,
592  $job_instance->getScheduleType(),
593  $job_instance->getScheduleValue(),
594  false
595  ),
596  'Last run: ' . $last_run_datetime->format(DATE_ATOM)
597  );
598  }
getScheduleType()
Get current schedule type (if flexible)
Definition: CronJob.php:183
isDue(?\DateTimeImmutable $last_run, ?JobScheduleType $schedule_type, ?int $schedule_value, bool $is_manually_executed=false)
Definition: CronJob.php:162
getScheduleValue()
Get current schedule value (if flexible)
Definition: CronJob.php:195
+ Here is the call graph for this function:

◆ weeklyScheduleProvider()

static CronJobScheduleTest::weeklyScheduleProvider ( )
static

Definition at line 456 of file CronJobScheduleTest.php.

References null.

456  : Generator
457  {
458  yield 'Different Week' => [
459  self::getJob(
460  true,
461  JobScheduleType::WEEKLY,
462  null,
463  JobScheduleType::WEEKLY,
464  null
465  ),
466  function (): DateTimeImmutable {
467  self::$now = new DateTimeImmutable(
468  '@1672570104'
469  ); // Sun Jan 01 2023 10:48:24 GMT+0000 (year: 2023 / week: 52)
470 
471  return self::$now->modify('-1 week'); // Sun Dec 25 2022 10:48:24 GMT+0000 (year: 2022 / week: 51)
472  },
473  true
474  ];
475 
476  yield 'Same Week and Year, but different Month: December (now) and January (Last run)' => [
477  self::getJob(
478  true,
479  JobScheduleType::WEEKLY,
480  null,
481  JobScheduleType::WEEKLY,
482  null
483  ),
484  function (): DateTimeImmutable {
485  self::$now = new DateTimeImmutable(
486  '@1703669703'
487  ); // Wed Dec 27 2023 09:35:03 GMT+0000 (year: 2023 / week: 52 / month: 12)
488 
489  return new DateTimeImmutable(
490  '@1672570104'
491  ); // Sun Jan 01 2023 10:48:24 GMT+0000 (year: 2023 / week: 52 / month: 1)
492  },
493  true
494  ];
495 
496  yield 'Same Week and Year and same Month: January' => [
497  self::getJob(
498  true,
499  JobScheduleType::WEEKLY,
500  null,
501  JobScheduleType::WEEKLY,
502  null
503  ),
504  function (): DateTimeImmutable {
505  self::$now = new DateTimeImmutable(
506  '@1704188103'
507  ); // Tue Jan 02 2024 09:35:03 GMT+0000 (year: 2024 / week: 1 / month: 1)
508 
509  return self::$now->modify(
510  '-1 day'
511  ); // Mon Jan 01 2024 09:35:03 GMT+0000 (year: 2024 / week: 1 / month: 1)
512  },
513  false
514  ];
515 
516  yield 'Same Week (52nd), but Year Difference > 1' => [
517  self::getJob(
518  true,
519  JobScheduleType::WEEKLY,
520  null,
521  JobScheduleType::WEEKLY,
522  null
523  ),
524  function (): DateTimeImmutable {
525  self::$now = new DateTimeImmutable(
526  '@1672570104'
527  ); // Sun Jan 01 2023 10:48:24 GMT+0000 (year: 2023 / week: 52)
528 
529  return self::$now->modify('tuesday this week')->modify(
530  '-1 year'
531  ); // Mon Dec 27 2021 10:48:24 GMT+0000 (year: 2021 / week: 52)
532  },
533  true
534  ];
535 
536  yield 'Same Week (52nd) in different Years, but Turn of the Year' => [
537  self::getJob(
538  true,
539  JobScheduleType::WEEKLY,
540  null,
541  JobScheduleType::WEEKLY,
542  null
543  ),
544  function (): DateTimeImmutable {
545  self::$now = new DateTimeImmutable(
546  '@1672570104'
547  ); // Sun Jan 01 2023 10:48:24 GMT+0000 (year: 2023 / week: 52 / month: 1)
548 
549  return self::$now->modify(
550  'monday this week'
551  ); // Mon Dec 26 2022 10:48:24 GMT+0000 (year: 2022 / week: 52 / month: 12)
552  },
553  false
554  ];
555 
556  yield 'Same Week (52nd) in different Years, but not Turn of the Year' => [
557  self::getJob(
558  true,
559  JobScheduleType::WEEKLY,
560  null,
561  JobScheduleType::WEEKLY,
562  null
563  ),
564  function (): DateTimeImmutable {
565  self::$now = new DateTimeImmutable(
566  '@1703669703'
567  ); // Wed Dec 27 2023 09:35:03 GMT+0000 (year: 2023 / week: 52 / month: 12)
568 
569  return new DateTimeImmutable(
570  '@1672012800'
571  ); // Mon Dec 26 2022 00:00:00 GMT+0000 (year: 2022 / week: 52 / month: 12)
572  },
573  true
574  ];
575  }
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null

Field Documentation

◆ $now

DateTimeImmutable CronJobScheduleTest::$now
staticprivate

Definition at line 28 of file CronJobScheduleTest.php.

◆ $this_quarter_start

DateTimeImmutable CronJobScheduleTest::$this_quarter_start
staticprivate

Definition at line 29 of file CronJobScheduleTest.php.


The documentation for this class was generated from the following file: