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_badges
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_badges\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_badges\privacy\provider;
36
use core_privacy\local\request\approved_userlist;
37
use core_badges\helper;
38
 
39
require_once($CFG->libdir . '/badgeslib.php');
40
 
41
/**
42
 * Data provider testcase class.
43
 *
44
 * @package    core_badges
45
 * @category   test
46
 * @copyright  2018 Frédéric Massart
47
 * @author     Frédéric Massart <fred@branchup.tech>
48
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
49
 */
1441 ariadna 50
final class provider_test extends provider_testcase {
1 efrain 51
 
52
    public function setUp(): void {
1441 ariadna 53
        parent::setUp();
1 efrain 54
        $this->resetAfterTest();
55
    }
56
 
11 efrain 57
    public function test_get_contexts_for_userid_for_badge_editing(): void {
1 efrain 58
        $dg = $this->getDataGenerator();
59
        $u1 = $dg->create_user();
60
        $u2 = $dg->create_user();
61
        $u3 = $dg->create_user();
62
        $u4 = $dg->create_user();
63
        $u5 = $dg->create_user();
64
        $c1 = $dg->create_course();
65
        $c2 = $dg->create_course();
66
        $sysctx = \context_system::instance();
67
        $c1ctx = \context_course::instance($c1->id);
68
        $c2ctx = \context_course::instance($c2->id);
69
 
70
        // Assert that we find contexts where we created/modified a badge.
71
        $this->create_badge(['usercreated' => $u1->id, 'usermodified' => $u5->id]);
72
        $this->create_badge(['usercreated' => $u2->id, 'type' => BADGE_TYPE_COURSE, 'courseid' => $c1->id]);
73
        $this->create_badge(['usermodified' => $u3->id]);
74
        $this->create_badge(['usermodified' => $u4->id, 'type' => BADGE_TYPE_COURSE, 'courseid' => $c2->id,
75
            'usercreated' => $u5->id]);
76
 
77
        $contexts = provider::get_contexts_for_userid($u1->id)->get_contextids();
78
        $this->assertCount(1, $contexts);
79
        $this->assertEquals($sysctx->id, $contexts[0]);
80
 
81
        $contexts = provider::get_contexts_for_userid($u2->id)->get_contextids();
82
        $this->assertCount(1, $contexts);
83
        $this->assertEquals($c1ctx->id, $contexts[0]);
84
 
85
        $contexts = provider::get_contexts_for_userid($u3->id)->get_contextids();
86
        $this->assertCount(1, $contexts);
87
        $this->assertEquals($sysctx->id, $contexts[0]);
88
 
89
        $contexts = provider::get_contexts_for_userid($u4->id)->get_contextids();
90
        $this->assertCount(1, $contexts);
91
        $this->assertEquals($c2ctx->id, $contexts[0]);
92
 
93
        $contexts = provider::get_contexts_for_userid($u5->id)->get_contextids();
94
        $this->assertCount(2, $contexts);
95
        $this->assertTrue(in_array($sysctx->id, $contexts));
96
        $this->assertTrue(in_array($c2ctx->id, $contexts));
97
    }
98
 
11 efrain 99
    public function test_get_contexts_for_userid_for_manual_award(): void {
1 efrain 100
        global $DB;
101
 
102
        $dg = $this->getDataGenerator();
103
        $u1 = $dg->create_user();
104
        $u2 = $dg->create_user();
105
        $u3 = $dg->create_user();
106
        $u4 = $dg->create_user();
107
        $c1 = $dg->create_course();
108
        $sysctx = \context_system::instance();
109
        $c1ctx = \context_course::instance($c1->id);
110
        $u1ctx = \context_user::instance($u1->id);
111
        $u2ctx = \context_user::instance($u2->id);
112
        $u3ctx = \context_user::instance($u3->id);
113
        $u4ctx = \context_user::instance($u4->id);
114
        $b1 = $this->create_badge();
115
        $b2 = $this->create_badge(['type' => BADGE_TYPE_COURSE, 'courseid' => $c1->id]);
116
 
117
        $this->create_manual_award(['recipientid' => $u4->id, 'issuerid' => $u1->id, 'badgeid' => $b1->id]);
118
        $this->create_manual_award(['recipientid' => $u3->id, 'issuerid' => $u2->id, 'badgeid' => $b1->id]);
119
        $this->create_manual_award(['recipientid' => $u3->id, 'issuerid' => $u2->id, 'badgeid' => $b2->id]);
120
 
121
        $contexts = provider::get_contexts_for_userid($u1->id)->get_contextids();
122
        $this->assertCount(1, $contexts);
123
        $this->assertEquals($u4ctx->id, $contexts[0]);
124
 
125
        $contexts = provider::get_contexts_for_userid($u2->id)->get_contextids();
126
        $this->assertCount(1, $contexts);
127
        $this->assertEquals($u3ctx->id, $contexts[0]);
128
    }
129
 
11 efrain 130
    public function test_get_contexts_for_userid_for_my_stuff(): void {
1 efrain 131
        global $DB;
132
 
133
        $dg = $this->getDataGenerator();
134
        $u1 = $dg->create_user();
135
        $u2 = $dg->create_user();
136
        $u3 = $dg->create_user();
137
        $u4 = $dg->create_user();
138
        $c1 = $dg->create_course();
139
        $sysctx = \context_system::instance();
140
        $c1ctx = \context_course::instance($c1->id);
141
        $u1ctx = \context_user::instance($u1->id);
142
        $u2ctx = \context_user::instance($u2->id);
143
        $u3ctx = \context_user::instance($u3->id);
144
        $u4ctx = \context_user::instance($u4->id);
145
        $b1 = $this->create_badge();
146
        $b2 = $this->create_badge(['type' => BADGE_TYPE_COURSE, 'courseid' => $c1->id]);
147
 
148
        helper::create_fake_backpack(['userid' => $u1->id]);
149
        $this->create_manual_award(['recipientid' => $u2->id, 'badgeid' => $b1->id]);
150
        $this->create_issued(['badgeid' => $b2->id, 'userid' => $u3->id]);
151
 
152
        $crit = $this->create_criteria_manual($b1->id);
153
        $crit->mark_complete($u4->id);
154
 
155
        $contexts = provider::get_contexts_for_userid($u1->id)->get_contextids();
156
        $this->assertCount(1, $contexts);
157
        $this->assertEquals($u1ctx->id, $contexts[0]);
158
 
159
        $contexts = provider::get_contexts_for_userid($u2->id)->get_contextids();
160
        $this->assertCount(1, $contexts);
161
        $this->assertEquals($u2ctx->id, $contexts[0]);
162
 
163
        $contexts = provider::get_contexts_for_userid($u3->id)->get_contextids();
164
        $this->assertCount(1, $contexts);
165
        $this->assertEquals($u3ctx->id, $contexts[0]);
166
 
167
        $contexts = provider::get_contexts_for_userid($u4->id)->get_contextids();
168
        $this->assertCount(1, $contexts);
169
        $this->assertEquals($u4ctx->id, $contexts[0]);
170
    }
171
 
11 efrain 172
    public function test_delete_data_for_user(): void {
1 efrain 173
        global $DB;
174
 
175
        $dg = $this->getDataGenerator();
176
        $u1 = $dg->create_user();
177
        $u2 = $dg->create_user();
178
        $c1 = $dg->create_course();
179
        $sysctx = \context_system::instance();
180
        $c1ctx = \context_course::instance($c1->id);
181
        $u1ctx = \context_user::instance($u1->id);
182
        $u2ctx = \context_user::instance($u2->id);
183
 
184
        $b1 = $this->create_badge(['usercreated' => $u1->id, 'usermodified' => $u2->id]);
185
        $b2 = $this->create_badge(['usercreated' => $u2->id, 'usermodified' => $u1->id,
186
            'type' => BADGE_TYPE_COURSE, 'courseid' => $c1->id]);
187
 
188
        helper::create_fake_backpack(['userid' => $u1->id]);
189
        helper::create_fake_backpack(['userid' => $u2->id]);
190
        $this->create_manual_award(['recipientid' => $u1->id, 'badgeid' => $b1->id]);
191
        $this->create_manual_award(['recipientid' => $u2->id, 'badgeid' => $b1->id, 'issuerid' => $u1->id]);
192
        $this->create_issued(['badgeid' => $b2->id, 'userid' => $u1->id]);
193
        $this->create_issued(['badgeid' => $b2->id, 'userid' => $u2->id]);
194
 
195
        $crit = $this->create_criteria_manual($b1->id);
196
        $crit->mark_complete($u2->id);
197
        $crit = $this->create_criteria_manual($b2->id);
198
        $crit->mark_complete($u1->id);
199
 
200
        $this->assertTrue($DB->record_exists('badge_backpack', ['userid' => $u1->id]));
201
        $this->assertTrue($DB->record_exists('badge_backpack', ['userid' => $u2->id]));
202
        $this->assertTrue($DB->record_exists('badge', ['usercreated' => $u1->id]));
203
        $this->assertTrue($DB->record_exists('badge', ['usermodified' => $u1->id]));
204
        $this->assertTrue($DB->record_exists('badge', ['usercreated' => $u2->id]));
205
        $this->assertTrue($DB->record_exists('badge', ['usermodified' => $u2->id]));
206
        $this->assertTrue($DB->record_exists('badge_manual_award', ['recipientid' => $u1->id]));
207
        $this->assertTrue($DB->record_exists('badge_manual_award', ['recipientid' => $u2->id]));
208
        $this->assertTrue($DB->record_exists('badge_issued', ['userid' => $u1->id]));
209
        $this->assertTrue($DB->record_exists('badge_issued', ['userid' => $u2->id]));
210
        $this->assertTrue($DB->record_exists('badge_criteria_met', ['userid' => $u1->id]));
211
        $this->assertTrue($DB->record_exists('badge_criteria_met', ['userid' => $u2->id]));
212
 
213
        provider::delete_data_for_user(new approved_contextlist($u1, 'core_badges', [$sysctx->id, $c1ctx->id,
214
            $u1ctx->id, $u2ctx->id]));
215
 
216
        $this->assertTrue($DB->record_exists('badge', ['usercreated' => $u1->id]));
217
        $this->assertTrue($DB->record_exists('badge', ['usermodified' => $u1->id]));
218
        $this->assertTrue($DB->record_exists('badge', ['usercreated' => $u2->id]));
219
        $this->assertTrue($DB->record_exists('badge', ['usermodified' => $u2->id]));
220
        $this->assertFalse($DB->record_exists('badge_backpack', ['userid' => $u1->id]));
221
        $this->assertTrue($DB->record_exists('badge_backpack', ['userid' => $u2->id]));
222
        $this->assertFalse($DB->record_exists('badge_manual_award', ['recipientid' => $u1->id]));
223
        $this->assertTrue($DB->record_exists('badge_manual_award', ['recipientid' => $u2->id]));
224
        $this->assertFalse($DB->record_exists('badge_issued', ['userid' => $u1->id]));
225
        $this->assertTrue($DB->record_exists('badge_issued', ['userid' => $u2->id]));
226
        $this->assertFalse($DB->record_exists('badge_criteria_met', ['userid' => $u1->id]));
227
        $this->assertTrue($DB->record_exists('badge_criteria_met', ['userid' => $u2->id]));
228
    }
229
 
11 efrain 230
    public function test_delete_data_for_all_users_in_context(): void {
1 efrain 231
        global $DB;
232
 
233
        $dg = $this->getDataGenerator();
234
        $u1 = $dg->create_user();
235
        $u2 = $dg->create_user();
236
        $c1 = $dg->create_course();
237
        $sysctx = \context_system::instance();
238
        $c1ctx = \context_course::instance($c1->id);
239
        $u1ctx = \context_user::instance($u1->id);
240
        $u2ctx = \context_user::instance($u2->id);
241
 
242
        $b1 = $this->create_badge(['usercreated' => $u1->id, 'usermodified' => $u2->id]);
243
        $b2 = $this->create_badge(['usercreated' => $u2->id, 'usermodified' => $u1->id,
244
            'type' => BADGE_TYPE_COURSE, 'courseid' => $c1->id]);
245
 
246
        helper::create_fake_backpack(['userid' => $u1->id]);
247
        helper::create_fake_backpack(['userid' => $u2->id]);
248
        $this->create_manual_award(['recipientid' => $u1->id, 'badgeid' => $b1->id]);
249
        $this->create_manual_award(['recipientid' => $u2->id, 'badgeid' => $b1->id, 'issuerid' => $u1->id]);
250
        $this->create_issued(['badgeid' => $b2->id, 'userid' => $u1->id]);
251
        $this->create_issued(['badgeid' => $b2->id, 'userid' => $u2->id]);
252
 
253
        $crit = $this->create_criteria_manual($b1->id);
254
        $crit->mark_complete($u2->id);
255
        $crit = $this->create_criteria_manual($b2->id);
256
        $crit->mark_complete($u1->id);
257
 
258
        $assertnochange = function() use ($DB, $u1, $u2) {
259
            $this->assertTrue($DB->record_exists('badge_backpack', ['userid' => $u1->id]));
260
            $this->assertTrue($DB->record_exists('badge_backpack', ['userid' => $u2->id]));
261
            $this->assertTrue($DB->record_exists('badge', ['usercreated' => $u1->id]));
262
            $this->assertTrue($DB->record_exists('badge', ['usermodified' => $u1->id]));
263
            $this->assertTrue($DB->record_exists('badge', ['usercreated' => $u2->id]));
264
            $this->assertTrue($DB->record_exists('badge', ['usermodified' => $u2->id]));
265
            $this->assertTrue($DB->record_exists('badge_manual_award', ['recipientid' => $u1->id]));
266
            $this->assertTrue($DB->record_exists('badge_manual_award', ['recipientid' => $u2->id]));
267
            $this->assertTrue($DB->record_exists('badge_issued', ['userid' => $u1->id]));
268
            $this->assertTrue($DB->record_exists('badge_issued', ['userid' => $u2->id]));
269
            $this->assertTrue($DB->record_exists('badge_criteria_met', ['userid' => $u1->id]));
270
            $this->assertTrue($DB->record_exists('badge_criteria_met', ['userid' => $u2->id]));
271
        };
272
        $assertnochange();
273
 
274
        provider::delete_data_for_all_users_in_context($sysctx);
275
        $assertnochange();
276
 
277
        provider::delete_data_for_all_users_in_context($c1ctx);
278
        $assertnochange();
279
 
280
        provider::delete_data_for_all_users_in_context($u1ctx);
281
        $this->assertTrue($DB->record_exists('badge', ['usercreated' => $u1->id]));
282
        $this->assertTrue($DB->record_exists('badge', ['usermodified' => $u1->id]));
283
        $this->assertTrue($DB->record_exists('badge', ['usercreated' => $u2->id]));
284
        $this->assertTrue($DB->record_exists('badge', ['usermodified' => $u2->id]));
285
        $this->assertFalse($DB->record_exists('badge_backpack', ['userid' => $u1->id]));
286
        $this->assertTrue($DB->record_exists('badge_backpack', ['userid' => $u2->id]));
287
        $this->assertFalse($DB->record_exists('badge_manual_award', ['recipientid' => $u1->id]));
288
        $this->assertTrue($DB->record_exists('badge_manual_award', ['recipientid' => $u2->id]));
289
        $this->assertFalse($DB->record_exists('badge_issued', ['userid' => $u1->id]));
290
        $this->assertTrue($DB->record_exists('badge_issued', ['userid' => $u2->id]));
291
        $this->assertFalse($DB->record_exists('badge_criteria_met', ['userid' => $u1->id]));
292
        $this->assertTrue($DB->record_exists('badge_criteria_met', ['userid' => $u2->id]));
293
    }
294
 
11 efrain 295
    public function test_export_data_for_user(): void {
1 efrain 296
        global $DB;
297
 
298
        $yes = transform::yesno(true);
299
        $no = transform::yesno(false);
300
 
301
        $dg = $this->getDataGenerator();
302
        $u1 = $dg->create_user();
303
        $u2 = $dg->create_user();
304
        $u3 = $dg->create_user();
305
        $c1 = $dg->create_course();
306
        $sysctx = \context_system::instance();
307
        $c1ctx = \context_course::instance($c1->id);
308
        $u1ctx = \context_user::instance($u1->id);
309
        $u2ctx = \context_user::instance($u2->id);
310
 
311
        $b1 = $this->create_badge(['usercreated' => $u3->id]);
312
        $this->endorse_badge(['badgeid' => $b1->id]);
313
        $this->align_badge(['badgeid' => $b1->id], ' (1)');
314
        $this->align_badge(['badgeid' => $b1->id], ' (2)');
315
        $b2 = $this->create_badge(['type' => BADGE_TYPE_COURSE, 'courseid' => $c1->id, 'usermodified' => $u3->id]);
316
        $this->relate_badge($b1->id, $b2->id);
317
        $b3 = $this->create_badge();
318
        $b3crit = $this->create_criteria_manual($b3->id);
319
        $b4 = $this->create_badge();
320
 
321
        // Create things for user 2, to check it's not exported it.
322
        $this->create_issued(['badgeid' => $b4->id, 'userid' => $u2->id]);
323
        helper::create_fake_backpack(['userid' => $u2->id, 'email' => $u2->email]);
324
        $this->create_manual_award(['badgeid' => $b1->id, 'recipientid' => $u2->id, 'issuerid' => $u3->id]);
325
 
326
        // Create a set of stuff for u1.
327
        $this->create_issued(['badgeid' => $b1->id, 'userid' => $u1->id, 'uniquehash' => 'yoohoo']);
328
        $this->create_manual_award(['badgeid' => $b2->id, 'recipientid' => $u1->id, 'issuerid' => $u3->id]);
329
        $b3crit->mark_complete($u1->id);
330
        helper::create_fake_backpack(['userid' => $u1->id, 'email' => $u1->email]);
331
 
332
        // Check u1.
333
        writer::reset();
334
        provider::export_user_data(new approved_contextlist($u1, 'core_badges', [$u1ctx->id, $u2ctx->id,
335
            $sysctx->id, $c1ctx->id]));
336
        $this->assertFalse(writer::with_context($u2ctx)->has_any_data());
337
        $this->assertFalse(writer::with_context($sysctx)->has_any_data());
338
        $this->assertFalse(writer::with_context($c1ctx)->has_any_data());
339
 
340
        $path = [get_string('badges', 'core_badges'), "{$b1->name} ({$b1->id})"];
341
        $data = writer::with_context($u1ctx)->get_data($path);
342
        $this->assertEquals($b1->name, $data->name);
343
        $this->assertEquals($b1->version, $data->version);
344
        $this->assertEquals($b1->language, $data->language);
345
        $this->assertEquals($b1->imagecaption, $data->imagecaption);
346
        $this->assertNotEmpty($data->issued);
347
        $this->assertEmpty($data->manual_award);
348
        $this->assertEmpty($data->criteria_met);
349
        $this->assertFalse(isset($data->course));
350
        $this->assertEquals('yoohoo', $data->issued['unique_hash']);
351
        $this->assertNull($data->issued['expires_on']);
352
 
353
        $this->assertNotEmpty($data->endorsement);
354
        $this->assertNotEmpty($data->endorsement['issuername']);
355
        $this->assertNotEmpty($data->endorsement['issuerurl']);
356
        $this->assertNotEmpty($data->endorsement['issueremail']);
357
        $this->assertNotEmpty($data->endorsement['claimid']);
358
        $this->assertNotEmpty($data->endorsement['claimcomment']);
359
        $this->assertNotEmpty($data->endorsement['dateissued']);
360
 
361
        $this->assertNotEmpty($data->related_badge);
362
        $this->assertNotEmpty($data->related_badge[0]);
363
        $this->assertEquals($data->related_badge[0]['badgeid'], $b2->id);
364
        $this->assertEquals($data->related_badge[0]['badgename'], $b2->name);
365
 
366
        $this->assertNotEmpty($data->alignment);
367
        $this->assertNotEmpty($data->alignment[0]);
368
        $this->assertNotEmpty($data->alignment[0]['targetname']);
369
        $this->assertNotEmpty($data->alignment[0]['targeturl']);
370
        $this->assertNotEmpty($data->alignment[0]['targetdescription']);
371
        $this->assertNotEmpty($data->alignment[0]['targetframework']);
372
        $this->assertNotEmpty($data->alignment[0]['targetcode']);
373
        $this->assertNotEmpty($data->alignment[1]);
374
        $this->assertNotEmpty($data->alignment[1]['targetname']);
375
        $this->assertNotEmpty($data->alignment[1]['targeturl']);
376
        $this->assertNotEmpty($data->alignment[1]['targetdescription']);
377
        $this->assertNotEmpty($data->alignment[1]['targetframework']);
378
        $this->assertNotEmpty($data->alignment[1]['targetcode']);
379
 
380
        $path = [get_string('badges', 'core_badges'), "{$b2->name} ({$b2->id})"];
381
        $data = writer::with_context($u1ctx)->get_data($path);
382
        $this->assertEquals($b2->name, $data->name);
383
        $this->assertEmpty($data->issued);
384
        $this->assertNotEmpty($data->manual_award);
385
        $this->assertEmpty($data->criteria_met);
386
        $this->assertEquals($c1->fullname, $data->course);
387
        $this->assertEquals($u3->id, $data->manual_award['issuer']);
388
 
389
        $path = [get_string('badges', 'core_badges'), "{$b3->name} ({$b3->id})"];
390
        $data = writer::with_context($u1ctx)->get_data($path);
391
        $this->assertEquals($b3->name, $data->name);
392
        $this->assertEmpty($data->issued);
393
        $this->assertEmpty($data->manual_award);
394
        $this->assertNotEmpty($data->criteria_met);
395
        $this->assertNotFalse(strpos($data->criteria_met[0], get_string('criteria_descr_2', 'core_badges', 'ALL')));
396
 
397
        $path = [get_string('badges', 'core_badges')];
398
        $data = writer::with_context($u1ctx)->get_related_data($path, 'backpacks');
399
        $this->assertCount(1, $data->backpacks);
400
        $this->assertEquals($u1->email, $data->backpacks[0]['email']);
401
 
402
        // Confirm we do not have u2.
403
        $path = [get_string('badges', 'core_badges'), "{$b4->name} ({$b4->id})"];
404
        $data = writer::with_context($u1ctx)->get_data($path);
405
        $this->assertEmpty($data);
406
        $data = writer::with_context($u2ctx)->get_data($path);
407
        $this->assertEmpty($data);
408
 
409
        // Export for u3.
410
        writer::reset();
411
        $path = [get_string('badges', 'core_badges')];
412
        provider::export_user_data(new approved_contextlist($u3, 'core_badges', [$u1ctx->id, $u2ctx->id,
413
            $sysctx->id, $c1ctx->id]));
414
 
415
        $data = writer::with_context($u2ctx)->get_related_data($path, 'manual_awards');
416
        $this->assertCount(1, $data->badges);
417
        $this->assertEquals($b1->name, $data->badges[0]['name']);
418
        $this->assertEquals($yes, $data->badges[0]['issued_by_you']);
419
        $this->assertEquals('Manager', $data->badges[0]['issuer_role']);
420
 
421
        $data = writer::with_context($sysctx)->get_data($path);
422
        $this->assertCount(1, $data->badges);
423
        $this->assertEquals($b1->name, $data->badges[0]['name']);
424
        $this->assertEquals($yes, $data->badges[0]['created_by_you']);
425
        $this->assertEquals($no, $data->badges[0]['modified_by_you']);
426
 
427
        $data = writer::with_context($c1ctx)->get_data($path);
428
        $this->assertCount(1, $data->badges);
429
        $this->assertEquals($b2->name, $data->badges[0]['name']);
430
        $this->assertEquals($no, $data->badges[0]['created_by_you']);
431
        $this->assertEquals($yes, $data->badges[0]['modified_by_you']);
432
 
433
        $data = writer::with_context($u1ctx)->get_related_data($path, 'manual_awards');
434
        $this->assertCount(1, $data->badges);
435
        $this->assertEquals($b3->name, $data->badges[0]['name']);
436
        $this->assertEquals($yes, $data->badges[0]['issued_by_you']);
437
        $this->assertEquals('Manager', $data->badges[0]['issuer_role']);
438
    }
439
 
440
    /**
441
     * Test that only users within a user, system and course context are fetched.
442
     */
11 efrain 443
    public function test_get_users_in_context(): void {
1 efrain 444
        $component = 'core_badges';
445
 
446
        // Create course1.
447
        $course1 = $this->getDataGenerator()->create_course();
448
        $coursecontext1 = \context_course::instance($course1->id);
449
        // Create course2.
450
        $course2 = $this->getDataGenerator()->create_course();
451
        $coursecontext2 = \context_course::instance($course2->id);
452
        // Create user1.
453
        $user1 = $this->getDataGenerator()->create_user();
454
        $usercontext1 = \context_user::instance($user1->id);
455
        // Create user2.
456
        $user2 = $this->getDataGenerator()->create_user();
457
        $usercontext2 = \context_user::instance($user2->id);
458
        // Create user3.
459
        $user3 = $this->getDataGenerator()->create_user();
460
        $usercontext3 = \context_user::instance($user3->id);
461
 
462
        // The list of users in usercontext1 should not return anything yet (related data still haven't been created).
463
        $userlist1 = new \core_privacy\local\request\userlist($usercontext1, $component);
464
        provider::get_users_in_context($userlist1);
465
        $this->assertCount(0, $userlist1);
466
        // The list of users in coursecontext1 should not return anything yet (related data still haven't been created).
467
        $userlist2 = new \core_privacy\local\request\userlist($coursecontext1, $component);
468
        provider::get_users_in_context($userlist2);
469
        $this->assertCount(0, $userlist2);
470
        // The list of users in systemcontext should not return anything yet (related data still haven't been created).
471
        $systemcontext = \context_system::instance();
472
        $userlist3 = new \core_privacy\local\request\userlist($systemcontext, $component);
473
        provider::get_users_in_context($userlist3);
474
        $this->assertCount(0, $userlist3);
475
 
476
        // Assert that we find contexts where we created/modified a badge.
477
        $this->create_badge(['usercreated' => $user1->id, 'usermodified' => $user2->id]);
478
        $badge1 = $this->create_badge(['usercreated' => $user2->id, 'type' => BADGE_TYPE_COURSE, 'courseid' => $course1->id]);
479
        $badge2 = $this->create_badge(['usercreated' => $user3->id, 'usermodified' => $user1->id]);
480
 
481
        $this->create_manual_award(['recipientid' => $user2->id, 'issuerid' => $user1->id, 'badgeid' => $badge1->id]);
482
        $this->create_manual_award(['recipientid' => $user3->id, 'issuerid' => $user2->id, 'badgeid' => $badge1->id]);
483
        $this->create_manual_award(['recipientid' => $user1->id, 'issuerid' => $user2->id, 'badgeid' => $badge2->id]);
484
 
485
        helper::create_fake_backpack(['userid' => $user2->id]);
486
        $this->create_issued(['badgeid' => $badge2->id, 'userid' => $user3->id]);
487
 
488
        $crit = $this->create_criteria_manual($badge1->id);
489
        $crit->mark_complete($user3->id);
490
 
491
        // The list of users for user context should return user1 and user2.
492
        provider::get_users_in_context($userlist1);
493
        $this->assertCount(2, $userlist1);
494
        $this->assertTrue(in_array($user1->id, $userlist1->get_userids()));
495
        $this->assertTrue(in_array($user2->id, $userlist1->get_userids()));
496
 
497
        // The list of users for course context should return user2.
498
        provider::get_users_in_context($userlist2);
499
        $this->assertCount(1, $userlist2);
500
        $this->assertTrue(in_array($user2->id, $userlist2->get_userids()));
501
 
502
        // The list of users for system context should return user1, user2 and user3.
503
        provider::get_users_in_context($userlist3);
504
        $this->assertCount(3, $userlist3);
505
        $this->assertTrue(in_array($user1->id, $userlist3->get_userids()));
506
        $this->assertTrue(in_array($user2->id, $userlist3->get_userids()));
507
        $this->assertTrue(in_array($user3->id, $userlist3->get_userids()));
508
    }
509
 
510
    /**
511
     * Test that data for users in approved userlist is deleted.
512
     */
11 efrain 513
    public function test_delete_data_for_users(): void {
1 efrain 514
        $component = 'core_badges';
515
 
516
        // Create course1.
517
        $course1 = $this->getDataGenerator()->create_course();
518
        $coursecontext1 = \context_course::instance($course1->id);
519
        // Create course2.
520
        $course2 = $this->getDataGenerator()->create_course();
521
        $coursecontext2 = \context_course::instance($course2->id);
522
        // Create user1.
523
        $user1 = $this->getDataGenerator()->create_user();
524
        $usercontext1 = \context_user::instance($user1->id);
525
        // Create user2.
526
        $user2 = $this->getDataGenerator()->create_user();
527
        $usercontext2 = \context_user::instance($user2->id);
528
        // Create user3.
529
        $user3 = $this->getDataGenerator()->create_user();
530
        $usercontext3 = \context_user::instance($user3->id);
531
 
532
        $this->create_badge(['usercreated' => $user1->id, 'usermodified' => $user2->id]);
533
        $badge1 = $this->create_badge(['usercreated' => $user2->id, 'type' => BADGE_TYPE_COURSE, 'courseid' => $course1->id]);
534
        $badge2 = $this->create_badge(['usercreated' => $user3->id, 'type' => BADGE_TYPE_COURSE, 'courseid' => $course2->id,
535
            'usermodified' => $user1->id]);
536
 
537
        $this->create_manual_award(['recipientid' => $user2->id, 'issuerid' => $user1->id, 'badgeid' => $badge1->id]);
538
        $this->create_manual_award(['recipientid' => $user3->id, 'issuerid' => $user2->id, 'badgeid' => $badge1->id]);
539
        $this->create_manual_award(['recipientid' => $user1->id, 'issuerid' => $user2->id, 'badgeid' => $badge2->id]);
540
 
541
        helper::create_fake_backpack(['userid' => $user2->id]);
542
        $this->create_issued(['badgeid' => $badge2->id, 'userid' => $user3->id]);
543
 
544
        $crit = $this->create_criteria_manual($badge1->id);
545
        $crit->mark_complete($user3->id);
546
 
547
        // The list of users for usercontext2 context should return users.
548
        $userlist1 = new \core_privacy\local\request\userlist($usercontext2, $component);
549
        provider::get_users_in_context($userlist1);
550
        $this->assertCount(2, $userlist1);
551
        $this->assertTrue(in_array($user1->id, $userlist1->get_userids()));
552
        $this->assertTrue(in_array($user2->id, $userlist1->get_userids()));
553
 
554
        // The list of users for coursecontext2 context should return users.
555
        $userlist2 = new \core_privacy\local\request\userlist($coursecontext2, $component);
556
        provider::get_users_in_context($userlist2);
557
        $this->assertCount(2, $userlist2);
558
        $this->assertTrue(in_array($user1->id, $userlist2->get_userids()));
559
        $this->assertTrue(in_array($user3->id, $userlist2->get_userids()));
560
 
561
        // The list of users for system context should return users.
562
        $systemcontext = \context_system::instance();
563
        $userlist3 = new \core_privacy\local\request\userlist($systemcontext, $component);
564
        provider::get_users_in_context($userlist3);
565
        $this->assertCount(2, $userlist3);
566
        $this->assertTrue(in_array($user1->id, $userlist3->get_userids()));
567
        $this->assertTrue(in_array($user2->id, $userlist3->get_userids()));
568
 
569
        // Delete the data for user1 in usercontext2.
570
        $approvedlist = new approved_userlist($usercontext2, $component, [$user1->id]);
571
        // Delete using delete_data_for_user. No data for users in usercontext2 should be removed.
572
        provider::delete_data_for_users($approvedlist);
573
        // The list of users for usercontext2 context should still return user1, user2.
574
        $userlist1 = new \core_privacy\local\request\userlist($usercontext2, $component);
575
        provider::get_users_in_context($userlist1);
576
        $this->assertCount(2, $userlist1);
577
        $this->assertTrue(in_array($user1->id, $userlist1->get_userids()));
578
        $this->assertTrue(in_array($user2->id, $userlist1->get_userids()));
579
 
580
        // Delete the data for user2 in usercontext2.
581
        $approvedlist = new approved_userlist($usercontext2, $component, [$user2->id]);
582
        // Delete using delete_data_for_user. The user data in usercontext2 should be removed.
583
        provider::delete_data_for_users($approvedlist);
584
        // The list of users for usercontext2 context should not return any users.
585
        $userlist1 = new \core_privacy\local\request\userlist($usercontext2, $component);
586
        provider::get_users_in_context($userlist1);
587
        $this->assertCount(0, $userlist1);
588
 
589
        // The list of users for coursecontext2 context should return the previous users.
590
        $userlist2 = new \core_privacy\local\request\userlist($coursecontext2, $component);
591
        provider::get_users_in_context($userlist2);
592
        $this->assertCount(2, $userlist2);
593
 
594
        // The list of users for system context should return the previous users.
595
        $systemcontext = \context_system::instance();
596
        $userlist3 = new \core_privacy\local\request\userlist($systemcontext, $component);
597
        provider::get_users_in_context($userlist3);
598
        $this->assertCount(2, $userlist3);
599
 
600
        // Make sure data is only deleted in the user context, nothing in course or system.
601
        // Convert $userlist2 into an approved_contextlist.
602
        $approvedlist = new approved_userlist($coursecontext2, $component, $userlist2->get_userids());
603
        provider::delete_data_for_users($approvedlist);
604
 
605
        // The list of users for coursecontext2 context should still return the user data.
606
        $userlist2 = new \core_privacy\local\request\userlist($coursecontext2, $component);
607
        provider::get_users_in_context($userlist2);
608
        $this->assertCount(2, $userlist2);
609
    }
610
 
611
    /**
612
     * Create a badge.
613
     *
614
     * @param array $params Parameters.
615
     * @return object
616
     */
617
    protected function create_badge(array $params = []) {
618
        global $DB, $USER;
619
        $record = (object) array_merge([
620
            'name' => "Test badge with 'apostrophe' and other friends (<>&@#)",
621
            'description' => "Testing badges",
622
            'timecreated' => time(),
623
            'timemodified' => time(),
624
            'usercreated' => $USER->id,
625
            'usermodified' => $USER->id,
626
            'issuername' => "Test issuer",
627
            'issuerurl' => "http://issuer-url.domain.co.nz",
628
            'issuercontact' => "issuer@example.com",
629
            'expiredate' => null,
630
            'expireperiod' => null,
631
            'type' => BADGE_TYPE_SITE,
632
            'courseid' => null,
633
            'messagesubject' => "Test message subject",
634
            'message' => "Test message body",
635
            'attachment' => 1,
636
            'notification' => 0,
637
            'status' => BADGE_STATUS_ACTIVE,
638
            'version' => OPEN_BADGES_V2,
639
            'language' => 'en',
640
            'imagecaption' => 'Image caption'
641
        ], $params);
642
        $record->id = $DB->insert_record('badge', $record);
643
 
644
        return $record;
645
    }
646
 
647
    /**
648
     * Relate a badge.
649
     *
650
     * @param int $badgeid The badge ID.
651
     * @param int $relatedbadgeid The related badge ID.
652
     * @return object
653
     */
654
    protected function relate_badge(int $badgeid, int $relatedbadgeid) {
655
        global $DB;
656
        $record = (object) [
657
            'badgeid' => $badgeid,
658
            'relatedbadgeid' => $relatedbadgeid
659
        ];
660
        $record->id = $DB->insert_record('badge_related', $record);
661
 
662
        return $record;
663
    }
664
 
665
    /**
666
     * Align a badge.
667
     *
668
     * @param array $params Parameters.
669
     * @return object
670
     */
671
    protected function align_badge(array $params = [], $suffix = '') {
672
        global $DB;
673
        $record = (object) array_merge([
674
            'badgeid' => null,
675
            'targetname' => "Alignment name" . $suffix,
676
            'targeturl' => "http://issuer-url.domain.co.nz",
677
            'targetdescription' => "Description" . $suffix,
678
            'targetframework' => "Framework" . $suffix,
679
            'targetcode' => "Code . $suffix"
680
        ], $params);
681
        $record->id = $DB->insert_record('badge_alignment', $record);
682
 
683
        return $record;
684
    }
685
 
686
    /**
687
     * Endorse a badge.
688
     *
689
     * @param array $params Parameters.
690
     * @return object
691
     */
692
    protected function endorse_badge(array $params = []) {
693
        global $DB;
694
        $record = (object) array_merge([
695
            'badgeid' => null,
696
            'issuername' => "External issuer name",
697
            'issuerurl' => "http://issuer-url.domain.co.nz",
698
            'issueremail' => "issuer@example.com",
699
            'claimid' => "Claim ID",
700
            'claimcomment' => "Claim comment",
701
            'dateissued' => time()
702
        ], $params);
703
        $record->id = $DB->insert_record('badge_endorsement', $record);
704
 
705
        return $record;
706
    }
707
 
708
    /**
709
     * Create a criteria of type badge.
710
     *
711
     * @param int $badgeid The badge ID.
712
     * @param array $params Parameters.
713
     * @return object
714
     */
715
    protected function create_criteria_badge($badgeid, array $params = []) {
716
        $badge = new \badge($badgeid);
717
        if (empty($badge->criteria)) {
718
            $overall = \award_criteria::build(['criteriatype' => BADGE_CRITERIA_TYPE_OVERALL, 'badgeid' => $badge->id]);
719
            $overall->save(['agg' => BADGE_CRITERIA_AGGREGATION_ALL]);
720
        }
721
 
722
        $criteria = \award_criteria::build([
723
            'badgeid' => $badge->id,
724
            'criteriatype' => BADGE_CRITERIA_TYPE_BADGE,
725
        ]);
726
 
727
        if (isset($params['badgeid'])) {
728
            $params['badge_' . $params['badgeid']] = $params['badgeid'];
729
            unset($params['badgeid']);
730
        }
731
 
732
        $criteria->save($params);
733
        $badge = new \badge($badgeid);
734
        return $badge->criteria[BADGE_CRITERIA_TYPE_BADGE];
735
    }
736
 
737
    /**
738
     * Create a criteria of type manual.
739
     *
740
     * @param int $badgeid The badge ID.
741
     * @param array $params Parameters.
742
     * @return object
743
     */
744
    protected function create_criteria_manual($badgeid, array $params = []) {
745
        global $DB;
746
 
747
        $badge = new \badge($badgeid);
748
        if (empty($badge->criteria)) {
749
            $overall = \award_criteria::build(['criteriatype' => BADGE_CRITERIA_TYPE_OVERALL, 'badgeid' => $badge->id]);
750
            $overall->save(['agg' => BADGE_CRITERIA_AGGREGATION_ALL]);
751
        }
752
 
753
        $criteria = \award_criteria::build([
754
            'badgeid' => $badge->id,
755
            'criteriatype' => BADGE_CRITERIA_TYPE_MANUAL,
756
        ]);
757
 
758
        $managerroleid = $DB->get_field_select('role', 'id', 'shortname = ?', ['manager'], IGNORE_MULTIPLE);
759
        if (empty($params)) {
760
            $params = [
761
                'role_' . $managerroleid = $managerroleid
762
            ];
763
        }
764
 
765
        $criteria->save($params);
766
        $badge = new \badge($badgeid);
767
        return $badge->criteria[BADGE_CRITERIA_TYPE_MANUAL];
768
    }
769
 
770
    /**
771
     * Create a badge issued.
772
     *
773
     * @param array $params Parameters.
774
     * @return object
775
     */
776
    protected function create_issued(array $params = []) {
777
        global $DB, $USER;
778
        $record = (object) array_merge([
779
            'badgeid' => null,
780
            'userid' => null,
781
            'uniquehash' => random_string(40),
782
            'dateissued' => time(),
783
            'dateexpire' => null,
784
            'visible' => 1,
785
            'issuernotified' => null,
786
        ], $params);
787
        $record->id = $DB->insert_record('badge_issued', $record);
788
        return $record;
789
    }
790
 
791
    /**
792
     * Create a manual award.
793
     *
794
     * @param array $params Parameters.
795
     * @return object
796
     */
797
    protected function create_manual_award(array $params = []) {
798
        global $DB, $USER;
799
        $record = (object) array_merge([
800
            'badgeid' => null,
801
            'recipientid' => null,
802
            'issuerid' => $USER->id,
803
            'issuerrole' => $DB->get_field_select('role', 'id', 'shortname = ?', ['manager'], IGNORE_MULTIPLE),
804
            'datemet' => time()
805
        ], $params);
806
        $record->id = $DB->insert_record('badge_manual_award', $record);
807
        return $record;
808
    }
809
 
810
}