Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1441 ariadna 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
namespace core_sms\privacy;
18
 
19
use core_privacy\local\metadata\collection;
20
use core_privacy\local\request\approved_contextlist;
21
use core_privacy\local\request\approved_userlist;
22
use core_privacy\local\request\contextlist;
23
use core_privacy\local\request\userlist;
24
use core_privacy\local\request\writer;
25
use core_sms\manager;
26
 
27
/**
28
 * Tests for sms
29
 *
30
 * @package    core_sms
31
 * @category   test
32
 * @copyright  2024 Andrew Lyons <andrew@nicols.co.uk>
33
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
34
 * @covers \core_sms\privacy\provider
35
 */
36
final class provider_test extends \core_privacy\tests\provider_testcase {
37
    public function test_get_metadata(): void {
38
        $collection = new collection('core_sms');
39
        $newcollection = provider::get_metadata($collection);
40
 
41
        $this->assertCount(1, $newcollection->get_collection());
42
        $types = $newcollection->get_collection();
43
        $type = reset($types);
44
        $this->assertEquals('sms_messages', $type->get_name());
45
    }
46
 
47
    public function test_get_contexts_for_userid_no_messagse(): void {
48
        $user = get_admin();
49
        $contextlist = provider::get_contexts_for_userid($user->id);
50
        $this->assertInstanceOf(contextlist::class, $contextlist);
51
 
52
        $this->assertCount(0, $contextlist);
53
    }
54
 
55
    public function test_get_contexts_for_userid_with_messages(): void {
56
        $this->resetAfterTest(true);
57
 
58
        $user = get_admin();
59
        $manager = \core\di::get(manager::class);
60
        $message = $manager->send(
61
            recipientnumber: '12345',
62
            content: 'Hello world',
63
            component: 'core_sms',
64
            messagetype: 'example',
65
            recipientuserid: $user->id,
66
            async: false,
67
        );
68
 
69
        $contextlist = provider::get_contexts_for_userid($user->id);
70
        $this->assertInstanceOf(contextlist::class, $contextlist);
71
 
72
        $this->assertCount(1, $contextlist);
73
        $context = $contextlist->current();
74
        $this->assertInstanceOf(\core\context\user::class, $context);
75
        $this->assertEquals($user->id, $context->instanceid);
76
    }
77
 
78
    public function test_export_user_data(): void {
79
        global $DB;
80
 
81
        $this->resetAfterTest(true);
82
        $clock = $this->mock_clock_with_frozen(99999);
83
 
84
        $user = get_admin();
85
        $otheruser = $this->getDataGenerator()->create_user();
86
        $manager = \core\di::get(manager::class);
87
        $manager->send(
88
            recipientnumber: '12345',
89
            content: 'Hello world',
90
            component: 'core_sms',
91
            messagetype: 'example',
92
            recipientuserid: $user->id,
93
            async: false,
94
        );
95
        $manager->send(
96
            recipientnumber: '12345',
97
            content: 'Hello, world!',
98
            component: 'core_course',
99
            messagetype: 'example',
100
            recipientuserid: $user->id,
101
            async: false,
102
        );
103
        $manager->send(
104
            recipientnumber: '12345',
105
            content: 'Hello, world!',
106
            component: 'core_course',
107
            messagetype: 'example',
108
            recipientuserid: $otheruser->id,
109
            async: false,
110
        );
111
 
112
        $clock->set_to(10000000);
113
 
114
        // Get the data for the User.
115
        $usercontext = \core\context\user::instance($user->id);
116
        /** @var \core_privacy\tests\request\content_writer */
117
        $writer = writer::with_context($usercontext);
118
        $this->assertFalse($writer->has_any_data_in_any_context());
119
 
120
        // Export data for the user.
121
        $this->export_all_data_for_user($user->id, 'core_sms');
122
        $this->assertTrue($writer->has_any_data_in_any_context());
123
        $data = $writer->get_data([get_string('sms', 'core_sms')]);
124
        $this->assertObjectHasProperty('messages', $data);
125
        $this->assertCount(2, $data->messages);
126
 
127
        $message = reset($data->messages);
128
        $this->assertArrayHasKey('content', $message);
129
        $this->assertEquals('Hello world', $message['content']);
130
 
131
        $this->assertArrayHasKey('messagetype', $message);
132
        $this->assertEquals('example', $message['messagetype']);
133
 
134
        $this->assertArrayHasKey('status', $message);
135
 
136
        $this->assertArrayHasKey('timecreated', $message);
137
        $this->assertEquals(99999, $message['timecreated']);
138
    }
139
 
140
    public function test_export_course_data(): void {
141
        $this->resetAfterTest(true);
142
        $clock = $this->mock_clock_with_frozen(99999);
143
 
144
        $course = $this->getDataGenerator()->create_course();
145
        $user = get_admin();
146
        $otheruser = $this->getDataGenerator()->create_user();
147
        $manager = \core\di::get(manager::class);
148
        $manager->send(
149
            recipientnumber: '12345',
150
            content: 'Hello world',
151
            component: 'core_sms',
152
            messagetype: 'example',
153
            recipientuserid: $user->id,
154
            async: false,
155
        );
156
        $manager->send(
157
            recipientnumber: '12345',
158
            content: 'Hello, world!',
159
            component: 'core_course',
160
            messagetype: 'example',
161
            recipientuserid: $user->id,
162
            async: false,
163
        );
164
        $manager->send(
165
            recipientnumber: '12345',
166
            content: 'Hello, world!',
167
            component: 'core_course',
168
            messagetype: 'example',
169
            recipientuserid: $otheruser->id,
170
            async: false,
171
        );
172
 
173
        $clock->set_to(10000000);
174
 
175
        // Get the data for the User Context.
176
        $usercontext = \core\context\user::instance($user->id);
177
        /** @var \core_privacy\tests\request\content_writer */
178
        $writer = writer::with_context($usercontext);
179
        $this->assertFalse($writer->has_any_data_in_any_context());
180
 
181
        // Export data for the Course - there should be none.
182
        $this->export_context_data_for_user($user->id, \core\context\course::instance($course->id), 'core_sms');
183
        $this->assertFalse($writer->has_any_data_in_any_context());
184
    }
185
 
186
    public function test_delete_data_for_all_users_in_context(): void {
187
        global $DB;
188
 
189
        $this->resetAfterTest(true);
190
 
191
        $user = get_admin();
192
        $otheruser = $this->getDataGenerator()->create_user();
193
        $manager = \core\di::get(manager::class);
194
        $manager->send(
195
            recipientnumber: '12345',
196
            content: 'Hello world',
197
            component: 'core_sms',
198
            messagetype: 'example',
199
            recipientuserid: $user->id,
200
            async: false,
201
        );
202
        $manager->send(
203
            recipientnumber: '12345',
204
            content: 'Hello, world!',
205
            component: 'core_course',
206
            messagetype: 'example',
207
            recipientuserid: $user->id,
208
            async: false,
209
        );
210
        $manager->send(
211
            recipientnumber: '12345',
212
            content: 'Hello, world!',
213
            component: 'core_course',
214
            messagetype: 'example',
215
            recipientuserid: $otheruser->id,
216
            async: false,
217
        );
218
        $this->assertCount(2, $DB->get_records('sms_messages', ['recipientuserid' => $user->id]));
219
        $this->assertEquals(3, $DB->count_records('sms_messages'));
220
 
221
        // No data is store under the system context. Nothing should be deleted.
222
        provider::delete_data_for_all_users_in_context(\core\context\system::instance());
223
        $this->assertEquals(3, $DB->count_records('sms_messages'));
224
 
225
        $usercontext = \core\context\user::instance($user->id);
226
        provider::delete_data_for_all_users_in_context($usercontext);
227
        $this->assertEmpty($DB->get_records('sms_messages', ['recipientuserid' => $user->id]));
228
        $this->assertEquals(1, $DB->count_records('sms_messages'));
229
    }
230
 
231
    public function test_delete_data_for_user(): void {
232
        global $DB;
233
 
234
        $this->resetAfterTest(true);
235
 
236
        $user = get_admin();
237
        $otheruser = $this->getDataGenerator()->create_user();
238
        $manager = \core\di::get(manager::class);
239
        $manager->send(
240
            recipientnumber: '12345',
241
            content: 'Hello world',
242
            component: 'core_sms',
243
            messagetype: 'example',
244
            recipientuserid: $user->id,
245
            async: false,
246
        );
247
        $manager->send(
248
            recipientnumber: '12345',
249
            content: 'Hello, world!',
250
            component: 'core_course',
251
            messagetype: 'example',
252
            recipientuserid: $user->id,
253
            async: false,
254
        );
255
        $manager->send(
256
            recipientnumber: '12345',
257
            content: 'Hello, world!',
258
            component: 'core_course',
259
            messagetype: 'example',
260
            recipientuserid: $otheruser->id,
261
            async: false,
262
        );
263
        $this->assertCount(2, $DB->get_records('sms_messages', ['recipientuserid' => $user->id]));
264
        $this->assertEquals(3, $DB->count_records('sms_messages'));
265
 
266
        $usercontext = \core\context\user::instance($user->id);
267
        provider::delete_data_for_user(new approved_contextlist($user, 'core_sms', [$usercontext->id]));
268
        $this->assertEmpty($DB->get_records('sms_messages', ['recipientuserid' => $user->id]));
269
        $this->assertEquals(1, $DB->count_records('sms_messages'));
270
    }
271
 
272
    public function test_delete_data_for_users_incorrect_userid(): void {
273
        global $DB;
274
 
275
        $this->resetAfterTest(true);
276
 
277
        $user = get_admin();
278
        $otheruser = $this->getDataGenerator()->create_user();
279
        $manager = \core\di::get(manager::class);
280
        $manager->send(
281
            recipientnumber: '12345',
282
            content: 'Hello world',
283
            component: 'core_sms',
284
            messagetype: 'example',
285
            recipientuserid: $user->id,
286
            async: false,
287
        );
288
        $manager->send(
289
            recipientnumber: '12345',
290
            content: 'Hello, world!',
291
            component: 'core_course',
292
            messagetype: 'example',
293
            recipientuserid: $user->id,
294
            async: false,
295
        );
296
        $manager->send(
297
            recipientnumber: '12345',
298
            content: 'Hello, world!',
299
            component: 'core_course',
300
            messagetype: 'example',
301
            recipientuserid: $otheruser->id,
302
            async: false,
303
        );
304
        $this->assertEquals(2, $DB->count_records('sms_messages', ['recipientuserid' => $user->id]));
305
        $this->assertEquals(1, $DB->count_records('sms_messages', ['recipientuserid' => $otheruser->id]));
306
        $this->assertEquals(3, $DB->count_records('sms_messages'));
307
 
308
        $usercontext = \core\context\user::instance($user->id);
309
 
310
        // Data is all stored under the users own context.
311
        provider::delete_data_for_users(new approved_userlist(
312
            $usercontext,
313
            'core_sms',
314
            [$otheruser->id]
315
        ));
316
        $this->assertEquals(0, $DB->count_records('sms_messages', ['recipientuserid' => $user->id]));
317
        $this->assertEquals(1, $DB->count_records('sms_messages', ['recipientuserid' => $otheruser->id]));
318
        $this->assertEquals(1, $DB->count_records('sms_messages'));
319
    }
320
 
321
    public function test_delete_data_for_users_correct_user(): void {
322
        global $DB;
323
 
324
        $this->resetAfterTest(true);
325
 
326
        $user = get_admin();
327
        $otheruser = $this->getDataGenerator()->create_user();
328
        $manager = \core\di::get(manager::class);
329
        $manager->send(
330
            recipientnumber: '12345',
331
            content: 'Hello world',
332
            component: 'core_sms',
333
            messagetype: 'example',
334
            recipientuserid: $user->id,
335
            async: false,
336
        );
337
        $manager->send(
338
            recipientnumber: '12345',
339
            content: 'Hello, world!',
340
            component: 'core_course',
341
            messagetype: 'example',
342
            recipientuserid: $user->id,
343
            async: false,
344
        );
345
        $manager->send(
346
            recipientnumber: '12345',
347
            content: 'Hello, world!',
348
            component: 'core_course',
349
            messagetype: 'example',
350
            recipientuserid: $otheruser->id,
351
            async: false,
352
        );
353
        $this->assertEquals(2, $DB->count_records('sms_messages', ['recipientuserid' => $user->id]));
354
        $this->assertEquals(1, $DB->count_records('sms_messages', ['recipientuserid' => $otheruser->id]));
355
        $this->assertEquals(3, $DB->count_records('sms_messages'));
356
 
357
        $usercontext = \core\context\user::instance($user->id);
358
 
359
        // Deleting data for both users only deletes that user's content.
360
        provider::delete_data_for_users(new approved_userlist(
361
            $usercontext,
362
            'core_sms',
363
            [$user->id, $otheruser->id],
364
        ));
365
        $this->assertEquals(0, $DB->count_records('sms_messages', ['recipientuserid' => $user->id]));
366
        $this->assertEquals(1, $DB->count_records('sms_messages', ['recipientuserid' => $otheruser->id]));
367
        $this->assertEquals(1, $DB->count_records('sms_messages'));
368
    }
369
 
370
    public function test_delete_data_for_users_wrong_context(): void {
371
        global $DB;
372
 
373
        $this->resetAfterTest(true);
374
 
375
        $user = get_admin();
376
        $otheruser = $this->getDataGenerator()->create_user();
377
        $manager = \core\di::get(manager::class);
378
        $manager->send(
379
            recipientnumber: '12345',
380
            content: 'Hello world',
381
            component: 'core_sms',
382
            messagetype: 'example',
383
            recipientuserid: $user->id,
384
            async: false,
385
        );
386
        $manager->send(
387
            recipientnumber: '12345',
388
            content: 'Hello, world!',
389
            component: 'core_course',
390
            messagetype: 'example',
391
            recipientuserid: $user->id,
392
            async: false,
393
        );
394
        $manager->send(
395
            recipientnumber: '12345',
396
            content: 'Hello, world!',
397
            component: 'core_course',
398
            messagetype: 'example',
399
            recipientuserid: $otheruser->id,
400
            async: false,
401
        );
402
        $this->assertEquals(2, $DB->count_records('sms_messages', ['recipientuserid' => $user->id]));
403
        $this->assertEquals(1, $DB->count_records('sms_messages', ['recipientuserid' => $otheruser->id]));
404
        $this->assertEquals(3, $DB->count_records('sms_messages'));
405
 
406
        // Incorrect contexts are ignored.
407
        provider::delete_data_for_users(new approved_userlist(
408
            \core\context\system::instance(),
409
            'core_sms',
410
            [$user->id, $otheruser->id],
411
        ));
412
 
413
        $this->assertEquals(2, $DB->count_records('sms_messages', ['recipientuserid' => $user->id]));
414
        $this->assertEquals(1, $DB->count_records('sms_messages', ['recipientuserid' => $otheruser->id]));
415
        $this->assertEquals(3, $DB->count_records('sms_messages'));
416
    }
417
 
418
    public function test_get_users_in_context(): void {
419
        global $DB;
420
 
421
        $this->resetAfterTest(true);
422
 
423
        $user = get_admin();
424
        $otheruser = $this->getDataGenerator()->create_user();
425
        $manager = \core\di::get(manager::class);
426
        $manager->send(
427
            recipientnumber: '12345',
428
            content: 'Hello world',
429
            component: 'core_sms',
430
            messagetype: 'example',
431
            recipientuserid: $user->id,
432
            async: false,
433
        );
434
        $manager->send(
435
            recipientnumber: '12345',
436
            content: 'Hello, world!',
437
            component: 'core_course',
438
            messagetype: 'example',
439
            recipientuserid: $user->id,
440
            async: false,
441
        );
442
        $manager->send(
443
            recipientnumber: '12345',
444
            content: 'Hello, world!',
445
            component: 'core_course',
446
            messagetype: 'example',
447
            recipientuserid: $otheruser->id,
448
            async: false,
449
        );
450
        $this->assertCount(2, $DB->get_records('sms_messages', ['recipientuserid' => $user->id]));
451
        $this->assertEquals(3, $DB->count_records('sms_messages'));
452
 
453
        // Get the users in the user context - should just be the user of that user context.
454
        $userlist = new userlist(\core\context\user::instance($user->id), 'core_sms');
455
        provider::get_users_in_context($userlist);
456
        $this->assertEquals([$user->id], $userlist->get_userids());
457
 
458
        // No users in the system context.
459
        $userlist = new userlist(\core\context\system::instance(), 'core_sms');
460
        provider::get_users_in_context($userlist);
461
        $this->assertEquals([], $userlist->get_userids());
462
    }
463
}