MDL-62563 privacy: Add unit tests
[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();
56         // Create a user.
57         $user = $this->getDataGenerator()->create_user();
58         // Mark the user as deleted.
59         $user->deleted = 1;
60         $DB->update_record('user', $user);
62         // The user should not have a delete data request.
63         $this->assertCount(0, api::get_data_requests($user->id, [],
64                 [api::DATAREQUEST_TYPE_DELETE]));
66         $this->execute_task('tool_dataprivacy\task\delete_existing_deleted_users');
67         // After running the scheduled task, the deleted user should have a delete data request.
68         $this->assertCount(1, api::get_data_requests($user->id, [],
69                 [api::DATAREQUEST_TYPE_DELETE]));
70     }
72     /**
73      * Ensure that a delete data request for pre-existing deleted users
74      * is created when there are existing non-delete data requests
75      * for that particular user.
76      */
77     public function test_delete_existing_deleted_users_task_existing_export_data_requests() {
78         global $DB;
80         $this->resetAfterTest();
81         $this->setAdminUser();
82         // Create a user.
83         $user = $this->getDataGenerator()->create_user();
84         // Create export data request for the user.
85         api::create_data_request($user->id, api::DATAREQUEST_TYPE_EXPORT);
86         // Mark the user as deleted.
87         $user->deleted = 1;
88         $DB->update_record('user', $user);
90         // The user should have a export data request.
91         $this->assertCount(1, api::get_data_requests($user->id, [],
92                 [api::DATAREQUEST_TYPE_EXPORT]));
93         // The user should not have a delete data request.
94         $this->assertCount(0, api::get_data_requests($user->id, [],
95                 [api::DATAREQUEST_TYPE_DELETE]));
97         $this->execute_task('tool_dataprivacy\task\delete_existing_deleted_users');
98         // After running the scheduled task, the deleted user should have a delete data request.
99         $this->assertCount(1, api::get_data_requests($user->id, [],
100                 [api::DATAREQUEST_TYPE_DELETE]));
101     }
103     /**
104      * Ensure that a delete data request for pre-existing deleted users
105      * is not created when there are existing ongoing delete data requests
106      * for that particular user.
107      */
108     public function test_delete_existing_deleted_users_task_existing_ongoing_delete_data_requests() {
109         $this->resetAfterTest();
110         $this->setAdminUser();
111         // Create a user.
112         $user = $this->getDataGenerator()->create_user();
113         $this->setUser($user);
114         // Create delete data request for the user.
115         $datarequest = api::create_data_request($user->id, api::DATAREQUEST_TYPE_DELETE);
116         $requestid = $datarequest->get('id');
117         api::update_request_status($requestid, api::DATAREQUEST_STATUS_AWAITING_APPROVAL);
119         // The user should have an ongoing delete data request.
120         $this->assertCount(1, api::get_data_requests($user->id,
121                 [api::DATAREQUEST_STATUS_AWAITING_APPROVAL], [api::DATAREQUEST_TYPE_DELETE]));
123         $this->setAdminUser();
124         // Delete the user.
125         delete_user($user);
126         // The user should still have the existing ongoing delete data request.
127         $this->assertCount(1, \tool_dataprivacy\api::get_data_requests($user->id,
128                 [api::DATAREQUEST_STATUS_AWAITING_APPROVAL], [api::DATAREQUEST_TYPE_DELETE]));
130         $this->execute_task('tool_dataprivacy\task\delete_existing_deleted_users');
131         // After running the scheduled task, the user should have only one delete data request.
132         $this->assertCount(1, api::get_data_requests($user->id, [],
133                 [api::DATAREQUEST_TYPE_DELETE]));
134         // The user should not have a newly created delete data request.
135         $this->assertCount(0, api::get_data_requests($user->id,
136                 [api::DATAREQUEST_STATUS_PENDING], [api::DATAREQUEST_TYPE_DELETE]));
137     }
139     /**
140      * Ensure that a delete data request for pre-existing deleted users
141      * is not created when there are existing finished delete data requests
142      * for that particular user.
143      */
144     public function test_delete_existing_deleted_users_task_existing_finished_delete_data_requests() {
145         $this->resetAfterTest();
146         $this->setAdminUser();
147         // Create a user.
148         $user = $this->getDataGenerator()->create_user();
149         $this->setUser($user);
150         // Create delete data request for the user.
151         $datarequest = api::create_data_request($user->id, api::DATAREQUEST_TYPE_DELETE);
152         $requestid = $datarequest->get('id');
153         api::update_request_status($requestid, api::DATAREQUEST_STATUS_CANCELLED);
155         // The user should have a delete data request.
156         $this->assertCount(1, api::get_data_requests($user->id, [],
157                 [api::DATAREQUEST_TYPE_DELETE]));
158         // The user should not have an ongoing data requests.
159         $this->assertFalse(api::has_ongoing_request($user->id, api::DATAREQUEST_TYPE_DELETE));
161         $this->setAdminUser();
162         // Delete the user.
163         delete_user($user);
164         // The user should still have the existing finished delete data request.
165         $this->assertCount(1, \tool_dataprivacy\api::get_data_requests($user->id,
166                 [api::DATAREQUEST_STATUS_CANCELLED], [api::DATAREQUEST_TYPE_DELETE]));
168         $this->execute_task('tool_dataprivacy\task\delete_existing_deleted_users');
169         // After running the scheduled task, the user should still have one delete data requests.
170         $this->assertCount(1, api::get_data_requests($user->id, [],
171                 [api::DATAREQUEST_TYPE_DELETE]));
172         // The user should still have the existing finished delete data request.
173         $this->assertCount(1, \tool_dataprivacy\api::get_data_requests($user->id,
174                 [api::DATAREQUEST_STATUS_CANCELLED], [api::DATAREQUEST_TYPE_DELETE]));
175     }
177     /**
178      * Helper to execute a particular task.
179      *
180      * @param string $task The task.
181      */
182     private function execute_task($task) {
183         // Run the scheduled task.
184         ob_start();
185         $task = \core\task\manager::get_scheduled_task($task);
186         $task->execute();
187         ob_end_clean();
188     }