Proyectos de Subversion Moodle

Rev

Rev 1 | | 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    mod_chat
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 mod_chat\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\approved_userlist;
34
use core_privacy\local\request\transform;
35
use core_privacy\local\request\writer;
36
use mod_chat\privacy\provider;
37
 
38
require_once($CFG->dirroot . '/mod/chat/lib.php');
39
 
40
/**
41
 * Data provider testcase class.
42
 *
43
 * @package    mod_chat
44
 * @category   test
45
 * @copyright  2018 Frédéric Massart
46
 * @author     Frédéric Massart <fred@branchup.tech>
47
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
48
 */
49
class provider_test extends provider_testcase {
50
 
51
    public function setUp(): void {
52
        global $PAGE;
53
        $this->resetAfterTest();
54
        $PAGE->get_renderer('core');
55
 
56
        // Chat module is disabled by default, enable it for testing.
57
        $manager = \core_plugin_manager::resolve_plugininfo_class('mod');
58
        $manager::enable_plugin('chat', 1);
59
    }
60
 
11 efrain 61
    public function test_get_contexts_for_userid(): void {
1 efrain 62
        global $DB;
63
        $dg = $this->getDataGenerator();
64
        $c1 = $dg->create_course();
65
        $c2 = $dg->create_course();
66
 
67
        $u1 = $dg->create_user();
68
        $u2 = $dg->create_user();
69
 
70
        $chat1a = $dg->create_module('chat', ['course' => $c1]);
71
        $chat1b = $dg->create_module('chat', ['course' => $c1]);
72
        $chat2a = $dg->create_module('chat', ['course' => $c2]);
73
 
74
        // Logins but no message.
75
        $chatuser = $this->login_user_in_course_chat($u1, $c1, $chat1a);
76
 
77
        // Logins and messages.
78
        $chatuser = $this->login_user_in_course_chat($u1, $c1, $chat1b);
79
        chat_send_chatmessage($chatuser, 'Hello world!');
80
 
81
        // Silent login (no system message).
82
        $chatuser = $this->login_user_in_course_chat($u1, $c2, $chat2a, 0, true);
83
 
84
        // Silent login and messages.
85
        $chatuser = $this->login_user_in_course_chat($u2, $c1, $chat1b, 0, true);
86
        chat_send_chatmessage($chatuser, 'Ça va ?');
87
        chat_send_chatmessage($chatuser, 'Moi, ça va.');
88
 
89
        // Silent login and messages.
90
        $chatuser = $this->login_user_in_course_chat($u2, $c2, $chat2a);
91
        chat_send_chatmessage($chatuser, 'What\'s happening here?');
92
 
93
        // Check contexts for user 1.
94
        $contextids = provider::get_contexts_for_userid($u1->id)->get_contextids();
95
        $this->assertCount(2, $contextids);
96
        $this->assertTrue(in_array(\context_module::instance($chat1a->cmid)->id, $contextids));
97
        $this->assertTrue(in_array(\context_module::instance($chat1b->cmid)->id, $contextids));
98
 
99
        $contextids = provider::get_contexts_for_userid($u2->id)->get_contextids();
100
        $this->assertCount(2, $contextids);
101
        $this->assertTrue(in_array(\context_module::instance($chat1b->cmid)->id, $contextids));
102
        $this->assertTrue(in_array(\context_module::instance($chat2a->cmid)->id, $contextids));
103
    }
104
 
105
    /**
106
     * Test that only users with relevant contexts are fetched.
107
     */
11 efrain 108
    public function test_get_users_in_context(): void {
1 efrain 109
        $component = 'mod_chat';
110
        $dg = $this->getDataGenerator();
111
        $c1 = $dg->create_course();
112
        $c2 = $dg->create_course();
113
 
114
        $u1 = $dg->create_user();
115
        $u2 = $dg->create_user();
116
 
117
        $chat1a = $dg->create_module('chat', ['course' => $c1]);
118
        $chat1b = $dg->create_module('chat', ['course' => $c1]);
119
        $chat2a = $dg->create_module('chat', ['course' => $c2]);
120
 
121
        // Logins but no message.
122
        $chatuser = $this->login_user_in_course_chat($u1, $c1, $chat1a);
123
 
124
        // Logins and messages.
125
        $chatuser = $this->login_user_in_course_chat($u1, $c1, $chat1b);
126
        chat_send_chatmessage($chatuser, 'Hello world!');
127
 
128
        // Silent login (no system message).
129
        $chatuser = $this->login_user_in_course_chat($u1, $c2, $chat2a, 0, true);
130
 
131
        // Silent login and messages.
132
        $chatuser = $this->login_user_in_course_chat($u2, $c1, $chat1b, 0, true);
133
        chat_send_chatmessage($chatuser, 'Ça va ?');
134
        chat_send_chatmessage($chatuser, 'Moi, ça va.');
135
 
136
        // Silent login and messages.
137
        $chatuser = $this->login_user_in_course_chat($u2, $c2, $chat2a);
138
        chat_send_chatmessage($chatuser, 'What\'s happening here?');
139
 
140
        $context1a = \context_module::instance($chat1a->cmid);
141
        $context1b = \context_module::instance($chat1b->cmid);
142
        $context2a = \context_module::instance($chat2a->cmid);
143
 
144
        $userlist1a = new \core_privacy\local\request\userlist($context1a, $component);
145
        $userlist1b = new \core_privacy\local\request\userlist($context1b, $component);
146
        $userlist2a = new \core_privacy\local\request\userlist($context2a, $component);
147
        \mod_chat\privacy\provider::get_users_in_context($userlist1a);
148
        \mod_chat\privacy\provider::get_users_in_context($userlist1b);
149
        \mod_chat\privacy\provider::get_users_in_context($userlist2a);
150
 
151
        // Ensure correct users are found in relevant contexts.
152
        $this->assertCount(1, $userlist1a);
153
        $expected = [$u1->id];
154
        $actual = $userlist1a->get_userids();
155
        $this->assertEquals($expected, $actual);
156
 
157
        $this->assertCount(2, $userlist1b);
158
        $expected = [$u1->id, $u2->id];
159
        $actual = $userlist1b->get_userids();
160
        sort($expected);
161
        sort($actual);
162
        $this->assertEquals($expected, $actual);
163
 
164
        $this->assertCount(1, $userlist2a);
165
        $expected = [$u1->id];
166
        $actual = $userlist1a->get_userids();
167
        $this->assertEquals($expected, $actual);
168
    }
169
 
11 efrain 170
    public function test_delete_data_for_all_users_in_context(): void {
1 efrain 171
        global $DB;
172
        $dg = $this->getDataGenerator();
173
        $c1 = $dg->create_course();
174
 
175
        $u1 = $dg->create_user();
176
        $u2 = $dg->create_user();
177
 
178
        $chat1a = $dg->create_module('chat', ['course' => $c1]);
179
        $chat1b = $dg->create_module('chat', ['course' => $c1]);
180
        $chat1actx = \context_module::instance($chat1a->cmid);
181
        $chat1bctx = \context_module::instance($chat1b->cmid);
182
 
183
        $u1chat1a = $this->login_user_in_course_chat($u1, $c1, $chat1a);
184
        $u2chat1a = $this->login_user_in_course_chat($u2, $c1, $chat1a);
185
        chat_send_chatmessage($u1chat1a, 'Ça va ?');
186
        chat_send_chatmessage($u2chat1a, 'Oui, et toi ?');
187
        chat_send_chatmessage($u1chat1a, 'Bien merci.');
188
        chat_send_chatmessage($u2chat1a, 'Pourquoi ils disent omelette "du" fromage ?!');
189
        chat_send_chatmessage($u1chat1a, 'Aucune idée');
190
        $this->assert_has_data_in_chat($u1, $chat1a);
191
        $this->assert_has_data_in_chat($u2, $chat1a);
192
 
193
        $u1chat1b = $this->login_user_in_course_chat($u1, $c1, $chat1b);
194
        $u2chat1b = $this->login_user_in_course_chat($u2, $c1, $chat1b);
195
        chat_send_chatmessage($u1chat1b, 'How are you going?');
196
        chat_send_chatmessage($u2chat1b, 'Alright, you?');
197
        chat_send_chatmessage($u1chat1b, 'Good, thanks.');
198
        chat_send_chatmessage($u2chat1b, 'Sacre bleu!');
199
        chat_send_chatmessage($u1chat1b, '\ö/');
200
        $this->assert_has_data_in_chat($u1, $chat1b);
201
        $this->assert_has_data_in_chat($u2, $chat1b);
202
 
203
        // No change.
204
        provider::delete_data_for_all_users_in_context(\context_course::instance($c1->id));
205
        $this->assert_has_data_in_chat($u1, $chat1a);
206
        $this->assert_has_data_in_chat($u2, $chat1a);
207
        $this->assert_has_data_in_chat($u1, $chat1b);
208
        $this->assert_has_data_in_chat($u2, $chat1b);
209
 
210
        // Deletinge first chat does not affect other chat.
211
        provider::delete_data_for_all_users_in_context($chat1actx);
212
        $this->assert_has_no_data_in_chat($u1, $chat1a);
213
        $this->assert_has_no_data_in_chat($u2, $chat1a);
214
        $this->assert_has_data_in_chat($u1, $chat1b);
215
        $this->assert_has_data_in_chat($u2, $chat1b);
216
    }
217
 
11 efrain 218
    public function test_delete_data_for_user(): void {
1 efrain 219
        global $DB;
220
        $dg = $this->getDataGenerator();
221
        $c1 = $dg->create_course();
222
 
223
        $u1 = $dg->create_user();
224
        $u2 = $dg->create_user();
225
 
226
        $chat1a = $dg->create_module('chat', ['course' => $c1]);
227
        $chat1b = $dg->create_module('chat', ['course' => $c1]);
228
        $chat1actx = \context_module::instance($chat1a->cmid);
229
        $chat1bctx = \context_module::instance($chat1b->cmid);
230
 
231
        $u1chat1a = $this->login_user_in_course_chat($u1, $c1, $chat1a);
232
        $u2chat1a = $this->login_user_in_course_chat($u2, $c1, $chat1a);
233
        chat_send_chatmessage($u1chat1a, 'Ça va ?');
234
        chat_send_chatmessage($u2chat1a, 'Oui, et toi ?');
235
        chat_send_chatmessage($u1chat1a, 'Bien merci.');
236
        chat_send_chatmessage($u2chat1a, 'Pourquoi ils disent omelette "du" fromage ?!');
237
        chat_send_chatmessage($u1chat1a, 'Aucune idée');
238
        $this->assert_has_data_in_chat($u1, $chat1a);
239
        $this->assert_has_data_in_chat($u2, $chat1a);
240
 
241
        $u1chat1b = $this->login_user_in_course_chat($u1, $c1, $chat1b);
242
        $u2chat1b = $this->login_user_in_course_chat($u2, $c1, $chat1b);
243
        chat_send_chatmessage($u1chat1b, 'How are you going?');
244
        chat_send_chatmessage($u2chat1b, 'Alright, you?');
245
        chat_send_chatmessage($u1chat1b, 'Good, thanks.');
246
        chat_send_chatmessage($u2chat1b, 'Sacre bleu!');
247
        chat_send_chatmessage($u1chat1b, '\ö/');
248
        $this->assert_has_data_in_chat($u1, $chat1b);
249
        $this->assert_has_data_in_chat($u2, $chat1b);
250
 
251
        provider::delete_data_for_user(new approved_contextlist($u1, 'mod_chat', [$chat1actx->id]));
252
        $this->assert_has_no_data_in_chat($u1, $chat1a);
253
        $this->assert_has_data_in_chat($u2, $chat1a);
254
        $this->assert_has_data_in_chat($u1, $chat1b);
255
        $this->assert_has_data_in_chat($u2, $chat1b);
256
 
257
        provider::delete_data_for_user(new approved_contextlist($u2, 'mod_chat', [$chat1actx->id, $chat1bctx->id]));
258
        $this->assert_has_no_data_in_chat($u1, $chat1a);
259
        $this->assert_has_no_data_in_chat($u2, $chat1a);
260
        $this->assert_has_data_in_chat($u1, $chat1b);
261
        $this->assert_has_no_data_in_chat($u2, $chat1b);
262
    }
263
 
264
    /**
265
     * Test that data for users in approved userlist is deleted.
266
     */
11 efrain 267
    public function test_delete_data_for_users(): void {
1 efrain 268
        global $DB;
269
        $component = 'mod_chat';
270
        $dg = $this->getDataGenerator();
271
        $c1 = $dg->create_course();
272
 
273
        $u1 = $dg->create_user();
274
        $u2 = $dg->create_user();
275
        $u3 = $dg->create_user();
276
 
277
        $chat1 = $dg->create_module('chat', ['course' => $c1]);
278
        $chat1context = \context_module::instance($chat1->cmid);
279
 
280
        $u1chat1 = $this->login_user_in_course_chat($u1, $c1, $chat1);
281
        $u2chat1 = $this->login_user_in_course_chat($u2, $c1, $chat1);
282
        $u3chat1 = $this->login_user_in_course_chat($u3, $c1, $chat1);
283
        chat_send_chatmessage($u1chat1, 'Ça va ?');
284
        chat_send_chatmessage($u2chat1, 'Oui, et toi ?');
285
        chat_send_chatmessage($u1chat1, 'Bien merci.');
286
        chat_send_chatmessage($u2chat1, 'Pourquoi ils disent omelette "du" fromage ?!');
287
        chat_send_chatmessage($u1chat1, 'Aucune idée');
288
        chat_send_chatmessage($u3chat1, 'Je ne comprends pas');
289
        $this->assert_has_data_in_chat($u1, $chat1);
290
        $this->assert_has_data_in_chat($u2, $chat1);
291
        $this->assert_has_data_in_chat($u3, $chat1);
292
 
293
        $chat2 = $dg->create_module('chat', ['course' => $c1]);
294
 
295
        $u1chat2 = $this->login_user_in_course_chat($u1, $c1, $chat2);
296
        $u2chat2 = $this->login_user_in_course_chat($u2, $c1, $chat2);
297
        $u3chat2 = $this->login_user_in_course_chat($u3, $c1, $chat2);
298
        chat_send_chatmessage($u1chat2, 'Why do we have a separate chat?');
299
        chat_send_chatmessage($u2chat2, 'I have no idea!');
300
        chat_send_chatmessage($u3chat2, 'Me either.');
301
        $this->assert_has_data_in_chat($u1, $chat2);
302
        $this->assert_has_data_in_chat($u2, $chat2);
303
        $this->assert_has_data_in_chat($u3, $chat2);
304
 
305
        // Delete user 1 and 2 data from chat 1 context only.
306
        $approveduserids = [$u1->id, $u2->id];
307
        $approvedlist = new approved_userlist($chat1context, $component, $approveduserids);
308
        provider::delete_data_for_users($approvedlist);
309
 
310
        // Ensure correct chat data is deleted.
311
        $this->assert_has_no_data_in_chat($u1, $chat1);
312
        $this->assert_has_no_data_in_chat($u2, $chat1);
313
        $this->assert_has_data_in_chat($u3, $chat1);
314
 
315
        $this->assert_has_data_in_chat($u1, $chat2);
316
        $this->assert_has_data_in_chat($u2, $chat2);
317
        $this->assert_has_data_in_chat($u3, $chat2);
318
    }
319
 
11 efrain 320
    public function test_export_data_for_user(): void {
1 efrain 321
        global $DB;
322
        $dg = $this->getDataGenerator();
323
        $c1 = $dg->create_course();
324
 
325
        $u1 = $dg->create_user();
326
        $u2 = $dg->create_user();
327
 
328
        $chat1a = $dg->create_module('chat', ['course' => $c1]);
329
        $chat1b = $dg->create_module('chat', ['course' => $c1]);
330
        $chat1actx = \context_module::instance($chat1a->cmid);
331
        $chat1bctx = \context_module::instance($chat1b->cmid);
332
 
333
        $u1chat1a = $this->login_user_in_course_chat($u1, $c1, $chat1a);
334
        $u2chat1a = $this->login_user_in_course_chat($u2, $c1, $chat1a);
335
        chat_send_chatmessage($u1chat1a, 'Ça va ?');
336
        chat_send_chatmessage($u2chat1a, 'Oui, et toi ?');
337
        chat_send_chatmessage($u1chat1a, 'Bien merci.');
338
        chat_send_chatmessage($u2chat1a, 'Pourquoi ils disent omelette "du" fromage ?!');
339
        chat_send_chatmessage($u1chat1a, 'Aucune idée');
340
        chat_send_chatmessage($u1chat1a, 'exit', true);
341
 
342
        $u1chat1b = $this->login_user_in_course_chat($u1, $c1, $chat1b);
343
        $u2chat1b = $this->login_user_in_course_chat($u2, $c1, $chat1b);
344
        chat_send_chatmessage($u1chat1b, 'How are you going?');
345
        chat_send_chatmessage($u2chat1b, 'Alright, you?');
346
        chat_send_chatmessage($u1chat1b, 'Good, thanks.');
347
        chat_send_chatmessage($u2chat1b, 'Sacre bleu!');
348
        chat_send_chatmessage($u1chat1b, '\ö/');
349
 
350
        // Export for user 1 in chat 1.
351
        provider::export_user_data(new approved_contextlist($u1, 'mod_chat', [$chat1actx->id]));
352
        $data = writer::with_context($chat1actx)->get_data([]);
353
        $this->assertNotEmpty($data);
354
        $this->assertCount(5, $data->messages);
355
        $this->assertEquals(get_string('messageenter', 'mod_chat', fullname($u1)), $data->messages[0]['message']);
356
        $this->assertEquals(transform::yesno(true), $data->messages[0]['is_system_generated']);
357
        $this->assertEquals('Ça va ?', $data->messages[1]['message']);
358
        $this->assertEquals(transform::yesno(false), $data->messages[1]['is_system_generated']);
359
        $this->assertEquals('Bien merci.', $data->messages[2]['message']);
360
        $this->assertEquals(transform::yesno(false), $data->messages[2]['is_system_generated']);
361
        $this->assertEquals('Aucune idée', $data->messages[3]['message']);
362
        $this->assertEquals(transform::yesno(false), $data->messages[3]['is_system_generated']);
363
        $this->assertEquals(get_string('messageexit', 'mod_chat', fullname($u1)), $data->messages[4]['message']);
364
        $this->assertEquals(transform::yesno(true), $data->messages[4]['is_system_generated']);
365
        $data = writer::with_context($chat1bctx)->get_data([]);
366
        $this->assertEmpty($data);
367
 
368
        // Export for user2 in chat 1 and 2.
369
        writer::reset();
370
        provider::export_user_data(new approved_contextlist($u2, 'mod_chat', [$chat1actx->id, $chat1bctx->id]));
371
        $data = writer::with_context($chat1actx)->get_data([]);
372
        $this->assertNotEmpty($data);
373
        $this->assertCount(3, $data->messages);
374
        $this->assertEquals(get_string('messageenter', 'mod_chat', fullname($u2)), $data->messages[0]['message']);
375
        $this->assertEquals('Oui, et toi ?', $data->messages[1]['message']);
376
        $this->assertEquals('Pourquoi ils disent omelette "du" fromage ?!', $data->messages[2]['message']);
377
        $data = writer::with_context($chat1bctx)->get_data([]);
378
        $this->assertNotEmpty($data);
379
        $this->assertCount(3, $data->messages);
380
        $this->assertEquals(get_string('messageenter', 'mod_chat', fullname($u2)), $data->messages[0]['message']);
381
        $this->assertEquals('Alright, you?', $data->messages[1]['message']);
382
        $this->assertEquals('Sacre bleu!', $data->messages[2]['message']);
383
    }
384
 
385
    /**
386
     * Assert that there is data for a user in a chat.
387
     *
388
     * @param object $user The user.
389
     * @param object $chat The chat.
390
     * @return void
391
     */
392
    protected function assert_has_data_in_chat($user, $chat) {
393
        $this->assertTrue($this->has_data_in_chat($user, $chat));
394
    }
395
 
396
    /**
397
     * Assert that there isn't any data for a user in a chat.
398
     *
399
     * @param object $user The user.
400
     * @param object $chat The chat.
401
     * @return void
402
     */
403
    protected function assert_has_no_data_in_chat($user, $chat) {
404
        $this->assertFalse($this->has_data_in_chat($user, $chat));
405
    }
406
 
407
    /**
408
     * Check whether a user has data in a chat.
409
     *
410
     * @param object $user The user.
411
     * @param object $chat The chat.
412
     * @return bool
413
     */
414
    protected function has_data_in_chat($user, $chat) {
415
        global $DB;
416
        return $DB->record_exists('chat_messages', ['chatid' => $chat->id, 'userid' => $user->id]);
417
    }
418
 
419
    /**
420
     * Login a user in a chat.
421
     *
422
     * @param object $user The user.
423
     * @param object $course The course.
424
     * @param object $chat The chat.
425
     * @param int $group The group number.
426
     * @param bool $silent Whether we should advertise that the user logs in.
427
     * @return object The chat user.
428
     */
429
    protected function login_user_in_course_chat($user, $course, $chat, $group = 0, $silent = false) {
430
        global $DB, $USER;
431
        $origuser = $USER;
432
        $this->setUser($user);
433
        chat_login_user($chat->id, $silent ? 'sockets' : 'basic', 0, $course);
434
        $chatuser = $DB->get_record('chat_users', ['userid' => $user->id, 'chatid' => $chat->id, 'groupid' => 0]);
435
        $this->setUser($origuser);
436
        return $chatuser;
437
    }
438
}