Proyectos de Subversion Moodle

Rev

Rev 11 | | Comparar con el anterior | 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
 * Data provider tests.
19
 *
20
 * @package    core_block
21
 * @category   test
22
 * @copyright  2018 Frédéric Massart
23
 * @author     Frédéric Massart <fred@branchup.tech>
24
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25
 */
26
namespace core_block\privacy;
27
 
28
defined('MOODLE_INTERNAL') || die();
29
global $CFG;
30
 
31
use core_privacy\tests\provider_testcase;
32
use core_privacy\local\request\approved_contextlist;
33
use core_privacy\local\request\transform;
34
use core_privacy\local\request\writer;
35
use core_block\privacy\provider;
36
 
37
/**
38
 * Data provider testcase class.
39
 *
40
 * @package    core_block
41
 * @category   test
42
 * @copyright  2018 Frédéric Massart
43
 * @author     Frédéric Massart <fred@branchup.tech>
44
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
45
 */
1441 ariadna 46
final class provider_test extends provider_testcase {
1 efrain 47
 
48
    public function setUp(): void {
1441 ariadna 49
        parent::setUp();
1 efrain 50
        $this->resetAfterTest();
51
    }
52
 
11 efrain 53
    public function test_get_contexts_for_userid(): void {
1 efrain 54
        $dg = $this->getDataGenerator();
55
        $c1 = $dg->create_course();
56
        $c2 = $dg->create_course();
57
        $u1 = $dg->create_user();
58
        $u2 = $dg->create_user();
59
        $c1ctx = \context_course::instance($c1->id);
60
        $c2ctx = \context_course::instance($c2->id);
61
        $u1ctx = \context_user::instance($u1->id);
62
        $u2ctx = \context_user::instance($u2->id);
63
 
64
        $manager = $this->get_block_manager(['region-a'], $c1ctx);
65
        $manager->add_block('myprofile', 'region-a', 0, false);
66
        $manager->load_blocks();
67
        $blockmyprofile = $manager->get_blocks_for_region('region-a')[0];
68
 
69
        $manager = $this->get_block_manager(['region-a'], $c2ctx);
70
        $manager->add_block('login', 'region-a', 0, false);
71
        $manager->add_block('mentees', 'region-a', 1, false);
72
        $manager->load_blocks();
73
        list($blocklogin, $blockmentees) = $manager->get_blocks_for_region('region-a');
74
 
75
        $manager = $this->get_block_manager(['region-a'], $u1ctx);
76
        $manager->add_block('private_files', 'region-a', 0, false);
77
        $manager->load_blocks();
78
        $blockprivatefiles = $manager->get_blocks_for_region('region-a')[0];
79
 
80
        $this->set_hidden_pref($blocklogin, true, $u1->id);
81
        $this->set_hidden_pref($blockprivatefiles, true, $u1->id);
82
        $this->set_docked_pref($blockmyprofile, true, $u1->id);
83
        $this->set_docked_pref($blockmentees, true, $u1->id);
84
        $this->set_docked_pref($blockmentees, true, $u2->id);
85
 
86
        $contextids = provider::get_contexts_for_userid($u1->id)->get_contextids();
87
        $this->assertCount(4, $contextids);
88
        $this->assertTrue(in_array($blocklogin->context->id, $contextids));
89
        $this->assertTrue(in_array($blockprivatefiles->context->id, $contextids));
90
        $this->assertTrue(in_array($blockmyprofile->context->id, $contextids));
91
        $this->assertTrue(in_array($blockmentees->context->id, $contextids));
92
 
93
        $contextids = provider::get_contexts_for_userid($u2->id)->get_contextids();
94
        $this->assertCount(1, $contextids);
95
        $this->assertTrue(in_array($blockmentees->context->id, $contextids));
96
    }
97
 
98
    /**
99
     * Test that user IDs are returned for a given context.
100
     */
11 efrain 101
    public function test_get_users_in_context(): void {
1 efrain 102
        global $DB;
103
        $u1 = $this->getDataGenerator()->create_user();
104
        $u2 = $this->getDataGenerator()->create_user();
105
        $u3 = $this->getDataGenerator()->create_user();
106
 
107
        $course = $this->getDataGenerator()->create_course();
108
 
109
        $manager = $this->get_block_manager(['region-a'], \context_course::instance($course->id));
110
        $manager->add_block('myprofile', 'region-a', 0, false);
111
        $manager->load_blocks();
112
        $blockmyprofile = $manager->get_blocks_for_region('region-a')[0];
113
 
114
        $this->set_hidden_pref($blockmyprofile, true, $u1->id);
115
        $this->set_hidden_pref($blockmyprofile, true, $u3->id);
116
        $this->set_docked_pref($blockmyprofile, true, $u2->id);
117
        $this->set_docked_pref($blockmyprofile, true, $u3->id);
118
 
119
        $records = $DB->get_records('block_instances', ['blockname' => 'myprofile']);
120
        $record = array_shift($records);
121
        $blockcontext = \context_block::instance($record->id);
122
 
123
        $userlist = new \core_privacy\local\request\userlist($blockcontext, 'core_block');
124
        provider::get_users_in_context($userlist);
125
        $this->assertCount(3, $userlist->get_userids());
126
    }
127
 
128
 
11 efrain 129
    public function test_delete_data_for_user(): void {
1 efrain 130
        global $DB;
131
        $dg = $this->getDataGenerator();
132
        $c1 = $dg->create_course();
133
        $c2 = $dg->create_course();
134
        $u1 = $dg->create_user();
135
        $u2 = $dg->create_user();
136
        $c1ctx = \context_course::instance($c1->id);
137
        $c2ctx = \context_course::instance($c2->id);
138
        $u1ctx = \context_user::instance($u1->id);
139
        $u2ctx = \context_user::instance($u2->id);
140
 
141
        $manager = $this->get_block_manager(['region-a'], $c1ctx);
142
        $manager->add_block('myprofile', 'region-a', 0, false);
143
        $manager->load_blocks();
144
        $blockmyprofile = $manager->get_blocks_for_region('region-a')[0];
145
 
146
        $manager = $this->get_block_manager(['region-a'], $c2ctx);
147
        $manager->add_block('login', 'region-a', 0, false);
148
        $manager->add_block('mentees', 'region-a', 1, false);
149
        $manager->load_blocks();
150
        list($blocklogin, $blockmentees) = $manager->get_blocks_for_region('region-a');
151
 
152
        $manager = $this->get_block_manager(['region-a'], $u1ctx);
153
        $manager->add_block('private_files', 'region-a', 0, false);
154
        $manager->load_blocks();
155
        $blockprivatefiles = $manager->get_blocks_for_region('region-a')[0];
156
 
157
        $this->set_hidden_pref($blocklogin, true, $u1->id);
158
        $this->set_hidden_pref($blocklogin, true, $u2->id);
159
        $this->set_hidden_pref($blockprivatefiles, true, $u1->id);
160
        $this->set_hidden_pref($blockmyprofile, true, $u1->id);
161
        $this->set_docked_pref($blockmyprofile, true, $u1->id);
162
        $this->set_docked_pref($blockmentees, true, $u1->id);
163
        $this->set_docked_pref($blockmentees, true, $u2->id);
164
 
165
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
166
            'name' => "block{$blocklogin->instance->id}hidden"]));
