2 // This file is part of Moodle - http://moodle.org/
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.
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/>.
18 * Expired contexts tests.
20 * @package tool_dataprivacy
21 * @copyright 2018 David Monllao
22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25 use tool_dataprivacy\api
;
26 use tool_dataprivacy\data_registry
;
27 use tool_dataprivacy\expired_context
;
29 defined('MOODLE_INTERNAL') ||
die();
33 * Expired contexts tests.
35 * @package tool_dataprivacy
36 * @copyright 2018 David Monllao
37 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
39 class tool_dataprivacy_expired_contexts_testcase
extends advanced_testcase
{
44 public function setUp() {
45 $this->resetAfterTest();
46 $this->setAdminUser();
50 * Test expired users flagging and deletion.
54 public function test_expired_users() {
57 $purpose = api
::create_purpose((object)['name' => 'p1', 'retentionperiod' => 'PT1H']);
58 $cat = api
::create_category((object)['name' => 'a']);
61 'purposeid' => $purpose->get('id'),
62 'categoryid' => $cat->get('id'),
63 'contextlevel' => CONTEXT_SYSTEM
,
65 api
::set_contextlevel($record);
66 $record->contextlevel
= CONTEXT_USER
;
67 api
::set_contextlevel($record);
69 $userdata = ['lastaccess' => '123'];
70 $user1 = $this->getDataGenerator()->create_user($userdata);
71 $user2 = $this->getDataGenerator()->create_user($userdata);
72 $user3 = $this->getDataGenerator()->create_user($userdata);
73 $user4 = $this->getDataGenerator()->create_user($userdata);
74 $user5 = $this->getDataGenerator()->create_user();
76 $course1 = $this->getDataGenerator()->create_course();
78 $course2 = $this->getDataGenerator()->create_course(['startdate' => '1', 'enddate' => '2']);
80 $course3 = $this->getDataGenerator()->create_course(['startdate' => '1', 'enddate' => time()]);
82 $this->getDataGenerator()->enrol_user($user1->id
, $course1->id
, 'student');
83 $this->getDataGenerator()->enrol_user($user2->id
, $course2->id
, 'student');
84 $this->getDataGenerator()->enrol_user($user3->id
, $course2->id
, 'student');
85 $this->getDataGenerator()->enrol_user($user4->id
, $course3->id
, 'student');
87 // Users without lastaccess are skipped as well as users enroled in courses with no end date.
88 $expired = new \tool_dataprivacy\
expired_user_contexts();
89 $numexpired = $expired->flag_expired();
90 $this->assertEquals(2, $numexpired);
91 $this->assertEquals(2, $DB->count_records('tool_dataprivacy_ctxexpired', ['status' => expired_context
::STATUS_EXPIRED
]));
93 // Approve user1 to be deleted.
94 $user2ctx = \context_user
::instance($user2->id
);
95 $expiredctx = expired_context
::get_record(['contextid' => $user2ctx->id
]);
96 api
::set_expired_context_status($expiredctx, expired_context
::STATUS_APPROVED
);
97 $this->assertEquals(1, $DB->count_records('tool_dataprivacy_ctxexpired', ['status' => expired_context
::STATUS_APPROVED
]));
99 // Delete expired contexts.
100 $deleted = $expired->delete();
101 $this->assertEquals(1, $deleted);
102 $this->assertEquals(1, $DB->count_records('tool_dataprivacy_ctxexpired', ['status' => expired_context
::STATUS_EXPIRED
]));
103 $this->assertEquals(1, $DB->count_records('tool_dataprivacy_ctxexpired', ['status' => expired_context
::STATUS_CLEANED
]));
105 // No new records are generated.
106 $numexpired = $expired->flag_expired();
107 $this->assertEquals(0, $numexpired);
108 $this->assertEquals(2, $DB->count_records('tool_dataprivacy_ctxexpired'));
109 $deleted = $expired->delete();
110 $this->assertEquals(0, $deleted);
114 * Test expired course and course stuff flagging and deletion.
118 public function test_expired_course_related_contexts() {
121 $purpose1 = api
::create_purpose((object)['name' => 'p1', 'retentionperiod' => 'PT1H']);
122 $purpose2 = api
::create_purpose((object)['name' => 'p1', 'retentionperiod' => 'P1000Y']);
123 $cat = api
::create_category((object)['name' => 'a']);
126 'purposeid' => $purpose1->get('id'),
127 'categoryid' => $cat->get('id'),
128 'contextlevel' => CONTEXT_SYSTEM
,
130 api
::set_contextlevel($record);
132 list($purposevar, $categoryvar) = data_registry
::var_names_from_context(
133 \context_helper
::get_class_for_level(CONTEXT_COURSE
)
135 set_config($purposevar, $purpose1->get('id'), 'tool_dataprivacy');
137 // A lot more time for modules.
138 list($purposevar, $categoryvar) = data_registry
::var_names_from_context(
139 \context_helper
::get_class_for_level(CONTEXT_MODULE
)
141 set_config($purposevar, $purpose2->get('id'), 'tool_dataprivacy');
143 $course1 = $this->getDataGenerator()->create_course();
146 $course2 = $this->getDataGenerator()->create_course(['startdate' => '1', 'enddate' => '2']);
147 $forum1 = $this->getDataGenerator()->create_module('forum', array('course' => $course2->id
));
148 $forum2 = $this->getDataGenerator()->create_module('forum', array('course' => $course2->id
));
150 // We want to override this last module instance purpose so we can test that modules are also
151 // returned as expired.
152 $forum2ctx = \context_module
::instance($forum2->cmid
);
154 'purposeid' => $purpose1->get('id'),
155 'categoryid' => $cat->get('id'),
156 'contextid' => $forum2ctx->id
,
158 api
::set_context_instance($record);
161 $course3 = $this->getDataGenerator()->create_course(['startdate' => '1', 'enddate' => time()]);
162 $forum3 = $this->getDataGenerator()->create_module('forum', array('course' => $course3->id
));
164 $expired = new \tool_dataprivacy\
expired_course_related_contexts();
165 $numexpired = $expired->flag_expired();
167 // Only 1 module has expired.
168 $this->assertEquals(1, $numexpired);
169 $this->assertEquals(1, $DB->count_records('tool_dataprivacy_ctxexpired', ['status' => expired_context
::STATUS_EXPIRED
]));
171 // Add a forum1 override to 1h retention period so both forum1 and course2 are also expired.
172 $forum1ctx = \context_module
::instance($forum1->cmid
);
173 $record->purposeid
= $purpose1->get('id');
174 $record->contextid
= $forum1ctx->id
;
175 api
::set_context_instance($record);
176 $numexpired = $expired->flag_expired();
177 $this->assertEquals(2, $numexpired);
178 $this->assertEquals(3, $DB->count_records('tool_dataprivacy_ctxexpired', ['status' => expired_context
::STATUS_EXPIRED
]));
180 // Approve forum1 to be deleted.
181 $expiredctx = expired_context
::get_record(['contextid' => $forum1ctx->id
]);
182 api
::set_expired_context_status($expiredctx, expired_context
::STATUS_APPROVED
);
184 // Delete expired contexts.
185 $deleted = $expired->delete();
186 $this->assertEquals(1, $deleted);
187 $this->assertEquals(1, $DB->count_records('tool_dataprivacy_ctxexpired', ['status' => expired_context
::STATUS_CLEANED
]));
189 $expiredctx = expired_context
::get_record(['contextid' => $forum2ctx->id
]);
190 api
::set_expired_context_status($expiredctx, expired_context
::STATUS_APPROVED
);
192 $course2ctx = \context_course
::instance($course2->id
);
193 $expiredctx = expired_context
::get_record(['contextid' => $course2ctx->id
]);
194 api
::set_expired_context_status($expiredctx, expired_context
::STATUS_APPROVED
);
196 // Delete expired contexts.
197 $deleted = $expired->delete();
198 $this->assertEquals(2, $deleted);
199 $this->assertEquals(3, $DB->count_records('tool_dataprivacy_ctxexpired', ['status' => expired_context
::STATUS_CLEANED
]));
201 // No new records are generated.
202 $numexpired = $expired->flag_expired();
203 $this->assertEquals(0, $numexpired);
204 $this->assertEquals(3, $DB->count_records('tool_dataprivacy_ctxexpired'));
205 $deleted = $expired->delete();
206 $this->assertEquals(0, $deleted);