Proyectos de Subversion Moodle

Rev

Ir a la última revisión | | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 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/>.
16
 
17
/**
18
 * Base class for unit tests for core_cohort.
19
 *
20
 * @package    core_cohort
21
 * @category   test
22
 * @copyright  2018 Sara Arjona <sara@moodle.com>
23
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24
 */
25
namespace core_cohort\privacy;
26
 
27
defined('MOODLE_INTERNAL') || die();
28
 
29
use core_cohort\privacy\provider;
30
use core_privacy\local\request\approved_contextlist;
31
use core_privacy\local\request\writer;
32
use core_privacy\tests\provider_testcase;
33
use core_privacy\local\request\approved_userlist;
34
 
35
/**
36
 * Unit tests for cohort\classes\privacy\provider.php
37
 *
38
 * @copyright  2018 Sara Arjona <sara@moodle.com>
39
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
40
 */
41
class provider_test extends provider_testcase {
42
 
43
    /**
44
     * Basic setup for these tests.
45
     */
46
    public function setUp(): void {
47
        $this->resetAfterTest(true);
48
    }
49
 
50
    /**
51
     * Test getting the context for the user ID related to this plugin.
52
     */
53
    public function test_get_contexts_for_userid() {
54
        // Create system cohort and category cohort.
55
        $coursecategory = $this->getDataGenerator()->create_category();
56
        $coursecategoryctx = \context_coursecat::instance($coursecategory->id);
57
        $systemctx = \context_system::instance();
58
        $categorycohort = $this->getDataGenerator()->create_cohort([
59
                'contextid' => $coursecategoryctx->id,
60
                'name' => 'Category cohort 1',
61
            ]);
62
        $systemcohort = $this->getDataGenerator()->create_cohort([
63
                'contextid' => $systemctx->id,
64
                'name' => 'System cohort 1'
65
            ]);
66
 
67
        // Create user and add to the system and category cohorts.
68
        $user = $this->getDataGenerator()->create_user();
69
        cohort_add_member($categorycohort->id, $user->id);
70
        cohort_add_member($systemcohort->id, $user->id);
71
 
72
        // User is member of 2 cohorts.
73
        $contextlist = provider::get_contexts_for_userid($user->id);
74
        $this->assertCount(2, (array) $contextlist->get_contextids());
75
        $this->assertContainsEquals($coursecategoryctx->id, $contextlist->get_contextids());
76
        $this->assertContainsEquals($systemctx->id, $contextlist->get_contextids());
77
    }
78
 
79
    /**
80
     * Test that data is exported correctly for this plugin.
81
     */
82
    public function test_export_user_data() {
83
        // Create system cohort and category cohort.
84
        $coursecategory = $this->getDataGenerator()->create_category();
85
        $coursecategoryctx = \context_coursecat::instance($coursecategory->id);
86
        $systemctx = \context_system::instance();
87
        $categorycohort = $this->getDataGenerator()->create_cohort([
88
                'contextid' => $coursecategoryctx->id,
89
                'name' => 'Category cohort 1',
90
            ]);
91
        $systemcohort1 = $this->getDataGenerator()->create_cohort([
92
                'contextid' => $systemctx->id,
93
                'name' => 'System cohort 1'
94
            ]);
95
        $systemcohort2 = $this->getDataGenerator()->create_cohort([
96
                'contextid' => $systemctx->id,
97
                'name' => 'System cohort 2'
98
            ]);
99
 
100
        // Create user and add to the system and category cohorts.
101
        $user = $this->getDataGenerator()->create_user();
102
        cohort_add_member($categorycohort->id, $user->id);
103
        cohort_add_member($systemcohort1->id, $user->id);
104
        cohort_add_member($systemcohort2->id, $user->id);
105
 
106
        // Validate system cohort exported data.
107
        $writer = writer::with_context($systemctx);
108
        $this->assertFalse($writer->has_any_data());
109
        $this->export_context_data_for_user($user->id, $systemctx, 'core_cohort');
110
        $data = $writer->get_related_data([], 'cohort');
111
        $this->assertCount(2, $data);
112
 
113
        // Validate category cohort exported data.
114
        $writer = writer::with_context($coursecategoryctx);
115
        $this->assertFalse($writer->has_any_data());
116
        $this->export_context_data_for_user($user->id, $coursecategoryctx, 'core_cohort');
117
        $data = $writer->get_related_data([], 'cohort');
118
        $this->assertCount(1, $data);
119
        $this->assertEquals($categorycohort->name, reset($data)->name);
120
    }
121
 
122
    /**
123
     * Test for provider::delete_data_for_all_users_in_context().
124
     */
125
    public function test_delete_data_for_all_users_in_context() {
126
        global $DB;
127
 
128
        // Create system cohort and category cohort.
129
        $coursecategory = $this->getDataGenerator()->create_category();
130
        $coursecategoryctx = \context_coursecat::instance($coursecategory->id);
131
        $systemctx = \context_system::instance();
132
        $categorycohort = $this->getDataGenerator()->create_cohort([
133
                'contextid' => $coursecategoryctx->id,
134
                'name' => 'Category cohort 1',
135
                'idnumber' => '',
136
                'description' => ''
137
            ]);
138
        $systemcohort = $this->getDataGenerator()->create_cohort([
139
                'contextid' => $systemctx->id,
140
                'name' => 'System cohort 1'
141
            ]);
142
 
143
        // Create user and add to the system and category cohorts.
144
        $user = $this->getDataGenerator()->create_user();
145
        cohort_add_member($categorycohort->id, $user->id);
146
        cohort_add_member($systemcohort->id, $user->id);
147
 
148
        // Before deletion, we should have 2 entries in the cohort_members table.
149
        $count = $DB->count_records('cohort_members');
150
        $this->assertEquals(2, $count);
151
 
152
        // Delete data based on system context.
153
        provider::delete_data_for_all_users_in_context($systemctx);
154
 
155
        // After deletion, the cohort_members entries should have been deleted.
156
        $count = $DB->count_records('cohort_members');
157
        $this->assertEquals(1, $count);
158
 
159
        // Delete data based on category context.
160
        provider::delete_data_for_all_users_in_context($coursecategoryctx);
161
 
162
        // After deletion, the cohort_members entries should have been deleted.
163
        $count = $DB->count_records('cohort_members');
164
        $this->assertEquals(0, $count);
165
    }
166
 
167
    /**
168
     * Test for provider::delete_data_for_user().
169
     */
170
    public function test_delete_data_for_user() {
171
        global $DB;
172
 
173
        // Create system cohort and category cohort.
174
        $coursecategory = $this->getDataGenerator()->create_category();
175
        $coursecategoryctx = \context_coursecat::instance($coursecategory->id);
176
        $systemctx = \context_system::instance();
177
        $categorycohort = $this->getDataGenerator()->create_cohort([
178
                'contextid' => $coursecategoryctx->id,
179
                'name' => 'Category cohort 1',
180
                'idnumber' => '',
181
                'description' => ''
182
            ]);
183
        $systemcohort = $this->getDataGenerator()->create_cohort([
184
                'contextid' => $systemctx->id,
185
                'name' => 'System cohort 1'
186
            ]);
187
 
188
        // Create user and add to the system and category cohorts.
189
        $user1 = $this->getDataGenerator()->create_user();
190
        cohort_add_member($categorycohort->id, $user1->id);
191
        cohort_add_member($systemcohort->id, $user1->id);
192
 
193
        // Create another user and add to the system and category cohorts.
194
        $user2 = $this->getDataGenerator()->create_user();
195
        cohort_add_member($categorycohort->id, $user2->id);
196
        cohort_add_member($systemcohort->id, $user2->id);
197
 
198
        // Create another user and add to the system cohort.
199
        $user3 = $this->getDataGenerator()->create_user();
200
        cohort_add_member($systemcohort->id, $user3->id);
201
 
202
        // Before deletion, we should have 5 entries in the cohort_members table.
203
        $count = $DB->count_records('cohort_members');
204
        $this->assertEquals(5, $count);
205
 
206
        $contextlist = provider::get_contexts_for_userid($user1->id);
207
        $contexts = [];
208
        $contexts[] = \context_user::instance($user1->id)->id;
209
        $contexts = array_merge($contexts, $contextlist->get_contextids());
210
        $approvedcontextlist = new approved_contextlist($user1, 'cohort', $contexts);
211
        provider::delete_data_for_user($approvedcontextlist);
212
 
213
        // After deletion, the cohort_members entries for the first student should have been deleted.
214
        $count = $DB->count_records('cohort_members', ['userid' => $user1->id]);
215
        $this->assertEquals(0, $count);
216
        $count = $DB->count_records('cohort_members');
217
        $this->assertEquals(3, $count);
218
 
219
        // Confirm that the cohorts hasn't been removed.
220
        $cohortscount = $DB->get_records('cohort');
221
        $this->assertCount(2, (array) $cohortscount);
222
    }
223
 
224
    /**
225
     * Test that only users within a course context are fetched.
226
     */
227
    public function test_get_users_in_context() {
228
        $component = 'core_cohort';
229
 
230
        // Create system cohort and category cohort.
231
        $coursecategory = $this->getDataGenerator()->create_category();
232
        $coursecategoryctx = \context_coursecat::instance($coursecategory->id);
233
        $systemctx = \context_system::instance();
234
        $categorycohort = $this->getDataGenerator()->create_cohort([
235
            'contextid' => $coursecategoryctx->id,
236
            'name' => 'Category cohort 1',
237
        ]);
238
        // Create user.
239
        $user = $this->getDataGenerator()->create_user();
240
        $userctx = \context_user::instance($user->id);
241
 
242
        $userlist1 = new \core_privacy\local\request\userlist($coursecategoryctx, $component);
243
        provider::get_users_in_context($userlist1);
244
        $this->assertCount(0, $userlist1);
245
 
246
        $userlist2 = new \core_privacy\local\request\userlist($systemctx, $component);
247
        provider::get_users_in_context($userlist2);
248
        $this->assertCount(0, $userlist2);
249
 
250
        $systemcohort = $this->getDataGenerator()->create_cohort([
251
            'contextid' => $systemctx->id,
252
            'name' => 'System cohort 1'
253
        ]);
254
        // Create user and add to the system and category cohorts.
255
        cohort_add_member($categorycohort->id, $user->id);
256
        cohort_add_member($systemcohort->id, $user->id);
257
 
258
        // The list of users within the coursecat context should contain user.
259
        $userlist1 = new \core_privacy\local\request\userlist($coursecategoryctx, $component);
260
        provider::get_users_in_context($userlist1);
261
        $this->assertCount(1, $userlist1);
262
        $expected = [$user->id];
263
        $actual = $userlist1->get_userids();
264
        $this->assertEquals($expected, $actual);
265
 
266
        // The list of users within the system context should contain user.
267
        $userlist2 = new \core_privacy\local\request\userlist($systemctx, $component);
268
        provider::get_users_in_context($userlist2);
269
        $this->assertCount(1, $userlist2);
270
        $expected = [$user->id];
271
        $actual = $userlist2->get_userids();
272
        $this->assertEquals($expected, $actual);
273
 
274
        // The list of users within the user context should be empty.
275
        $userlist3 = new \core_privacy\local\request\userlist($userctx, $component);
276
        provider::get_users_in_context($userlist3);
277
        $this->assertCount(0, $userlist3);
278
    }
279
 
280
    /**
281
     * Test that data for users in approved userlist is deleted.
282
     */
283
    public function test_delete_data_for_users() {
284
        $component = 'core_cohort';
285
 
286
        // Create system cohort and category cohort.
287
        $coursecategory = $this->getDataGenerator()->create_category();
288
        $coursecategoryctx = \context_coursecat::instance($coursecategory->id);
289
        $systemctx = \context_system::instance();
290
        $categorycohort = $this->getDataGenerator()->create_cohort([
291
            'contextid' => $coursecategoryctx->id,
292
            'name' => 'Category cohort 1',
293
        ]);
294
        // Create user1.
295
        $user1 = $this->getDataGenerator()->create_user();
296
        $userctx1 = \context_user::instance($user1->id);
297
        // Create user2.
298
        $user2 = $this->getDataGenerator()->create_user();
299
 
300
        $systemcohort = $this->getDataGenerator()->create_cohort([
301
            'contextid' => $systemctx->id,
302
            'name' => 'System cohort 1'
303
        ]);
304
        // Create user and add to the system and category cohorts.
305
        cohort_add_member($categorycohort->id, $user1->id);
306
        cohort_add_member($systemcohort->id, $user1->id);
307
        cohort_add_member($categorycohort->id, $user2->id);
308
 
309
        $userlist1 = new \core_privacy\local\request\userlist($coursecategoryctx, $component);
310
        provider::get_users_in_context($userlist1);
311
        $this->assertCount(2, $userlist1);
312
 
313
        $userlist2 = new \core_privacy\local\request\userlist($systemctx, $component);
314
        provider::get_users_in_context($userlist2);
315
        $this->assertCount(1, $userlist2);
316
 
317
        // Convert $userlist1 into an approved_contextlist.
318
        $approvedlist1 = new approved_userlist($coursecategoryctx, $component, $userlist1->get_userids());
319
        // Delete using delete_data_for_user.
320
        provider::delete_data_for_users($approvedlist1);
321
 
322
        // Re-fetch users in coursecategoryctx.
323
        $userlist1 = new \core_privacy\local\request\userlist($coursecategoryctx, $component);
324
        provider::get_users_in_context($userlist1);
325
        // The user data in coursecategoryctx should be deleted.
326
        $this->assertCount(0, $userlist1);
327
        // Re-fetch users in coursecategoryctx.
328
        $userlist2 = new \core_privacy\local\request\userlist($systemctx, $component);
329
        provider::get_users_in_context($userlist2);
330
        // The user data in coursecontext2 should be still present.
331
        $this->assertCount(1, $userlist2);
332
 
333
        // Convert $userlist2 into an approved_contextlist in the user context.
334
        $approvedlist3 = new approved_userlist($userctx1, $component, $userlist2->get_userids());
335
        // Delete using delete_data_for_user.
336
        provider::delete_data_for_users($approvedlist3);
337
        // Re-fetch users in coursecontext1.
338
        $userlist3 = new \core_privacy\local\request\userlist($systemctx, $component);
339
        provider::get_users_in_context($userlist3);
340
        // The user data in systemcontext should not be deleted.
341
        $this->assertCount(1, $userlist3);
342
    }
343
}