167
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u2->id,
168
            'name' => "block{$blocklogin->instance->id}hidden"]));
169
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
170
            'name' => "block{$blockprivatefiles->instance->id}hidden"]));
171
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
172
            'name' => "block{$blockmyprofile->instance->id}hidden"]));
173
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
174
            'name' => "docked_block_instance_{$blockmyprofile->instance->id}"]));
175
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
176
            'name' => "docked_block_instance_{$blockmentees->instance->id}"]));
177
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u2->id,
178
            'name' => "docked_block_instance_{$blockmentees->instance->id}"]));
179
 
180
        provider::delete_data_for_user(new approved_contextlist($u1, 'core_block', [$blocklogin->context->id,
181
            $blockmyprofile->context->id, $blockmentees->context->id]));
182
 
183
        $this->assertFalse($DB->record_exists('user_preferences', ['userid' => $u1->id,
184
            'name' => "block{$blocklogin->instance->id}hidden"]));
185
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u2->id,
186
            'name' => "block{$blocklogin->instance->id}hidden"]));
187
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
188
            'name' => "block{$blockprivatefiles->instance->id}hidden"]));
189
        $this->assertFalse($DB->record_exists('user_preferences', ['userid' => $u1->id,
190
            'name' => "block{$blockmyprofile->instance->id}hidden"]));
