$this->assertContains('2:15 AM', core_text::strtoupper($userdate));
}
- public function test_reset_scheduled_tasks_for_component() {
- global $DB;
-
+ public function test_reset_scheduled_tasks_for_component_customised(): void {
$this->resetAfterTest(true);
- // Remember the defaults.
- $defaulttasks = \core\task\manager::load_scheduled_tasks_for_component('moodle');
- $initcount = count($defaulttasks);
+
+ $tasks = \core\task\manager::load_scheduled_tasks_for_component('moodle');
+
// Customise a task.
- $firsttask = reset($defaulttasks);
- $firsttask->set_minute('1');
- $firsttask->set_hour('2');
- $firsttask->set_month('3');
- $firsttask->set_day_of_week('4');
- $firsttask->set_day('5');
- $firsttask->set_customised('1');
- \core\task\manager::configure_scheduled_task($firsttask);
- $firsttaskrecord = \core\task\manager::record_from_scheduled_task($firsttask);
- // We reset this field, because we do not want to compare it.
- $firsttaskrecord->nextruntime = '0';
+ $task = reset($tasks);
+ $task->set_minute('1');
+ $task->set_hour('2');
+ $task->set_month('3');
+ $task->set_day_of_week('4');
+ $task->set_day('5');
+ $task->set_customised('1');
+ \core\task\manager::configure_scheduled_task($task);
+
+ // Now call reset.
+ \core\task\manager::reset_scheduled_tasks_for_component('moodle');
+
+ // Fetch the task again.
+ $taskafterreset = \core\task\manager::get_scheduled_task(get_class($task));
+
+ // The task should still be the same as the customised.
+ $this->assertTaskEquals($task, $taskafterreset);
+ }
+
+ public function test_reset_scheduled_tasks_for_component_deleted(): void {
+ global $DB;
+ $this->resetAfterTest(true);
// Delete a task to simulate the fact that its new.
- $secondtask = next($defaulttasks);
- $DB->delete_records('task_scheduled', array('classname' => '\\' . trim(get_class($secondtask), '\\')));
- $this->assertFalse(\core\task\manager::get_scheduled_task(get_class($secondtask)));
+ $tasklist = \core\task\manager::load_scheduled_tasks_for_component('moodle');
- // Edit a task to simulate a change in its definition (as if it was not customised).
- $thirdtask = next($defaulttasks);
- $thirdtask->set_minute('1');
- $thirdtask->set_hour('2');
- $thirdtask->set_month('3');
- $thirdtask->set_day_of_week('4');
- $thirdtask->set_day('5');
- $thirdtaskbefore = \core\task\manager::get_scheduled_task(get_class($thirdtask));
- $thirdtaskbefore->set_next_run_time(null); // Ignore this value when comparing.
- \core\task\manager::configure_scheduled_task($thirdtask);
- $thirdtask = \core\task\manager::get_scheduled_task(get_class($thirdtask));
- $thirdtask->set_next_run_time(null); // Ignore this value when comparing.
- $this->assertNotEquals($thirdtaskbefore, $thirdtask);
+ // Note: This test must use a task which does not use any random values.
+ $task = \core\task\manager::get_scheduled_task(core\task\session_cleanup_task::class);
+
+ $DB->delete_records('task_scheduled', array('classname' => '\\' . trim(get_class($task), '\\')));
+ $this->assertFalse(\core\task\manager::get_scheduled_task(core\task\session_cleanup_task::class));
// Now call reset on all the tasks.
\core\task\manager::reset_scheduled_tasks_for_component('moodle');
- // Load the tasks again.
- $defaulttasks = \core\task\manager::load_scheduled_tasks_for_component('moodle');
- $finalcount = count($defaulttasks);
- // Compare the first task.
- $newfirsttask = reset($defaulttasks);
- $newfirsttaskrecord = \core\task\manager::record_from_scheduled_task($newfirsttask);
- // We reset this field, because we do not want to compare it.
- $newfirsttaskrecord->nextruntime = '0';
+ // Assert that the second task was added back.
+ $taskafterreset = \core\task\manager::get_scheduled_task(core\task\session_cleanup_task::class);
+ $this->assertNotFalse($taskafterreset);
- // Assert a customised task was not altered by reset.
- $this->assertEquals($firsttaskrecord, $newfirsttaskrecord);
+ $this->assertTaskEquals($task, $taskafterreset);
+ $this->assertCount(count($tasklist), \core\task\manager::load_scheduled_tasks_for_component('moodle'));
+ }
- // Assert that the second task was added back.
- $secondtaskafter = \core\task\manager::get_scheduled_task(get_class($secondtask));
- $secondtaskafter->set_next_run_time(null); // Do not compare the nextruntime.
- $secondtask->set_next_run_time(null);
- $this->assertEquals($secondtask, $secondtaskafter);
-
- // Assert that the third task edits were overridden.
- $thirdtaskafter = \core\task\manager::get_scheduled_task(get_class($thirdtask));
- $thirdtaskafter->set_next_run_time(null);
- $this->assertEquals($thirdtaskbefore, $thirdtaskafter);
-
- // Assert we have the same number of tasks.
- $this->assertEquals($initcount, $finalcount);
+ public function test_reset_scheduled_tasks_for_component_changed_in_source(): void {
+ $this->resetAfterTest(true);
+
+ // Delete a task to simulate the fact that its new.
+ // Note: This test must use a task which does not use any random values.
+ $task = \core\task\manager::get_scheduled_task(core\task\session_cleanup_task::class);
+
+ // Get a copy of the task before maing changes for later comparison.
+ $taskbeforechange = \core\task\manager::get_scheduled_task(core\task\session_cleanup_task::class);
+
+ // Edit a task to simulate a change in its definition (as if it was not customised).
+ $task->set_minute('1');
+ $task->set_hour('2');
+ $task->set_month('3');
+ $task->set_day_of_week('4');
+ $task->set_day('5');
+ \core\task\manager::configure_scheduled_task($task);
+
+ // Fetch the task out for comparison.
+ $taskafterchange = \core\task\manager::get_scheduled_task(core\task\session_cleanup_task::class);
+
+ // The task should now be different to the original.
+ $this->assertTaskNotEquals($taskbeforechange, $taskafterchange);
+
+ // Now call reset.
+ \core\task\manager::reset_scheduled_tasks_for_component('moodle');
+
+ // Fetch the task again.
+ $taskafterreset = \core\task\manager::get_scheduled_task(core\task\session_cleanup_task::class);
+
+ // The task should now be the same as the original.
+ $this->assertTaskEquals($taskbeforechange, $taskafterreset);
}
/**
$this->assertEquals(0, $task->get_fail_delay());
$this->assertLessThan($before + 70, $task->get_next_run_time());
}
+
+ /**
+ * Assert that the specified tasks are equal.
+ *
+ * @param \core\task\task_base $task
+ * @param \core\task\task_base $comparisontask
+ */
+ public function assertTaskEquals(\core\task\task_base $task, \core\task\task_base $comparisontask): void {
+ // Convert both to an object.
+ $task = \core\task\manager::record_from_scheduled_task($task);
+ $comparisontask = \core\task\manager::record_from_scheduled_task($comparisontask);
+
+ // Reset the nextruntime field as it is intentionally dynamic.
+ $task->nextruntime = null;
+ $comparisontask->nextruntime = null;
+
+ $args = array_merge(
+ [
+ $task,
+ $comparisontask,
+ ],
+ array_slice(func_get_args(), 2)
+ );
+
+ call_user_func_array([$this, 'assertEquals'], $args);
+ }
+
+ /**
+ * Assert that the specified tasks are not equal.
+ *
+ * @param \core\task\task_base $task
+ * @param \core\task\task_base $comparisontask
+ */
+ public function assertTaskNotEquals(\core\task\task_base $task, \core\task\task_base $comparisontask): void {
+ // Convert both to an object.
+ $task = \core\task\manager::record_from_scheduled_task($task);
+ $comparisontask = \core\task\manager::record_from_scheduled_task($comparisontask);
+
+ // Reset the nextruntime field as it is intentionally dynamic.
+ $task->nextruntime = null;
+ $comparisontask->nextruntime = null;
+
+ $args = array_merge(
+ [
+ $task,
+ $comparisontask,
+ ],
+ array_slice(func_get_args(), 2)
+ );
+
+ call_user_func_array([$this, 'assertNotEquals'], $args);
+ }
}