Merge branch 'MDL-62564-integration-master-1' of git://github.com/mihailges/moodle
[moodle.git] / admin / tool / dataprivacy / tests / task_test.php
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.
13 //
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  * Tests for scheduled tasks.
19  *
20  * @package    tool_dataprivacy
21  * @copyright  2018 Mihail Geshoski <mihail@moodle.com>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 defined('MOODLE_INTERNAL') || die();
26 require_once('data_privacy_testcase.php');
28 use tool_dataprivacy\api;
30 /**
31  * Tests for scheduled tasks.
32  *
33  * @package    tool_dataprivacy
34  * @copyright  2018 Mihail Geshoski <mihail@moodle.com>
35  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36  */
37 class tool_dataprivacy_task_testcase extends data_privacy_testcase {
39     /**
40      * Test tearDown.
41      */
42     public function tearDown() {
43         \core_privacy\local\request\writer::reset();
44     }
46     /**
47      * Ensure that a delete data request for pre-existing deleted users
48      * is created when there are not any existing data requests
49      * for that particular user.
50      */
51     public function test_delete_existing_deleted_users_task_no_previous_requests() {
52         global $DB;
54         $this->resetAfterTest();
55         $this->setAdminUser();
57         // Enable automatic creation of delete data requests.
58         set_config('automaticdeletionrequests', 1, 'tool_dataprivacy');
60         // Create a user.
61         $user = $this->getDataGenerator()->create_user();
62         // Mark the user as deleted.
63         $user->deleted = 1;
64         $DB->update_record('user', $user);
66         // The user should not have a delete data request.
67         $this->assertCount(0, api::get_data_requests($user->id, [],
68                 [api::DATAREQUEST_TYPE_DELETE]));
70         $this->execute_task('tool_dataprivacy\task\delete_existing_deleted_users');
71         // After running the scheduled task, the deleted user should have a delete data request.
72         $this->assertCount(1, api::get_data_requests($user->id, [],
73                 [api::DATAREQUEST_TYPE_DELETE]));
74     }
76     /**
77      * Ensure that a delete data request for pre-existing deleted users
78      * is not being created when automatic creation of delete data requests is disabled.
79      */
80     public function test_delete_existing_deleted_users_task_automatic_creation_disabled() {
81         global $DB;
83         $this->resetAfterTest();
84         $this->setAdminUser();
86         // Disable automatic creation of delete data requests.
87         set_config('automaticdeletionrequests', 0, 'tool_dataprivacy');
89         // Create a user.
90         $user = $this->getDataGenerator()->create_user();
91         // Mark the user as deleted.
92         $user->deleted = 1;
93         $DB->update_record('user', $user);
95         // The user should not have a delete data request.
96         $this->assertCount(0, api::get_data_requests($user->id, [],
97             [api::DATAREQUEST_TYPE_DELETE]));
99         $this->execute_task('tool_dataprivacy\task\delete_existing_deleted_users');
100         // After running the scheduled task, the deleted user should still not have a delete data request.
101         $this->assertCount(0, api::get_data_requests($user->id, [],
102             [api::DATAREQUEST_TYPE_DELETE]));
103     }
105     /**
106      * Ensure that a delete data request for pre-existing deleted users
107      * is created when there are existing non-delete data requests
108      * for that particular user.
109      */
110     public function test_delete_existing_deleted_users_task_existing_export_data_requests() {
111         global $DB;
113         $this->resetAfterTest();
114         $this->setAdminUser();
116         // Enable automatic creation of delete data requests.
117         set_config('automaticdeletionrequests', 1, 'tool_dataprivacy');
119         // Create a user.
120         $user = $this->getDataGenerator()->create_user();
121         // Create export data request for the user.
122         api::create_data_request($user->id, api::DATAREQUEST_TYPE_EXPORT);
123         // Mark the user as deleted.
124         $user->deleted = 1;
125         $DB->update_record('user', $user);
127         // The user should have a export data request.
128         $this->assertCount(1, api::get_data_requests($user->id, [],
129                 [api::DATAREQUEST_TYPE_EXPORT]));
130         // The user should not have a delete data request.
131         $this->assertCount(0, api::get_data_requests($user->id, [],
132                 [api::DATAREQUEST_TYPE_DELETE]));
134         $this->execute_task('tool_dataprivacy\task\delete_existing_deleted_users');
135         // After running the scheduled task, the deleted user should have a delete data request.
136         $this->assertCount(1, api::get_data_requests($user->id, [],
137                 [api::DATAREQUEST_TYPE_DELETE]));
138     }
140     /**
141      * Ensure that a delete data request for pre-existing deleted users
142      * is not created when there are existing ongoing delete data requests
143      * for that particular user.
144      */
145     public function test_delete_existing_deleted_users_task_existing_ongoing_delete_data_requests() {
146         global $DB;
148         $this->resetAfterTest();
149         $this->setAdminUser();
151         // Enable automatic creation of delete data requests.
152         set_config('automaticdeletionrequests', 1, 'tool_dataprivacy');
154         // Create a user.
155         $user = $this->getDataGenerator()->create_user();
156         $this->setUser($user);
157         // Create delete data request for the user.
158         $datarequest = api::create_data_request($user->id, api::DATAREQUEST_TYPE_DELETE);
159         $requestid = $datarequest->get('id');
160         api::update_request_status($requestid, api::DATAREQUEST_STATUS_AWAITING_APPROVAL);
162         // The user should have an ongoing delete data request.
163         $this->assertCount(1, api::get_data_requests($user->id,
164                 [api::DATAREQUEST_STATUS_AWAITING_APPROVAL], [api::DATAREQUEST_TYPE_DELETE]));
166         // Mark the user as deleted.
167         $user->deleted = 1;
168         $DB->update_record('user', $user);
170         // The user should still have the existing ongoing delete data request.
171         $this->assertCount(1, \tool_dataprivacy\api::get_data_requests($user->id,
172                 [api::DATAREQUEST_STATUS_AWAITING_APPROVAL], [api::DATAREQUEST_TYPE_DELETE]));
174         $this->execute_task('tool_dataprivacy\task\delete_existing_deleted_users');
175         // After running the scheduled task, the user should have only one delete data request.
176         $this->assertCount(1, api::get_data_requests($user->id, [],
177                 [api::DATAREQUEST_TYPE_DELETE]));
178         // The user should not have a newly created delete data request.
179         $this->assertCount(0, api::get_data_requests($user->id,
180                 [api::DATAREQUEST_STATUS_PENDING], [api::DATAREQUEST_TYPE_DELETE]));
181     }
183     /**
184      * Ensure that a delete data request for pre-existing deleted users
185      * is not created when there are existing finished delete data requests
186      * for that particular user.
187      */
188     public function test_delete_existing_deleted_users_task_existing_finished_delete_data_requests() {
189         global $DB;
191         $this->resetAfterTest();
192         $this->setAdminUser();
194         // Enable automatic creation of delete data requests.
195         set_config('automaticdeletionrequests', 1, 'tool_dataprivacy');
197         // Create a user.
198         $user = $this->getDataGenerator()->create_user();
199         $this->setUser($user);
200         // Create delete data request for the user.
201         $datarequest = api::create_data_request($user->id, api::DATAREQUEST_TYPE_DELETE);
202         $requestid = $datarequest->get('id');
203         api::update_request_status($requestid, api::DATAREQUEST_STATUS_CANCELLED);
205         // The user should have a delete data request.
206         $this->assertCount(1, api::get_data_requests($user->id, [],
207                 [api::DATAREQUEST_TYPE_DELETE]));
208         // The user should not have an ongoing data requests.
209         $this->assertFalse(api::has_ongoing_request($user->id, api::DATAREQUEST_TYPE_DELETE));
211         // Mark the user as deleted.
212         $user->deleted = 1;
213         $DB->update_record('user', $user);
215         // The user should still have the existing finished delete data request.
216         $this->assertCount(1, \tool_dataprivacy\api::get_data_requests($user->id,
217                 [api::DATAREQUEST_STATUS_CANCELLED], [api::DATAREQUEST_TYPE_DELETE]));
219         $this->execute_task('tool_dataprivacy\task\delete_existing_deleted_users');
220         // After running the scheduled task, the user should still have one delete data requests.
221         $this->assertCount(1, api::get_data_requests($user->id, [],
222                 [api::DATAREQUEST_TYPE_DELETE]));
223         // The user should still have the existing finished delete data request.
224         $this->assertCount(1, \tool_dataprivacy\api::get_data_requests($user->id,
225                 [api::DATAREQUEST_STATUS_CANCELLED], [api::DATAREQUEST_TYPE_DELETE]));
226     }
228     /**
229      * Helper to execute a particular task.
230      *
231      * @param string $task The task.
232      */
233     private function execute_task($task) {
234         // Run the scheduled task.
235         ob_start();
236         $task = \core\task\manager::get_scheduled_task($task);
237         $task->execute();
238         ob_end_clean();
239     }