191
        $this->assertFalse($DB->record_exists('user_preferences', ['userid' => $u1->id,
192
            'name' => "docked_block_instance_{$blockmyprofile->instance->id}"]));
193
        $this->assertFalse($DB->record_exists('user_preferences', ['userid' => $u1->id,
194
            'name' => "docked_block_instance_{$blockmentees->instance->id}"]));
195
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u2->id,
196
            'name' => "docked_block_instance_{$blockmentees->instance->id}"]));
197
    }
198
 
11 efrain 199
    public function test_delete_data_for_all_users_in_context(): void {
1 efrain 200
        global $DB;
201
        $dg = $this->getDataGenerator();
202
        $c1 = $dg->create_course();
203
        $c2 = $dg->create_course();
204
        $u1 = $dg->create_user();
205
        $u2 = $dg->create_user();
206
        $c1ctx = \context_course::instance($c1->id);
207
        $c2ctx = \context_course::instance($c2->id);
208
        $u1ctx = \context_user::instance($u1->id);
209
        $u2ctx = \context_user::instance($u2->id);
210
 
211
        $manager = $this->get_block_manager(['region-a'], $c1ctx);
212
        $manager->add_block('myprofile', 'region-a', 0, false);
213
        $manager->load_blocks();
214
        $blockmyprofile = $manager->get_blocks_for_region('region-a')[0];
215
 
216
        $manager = $this->get_block_manager(['region-a'], $c2ctx);
217
        $manager->add_block('login', 'region-a', 0, false);
218
        $manager->add_block('mentees', 'region-a', 1, false);
219
        $manager->load_blocks();
220
        list($blocklogin, $blockmentees) = $manager->get_blocks_for_region('region-a');
221
 
222
        $manager = $this->get_block_manager(['region-a'], $u1ctx);
223
        $manager->add_block('private_files', 'region-a', 0, false);
224
        $manager->load_blocks();
225
        $blockprivatefiles = $manager->get_blocks_for_region('region-a')[0];
226
 
227
        $this->set_hidden_pref($blocklogin, true, $u1->id);
228
        $this->set_hidden_pref($blocklogin, true, $u2->id);
229
        $this->set_hidden_pref($blockprivatefiles, true, $u1->id);
230
        $this->set_hidden_pref($blockmyprofile, true, $u1->id);
231
        $this->set_docked_pref($blockmyprofile, true, $u1->id);
232
        $this->set_docked_pref($blockmentees, true, $u1->id);
233
        $this->set_docked_pref($blockmentees, true, $u2->id);
234
 
235
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
236
            'name' => "block{$blocklogin->instance->id}hidden"]));
237
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u2->id,
238
            'name' => "block{$blocklogin->instance->id}hidden"]));
239
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
240
            'name' => "block{$blockprivatefiles->instance->id}hidden"]));
241
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
242
            'name' => "block{$blockmyprofile->instance->id}hidden"]));
243
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
244
            'name' => "docked_block_instance_{$blockmyprofile->instance->id}"]));
245
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
246
            'name' => "docked_block_instance_{$blockmentees->instance->id}"]));
247
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u2->id,
248
            'name' => "docked_block_instance_{$blockmentees->instance->id}"]));
249
 
250
        // Nothing happens.
251
        provider::delete_data_for_all_users_in_context($c1ctx);
252
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
253
            'name' => "block{$blocklogin->instance->id}hidden"]));
254
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u2->id,
255
            'name' => "block{$blocklogin->instance->id}hidden"]));
256
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
257
            'name' => "block{$blockprivatefiles->instance->id}hidden"]));
258
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
259
            'name' => "block{$blockmyprofile->instance->id}hidden"]));
260
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
261
            'name' => "docked_block_instance_{$blockmyprofile->instance->id}"]));
262
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
263
            'name' => "docked_block_instance_{$blockmentees->instance->id}"]));
264
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u2->id,
265
            'name' => "docked_block_instance_{$blockmentees->instance->id}"]));
266
 
267
        // Delete one block.
268
        provider::delete_data_for_all_users_in_context($blocklogin->context);
