MDL-58454 badges: Fix some minor errors for Open Badges v2
[moodle.git] / lib / tests / adhoc_task_test.php
blob2b8b7d1e19dc5ea47994a4bfb90ce201a8eca223
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
17 /**
18 * This file contains the unittests for adhock tasks.
20 * @package core
21 * @category phpunit
22 * @copyright 2013 Damyon Wiese
23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
26 defined('MOODLE_INTERNAL') || die();
27 require_once(__DIR__ . '/fixtures/task_fixtures.php');
30 /**
31 * Test class for adhoc tasks.
33 * @package core
34 * @category task
35 * @copyright 2013 Damyon Wiese
36 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38 class core_adhoc_task_testcase extends advanced_testcase {
40 /**
41 * Test basic adhoc task execution.
43 public function test_get_next_adhoc_task_now() {
44 $this->resetAfterTest(true);
46 // Create an adhoc task.
47 $task = new \core\task\adhoc_test_task();
49 // Queue it.
50 \core\task\manager::queue_adhoc_task($task);
52 $now = time();
53 // Get it from the scheduler.
54 $task = \core\task\manager::get_next_adhoc_task($now);
55 $this->assertInstanceOf('\\core\\task\\adhoc_test_task', $task);
56 $task->execute();
57 \core\task\manager::adhoc_task_complete($task);
60 /**
61 * Test adhoc task failure retry backoff.
63 public function test_get_next_adhoc_task_fail_retry() {
64 $this->resetAfterTest(true);
66 // Create an adhoc task.
67 $task = new \core\task\adhoc_test_task();
68 \core\task\manager::queue_adhoc_task($task);
70 $now = time();
72 // Get it from the scheduler, execute it, and mark it as failed.
73 $task = \core\task\manager::get_next_adhoc_task($now);
74 $task->execute();
75 \core\task\manager::adhoc_task_failed($task);
77 // The task will not be returned immediately.
78 $this->assertNull(\core\task\manager::get_next_adhoc_task($now));
80 // Should get the adhoc task (retry after delay).
81 $task = \core\task\manager::get_next_adhoc_task($now + 120);
82 $this->assertInstanceOf('\\core\\task\\adhoc_test_task', $task);
83 $task->execute();
85 \core\task\manager::adhoc_task_complete($task);
87 // Should not get any task.
88 $this->assertNull(\core\task\manager::get_next_adhoc_task($now));
91 /**
92 * Test future adhoc task execution.
94 public function test_get_next_adhoc_task_future() {
95 $this->resetAfterTest(true);
97 $now = time();
98 // Create an adhoc task in future.
99 $task = new \core\task\adhoc_test_task();
100 $task->set_next_run_time($now + 1000);
101 \core\task\manager::queue_adhoc_task($task);
103 // Fetching the next task should not return anything.
104 $this->assertNull(\core\task\manager::get_next_adhoc_task($now));
106 // Fetching in the future should return the task.
107 $task = \core\task\manager::get_next_adhoc_task($now + 1020);
108 $this->assertInstanceOf('\\core\\task\\adhoc_test_task', $task);
109 $task->execute();
110 \core\task\manager::adhoc_task_complete($task);
114 * Test empty set of adhoc tasks
116 public function test_get_adhoc_tasks_empty_set() {
117 $this->resetAfterTest(true);
119 $this->assertEquals([], \core\task\manager::get_adhoc_tasks('\\core\\task\\adhoc_test_task'));
123 * Test correct set of adhoc tasks is returned for class.
125 public function test_get_adhoc_tasks_result_set() {
126 $this->resetAfterTest(true);
128 for ($i = 0; $i < 3; $i++) {
129 $task = new \core\task\adhoc_test_task();
130 \core\task\manager::queue_adhoc_task($task);
133 for ($i = 0; $i < 3; $i++) {
134 $task = new \core\task\adhoc_test2_task();
135 \core\task\manager::queue_adhoc_task($task);
138 $adhoctests = \core\task\manager::get_adhoc_tasks('\\core\\task\\adhoc_test_task');
139 $adhoctest2s = \core\task\manager::get_adhoc_tasks('\\core\\task\\adhoc_test2_task');
141 $this->assertCount(3, $adhoctests);
142 $this->assertCount(3, $adhoctest2s);
144 foreach ($adhoctests as $task) {
145 $this->assertInstanceOf('\\core\\task\\adhoc_test_task', $task);
148 foreach ($adhoctest2s as $task) {
149 $this->assertInstanceOf('\\core\\task\\adhoc_test2_task', $task);
154 * Test queue_adhoc_task "if not scheduled".
156 public function test_queue_adhoc_task_if_not_scheduled() {
157 $this->resetAfterTest(true);
158 $user = \core_user::get_user_by_username('admin');
160 // Schedule adhoc task.
161 $task = new \core\task\adhoc_test_task();
162 $task->set_custom_data(array('courseid' => 10));
163 $this->assertNotEmpty(\core\task\manager::queue_adhoc_task($task, true));
164 $this->assertEquals(1, count(\core\task\manager::get_adhoc_tasks('core\task\adhoc_test_task')));
166 // Schedule adhoc task with a user.
167 $task = new \core\task\adhoc_test_task();
168 $task->set_custom_data(array('courseid' => 10));
169 $task->set_userid($user->id);
170 $this->assertNotEmpty(\core\task\manager::queue_adhoc_task($task, true));
171 $this->assertEquals(2, count(\core\task\manager::get_adhoc_tasks('core\task\adhoc_test_task')));
173 // Schedule same adhoc task with different custom data.
174 $task = new \core\task\adhoc_test_task();
175 $task->set_custom_data(array('courseid' => 1));
176 $this->assertNotEmpty(\core\task\manager::queue_adhoc_task($task, true));
177 $this->assertEquals(3, count(\core\task\manager::get_adhoc_tasks('core\task\adhoc_test_task')));
179 // Schedule same adhoc task with same custom data.
180 $task = new \core\task\adhoc_test_task();
181 $task->set_custom_data(array('courseid' => 1));
182 $this->assertEmpty(\core\task\manager::queue_adhoc_task($task, true));
183 $this->assertEquals(3, count(\core\task\manager::get_adhoc_tasks('core\task\adhoc_test_task')));
185 // Schedule same adhoc task with same custom data and a user.
186 $task = new \core\task\adhoc_test_task();
187 $task->set_custom_data(array('courseid' => 1));
188 $task->set_userid($user->id);
189 $this->assertNotEmpty(\core\task\manager::queue_adhoc_task($task, true));
190 $this->assertEquals(4, count(\core\task\manager::get_adhoc_tasks('core\task\adhoc_test_task')));
192 // Schedule same adhoc task without custom data.
193 // Note: This task was created earlier.
194 $task = new \core\task\adhoc_test_task();
195 $this->assertNotEmpty(\core\task\manager::queue_adhoc_task($task, true));
196 $this->assertEquals(5, count(\core\task\manager::get_adhoc_tasks('core\task\adhoc_test_task')));
198 // Schedule same adhoc task without custom data (again).
199 $task5 = new \core\task\adhoc_test_task();
200 $this->assertEmpty(\core\task\manager::queue_adhoc_task($task5, true));
201 $this->assertEquals(5, count(\core\task\manager::get_adhoc_tasks('core\task\adhoc_test_task')));
203 // Schedule same adhoc task without custom data but with a userid.
204 $task6 = new \core\task\adhoc_test_task();
205 $user = \core_user::get_user_by_username('admin');
206 $task6->set_userid($user->id);
207 $this->assertNotEmpty(\core\task\manager::queue_adhoc_task($task6, true));
208 $this->assertEquals(6, count(\core\task\manager::get_adhoc_tasks('core\task\adhoc_test_task')));
210 // Schedule same adhoc task again without custom data but with a userid.
211 $task6 = new \core\task\adhoc_test_task();
212 $user = \core_user::get_user_by_username('admin');
213 $task6->set_userid($user->id);
214 $this->assertEmpty(\core\task\manager::queue_adhoc_task($task6, true));
215 $this->assertEquals(6, count(\core\task\manager::get_adhoc_tasks('core\task\adhoc_test_task')));
219 * Test that when no userid is specified, it returns empty from the DB
220 * too.
222 public function test_adhoc_task_user_empty() {
223 $this->resetAfterTest(true);
225 // Create an adhoc task in future.
226 $task = new \core\task\adhoc_test_task();
227 \core\task\manager::queue_adhoc_task($task);
229 // Get it back from the scheduler.
230 $now = time();
231 $task = \core\task\manager::get_next_adhoc_task($now);
232 \core\task\manager::adhoc_task_complete($task);
234 $this->assertEmpty($task->get_userid());
238 * Test that when a userid is specified, that userid is subsequently
239 * returned.
241 public function test_adhoc_task_user_set() {
242 $this->resetAfterTest(true);
244 // Create an adhoc task in future.
245 $task = new \core\task\adhoc_test_task();
246 $user = \core_user::get_user_by_username('admin');
247 $task->set_userid($user->id);
248 \core\task\manager::queue_adhoc_task($task);
250 // Get it back from the scheduler.
251 $now = time();
252 $task = \core\task\manager::get_next_adhoc_task($now);
253 \core\task\manager::adhoc_task_complete($task);
255 $this->assertEquals($user->id, $task->get_userid());