269
        $this->assertFalse($DB->record_exists('user_preferences', ['userid' => $u1->id,
270
            'name' => "block{$blocklogin->instance->id}hidden"]));
271
        $this->assertFalse($DB->record_exists('user_preferences', ['userid' => $u2->id,
272
            'name' => "block{$blocklogin->instance->id}hidden"]));
273
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
274
            'name' => "block{$blockprivatefiles->instance->id}hidden"]));
275
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
276
            'name' => "block{$blockmyprofile->instance->id}hidden"]));
277
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
278
            'name' => "docked_block_instance_{$blockmyprofile->instance->id}"]));
279
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
280
            'name' => "docked_block_instance_{$blockmentees->instance->id}"]));
281
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u2->id,
282
            'name' => "docked_block_instance_{$blockmentees->instance->id}"]));
283
 
284
        // Delete another block.
285
        provider::delete_data_for_all_users_in_context($blockmyprofile->context);
286
        $this->assertFalse($DB->record_exists('user_preferences', ['userid' => $u1->id,
287
            'name' => "block{$blocklogin->instance->id}hidden"]));
288
        $this->assertFalse($DB->record_exists('user_preferences', ['userid' => $u2->id,
289
            'name' => "block{$blocklogin->instance->id}hidden"]));
290
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
291
            'name' => "block{$blockprivatefiles->instance->id}hidden"]));
292
        $this->assertFalse($DB->record_exists('user_preferences', ['userid' => $u1->id,
293
            'name' => "block{$blockmyprofile->instance->id}hidden"]));
294
        $this->assertFalse($DB->record_exists('user_preferences', ['userid' => $u1->id,
295
            'name' => "docked_block_instance_{$blockmyprofile->instance->id}"]));
296
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u1->id,
297
            'name' => "docked_block_instance_{$blockmentees->instance->id}"]));
298
        $this->assertTrue($DB->record_exists('user_preferences', ['userid' => $u2->id,
299
            'name' => "docked_block_instance_{$blockmentees->instance->id}"]));
300
    }
301
 
302
    /**
303
     * Test the deletion of data related to a context and a list of users.
304
     */
11 efrain 305
    public function test_delete_data_for_users(): void {
1 efrain 306
        global $DB;
307
        $u1 = $this->getDataGenerator()->create_user();
308
        $u2 = $this->getDataGenerator()->create_user();
309
        $u3 = $this->getDataGenerator()->create_user();
310
 
311
        $course = $this->getDataGenerator()->create_course();
312
 
313
        $manager = $this->get_block_manager(['region-a'], \context_course::instance($course->id));
314
        $manager->add_block('myprofile', 'region-a', 0, false);
315
        $manager->load_blocks();
316
        $blockmyprofile = $manager->get_blocks_for_region('region-a')[0];
317
 
318
        $this->set_hidden_pref($blockmyprofile, true, $u1->id);
319
        $this->set_hidden_pref($blockmyprofile, true, $u3->id);
320
        $this->set_docked_pref($blockmyprofile, true, $u2->id);
321
        $this->set_docked_pref($blockmyprofile, true, $u3->id);
322
 
323
        $records = $DB->get_records('block_instances', ['blockname' => 'myprofile']);
324
        $record = array_shift($records);
325
        $blockcontext = \context_block::instance($record->id);
326
 
327
        $userlist = new \core_privacy\local\request\userlist($blockcontext, 'core_block');
328
        provider::get_users_in_context($userlist);
329
        $this->assertCount(3, $userlist->get_userids());
330
 
331
        // Delete preferences for user 1 and 3 for the my profile block.
332
        $userlist = new \core_privacy\local\request\approved_userlist($blockcontext, 'core_block', [$u1->id, $u3->id]);
333
        provider::delete_data_for_users($userlist);
334
 
335
        // Only user 2's preference is left.
336
        $this->assertCount(1, $DB->get_records('user_preferences',
337
                ['name' => "docked_block_instance_{$blockcontext->instanceid}"]));
338
        // All of these are gone.
339
        $this->assertEmpty($DB->get_records('user_preferences',
340
                ['name' => "block{$blockcontext->instanceid}hidden"]));
341
    }
342
 
11 efrain 343
    public function test_export_data_for_user(): void {
1 efrain 344
        global $DB;
345
        $dg = $this->getDataGenerator();
346
        $c1 = $dg->create_course();
347
        $c2 = $dg->create_course();
348
        $u1 = $dg->create_user();
349
        $u2 = $dg->create_user();
350
        $c1ctx = \context_course::instance($c1->id);
351
        $c2ctx = \context_course::instance($c2->id);
352
        $u1ctx = \context_user::instance($u1->id);
353
        $u2ctx = \context_user::instance($u2->id);
354
        $yes = transform::yesno(true);
355
        $no = transform::yesno(false);
356
 
357
        $manager = $this->get_block_manager(['region-a'], $c1ctx);
358
        $manager->add_block('myprofile', 'region-a', 0, false);
359
        $manager->add_block('login', 'region-a', 1, false);
360
        $manager->add_block('mentees', 'region-a', 2, false);
361
        $manager->add_block('private_files', 'region-a', 3, false);
362
        $manager->load_blocks();
363
        list($bmyprofile, $blogin, $bmentees, $bprivatefiles) = $manager->get_blocks_for_region('region-a');
364
 
365
        // Set some user preferences.
366
        $this->set_hidden_pref($blogin, true, $u1->id);
367
        $this->set_docked_pref($blogin, false, $u1->id);
368
        $this->set_docked_pref($blogin, true, $u2->id);
369
        $this->set_hidden_pref($bprivatefiles, false, $u1->id);
370
        $this->set_docked_pref($bprivatefiles, true, $u2->id);
371
        $this->set_docked_pref($bmyprofile, true, $u1->id);
372
        $this->set_docked_pref($bmentees, true, $u2->id);
373
 
374
        // Export data.
375
        provider::export_user_data(new approved_contextlist($u1, 'core_block', [$bmyprofile->context->id, $blogin->context->id,
376
            $bmentees->context->id, $bprivatefiles->context->id]));
377
        $prefs = writer::with_context($bmentees->context)->get_user_context_preferences('core_block');
378
        $this->assertEmpty((array) $prefs);
379
 
380
        $prefs = writer::with_context($blogin->context)->get_user_context_preferences('core_block');
381
        $this->assertEquals($no, $prefs->block_is_docked->value);
382
        $this->assertEquals($yes, $prefs->block_is_hidden->value);
383
 
384
        $prefs = writer::with_context($bprivatefiles->context)->get_user_context_preferences('core_block');
385
        $this->assertObjectNotHasProperty('block_is_docked', $prefs);
386
        $this->assertEquals($no, $prefs->block_is_hidden->value);
387
 
388
        $prefs = writer::with_context($bmyprofile->context)->get_user_context_preferences('core_block');
389
        $this->assertEquals($yes, $prefs->block_is_docked->value);
390
        $this->assertObjectNotHasProperty('block_is_hidden', $prefs);
391
    }
392
 
393
    /**
394
     * Get the block manager.
395
     *
396
     * @param array $regions The regions.
397
     * @param \context $context The context.
398
     * @param string $pagetype The page type.
399
     * @param string $subpage The sub page.
400
     * @return \block_manager
401
     */
402
    protected function get_block_manager($regions, $context, $pagetype = 'page-type', $subpage = '') {
403
        $page = new \moodle_page();
404
        $page->set_context($context);
405
        $page->set_pagetype($pagetype);
406
        $page->set_subpage($subpage);
407
        $page->set_url(new \moodle_url('/'));
408
 
409
        $blockmanager = new \block_manager($page);
410
        $blockmanager->add_regions($regions, false);
411
        $blockmanager->set_default_region($regions[0]);
412
 
413
        return $blockmanager;
414
    }
415
 
416
    /**
417
     * Set a docked preference.
418
     *
419
     * @param \block_base $block The block.
420
     * @param bool $value The value.
421
     * @param int $userid The user ID.
422
     */
423
    protected function set_docked_pref($block, $value, $userid) {
424
        set_user_preference("docked_block_instance_{$block->instance->id}", $value, $userid);
425
    }
426
 
427
    /**
428
     * Set a hidden preference.
429
     *
430
     * @param \block_base $block The block.
431
     * @param bool $value The value.
432
     * @param int $userid The user ID.
433
     */
434
    protected function set_hidden_pref($block, $value, $userid) {
435
        set_user_preference("block{$block->instance->id}hidden", $value, $userid);
436
    }
437
 
438
}