MDL-70897 various: uasort callback can not return bool
[moodle.git] / message / tests / privacy_provider_test.php
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/>.
17 /**
18  * Privacy provider tests.
19  *
20  * @package    core_message
21  * @copyright  2018 Mark Nelson <markn@moodle.com>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 use core_privacy\local\metadata\collection;
26 use core_message\privacy\provider;
27 use \core_privacy\local\request\contextlist;
28 use \core_privacy\local\request\writer;
29 use \core_privacy\local\request\transform;
30 use \core_message\tests\helper as testhelper;
32 defined('MOODLE_INTERNAL') || die();
34 /**
35  * Privacy provider tests class.
36  *
37  * @package    core_message
38  * @copyright  2018 Mark Nelson <markn@moodle.com>
39  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
40  */
41 class core_message_privacy_provider_testcase extends \core_privacy\tests\provider_testcase {
43     /**
44      * Test for provider::get_metadata().
45      */
46     public function test_get_metadata() {
47         $collection = new collection('core_message');
48         $newcollection = provider::get_metadata($collection);
49         $itemcollection = $newcollection->get_collection();
50         $this->assertCount(10, $itemcollection);
52         $messagestable = array_shift($itemcollection);
53         $this->assertEquals('messages', $messagestable->get_name());
55         $messageuseractionstable = array_shift($itemcollection);
56         $this->assertEquals('message_user_actions', $messageuseractionstable->get_name());
58         $messageconversationmemberstable = array_shift($itemcollection);
59         $this->assertEquals('message_conversation_members', $messageconversationmemberstable->get_name());
61         $messageconversationactions = array_shift($itemcollection);
62         $this->assertEquals('message_conversation_actions', $messageconversationactions->get_name());
64         $messagecontacts = array_shift($itemcollection);
65         $this->assertEquals('message_contacts', $messagecontacts->get_name());
67         $messagecontactrequests = array_shift($itemcollection);
68         $this->assertEquals('message_contact_requests', $messagecontactrequests->get_name());
70         $messageusersblocked = array_shift($itemcollection);
71         $this->assertEquals('message_users_blocked', $messageusersblocked->get_name());
73         $notificationstable = array_shift($itemcollection);
74         $this->assertEquals('notifications', $notificationstable->get_name());
76         $usersettings = array_shift($itemcollection);
77         $this->assertEquals('core_message_messageprovider_settings', $usersettings->get_name());
79         $favouriteconversations = array_shift($itemcollection);
80         $this->assertEquals('core_favourites', $favouriteconversations->get_name());
81         $this->assertEquals('privacy:metadata:core_favourites', $favouriteconversations->get_summary());
83         $privacyfields = $messagestable->get_privacy_fields();
84         $this->assertArrayHasKey('useridfrom', $privacyfields);
85         $this->assertArrayHasKey('conversationid', $privacyfields);
86         $this->assertArrayHasKey('subject', $privacyfields);
87         $this->assertArrayHasKey('fullmessage', $privacyfields);
88         $this->assertArrayHasKey('fullmessageformat', $privacyfields);
89         $this->assertArrayHasKey('fullmessagehtml', $privacyfields);
90         $this->assertArrayHasKey('smallmessage', $privacyfields);
91         $this->assertArrayHasKey('timecreated', $privacyfields);
92         $this->assertArrayHasKey('customdata', $privacyfields);
93         $this->assertEquals('privacy:metadata:messages', $messagestable->get_summary());
95         $privacyfields = $messageuseractionstable->get_privacy_fields();
96         $this->assertArrayHasKey('userid', $privacyfields);
97         $this->assertArrayHasKey('messageid', $privacyfields);
98         $this->assertArrayHasKey('action', $privacyfields);
99         $this->assertArrayHasKey('timecreated', $privacyfields);
100         $this->assertEquals('privacy:metadata:message_user_actions', $messageuseractionstable->get_summary());
102         $privacyfields = $messageconversationmemberstable->get_privacy_fields();
103         $this->assertArrayHasKey('conversationid', $privacyfields);
104         $this->assertArrayHasKey('userid', $privacyfields);
105         $this->assertArrayHasKey('timecreated', $privacyfields);
106         $this->assertEquals('privacy:metadata:message_conversation_members', $messageconversationmemberstable->get_summary());
108         $privacyfields = $messagecontacts->get_privacy_fields();
109         $this->assertArrayHasKey('userid', $privacyfields);
110         $this->assertArrayHasKey('contactid', $privacyfields);
111         $this->assertArrayHasKey('timecreated', $privacyfields);
112         $this->assertEquals('privacy:metadata:message_contacts', $messagecontacts->get_summary());
114         $privacyfields = $messagecontactrequests->get_privacy_fields();
115         $this->assertArrayHasKey('userid', $privacyfields);
116         $this->assertArrayHasKey('requesteduserid', $privacyfields);
117         $this->assertArrayHasKey('timecreated', $privacyfields);
118         $this->assertEquals('privacy:metadata:message_contact_requests', $messagecontactrequests->get_summary());
120         $privacyfields = $messageusersblocked->get_privacy_fields();
121         $this->assertArrayHasKey('userid', $privacyfields);
122         $this->assertArrayHasKey('blockeduserid', $privacyfields);
123         $this->assertArrayHasKey('timecreated', $privacyfields);
124         $this->assertEquals('privacy:metadata:message_users_blocked', $messageusersblocked->get_summary());
126         $privacyfields = $notificationstable->get_privacy_fields();
127         $this->assertArrayHasKey('useridfrom', $privacyfields);
128         $this->assertArrayHasKey('useridto', $privacyfields);
129         $this->assertArrayHasKey('subject', $privacyfields);
130         $this->assertArrayHasKey('fullmessage', $privacyfields);
131         $this->assertArrayHasKey('fullmessageformat', $privacyfields);
132         $this->assertArrayHasKey('fullmessagehtml', $privacyfields);
133         $this->assertArrayHasKey('smallmessage', $privacyfields);
134         $this->assertArrayHasKey('component', $privacyfields);
135         $this->assertArrayHasKey('eventtype', $privacyfields);
136         $this->assertArrayHasKey('contexturl', $privacyfields);
137         $this->assertArrayHasKey('contexturlname', $privacyfields);
138         $this->assertArrayHasKey('timeread', $privacyfields);
139         $this->assertArrayHasKey('timecreated', $privacyfields);
140         $this->assertArrayHasKey('customdata', $privacyfields);
141         $this->assertEquals('privacy:metadata:notifications', $notificationstable->get_summary());
142     }
144     /**
145      * Test for provider::export_user_preferences().
146      */
147     public function test_export_user_preferences_no_pref() {
148         $this->resetAfterTest();
150         $user = $this->getDataGenerator()->create_user();
151         provider::export_user_preferences($user->id);
153         $writer = writer::with_context(\context_system::instance());
155         $this->assertFalse($writer->has_any_data());
156     }
158     /**
159      * Test for provider::export_user_preferences().
160      */
161     public function test_export_user_preferences() {
162         global $USER;
164         $this->resetAfterTest();
166         $this->setAdminUser();
168         // Create another user to set a preference for who we won't be exporting.
169         $user = $this->getDataGenerator()->create_user();
171         // Set some message user preferences.
172         set_user_preference('message_provider_moodle_instantmessage_loggedin', 'airnotifier', $USER->id);
173         set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'popup', $USER->id);
174         set_user_preference('message_blocknoncontacts', \core_message\api::MESSAGE_PRIVACY_ONLYCONTACTS, $USER->id);
175         set_user_preference('message_entertosend', true, $USER->id);
176         set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'inbound', $user->id);
178         // Set an unrelated preference.
179         set_user_preference('some_unrelated_preference', 'courses', $USER->id);
181         provider::export_user_preferences($USER->id);
183         $writer = writer::with_context(\context_system::instance());
185         $this->assertTrue($writer->has_any_data());
187         $prefs = (array) $writer->get_user_preferences('core_message');
189         // Check only 3 preferences exist.
190         $this->assertCount(4, $prefs);
191         $this->assertArrayHasKey('message_provider_moodle_instantmessage_loggedin', $prefs);
192         $this->assertArrayHasKey('message_provider_moodle_instantmessage_loggedoff', $prefs);
193         $this->assertArrayHasKey('message_blocknoncontacts', $prefs);
194         $this->assertArrayHasKey('message_entertosend', $prefs);
196         foreach ($prefs as $key => $pref) {
197             if ($key == 'message_provider_moodle_instantmessage_loggedin') {
198                 $this->assertEquals('airnotifier', $pref->value);
199             } else if ($key == 'message_provider_moodle_instantmessage_loggedoff') {
200                 $this->assertEquals('popup', $pref->value);
201             } else {
202                 $this->assertEquals(1, $pref->value);
203             }
204         }
205     }
207     /**
208      * Test for provider::get_contexts_for_userid() when there is no message or notification.
209      */
210     public function test_get_contexts_for_userid_no_data() {
211         $this->resetAfterTest();
213         $user = $this->getDataGenerator()->create_user();
215         $contextlist = provider::get_contexts_for_userid($user->id);
216         $this->assertCount(1, $contextlist);
218         $this->remove_user_self_conversation($user->id);
220         $contextlist = provider::get_contexts_for_userid($user->id);
221         $this->assertEmpty($contextlist);
222     }
224     /**
225      * Test for provider::get_contexts_for_userid() when there is a private message between users.
226      */
227     public function test_get_contexts_for_userid_with_private_messages() {
228         $this->resetAfterTest();
230         $user1 = $this->getDataGenerator()->create_user();
231         $user2 = $this->getDataGenerator()->create_user();
232         $user3 = $this->getDataGenerator()->create_user();
234         // Remove user self-conversations.
235         $this->remove_user_self_conversation($user1->id);
236         $this->remove_user_self_conversation($user2->id);
237         $this->remove_user_self_conversation($user3->id);
239         // Test nothing is found before group conversations is created or message is sent.
240         $contextlist = provider::get_contexts_for_userid($user1->id);
241         $this->assertCount(0, $contextlist);
242         $contextlist = provider::get_contexts_for_userid($user2->id);
243         $this->assertCount(0, $contextlist);
245         // Send some private messages.
246         $pm1id = $this->create_message($user1->id, $user2->id, time() - (9 * DAYSECS));
248         // Test for the sender (user1).
249         $contextlist = provider::get_contexts_for_userid($user1->id);
250         $this->assertCount(1, $contextlist);
251         $contextforuser = $contextlist->current();
252         $this->assertEquals(
253                 \context_user::instance($user1->id)->id,
254                 $contextforuser->id);
256         // Test for the receiver (user2).
257         $contextlist = provider::get_contexts_for_userid($user2->id);
258         $this->assertCount(1, $contextlist);
259         $contextforuser = $contextlist->current();
260         $this->assertEquals(
261                 \context_user::instance($user2->id)->id,
262                 $contextforuser->id);
264         // Test for user3 (no private messages).
265         $contextlist = provider::get_contexts_for_userid($user3->id);
266         $this->assertCount(0, $contextlist);
267     }
269     /**
270      * Test for provider::get_contexts_for_userid() when there is several messages (private and group).
271      */
272     public function test_get_contexts_for_userid_with_messages() {
273         $this->resetAfterTest();
274         $this->setAdminUser();
276         $user1 = $this->getDataGenerator()->create_user();
277         $user2 = $this->getDataGenerator()->create_user();
278         $user3 = $this->getDataGenerator()->create_user();
279         $user4 = $this->getDataGenerator()->create_user();
281         // Remove user self-conversations.
282         $this->remove_user_self_conversation($user1->id);
283         $this->remove_user_self_conversation($user2->id);
284         $this->remove_user_self_conversation($user3->id);
285         $this->remove_user_self_conversation($user4->id);
287         // Test nothing is found before group conversations is created or message is sent.
288         $contextlist = provider::get_contexts_for_userid($user1->id);
289         $this->assertCount(0, $contextlist);
290         $contextlist = provider::get_contexts_for_userid($user2->id);
291         $this->assertCount(0, $contextlist);
293         // Create course.
294         $course1 = $this->getDataGenerator()->create_course();
295         $coursecontext1 = context_course::instance($course1->id);
297         // Enrol users to courses.
298         $this->getDataGenerator()->enrol_user($user1->id, $course1->id);
299         $this->getDataGenerator()->enrol_user($user2->id, $course1->id);
300         $this->getDataGenerator()->enrol_user($user3->id, $course1->id);
302         // Create groups (only one with enablemessaging = 1).
303         $group1a = $this->getDataGenerator()->create_group(array('courseid' => $course1->id, 'enablemessaging' => 1));
305         // Add users to groups.
306         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user1->id));
307         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user2->id));
308         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user3->id));
310         // Get conversation.
311         $component = 'core_group';
312         $itemtype = 'groups';
313         $conversation1 = \core_message\api::get_conversation_by_area(
314             $component,
315             $itemtype,
316             $group1a->id,
317             $coursecontext1->id
318         );
320         // Send some messages to the group conversation.
321         $now = time();
322         $m1id = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1', $now + 1);
323         $m2id = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 2', $now + 2);
324         $m3id = testhelper::send_fake_message_to_conversation($user2, $conversation1->id, 'Message 3', $now + 3);
326         // Test for user1 (although is member of the conversation, hasn't any private message).
327         $contextlist = provider::get_contexts_for_userid($user1->id);
328         $this->assertCount(0, $contextlist);
330         // Test for user2 (although is member of the conversation, hasn't any private message).
331         $contextlist = provider::get_contexts_for_userid($user2->id);
332         $this->assertCount(0, $contextlist);
334         // Test for user3 (although is member of the conversation, hasn't any private message).
335         $contextlist = provider::get_contexts_for_userid($user3->id);
336         $this->assertCount(0, $contextlist);
338         // Test for user4 (doesn't belong to the conversation).
339         $contextlist = provider::get_contexts_for_userid($user4->id);
340         $this->assertCount(0, $contextlist);
342         // Send some private messages.
343         $pm1id = $this->create_message($user1->id, $user2->id, time() - (9 * DAYSECS));
345         // Test user1 now has the user context because of the private message.
346         $contextlist = provider::get_contexts_for_userid($user1->id);
347         $this->assertCount(1, $contextlist);
348         $contextforuser = $contextlist->current();
349         $this->assertEquals(
350                 \context_user::instance($user1->id)->id,
351                 $contextforuser->id);
353         // Test user2 now has the user context because of the private message.
354         $contextlist = provider::get_contexts_for_userid($user2->id);
355         $this->assertCount(1, $contextlist);
356         $contextforuser = $contextlist->current();
357         $this->assertEquals(
358                 \context_user::instance($user2->id)->id,
359                 $contextforuser->id);
361         // Test for user3 (although is member of the conversation, hasn't still any private message).
362         $contextlist = provider::get_contexts_for_userid($user3->id);
363         $this->assertCount(0, $contextlist);
365         // Test for user4 (doesn't belong to the conversation and hasn't any private message).
366         $contextlist = provider::get_contexts_for_userid($user4->id);
367         $this->assertCount(0, $contextlist);
368     }
370     /**
371      * Test for provider::get_contexts_for_userid() when there is a notification between users.
372      */
373     public function test_get_contexts_for_userid_with_notification() {
374         $this->resetAfterTest();
376         $user1 = $this->getDataGenerator()->create_user();
377         $user2 = $this->getDataGenerator()->create_user();
379         // Remove user self-conversations.
380         $this->remove_user_self_conversation($user1->id);
381         $this->remove_user_self_conversation($user2->id);
383         // Test nothing is found before notification is created.
384         $contextlist = provider::get_contexts_for_userid($user1->id);
385         $this->assertCount(0, $contextlist);
386         $contextlist = provider::get_contexts_for_userid($user2->id);
387         $this->assertCount(0, $contextlist);
389         $this->create_notification($user1->id, $user2->id, time() - (9 * DAYSECS));
391         // Test for the sender.
392         $contextlist = provider::get_contexts_for_userid($user1->id);
393         $this->assertCount(1, $contextlist);
394         $contextforuser = $contextlist->current();
395         $this->assertEquals(
396                 context_user::instance($user1->id)->id,
397                 $contextforuser->id);
399         // Test for the receiver.
400         $contextlist = provider::get_contexts_for_userid($user2->id);
401         $this->assertCount(1, $contextlist);
402         $contextforuser = $contextlist->current();
403         $this->assertEquals(
404                 context_user::instance($user2->id)->id,
405                 $contextforuser->id);
406     }
408     /**
409      * Test for provider::get_contexts_for_userid() when a users has a contact.
410      */
411     public function test_get_contexts_for_userid_with_contact() {
412         $this->resetAfterTest();
414         $user1 = $this->getDataGenerator()->create_user();
415         $user2 = $this->getDataGenerator()->create_user();
417         // Remove user self-conversations.
418         $this->remove_user_self_conversation($user1->id);
419         $this->remove_user_self_conversation($user2->id);
421         // Test nothing is found before contact is created.
422         $contextlist = provider::get_contexts_for_userid($user1->id);
423         $this->assertCount(0, $contextlist);
424         $contextlist = provider::get_contexts_for_userid($user2->id);
425         $this->assertCount(0, $contextlist);
427         \core_message\api::add_contact($user1->id, $user2->id);
429         // Test for the user adding the contact.
430         $contextlist = provider::get_contexts_for_userid($user1->id);
431         $this->assertCount(1, $contextlist);
432         $contextforuser = $contextlist->current();
433         $this->assertEquals(
434                 context_user::instance($user1->id)->id,
435                 $contextforuser->id);
437         // Test for the user who is the contact.
438         $contextlist = provider::get_contexts_for_userid($user2->id);
439         $this->assertCount(1, $contextlist);
440         $contextforuser = $contextlist->current();
441         $this->assertEquals(
442                 context_user::instance($user2->id)->id,
443                 $contextforuser->id);
444     }
446     /**
447      * Test for provider::get_contexts_for_userid() when a user makes a contact request.
448      */
449     public function test_get_contexts_for_userid_with_contact_request() {
450         $this->resetAfterTest();
452         $user1 = $this->getDataGenerator()->create_user();
453         $user2 = $this->getDataGenerator()->create_user();
455         // Remove user self-conversations.
456         $this->remove_user_self_conversation($user1->id);
457         $this->remove_user_self_conversation($user2->id);
459         // Test nothing is found before request is created.
460         $contextlist = provider::get_contexts_for_userid($user1->id);
461         $this->assertCount(0, $contextlist);
462         $contextlist = provider::get_contexts_for_userid($user2->id);
463         $this->assertCount(0, $contextlist);
465         \core_message\api::create_contact_request($user1->id, $user2->id);
467         // Test for the user requesting the contact.
468         $contextlist = provider::get_contexts_for_userid($user1->id);
469         $this->assertCount(1, $contextlist);
470         $contextforuser = $contextlist->current();
471         $this->assertEquals(
472                 context_user::instance($user1->id)->id,
473                 $contextforuser->id);
475         // Test for the user receiving the contact request.
476         $contextlist = provider::get_contexts_for_userid($user2->id);
477         $this->assertCount(1, $contextlist);
478         $contextforuser = $contextlist->current();
479         $this->assertEquals(
480                 context_user::instance($user2->id)->id,
481                 $contextforuser->id);
482     }
484     /**
485      * Test for provider::get_contexts_for_userid() when a user is blocked.
486      */
487     public function test_get_contexts_for_userid_with_blocked_contact() {
488         $this->resetAfterTest();
490         $user1 = $this->getDataGenerator()->create_user();
491         $user2 = $this->getDataGenerator()->create_user();
493         // Remove user self-conversations.
494         $this->remove_user_self_conversation($user1->id);
495         $this->remove_user_self_conversation($user2->id);
497         // Test nothing is found before user is blocked.
498         $contextlist = provider::get_contexts_for_userid($user1->id);
499         $this->assertCount(0, $contextlist);
500         $contextlist = provider::get_contexts_for_userid($user2->id);
501         $this->assertCount(0, $contextlist);
503         \core_message\api::block_user($user1->id, $user2->id);
505         // Test for the blocking user.
506         $contextlist = provider::get_contexts_for_userid($user1->id);
507         $this->assertCount(1, $contextlist);
508         $contextforuser = $contextlist->current();
509         $this->assertEquals(
510                 context_user::instance($user1->id)->id,
511                 $contextforuser->id);
513         // Test for the user who is blocked.
514         $contextlist = provider::get_contexts_for_userid($user2->id);
515         $this->assertCount(1, $contextlist);
516         $contextforuser = $contextlist->current();
517         $this->assertEquals(
518                 context_user::instance($user2->id)->id,
519                 $contextforuser->id);
520     }
522     /**
523      * Test for provider::export_user_data().
524      */
525     public function test_export_for_context_with_contacts() {
526         $this->resetAfterTest();
528         // Create users to test with.
529         $user1 = $this->getDataGenerator()->create_user();
530         $user2 = $this->getDataGenerator()->create_user();
531         $user3 = $this->getDataGenerator()->create_user();
532         $user4 = $this->getDataGenerator()->create_user();
534         // Remove user self-conversations.
535         $this->remove_user_self_conversation($user1->id);
536         $this->remove_user_self_conversation($user2->id);
537         $this->remove_user_self_conversation($user3->id);
538         $this->remove_user_self_conversation($user4->id);
540         \core_message\api::add_contact($user1->id, $user2->id);
541         \core_message\api::add_contact($user1->id, $user3->id);
542         \core_message\api::add_contact($user1->id, $user4->id);
544         $user1context = context_user::instance($user1->id);
546         $this->export_context_data_for_user($user1->id, $user1context, 'core_message');
548         $writer = writer::with_context($user1context);
550         $contacts = (array) $writer->get_data([get_string('contacts', 'core_message')]);
551         usort($contacts, ['static', 'sort_contacts']);
553         $this->assertCount(3, $contacts);
555         $contact1 = array_shift($contacts);
556         $this->assertEquals($user2->id, $contact1->contact);
558         $contact2 = array_shift($contacts);
559         $this->assertEquals($user3->id, $contact2->contact);
561         $contact3 = array_shift($contacts);
562         $this->assertEquals($user4->id, $contact3->contact);
563     }
565     /**
566      * Test for provider::export_user_data().
567      */
568     public function test_export_for_context_with_contact_requests() {
569         $this->resetAfterTest();
571         // Create users to test with.
572         $user1 = $this->getDataGenerator()->create_user();
573         $user2 = $this->getDataGenerator()->create_user();
574         $user3 = $this->getDataGenerator()->create_user();
575         $user4 = $this->getDataGenerator()->create_user();
577         // Remove user self-conversations.
578         $this->remove_user_self_conversation($user1->id);
579         $this->remove_user_self_conversation($user2->id);
580         $this->remove_user_self_conversation($user3->id);
581         $this->remove_user_self_conversation($user4->id);
583         \core_message\api::create_contact_request($user1->id, $user2->id);
584         \core_message\api::create_contact_request($user3->id, $user1->id);
585         \core_message\api::create_contact_request($user1->id, $user4->id);
587         $user1context = context_user::instance($user1->id);
589         $this->export_context_data_for_user($user1->id, $user1context, 'core_message');
591         $writer = writer::with_context($user1context);
593         $contactrequests = (array) $writer->get_data([get_string('contactrequests', 'core_message')]);
595         $this->assertCount(3, $contactrequests);
597         $contactrequest1 = array_shift($contactrequests);
598         $this->assertEquals($user2->id, $contactrequest1->contactrequest);
599         $this->assertEquals(get_string('yes'), $contactrequest1->maderequest);
601         $contactrequest2 = array_shift($contactrequests);
602         $this->assertEquals($user3->id, $contactrequest2->contactrequest);
603         $this->assertEquals(get_string('no'), $contactrequest2->maderequest);
605         $contactrequest3 = array_shift($contactrequests);
606         $this->assertEquals($user4->id, $contactrequest3->contactrequest);
607         $this->assertEquals(get_string('yes'), $contactrequest3->maderequest);
608     }
610     /**
611      * Test for provider::export_user_data().
612      */
613     public function test_export_for_context_with_blocked_users() {
614         $this->resetAfterTest();
616         // Create users to test with.
617         $user1 = $this->getDataGenerator()->create_user();
618         $user2 = $this->getDataGenerator()->create_user();
619         $user3 = $this->getDataGenerator()->create_user();
620         $user4 = $this->getDataGenerator()->create_user();
622         // Remove user self-conversations.
623         $this->remove_user_self_conversation($user1->id);
624         $this->remove_user_self_conversation($user2->id);
625         $this->remove_user_self_conversation($user3->id);
626         $this->remove_user_self_conversation($user4->id);
628         \core_message\api::block_user($user1->id, $user2->id);
629         \core_message\api::block_user($user1->id, $user3->id);
630         \core_message\api::block_user($user1->id, $user4->id);
632         $user1context = context_user::instance($user1->id);
634         $this->export_context_data_for_user($user1->id, $user1context, 'core_message');
636         $writer = writer::with_context($user1context);
638         $blockedusers = (array) $writer->get_data([get_string('blockedusers', 'core_message')]);
640         $this->assertCount(3, $blockedusers);
642         $blockeduser1 = array_shift($blockedusers);
643         $this->assertEquals($user2->id, $blockeduser1->blockeduser);
645         $blockeduser2 = array_shift($blockedusers);
646         $this->assertEquals($user3->id, $blockeduser2->blockeduser);
648         $blockeduser3 = array_shift($blockedusers);
649         $this->assertEquals($user4->id, $blockeduser3->blockeduser);
650     }
652     /**
653      * Test for provider::export_user_data().
654      */
655     public function test_export_for_context_with_private_messages() {
656         global $DB;
658         $this->resetAfterTest();
660         // Create users to test with.
661         $user1 = $this->getDataGenerator()->create_user();
662         $user2 = $this->getDataGenerator()->create_user();
663         $user3 = $this->getDataGenerator()->create_user();
665         // Remove user self-conversations.
666         $this->remove_user_self_conversation($user1->id);
667         $this->remove_user_self_conversation($user2->id);
668         $this->remove_user_self_conversation($user3->id);
670         $now = time();
672         // Send messages from user 1 to user 2.
673         $m1 = $this->create_message($user1->id, $user2->id, $now - (9 * DAYSECS), true);
674         $m2 = $this->create_message($user2->id, $user1->id, $now - (8 * DAYSECS));
675         $m3 = $this->create_message($user1->id, $user2->id, $now - (7 * DAYSECS));
677         // Send messages from user 3 to user 1.
678         $m4 = $this->create_message($user3->id, $user1->id, $now - (6 * DAYSECS), true);
679         $m5 = $this->create_message($user1->id, $user3->id, $now - (5 * DAYSECS));
680         $m6 = $this->create_message($user3->id, $user1->id, $now - (4 * DAYSECS));
682         // Send messages from user 3 to user 2 - these should not be included in the export.
683         $m7 = $this->create_message($user3->id, $user2->id, $now - (3 * DAYSECS), true);
684         $m8 = $this->create_message($user2->id, $user3->id, $now - (2 * DAYSECS));
685         $m9 = $this->create_message($user3->id, $user2->id, $now - (1 * DAYSECS));
687         // Mark message 2 and 5 as deleted.
688         \core_message\api::delete_message($user1->id, $m2);
689         \core_message\api::delete_message($user1->id, $m5);
691         $user1context = context_user::instance($user1->id);
693         $this->export_context_data_for_user($user1->id, $user1context, 'core_message');
695         $writer = writer::with_context($user1context);
697         $this->assertTrue($writer->has_any_data());
699         // Confirm the messages with user 2 are correct.
700         $messages = (array) $writer->get_data([get_string('messages', 'core_message'), $user2->id]);
701         $this->assertCount(3, $messages);
703         $dbm1 = $DB->get_record('messages', ['id' => $m1]);
704         $dbm2 = $DB->get_record('messages', ['id' => $m2]);
705         $dbm3 = $DB->get_record('messages', ['id' => $m3]);
707         usort($messages, ['static', 'sort_messages']);
708         $m1 = array_shift($messages);
709         $m2 = array_shift($messages);
710         $m3 = array_shift($messages);
712         $this->assertEquals(get_string('yes'), $m1->issender);
713         $this->assertEquals(message_format_message_text($dbm1), $m1->message);
714         $this->assertEquals(transform::datetime($now - (9 * DAYSECS)), $m1->timecreated);
715         $this->assertEquals('-', $m1->timeread);
716         $this->assertArrayNotHasKey('timedeleted', (array) $m1);
718         $this->assertEquals(get_string('no'), $m2->issender);
719         $this->assertEquals(message_format_message_text($dbm2), $m2->message);
720         $this->assertEquals(transform::datetime($now - (8 * DAYSECS)), $m2->timecreated);
721         $this->assertEquals('-', $m2->timeread);
722         $this->assertArrayHasKey('timedeleted', (array) $m2);
724         $this->assertEquals(get_string('yes'), $m3->issender);
725         $this->assertEquals(message_format_message_text($dbm3), $m3->message);
726         $this->assertEquals(transform::datetime($now - (7 * DAYSECS)), $m3->timecreated);
727         $this->assertEquals('-', $m3->timeread);
729         // Confirm the messages with user 3 are correct.
730         $messages = (array) $writer->get_data([get_string('messages', 'core_message'), $user3->id]);
731         $this->assertCount(3, $messages);
733         $dbm4 = $DB->get_record('messages', ['id' => $m4]);
734         $dbm5 = $DB->get_record('messages', ['id' => $m5]);
735         $dbm6 = $DB->get_record('messages', ['id' => $m6]);
737         usort($messages, ['static', 'sort_messages']);
738         $m4 = array_shift($messages);
739         $m5 = array_shift($messages);
740         $m6 = array_shift($messages);
742         $this->assertEquals(get_string('no'), $m4->issender);
743         $this->assertEquals(message_format_message_text($dbm4), $m4->message);
744         $this->assertEquals(transform::datetime($now - (6 * DAYSECS)), $m4->timecreated);
745         $this->assertNotEquals('-', $m4->timeread);
746         $this->assertArrayNotHasKey('timedeleted', (array) $m4);
748         $this->assertEquals(get_string('yes'), $m5->issender);
749         $this->assertEquals(message_format_message_text($dbm5), $m5->message);
750         $this->assertEquals(transform::datetime($now - (5 * DAYSECS)), $m5->timecreated);
751         $this->assertEquals('-', $m5->timeread);
752         $this->assertArrayHasKey('timedeleted', (array) $m5);
754         $this->assertEquals(get_string('no'), $m6->issender);
755         $this->assertEquals(message_format_message_text($dbm6), $m6->message);
756         $this->assertEquals(transform::datetime($now - (4 * DAYSECS)), $m6->timecreated);
757         $this->assertEquals('-', $m6->timeread);
758     }
760     /**
761      * Test for provider::export_user_data().
762      */
763     public function test_export_for_context_with_messages() {
764         global $DB;
766         $this->resetAfterTest();
767         $this->setAdminUser();
768         $now = time();
769         $systemcontext = \context_system::instance();
771         // Create users to test with.
772         $user1 = $this->getDataGenerator()->create_user();
773         $user2 = $this->getDataGenerator()->create_user();
774         $user3 = $this->getDataGenerator()->create_user();
775         $user1context = \context_user::instance($user1->id);
777         // Remove user self-conversations.
778         $this->remove_user_self_conversation($user1->id);
779         $this->remove_user_self_conversation($user2->id);
780         $this->remove_user_self_conversation($user3->id);
782         $course1 = $this->getDataGenerator()->create_course();
783         $course2 = $this->getDataGenerator()->create_course();
784         $coursecontext1 = \context_course::instance($course1->id);
785         $coursecontext2 = \context_course::instance($course2->id);
787         // Enrol users to courses.
788         $this->getDataGenerator()->enrol_user($user1->id, $course1->id);
789         $this->getDataGenerator()->enrol_user($user2->id, $course1->id);
790         $this->getDataGenerator()->enrol_user($user3->id, $course1->id);
791         $this->getDataGenerator()->enrol_user($user1->id, $course2->id);
793         // Create course groups with group messaging enabled.
794         $group1a = $this->getDataGenerator()->create_group(array('courseid' => $course1->id, 'enablemessaging' => 1));
795         $group2a = $this->getDataGenerator()->create_group(array('courseid' => $course2->id, 'enablemessaging' => 1));
797         // Add users to groups.
798         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user1->id));
799         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user2->id));
800         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user3->id));
801         $this->getDataGenerator()->create_group_member(array('groupid' => $group2a->id, 'userid' => $user1->id));
803         // Get conversation.
804         $component = 'core_group';
805         $itemtype = 'groups';
806         $conversation = \core_message\api::get_conversation_by_area(
807             $component,
808             $itemtype,
809             $group1a->id,
810             $coursecontext1->id
811         );
813         // Send some private messages between user 1 and user 2.
814         $pm1id = $this->create_message($user1->id, $user2->id, $now);
816         $dbpm1 = $DB->get_record('messages', ['id' => $pm1id]);
818         // Send some messages to the conversation.
819         $m1 = testhelper::send_fake_message_to_conversation($user1, $conversation->id, 'Message 1', $now + 1);
820         $m2 = testhelper::send_fake_message_to_conversation($user1, $conversation->id, 'Message 2', $now + 2);
821         $m3 = testhelper::send_fake_message_to_conversation($user2, $conversation->id, 'Message 3', $now + 3);
823         $dbm1 = $DB->get_record('messages', ['id' => $m1]);
824         $dbm2 = $DB->get_record('messages', ['id' => $m2]);
825         $dbm3 = $DB->get_record('messages', ['id' => $m3]);
827         // Mark as read and delete some messages.
828         \core_message\api::mark_message_as_read($user2->id, $dbm1);
829         \core_message\api::delete_message($user1->id, $m2);
831         // Confirm the user1 has no data in any course context because private messages are related to user context.
832         $this->export_context_data_for_user($user1->id, $coursecontext2, 'core_message');
834         // Check that system context hasn't been exported.
835         $writer = writer::with_context($systemcontext);
836         $this->assertFalse($writer->has_any_data());
838         // Check that course1 context hasn't been exported.
839         $writer = writer::with_context($coursecontext1);
840         $this->assertFalse($writer->has_any_data());
842         // Check that course2 context has been exported and contains data.
843         $writer = writer::with_context($coursecontext2);
844         $this->assertFalse($writer->has_any_data());
846         // Confirm the user1 has only private messages in the user context.
847         $this->export_context_data_for_user($user1->id, $user1context, 'core_message');
848         $writer = writer::with_context($user1context);
849         $this->assertTrue($writer->has_any_data());
851         // Confirm the messages with user 2 are correct.
852         $messages = (array) $writer->get_data([get_string('messages', 'core_message'), $user2->id]);
853         $this->assertCount(1, $messages);
854         $m1 = reset($messages);
856         $this->assertEquals(get_string('yes'), $m1->issender);
857         $this->assertEquals(message_format_message_text($dbpm1), $m1->message);
858         $this->assertEquals(transform::datetime($now), $m1->timecreated);
859         $this->assertEquals('-', $m1->timeread);
860         $this->assertArrayNotHasKey('timedeleted', (array) $m1);
862         // Confirm the messages with user 3 are correct.
863         $messages = (array) $writer->get_data([get_string('messages', 'core_message'), fullname($user3)]);
864         $this->assertCount(0, $messages);
865     }
867     /**
868      * Test for provider::export_user_data().
869      */
870     public function test_export_for_context_with_notifications() {
871         $this->resetAfterTest();
873         // Create users to test with.
874         $user1 = $this->getDataGenerator()->create_user();
875         $user2 = $this->getDataGenerator()->create_user();
876         $user3 = $this->getDataGenerator()->create_user();
878         // Remove user self-conversations.
879         $this->remove_user_self_conversation($user1->id);
880         $this->remove_user_self_conversation($user2->id);
881         $this->remove_user_self_conversation($user3->id);
883         $now = time();
884         $timeread = $now - DAYSECS;
886         // Send notifications from user 1 to user 2.
887         $this->create_notification($user1->id, $user2->id, $now + (9 * DAYSECS), $timeread);
888         $this->create_notification($user2->id, $user1->id, $now + (8 * DAYSECS));
889         $this->create_notification($user1->id, $user2->id, $now + (7 * DAYSECS));
891         // Send notifications from user 3 to user 1.
892         $this->create_notification($user3->id, $user1->id, $now + (6 * DAYSECS), $timeread);
893         $this->create_notification($user1->id, $user3->id, $now + (5 * DAYSECS));
894         $this->create_notification($user3->id, $user1->id, $now + (4 * DAYSECS));
896         // Send notifications from user 3 to user 2 - should not be part of the export.
897         $this->create_notification($user3->id, $user2->id, $now + (3 * DAYSECS), $timeread);
898         $this->create_notification($user2->id, $user3->id, $now + (2 * DAYSECS));
899         $this->create_notification($user3->id, $user2->id, $now + (1 * DAYSECS));
901         $user1context = context_user::instance($user1->id);
903         $this->export_context_data_for_user($user1->id, $user1context, 'core_message');
905         $writer = writer::with_context($user1context);
907         $this->assertTrue($writer->has_any_data());
909         // Confirm the notifications.
910         $notifications = (array) $writer->get_data([get_string('notifications', 'core_message')]);
912         $this->assertCount(6, $notifications);
913     }
915     /**
916      * Test for provider::delete_data_for_all_users_in_context().
917      */
918     public function test_delete_data_for_all_users_in_context() {
919         global $DB;
921         $this->resetAfterTest();
923         // Create users to test with.
924         $user1 = $this->getDataGenerator()->create_user();
925         $user2 = $this->getDataGenerator()->create_user();
926         $user3 = $this->getDataGenerator()->create_user();
927         $user4 = $this->getDataGenerator()->create_user();
928         $user5 = $this->getDataGenerator()->create_user();
930         $now = time();
931         $timeread = $now - DAYSECS;
933         $user1context = context_user::instance($user1->id);
935         // Create contacts.
936         \core_message\api::add_contact($user1->id, $user2->id);
937         \core_message\api::add_contact($user2->id, $user3->id);
939         // Create contact requests.
940         \core_message\api::create_contact_request($user1->id, $user3->id);
941         \core_message\api::create_contact_request($user2->id, $user4->id);
943         // Block a user.
944         \core_message\api::block_user($user1->id, $user3->id);
945         \core_message\api::block_user($user3->id, $user4->id);
947         // Create messages.
948         $m1 = $this->create_message($user1->id, $user2->id, $now + (9 * DAYSECS), true);
949         $m2 = $this->create_message($user2->id, $user1->id, $now + (8 * DAYSECS));
950         $m3 = $this->create_message($user2->id, $user3->id, $now + (7 * DAYSECS));
952         // Create notifications.
953         $n1 = $this->create_notification($user1->id, $user2->id, $now + (9 * DAYSECS), $timeread);
954         $n2 = $this->create_notification($user2->id, $user1->id, $now + (8 * DAYSECS));
955         $n3 = $this->create_notification($user2->id, $user3->id, $now + (7 * DAYSECS));
957         // Delete one of the messages.
958         \core_message\api::delete_message($user1->id, $m2);
960         // There should be 2 contacts.
961         $this->assertEquals(2, $DB->count_records('message_contacts'));
963         // There should be 2 contact requests.
964         $this->assertEquals(2, $DB->count_records('message_contact_requests'));
966         // There should be 2 blocked users.
967         $this->assertEquals(2, $DB->count_records('message_users_blocked'));
969         // There should be 3 messages.
970         $this->assertEquals(3, $DB->count_records('messages'));
972         // There should be 2 user actions - one for reading the message, one for deleting.
973         $this->assertEquals(2, $DB->count_records('message_user_actions'));
975         // There should be 4 conversation members + 5 self-conversations.
976         $this->assertEquals(9, $DB->count_records('message_conversation_members'));
978         // There should be 5 notifications (3 from create_notification and 2 from create_contact_request).
979         $this->assertEquals(5, $DB->count_records('notifications'));
981         provider::delete_data_for_all_users_in_context($user1context);
983         // Confirm there is only 1 contact left.
984         $this->assertEquals(1, $DB->count_records('message_contacts'));
985         // And it is not related to user1.
986         $this->assertEquals(0,
987                 $DB->count_records_select('message_contacts', 'userid = ? OR contactid = ?', [$user1->id, $user1->id]));
989         // Confirm there is only 1 contact request left.
990         $this->assertEquals(1, $DB->count_records('message_contact_requests'));
991         // And it is not related to user1.
992         $this->assertEquals(0,
993                 $DB->count_records_select('message_contact_requests', 'userid = ? OR requesteduserid = ?',
994                         [$user1->id, $user1->id]));
996         // Confirm there is only 1 blocked user left.
997         $this->assertEquals(1, $DB->count_records('message_users_blocked'));
998         // And it is not related to user1.
999         $this->assertEquals(0,
1000                 $DB->count_records_select('message_users_blocked', 'userid = ? OR blockeduserid = ?', [$user1->id, $user1->id]));
1002         // Confirm there are only 2 messages left.
1003         $this->assertEquals(2, $DB->count_records('messages'));
1004         // And none of them are from user1.
1005         $this->assertEquals(0, $DB->count_records('messages', ['useridfrom' => $user1->id]));
1007         // Confirm there is 0 user action left.
1008         $this->assertEquals(0, $DB->count_records('message_user_actions'));
1009         // And it is not for user1.
1010         $this->assertEquals(0, $DB->count_records('message_user_actions', ['userid' => $user1->id]));
1012         // Confirm there are only 3 conversation members left + 4 self-conversations.
1013         $this->assertEquals(7, $DB->count_records('message_conversation_members'));
1014         // And user1 is not in any conversation.
1015         $this->assertEquals(0, $DB->count_records('message_conversation_members', ['userid' => $user1->id]));
1017         // Confirm there are only 2 notifications.
1018         $this->assertEquals(2, $DB->count_records('notifications'));
1019         // And it is not related to user1.
1020         $this->assertEquals(0,
1021                 $DB->count_records_select('notifications', 'useridfrom = ? OR useridto = ? ', [$user1->id, $user1->id]));
1023         // Delete user self-conversations.
1024         $this->remove_user_self_conversation($user2->id);
1025         $this->remove_user_self_conversation($user3->id);
1026         $this->remove_user_self_conversation($user4->id);
1027         $this->remove_user_self_conversation($user5->id);
1029         // Confirm there are only 3 conversation members left.
1030         $this->assertEquals(3, $DB->count_records('message_conversation_members'));
1031         // And user1 is not in any conversation.
1032         $this->assertEquals(0, $DB->count_records('message_conversation_members', ['userid' => $user1->id]));
1034     }
1036     /**
1037      * Test for provider::delete_data_for_user().
1038      */
1039     public function test_delete_data_for_user() {
1040         global $DB;
1042         $this->resetAfterTest();
1044         // Create users to test with.
1045         $user1 = $this->getDataGenerator()->create_user();
1046         $user2 = $this->getDataGenerator()->create_user();
1047         $user3 = $this->getDataGenerator()->create_user();
1048         $user4 = $this->getDataGenerator()->create_user();
1049         $user5 = $this->getDataGenerator()->create_user();
1050         $user6 = $this->getDataGenerator()->create_user();
1052         $now = time();
1053         $timeread = $now - DAYSECS;
1055         // Create contacts.
1056         \core_message\api::add_contact($user1->id, $user2->id);
1057         \core_message\api::add_contact($user2->id, $user3->id);
1059         // Create contact requests.
1060         \core_message\api::create_contact_request($user1->id, $user3->id);
1061         \core_message\api::create_contact_request($user2->id, $user4->id);
1063         // Block users.
1064         \core_message\api::block_user($user1->id, $user5->id);
1065         \core_message\api::block_user($user2->id, $user6->id);
1067         // Create messages.
1068         $m1 = $this->create_message($user1->id, $user2->id, $now + (9 * DAYSECS), $timeread);
1069         $m2 = $this->create_message($user2->id, $user1->id, $now + (8 * DAYSECS));
1071         // Create notifications.
1072         $n1 = $this->create_notification($user1->id, $user2->id, $now + (9 * DAYSECS), $timeread);
1073         $n2 = $this->create_notification($user2->id, $user1->id, $now + (8 * DAYSECS));
1074         $n2 = $this->create_notification($user2->id, $user3->id, $now + (8 * DAYSECS));
1076         // Delete one of the messages.
1077         \core_message\api::delete_message($user1->id, $m2);
1079         // There should be 2 contacts.
1080         $this->assertEquals(2, $DB->count_records('message_contacts'));
1082         // There should be 1 contact request.
1083         $this->assertEquals(2, $DB->count_records('message_contact_requests'));
1085         // There should be 1 blocked user.
1086         $this->assertEquals(2, $DB->count_records('message_users_blocked'));
1088         // There should be two messages.
1089         $this->assertEquals(2, $DB->count_records('messages'));
1091         // There should be two user actions - one for reading the message, one for deleting.
1092         $this->assertEquals(2, $DB->count_records('message_user_actions'));
1094         // There should be two conversation members + 6 self-conversations.
1095         $this->assertEquals(8, $DB->count_records('message_conversation_members'));
1097         // There should be 5 notifications (3 from create_notification and 2 from create_contact_request).
1098         $this->assertEquals(5, $DB->count_records('notifications'));
1100         $user1context = context_user::instance($user1->id);
1101         $contextlist = new \core_privacy\local\request\approved_contextlist($user1, 'core_message',
1102             [$user1context->id]);
1103         provider::delete_data_for_user($contextlist);
1105         // Confirm the user 2 data still exists.
1106         $contacts = $DB->get_records('message_contacts');
1107         $contactrequests = $DB->get_records('message_contact_requests');
1108         $blockedusers = $DB->get_records('message_users_blocked');
1109         $messages = $DB->get_records('messages');
1110         $muas = $DB->get_records('message_user_actions');
1111         $mcms = $DB->get_records('message_conversation_members');
1112         $notifications = $DB->get_records('notifications');
1114         $this->assertCount(1, $contacts);
1115         $contact = reset($contacts);
1116         $this->assertEquals($user2->id, $contact->userid);
1117         $this->assertEquals($user3->id, $contact->contactid);
1119         $this->assertCount(1, $contactrequests);
1120         $contactrequest = reset($contactrequests);
1121         $this->assertEquals($user2->id, $contactrequest->userid);
1122         $this->assertEquals($user4->id, $contactrequest->requesteduserid);
1124         $this->assertCount(1, $blockedusers);
1125         $blockeduser = reset($blockedusers);
1126         $this->assertEquals($user2->id, $blockeduser->userid);
1127         $this->assertEquals($user6->id, $blockeduser->blockeduserid);
1129         $this->assertCount(1, $messages);
1130         $message = reset($messages);
1131         $this->assertEquals($m2, $message->id);
1133         $this->assertCount(0, $muas);
1135         $this->assertCount(6, $mcms);
1136         $members = array_map(function($member) {
1137             return $member->userid;
1138         }, $mcms);
1139         $this->assertContains($user2->id, $members);
1141         $this->assertCount(2, $notifications);
1142         ksort($notifications);
1144         $notification = array_pop($notifications);
1145         $this->assertEquals($user2->id, $notification->useridfrom);
1146         $this->assertEquals($user3->id, $notification->useridto);
1147     }
1149     /**
1150      * Test for provider::get_users_in_context() when there is no message or notification.
1151      */
1152     public function test_get_users_in_context_no_data() {
1153         $this->resetAfterTest();
1155         $user = $this->getDataGenerator()->create_user();
1156         $usercontext = context_user::instance($user->id);
1157         $this->remove_user_self_conversation($user->id);
1159         $userlist = new \core_privacy\local\request\userlist($usercontext, 'core_message');
1160         \core_message\privacy\provider::get_users_in_context($userlist);
1162         $this->assertEmpty($userlist->get_userids());
1163     }
1165     /**
1166      * Test for provider::get_users_in_context() when there is a message between users.
1167      */
1168     public function test_get_users_in_context_with_message() {
1169         $this->resetAfterTest();
1171         $user1 = $this->getDataGenerator()->create_user();
1172         $user2 = $this->getDataGenerator()->create_user();
1174         $user1context = context_user::instance($user1->id);
1175         $user2context = context_user::instance($user2->id);
1177         // Delete user self-conversations.
1178         $this->remove_user_self_conversation($user1->id);
1179         $this->remove_user_self_conversation($user2->id);
1181         // Test nothing is found before message is sent.
1182         $userlist = new \core_privacy\local\request\userlist($user1context, 'core_message');
1183         \core_message\privacy\provider::get_users_in_context($userlist);
1184         $this->assertCount(0, $userlist);
1185         $userlist = new \core_privacy\local\request\userlist($user2context, 'core_message');
1186         \core_message\privacy\provider::get_users_in_context($userlist);
1187         $this->assertCount(0, $userlist);
1189         $this->create_message($user1->id, $user2->id, time() - (9 * DAYSECS));
1191         // Test for the sender.
1192         $userlist = new \core_privacy\local\request\userlist($user1context, 'core_message');
1193         \core_message\privacy\provider::get_users_in_context($userlist);
1194         $this->assertCount(1, $userlist);
1195         $userincontext = $userlist->current();
1196         $this->assertEquals($user1->id, $userincontext->id);
1198         // Test for the receiver.
1199         $userlist = new \core_privacy\local\request\userlist($user2context, 'core_message');
1200         \core_message\privacy\provider::get_users_in_context($userlist);
1201         $this->assertCount(1, $userlist);
1202         $userincontext = $userlist->current();
1203         $this->assertEquals($user2->id, $userincontext->id);
1204     }
1206     /**
1207      * Test for provider::get_users_in_context() when there is a notification between users.
1208      */
1209     public function test_get_users_in_context_with_notification() {
1210         $this->resetAfterTest();
1212         $user1 = $this->getDataGenerator()->create_user();
1213         $user2 = $this->getDataGenerator()->create_user();
1215         $user1context = context_user::instance($user1->id);
1216         $user2context = context_user::instance($user2->id);
1218         // Delete user self-conversations.
1219         $this->remove_user_self_conversation($user1->id);
1220         $this->remove_user_self_conversation($user2->id);
1222         // Test nothing is found before notification is created.
1223         $userlist = new \core_privacy\local\request\userlist($user1context, 'core_message');
1224         \core_message\privacy\provider::get_users_in_context($userlist);
1225         $this->assertCount(0, $userlist);
1226         $userlist = new \core_privacy\local\request\userlist($user2context, 'core_message');
1227         \core_message\privacy\provider::get_users_in_context($userlist);
1228         $this->assertCount(0, $userlist);
1230         $this->create_notification($user1->id, $user2->id, time() - (9 * DAYSECS));
1232         // Test for the sender.
1233         $userlist = new \core_privacy\local\request\userlist($user1context, 'core_message');
1234         \core_message\privacy\provider::get_users_in_context($userlist);
1235         $this->assertCount(1, $userlist);
1236         $userincontext = $userlist->current();
1237         $this->assertEquals($user1->id, $userincontext->id);
1239         // Test for the receiver.
1240         $userlist = new \core_privacy\local\request\userlist($user2context, 'core_message');
1241         \core_message\privacy\provider::get_users_in_context($userlist);
1242         $this->assertCount(1, $userlist);
1243         $userincontext = $userlist->current();
1244         $this->assertEquals($user2->id, $userincontext->id);
1245     }
1247     /**
1248      * Test for provider::get_users_in_context() when a users has a contact.
1249      */
1250     public function test_get_users_in_context_with_contact() {
1251         $this->resetAfterTest();
1253         $user1 = $this->getDataGenerator()->create_user();
1254         $user2 = $this->getDataGenerator()->create_user();
1256         $user1context = context_user::instance($user1->id);
1257         $user2context = context_user::instance($user2->id);
1259         // Delete user self-conversations.
1260         $this->remove_user_self_conversation($user1->id);
1261         $this->remove_user_self_conversation($user2->id);
1263         // Test nothing is found before contact is created.
1264         $userlist = new \core_privacy\local\request\userlist($user1context, 'core_message');
1265         \core_message\privacy\provider::get_users_in_context($userlist);
1266         $this->assertCount(0, $userlist);
1267         $userlist = new \core_privacy\local\request\userlist($user2context, 'core_message');
1268         \core_message\privacy\provider::get_users_in_context($userlist);
1269         $this->assertCount(0, $userlist);
1271         \core_message\api::add_contact($user1->id, $user2->id);
1273         // Test for the user adding the contact.
1274         $userlist = new \core_privacy\local\request\userlist($user1context, 'core_message');
1275         \core_message\privacy\provider::get_users_in_context($userlist);
1276         $this->assertCount(1, $userlist);
1277         $userincontext = $userlist->current();
1278         $this->assertEquals($user1->id, $userincontext->id);
1280         // Test for the user who is the contact.
1281         $userlist = new \core_privacy\local\request\userlist($user2context, 'core_message');
1282         \core_message\privacy\provider::get_users_in_context($userlist);
1283         $this->assertCount(1, $userlist);
1284         $userincontext = $userlist->current();
1285         $this->assertEquals($user2->id, $userincontext->id);
1286     }
1288     /**
1289      * Test for provider::get_users_in_context() when a user makes a contact request.
1290      */
1291     public function test_get_users_in_context_with_contact_request() {
1292         $this->resetAfterTest();
1294         $user1 = $this->getDataGenerator()->create_user();
1295         $user2 = $this->getDataGenerator()->create_user();
1297         $user1context = context_user::instance($user1->id);
1298         $user2context = context_user::instance($user2->id);
1300         // Delete user self-conversations.
1301         $this->remove_user_self_conversation($user1->id);
1302         $this->remove_user_self_conversation($user2->id);
1304         // Test nothing is found before request is created.
1305         $userlist = new \core_privacy\local\request\userlist($user1context, 'core_message');
1306         \core_message\privacy\provider::get_users_in_context($userlist);
1307         $this->assertCount(0, $userlist);
1308         $userlist = new \core_privacy\local\request\userlist($user2context, 'core_message');
1309         \core_message\privacy\provider::get_users_in_context($userlist);
1310         $this->assertCount(0, $userlist);
1312         \core_message\api::create_contact_request($user1->id, $user2->id);
1314         // Test for the user requesting the contact.
1315         $userlist = new \core_privacy\local\request\userlist($user1context, 'core_message');
1316         \core_message\privacy\provider::get_users_in_context($userlist);
1317         $this->assertCount(1, $userlist);
1318         $userincontext = $userlist->current();
1319         $this->assertEquals($user1->id, $userincontext->id);
1321         // Test for the user receiving the contact request.
1322         $userlist = new \core_privacy\local\request\userlist($user2context, 'core_message');
1323         \core_message\privacy\provider::get_users_in_context($userlist);
1324         $this->assertCount(1, $userlist);
1325         $userincontext = $userlist->current();
1326         $this->assertEquals($user2->id, $userincontext->id);
1327     }
1329     /**
1330      * Test for provider::get_users_in_context() when a user is blocked.
1331      */
1332     public function test_get_users_in_context_with_blocked_contact() {
1333         $this->resetAfterTest();
1335         $user1 = $this->getDataGenerator()->create_user();
1336         $user2 = $this->getDataGenerator()->create_user();
1338         $user1context = context_user::instance($user1->id);
1339         $user2context = context_user::instance($user2->id);
1341         // Delete user self-conversations.
1342         $this->remove_user_self_conversation($user1->id);
1343         $this->remove_user_self_conversation($user2->id);
1345         // Test nothing is found before user is blocked.
1346         $userlist = new \core_privacy\local\request\userlist($user1context, 'core_message');
1347         \core_message\privacy\provider::get_users_in_context($userlist);
1348         $this->assertCount(0, $userlist);
1349         $userlist = new \core_privacy\local\request\userlist($user2context, 'core_message');
1350         \core_message\privacy\provider::get_users_in_context($userlist);
1351         $this->assertCount(0, $userlist);
1353         \core_message\api::block_user($user1->id, $user2->id);
1355         // Test for the blocking user.
1356         $userlist = new \core_privacy\local\request\userlist($user1context, 'core_message');
1357         \core_message\privacy\provider::get_users_in_context($userlist);
1358         $this->assertCount(1, $userlist);
1359         $userincontext = $userlist->current();
1360         $this->assertEquals($user1->id, $userincontext->id);
1362         // Test for the user who is blocked.
1363         $userlist = new \core_privacy\local\request\userlist($user2context, 'core_message');
1364         \core_message\privacy\provider::get_users_in_context($userlist);
1365         $this->assertCount(1, $userlist);
1366         $userincontext = $userlist->current();
1367         $this->assertEquals($user2->id, $userincontext->id);
1368     }
1370     /**
1371      * Test for provider::delete_data_for_users().
1372      */
1373     public function test_delete_data_for_users() {
1374         global $DB;
1376         $this->resetAfterTest();
1378         // Create users to test with.
1379         $user1 = $this->getDataGenerator()->create_user();
1380         $user2 = $this->getDataGenerator()->create_user();
1381         $user3 = $this->getDataGenerator()->create_user();
1382         $user4 = $this->getDataGenerator()->create_user();
1383         $user5 = $this->getDataGenerator()->create_user();
1384         $user6 = $this->getDataGenerator()->create_user();
1386         $now = time();
1387         $timeread = $now - DAYSECS;
1389         // Create contacts.
1390         \core_message\api::add_contact($user1->id, $user2->id);
1391         \core_message\api::add_contact($user2->id, $user3->id);
1393         // Create contact requests.
1394         \core_message\api::create_contact_request($user1->id, $user3->id);
1395         \core_message\api::create_contact_request($user2->id, $user4->id);
1397         // Block users.
1398         \core_message\api::block_user($user1->id, $user5->id);
1399         \core_message\api::block_user($user2->id, $user6->id);
1401         // Create messages.
1402         $m1 = $this->create_message($user1->id, $user2->id, $now + (9 * DAYSECS), $timeread);
1403         $m2 = $this->create_message($user2->id, $user1->id, $now + (8 * DAYSECS));
1405         // Create notifications.
1406         $n1 = $this->create_notification($user1->id, $user2->id, $now + (9 * DAYSECS), $timeread);
1407         $n2 = $this->create_notification($user2->id, $user1->id, $now + (8 * DAYSECS));
1408         $n2 = $this->create_notification($user2->id, $user3->id, $now + (8 * DAYSECS));
1410         // Delete one of the messages.
1411         \core_message\api::delete_message($user1->id, $m2);
1413         // There should be 2 contacts.
1414         $this->assertEquals(2, $DB->count_records('message_contacts'));
1416         // There should be 1 contact request.
1417         $this->assertEquals(2, $DB->count_records('message_contact_requests'));
1419         // There should be 1 blocked user.
1420         $this->assertEquals(2, $DB->count_records('message_users_blocked'));
1422         // There should be two messages.
1423         $this->assertEquals(2, $DB->count_records('messages'));
1425         // There should be two user actions - one for reading the message, one for deleting.
1426         $this->assertEquals(2, $DB->count_records('message_user_actions'));
1428         // There should be two conversation members + 6 self-conversations.
1429         $this->assertEquals(8, $DB->count_records('message_conversation_members'));
1431         // There should be three notifications + two for the contact requests.
1432         $this->assertEquals(5, $DB->count_records('notifications'));
1434         $user1context = context_user::instance($user1->id);
1435         $approveduserlist = new \core_privacy\local\request\approved_userlist($user1context, 'core_message',
1436                 [$user1->id, $user2->id]);
1437         provider::delete_data_for_users($approveduserlist);
1439         // Only user1's data should be deleted. User2 should be skipped as user2 is an invalid user for user1context.
1441         // Confirm the user 2 data still exists.
1442         $contacts = $DB->get_records('message_contacts');
1443         $contactrequests = $DB->get_records('message_contact_requests');
1444         $blockedusers = $DB->get_records('message_users_blocked');
1445         $messages = $DB->get_records('messages');
1446         $muas = $DB->get_records('message_user_actions');
1447         $mcms = $DB->get_records('message_conversation_members');
1448         $notifications = $DB->get_records('notifications');
1450         $this->assertCount(1, $contacts);
1451         $contact = reset($contacts);
1452         $this->assertEquals($user2->id, $contact->userid);
1453         $this->assertEquals($user3->id, $contact->contactid);
1455         $this->assertCount(1, $contactrequests);
1456         $contactrequest = reset($contactrequests);
1457         $this->assertEquals($user2->id, $contactrequest->userid);
1458         $this->assertEquals($user4->id, $contactrequest->requesteduserid);
1460         $this->assertCount(1, $blockedusers);
1461         $blockeduser = reset($blockedusers);
1462         $this->assertEquals($user2->id, $blockeduser->userid);
1463         $this->assertEquals($user6->id, $blockeduser->blockeduserid);
1465         $this->assertCount(1, $messages);
1466         $message = reset($messages);
1467         $this->assertEquals($m2, $message->id);
1469         $this->assertCount(0, $muas);
1471         $this->assertCount(6, $mcms);
1472         $memberids = array_map(function($convmember) {
1473                 return $convmember->userid;
1474         }, $mcms);
1475         $this->assertContains($user2->id, $memberids);
1477         $this->assertCount(2, $notifications);
1478         ksort($notifications);
1480         $notification = array_pop($notifications);
1481         $this->assertEquals($user2->id, $notification->useridfrom);
1482         $this->assertEquals($user3->id, $notification->useridto);
1483     }
1485     /**
1486      * Test for provider::add_contexts_for_conversations().
1487      */
1488     public function test_add_contexts_for_conversations() {
1489         $this->resetAfterTest();
1490         $this->setAdminUser();
1491         $component = 'core_group';
1492         $itemtype = 'groups';
1494         $user1 = $this->getDataGenerator()->create_user();
1495         $user2 = $this->getDataGenerator()->create_user();
1496         $user3 = $this->getDataGenerator()->create_user();
1497         $user4 = $this->getDataGenerator()->create_user();
1499         // Delete user self-conversations.
1500         $this->remove_user_self_conversation($user1->id);
1501         $this->remove_user_self_conversation($user2->id);
1502         $this->remove_user_self_conversation($user3->id);
1503         $this->remove_user_self_conversation($user4->id);
1505         // Test nothing is found before group conversations is created or message is sent.
1506         $contextlist = new contextlist();
1507         provider::add_contexts_for_conversations($contextlist, $user1->id, $component, $itemtype);
1508         $this->assertCount(0, $contextlist);
1509         provider::add_contexts_for_conversations($contextlist, $user2->id, $component, $itemtype);
1510         $this->assertCount(0, $contextlist);
1512         // Create courses.
1513         $course1 = $this->getDataGenerator()->create_course();
1514         $course2 = $this->getDataGenerator()->create_course();
1515         $coursecontext1 = \context_course::instance($course1->id);
1516         $coursecontext2 = \context_course::instance($course2->id);
1518         // Enrol users to courses.
1519         $this->getDataGenerator()->enrol_user($user1->id, $course1->id);
1520         $this->getDataGenerator()->enrol_user($user2->id, $course1->id);
1521         $this->getDataGenerator()->enrol_user($user3->id, $course1->id);
1522         $this->getDataGenerator()->enrol_user($user1->id, $course2->id);
1523         $this->getDataGenerator()->enrol_user($user2->id, $course2->id);
1525         // Create course groups with messaging enabled.
1526         $group1a = $this->getDataGenerator()->create_group(array('courseid' => $course1->id, 'enablemessaging' => 1));
1527         $group2a = $this->getDataGenerator()->create_group(array('courseid' => $course2->id, 'enablemessaging' => 1));
1529         // Add users to groups.
1530         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user1->id));
1531         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user2->id));
1532         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user3->id));
1533         $this->getDataGenerator()->create_group_member(array('groupid' => $group2a->id, 'userid' => $user1->id));
1535         // Get conversation.
1536         $conversation1 = \core_message\api::get_conversation_by_area(
1537             $component,
1538             $itemtype,
1539             $group1a->id,
1540             $coursecontext1->id
1541         );
1543         // Send some messages to the group conversation.
1544         $now = time();
1545         $m1id = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1', $now + 1);
1546         $m2id = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 2', $now + 2);
1547         $m3id = testhelper::send_fake_message_to_conversation($user2, $conversation1->id, 'Message 3', $now + 3);
1549         // Test for user1 (is member of the conversation and has sent a message).
1550         $contextlist = new contextlist();
1551         provider::add_contexts_for_conversations($contextlist, $user1->id, $component, $itemtype);
1552         $this->assertCount(2, $contextlist);
1553         $this->assertContainsEquals($coursecontext1->id, $contextlist->get_contextids());
1554         $this->assertContainsEquals($coursecontext2->id, $contextlist->get_contextids());
1556         // Test for user2 (is member of the conversation and has sent a message).
1557         $contextlist = new contextlist();
1558         provider::add_contexts_for_conversations($contextlist, $user2->id, $component, $itemtype);
1559         $this->assertCount(1, $contextlist);
1560         $this->assertEquals($coursecontext1, $contextlist->current());
1562         // Test for user3 (is member of the conversation).
1563         $contextlist = new contextlist();
1564         provider::add_contexts_for_conversations($contextlist, $user3->id, $component, $itemtype);
1565         $this->assertCount(1, $contextlist);
1566         $this->assertEquals($coursecontext1, $contextlist->current());
1568         // Test for user4 (doesn't belong to the conversation).
1569         $contextlist = new contextlist();
1570         provider::add_contexts_for_conversations($contextlist, $user4->id, $component, $itemtype);
1571         $this->assertCount(0, $contextlist);
1572     }
1574     /**
1575      * Test for provider::add_conversations_in_context().
1576      */
1577     public function test_add_conversations_in_context() {
1578         $this->resetAfterTest();
1579         $this->setAdminUser();
1580         $component = 'core_group';
1581         $itemtype = 'groups';
1583         $user1 = $this->getDataGenerator()->create_user();
1584         $user2 = $this->getDataGenerator()->create_user();
1585         $user3 = $this->getDataGenerator()->create_user();
1586         $user4 = $this->getDataGenerator()->create_user();
1588         // Create courses.
1589         $course1 = $this->getDataGenerator()->create_course();
1590         $course2 = $this->getDataGenerator()->create_course();
1591         $coursecontext1 = \context_course::instance($course1->id);
1592         $coursecontext2 = \context_course::instance($course2->id);
1594         // Test nothing is found before group conversations is created or message is sent.
1595         $userlist1 = new \core_privacy\local\request\userlist($coursecontext1, 'core_message');
1596         provider::add_conversations_in_context($userlist1, $component, $itemtype);
1597         $this->assertCount(0, $userlist1);
1599         // Enrol users to courses.
1600         $this->getDataGenerator()->enrol_user($user1->id, $course1->id);
1601         $this->getDataGenerator()->enrol_user($user2->id, $course1->id);
1602         $this->getDataGenerator()->enrol_user($user3->id, $course1->id);
1603         $this->getDataGenerator()->enrol_user($user4->id, $course1->id);
1604         $this->getDataGenerator()->enrol_user($user1->id, $course2->id);
1605         $this->getDataGenerator()->enrol_user($user2->id, $course2->id);
1607         // Create course groups with messaging enabled.
1608         $group1a = $this->getDataGenerator()->create_group(array('courseid' => $course1->id, 'enablemessaging' => 1));
1609         $group2a = $this->getDataGenerator()->create_group(array('courseid' => $course2->id, 'enablemessaging' => 1));
1611         // Add users to groups.
1612         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user1->id));
1613         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user2->id));
1614         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user3->id));
1615         $this->getDataGenerator()->create_group_member(array('groupid' => $group2a->id, 'userid' => $user1->id));
1617         // Get conversation.
1618         $conversation1 = \core_message\api::get_conversation_by_area(
1619             $component,
1620             $itemtype,
1621             $group1a->id,
1622             $coursecontext1->id
1623         );
1625         // Send some messages to the group conversation.
1626         $now = time();
1627         $m1id = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1', $now + 1);
1628         $m2id = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 2', $now + 2);
1629         $m3id = testhelper::send_fake_message_to_conversation($user2, $conversation1->id, 'Message 3', $now + 3);
1631         // Test for users with any group conversation in course1.
1632         provider::add_conversations_in_context($userlist1, $component, $itemtype);
1633         $this->assertCount(3, $userlist1);
1634         $this->assertEqualsCanonicalizing([$user1->id, $user2->id, $user3->id], $userlist1->get_userids());
1636         // Test for users with any group conversation in course2.
1637         $userlist2 = new \core_privacy\local\request\userlist($coursecontext2, 'core_message');
1638         provider::add_conversations_in_context($userlist2, $component, $itemtype);
1639         $this->assertCount(1, $userlist2);
1640         $this->assertEquals(
1641                 [$user1->id],
1642                 $userlist2->get_userids());
1643     }
1645     /**
1646      * Test for provider::export_conversations().
1647      */
1648     public function test_export_conversations() {
1649         global $DB;
1651         $this->resetAfterTest();
1652         $this->setAdminUser();
1653         $now = time();
1654         $systemcontext = \context_system::instance();
1656         // Create users to test with.
1657         $user1 = $this->getDataGenerator()->create_user();
1658         $user2 = $this->getDataGenerator()->create_user();
1659         $user3 = $this->getDataGenerator()->create_user();
1660         $user1context = \context_user::instance($user1->id);
1662         $course1 = $this->getDataGenerator()->create_course();
1663         $course2 = $this->getDataGenerator()->create_course();
1664         $coursecontext1 = \context_course::instance($course1->id);
1665         $coursecontext2 = \context_course::instance($course2->id);
1667         // Enrol users to courses.
1668         $this->getDataGenerator()->enrol_user($user1->id, $course1->id);
1669         $this->getDataGenerator()->enrol_user($user2->id, $course1->id);
1670         $this->getDataGenerator()->enrol_user($user3->id, $course1->id);
1671         $this->getDataGenerator()->enrol_user($user1->id, $course2->id);
1673         // Create course groups with group messaging enabled.
1674         $group1a = $this->getDataGenerator()->create_group(array('courseid' => $course1->id, 'enablemessaging' => 1));
1675         $group2a = $this->getDataGenerator()->create_group(array('courseid' => $course2->id, 'enablemessaging' => 1));
1677         // Add users to groups.
1678         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user1->id));
1679         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user2->id));
1680         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user3->id));
1681         $this->getDataGenerator()->create_group_member(array('groupid' => $group2a->id, 'userid' => $user1->id));
1683         // Send some private messages between user 1 and user 2.
1684         $pm1id = $this->create_message($user1->id, $user2->id, $now);
1686         // Get conversation.
1687         $iconversation1id = \core_message\api::get_conversation_between_users([$user1->id, $user2->id]);
1688         $component = 'core_group';
1689         $itemtype = 'groups';
1690         $conversation1 = \core_message\api::get_conversation_by_area(
1691             $component,
1692             $itemtype,
1693             $group1a->id,
1694             $coursecontext1->id
1695         );
1697         // Make favourite some conversations.
1698         \core_message\api::set_favourite_conversation($conversation1->id, $user1->id);
1699         \core_message\api::set_favourite_conversation($iconversation1id, $user2->id);
1701         // Mute some conversations.
1702         \core_message\api::mute_conversation($user1->id, $conversation1->id);
1703         \core_message\api::mute_conversation($user2->id, $iconversation1id);
1705         // Send some messages to the conversation.
1706         $m1 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1', $now + 1);
1707         $m2 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 2', $now + 2);
1708         $m3 = testhelper::send_fake_message_to_conversation($user2, $conversation1->id, 'Message 3', $now + 3);
1710         $dbm1 = $DB->get_record('messages', ['id' => $m1]);
1711         $dbm2 = $DB->get_record('messages', ['id' => $m2]);
1712         $dbm3 = $DB->get_record('messages', ['id' => $m3]);
1714         // Mark as read and delete some messages.
1715         \core_message\api::mark_message_as_read($user1->id, $dbm3, $now + 5);
1716         \core_message\api::delete_message($user1->id, $m2);
1718         // Export all the conversations related to the groups in course1 for user1.
1719         provider::export_conversations($user1->id, 'core_group', 'groups', $coursecontext1);
1721         // Check that system context hasn't been exported.
1722         $writer = writer::with_context($systemcontext);
1723         $this->assertFalse($writer->has_any_data());
1725         // Check that course2 context hasn't been exported.
1726         $writer = writer::with_context($coursecontext2);
1727         $this->assertFalse($writer->has_any_data());
1729         // Check that course1 context has been exported for user1 and contains data.
1730         $writer = writer::with_context($coursecontext1);
1731         $this->assertTrue($writer->has_any_data());
1733         // Confirm the messages for conversation1 are correct.
1734         $messages = (array) $writer->get_data([
1735             get_string('messages', 'core_message'),
1736             get_string($conversation1->itemtype, $conversation1->component),
1737             get_string('privacy:export:conversationprefix', 'core_message') . $conversation1->name
1738         ]);
1739         $this->assertCount(3, $messages);
1741         usort($messages, ['static', 'sort_messages']);
1742         $m1 = array_shift($messages);
1743         $m2 = array_shift($messages);
1744         $m3 = array_shift($messages);
1746         // Check message 1 is correct.
1747         $this->assertEquals(get_string('yes'), $m1->issender);
1748         $this->assertEquals(message_format_message_text($dbm1), $m1->message);
1749         $this->assertEquals(transform::datetime($now + 1), $m1->timecreated);
1750         $this->assertEquals('-', $m1->timeread);
1751         $this->assertArrayNotHasKey('timedeleted', (array) $m1);
1753         // Check message 2 is correct.
1754         $this->assertEquals(get_string('yes'), $m2->issender);
1755         $this->assertEquals(message_format_message_text($dbm2), $m2->message);
1756         $this->assertEquals(transform::datetime($now + 2), $m2->timecreated);
1757         $this->assertEquals('-', $m2->timeread);
1758         $this->assertArrayHasKey('timedeleted', (array) $m2);
1760         // Check message 3 is correct.
1761         $this->assertEquals(get_string('no'), $m3->issender);
1762         $this->assertEquals(message_format_message_text($dbm3), $m3->message);
1763         $this->assertEquals(transform::datetime($now + 3), $m3->timecreated);
1764         $this->assertEquals(transform::datetime($now + 5), $m3->timeread);
1765         $this->assertArrayNotHasKey('timedeleted', (array) $m3);
1767         // Confirm the muted group conversation is correct.
1768         $mutedconversations = (array) $writer->get_related_data([
1769             get_string('messages', 'core_message'),
1770             get_string($conversation1->itemtype, $conversation1->component),
1771             get_string('privacy:export:conversationprefix', 'core_message') . $conversation1->name
1772         ], 'muted');
1773         $this->assertCount(2, $mutedconversations);
1774         $this->assertEquals(get_string('yes'), $mutedconversations['muted']);
1776         // Confirm the favourite group conversation is correct.
1777         $favourite = (array) $writer->get_related_data([
1778             get_string('messages', 'core_message'),
1779             get_string($conversation1->itemtype, $conversation1->component),
1780             get_string('privacy:export:conversationprefix', 'core_message') . $conversation1->name
1781         ], 'starred');
1782         $this->assertCount(4, $favourite);
1783         $this->assertEquals(get_string('yes'), $favourite['starred']);
1785         // Reset writer before exporting conversations for user2.
1786         writer::reset();
1788         // Export all the conversations related to the groups in course1 for user2.
1789         provider::export_conversations($user2->id, 'core_group', 'groups', $coursecontext1);
1791         // Check that system context hasn't been exported.
1792         $writer = writer::with_context($systemcontext);
1793         $this->assertFalse($writer->has_any_data());
1795         // Check that course2 context hasn't been exported.
1796         $writer = writer::with_context($coursecontext2);
1797         $this->assertFalse($writer->has_any_data());
1799         // Check that course1 context has been exported for user2 and contains data.
1800         $writer = writer::with_context($coursecontext1);
1801         $this->assertTrue($writer->has_any_data());
1803         // Confirm the messages for conversation1 are correct.
1804         $messages = (array) $writer->get_data([
1805             get_string('messages', 'core_message'),
1806             get_string($conversation1->itemtype, $conversation1->component),
1807             get_string('privacy:export:conversationprefix', 'core_message') . $conversation1->name
1808         ]);
1809         $this->assertCount(3, $messages);
1811         usort($messages, ['static', 'sort_messages']);
1812         $m1 = array_shift($messages);
1813         $m2 = array_shift($messages);
1814         $m3 = array_shift($messages);
1816         // Check message 1 is correct.
1817         $this->assertEquals(get_string('no'), $m1->issender);
1818         $this->assertEquals(message_format_message_text($dbm1), $m1->message);
1819         $this->assertEquals(transform::datetime($now + 1), $m1->timecreated);
1820         $this->assertEquals('-', $m1->timeread);
1821         $this->assertArrayNotHasKey('timedeleted', (array) $m1);
1823         // Check message 2 is correct.
1824         $this->assertEquals(get_string('no'), $m2->issender);
1825         $this->assertEquals(message_format_message_text($dbm2), $m2->message);
1826         $this->assertEquals(transform::datetime($now + 2), $m2->timecreated);
1827         $this->assertEquals('-', $m2->timeread);
1828         $this->assertArrayNotHasKey('timedeleted', (array) $m2);
1830         // Check message 3 is correct.
1831         $this->assertEquals(get_string('yes'), $m3->issender);
1832         $this->assertEquals(message_format_message_text($dbm3), $m3->message);
1833         $this->assertEquals(transform::datetime($now + 3), $m3->timecreated);
1834         $this->assertEquals('-', $m3->timeread);
1835         $this->assertArrayNotHasKey('timedeleted', (array) $m3);
1837         // Confirm the muted group conversation is correct.
1838         $mutedconversations = (array) $writer->get_related_data([
1839             get_string('messages', 'core_message'),
1840             get_string($conversation1->itemtype, $conversation1->component),
1841             $conversation1->name
1842         ], 'muted');
1843         $this->assertCount(0, $mutedconversations);
1845         // Confirm there are no favourite group conversation for user2.
1846         $favourite = (array) $writer->get_related_data([
1847             get_string('messages', 'core_message'),
1848             get_string($conversation1->itemtype, $conversation1->component),
1849             $conversation1->name
1850         ], 'starred');
1851         $this->assertCount(0, $favourite);
1852     }
1854     /**
1855      * Test for provider::delete_conversations_for_all_users().
1856      */
1857     public function test_delete_conversations_for_all_users() {
1858         global $DB;
1860         $this->resetAfterTest();
1861         $this->setAdminUser();
1862         $now = time();
1863         $timeread = $now - DAYSECS;
1864         $component = 'core_group';
1865         $itemtype = 'groups';
1867         // Create users to test with.
1868         $user1 = $this->getDataGenerator()->create_user();
1869         $user2 = $this->getDataGenerator()->create_user();
1870         $user3 = $this->getDataGenerator()->create_user();
1871         $user4 = $this->getDataGenerator()->create_user();
1872         $user5 = $this->getDataGenerator()->create_user();
1873         $user1context = \context_user::instance($user1->id);
1875         // Create contacts.
1876         \core_message\api::add_contact($user1->id, $user2->id);
1877         \core_message\api::add_contact($user2->id, $user3->id);
1879         // Create contact requests.
1880         \core_message\api::create_contact_request($user1->id, $user3->id);
1881         \core_message\api::create_contact_request($user2->id, $user4->id);
1883         // Block a user.
1884         \core_message\api::block_user($user1->id, $user3->id);
1885         \core_message\api::block_user($user3->id, $user4->id);
1887         // Create individual messages.
1888         $im1 = $this->create_message($user1->id, $user2->id, $now + (9 * DAYSECS), true);
1889         $im2 = $this->create_message($user2->id, $user1->id, $now + (8 * DAYSECS), true);
1890         $im3 = $this->create_message($user2->id, $user3->id, $now + (7 * DAYSECS));
1892         // Create notifications.
1893         $n1 = $this->create_notification($user1->id, $user2->id, $now + (9 * DAYSECS), $timeread);
1894         $n2 = $this->create_notification($user2->id, $user1->id, $now + (8 * DAYSECS));
1895         $n3 = $this->create_notification($user2->id, $user3->id, $now + (7 * DAYSECS));
1897         // Delete one of the messages.
1898         \core_message\api::delete_message($user1->id, $im2);
1900         // Create course2.
1901         $course1 = $this->getDataGenerator()->create_course();
1902         $course2 = $this->getDataGenerator()->create_course();
1903         $coursecontext1 = \context_course::instance($course1->id);
1904         $coursecontext2 = \context_course::instance($course2->id);
1906         // Enrol users to courses.
1907         $this->getDataGenerator()->enrol_user($user1->id, $course1->id);
1908         $this->getDataGenerator()->enrol_user($user2->id, $course1->id);
1909         $this->getDataGenerator()->enrol_user($user3->id, $course1->id);
1910         $this->getDataGenerator()->enrol_user($user1->id, $course2->id);
1911         $this->getDataGenerator()->enrol_user($user2->id, $course2->id);
1913         // Create course groups with group messaging enabled.
1914         $group1a = $this->getDataGenerator()->create_group(array('courseid' => $course1->id, 'enablemessaging' => 1));
1915         $group2a = $this->getDataGenerator()->create_group(array('courseid' => $course2->id, 'enablemessaging' => 1));
1917         // Add users to groups.
1918         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user1->id));
1919         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user2->id));
1920         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user3->id));
1921         $this->getDataGenerator()->create_group_member(array('groupid' => $group2a->id, 'userid' => $user1->id));
1922         $this->getDataGenerator()->create_group_member(array('groupid' => $group2a->id, 'userid' => $user2->id));
1924         // Get conversations.
1925         $iconversation1id = \core_message\api::get_conversation_between_users([$user1->id, $user2->id]);
1926         $conversation1 = \core_message\api::get_conversation_by_area(
1927             $component,
1928             $itemtype,
1929             $group1a->id,
1930             $coursecontext1->id
1931         );
1932         $conversation2 = \core_message\api::get_conversation_by_area(
1933             $component,
1934             $itemtype,
1935             $group2a->id,
1936             $coursecontext2->id
1937         );
1939         // Make favourite some conversations.
1940         \core_message\api::set_favourite_conversation($iconversation1id, $user1->id);
1941         \core_message\api::set_favourite_conversation($conversation1->id, $user1->id);
1942         \core_message\api::set_favourite_conversation($conversation1->id, $user2->id);
1944         // Send some messages to the conversation.
1945         $gm1 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1.1', $now + 1);
1946         $gm2 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1.2', $now + 2);
1947         $gm3 = testhelper::send_fake_message_to_conversation($user2, $conversation1->id, 'Message 1.3', $now + 3);
1948         $gm4 = testhelper::send_fake_message_to_conversation($user1, $conversation2->id, 'Message 2.1', $now + 4);
1949         $gm5 = testhelper::send_fake_message_to_conversation($user2, $conversation2->id, 'Message 2.2', $now + 5);
1951         $dbgm1 = $DB->get_record('messages', ['id' => $gm1]);
1952         $dbgm2 = $DB->get_record('messages', ['id' => $gm2]);
1953         $dbgm3 = $DB->get_record('messages', ['id' => $gm3]);
1954         $dbgm4 = $DB->get_record('messages', ['id' => $gm4]);
1955         $dbgm5 = $DB->get_record('messages', ['id' => $gm5]);
1957         // Mark as read one of the conversation messages.
1958         \core_message\api::mark_message_as_read($user1->id, $dbgm3, $now + 5);
1960         // Mark some conversations as muted by two users.
1961         \core_message\api::mute_conversation($user1->id, $iconversation1id);
1962         \core_message\api::mute_conversation($user1->id, $conversation1->id);
1963         \core_message\api::mute_conversation($user2->id, $conversation1->id);
1965         // There should be 2 contacts.
1966         $this->assertEquals(2, $DB->count_records('message_contacts'));
1968         // There should be 2 contact requests.
1969         $this->assertEquals(2, $DB->count_records('message_contact_requests'));
1971         // There should be 2 blocked users.
1972         $this->assertEquals(2, $DB->count_records('message_users_blocked'));
1974         // There should be 8 messages.
1975         $this->assertEquals(8, $DB->count_records('messages'));
1977         // There should be 4 user actions - 3 for reading the message, 1 for deleting.
1978         $this->assertEquals(4, $DB->count_records('message_user_actions'));
1980         // There should be 3 muted conversations.
1981         $this->assertEquals(3, $DB->count_records('message_conversation_actions'));
1983         // There should be 4 conversations - 2 individual + 2 group + 5 self-conversations.
1984         $this->assertEquals(9, $DB->count_records('message_conversations'));
1986         // There should be 9 conversation members - (2 + 2) individual + (3 + 2) group + 5 self-conversations.
1987         $this->assertEquals(14 , $DB->count_records('message_conversation_members'));
1989         // There should be 5 notifications (3 from create_notification and 2 from create_contact_request).
1990         $this->assertEquals(5, $DB->count_records('notifications'));
1992         // There should be 3 favourite conversations + 5 self-conversations.
1993         $this->assertEquals(8, $DB->count_records('favourite'));
1995         // Delete conversations for all users in course1.
1996         provider::delete_conversations_for_all_users($coursecontext1, $component, $itemtype);
1998         // There should be still 2 contacts.
1999         $this->assertEquals(2, $DB->count_records('message_contacts'));
2001         // There should be still 2 contact requests.
2002         $this->assertEquals(2, $DB->count_records('message_contact_requests'));
2004         // There should be still 2 blocked users.
2005         $this->assertEquals(2, $DB->count_records('message_users_blocked'));
2007         // There should be 1 muted conversation.
2008         $this->assertEquals(1, $DB->count_records('message_conversation_actions'));
2010         // There should be 3 notifications.
2011         $this->assertEquals(5, $DB->count_records('notifications'));
2013         // There should be 5 messages - 3 individual - 2 group (course2).
2014         $this->assertEquals(5, $DB->count_records('messages'));
2015         $messages = $DB->get_records('messages');
2016         $this->assertArrayHasKey($im1, $messages);
2017         $this->assertArrayHasKey($im2, $messages);
2018         $this->assertArrayHasKey($im3, $messages);
2019         $this->assertArrayHasKey($gm4, $messages);
2020         $this->assertArrayHasKey($gm5, $messages);
2022         // There should be 3 user actions - 2 for reading the message, 1 for deleting.
2023         $this->assertEquals(3, $DB->count_records('message_user_actions'));
2024         $useractions = $DB->get_records('message_user_actions');
2025         $useractions = array_map(function($action) {
2026                 return $action->messageid;
2027         }, $useractions);
2028         $this->assertNotContains($gm3, $useractions);
2030         // There should be 3 conversations - 2 individual + 1 group (course2) + 5 self-conversations.
2031         $this->assertEquals(8, $DB->count_records('message_conversations'));
2032         $conversations = $DB->get_records('message_conversations');
2033         $this->assertArrayNotHasKey($conversation1->id, $conversations);
2035         // There should be 6 conversation members - (2 + 2) individual + 2 group + 5 self-conversations.
2036         $this->assertEquals(11, $DB->count_records('message_conversation_members'));
2038         // There should be 1 favourite conversation - the individual one + 5 self-conversations.
2039         $this->assertEquals(6, $DB->count_records('favourite'));
2040     }
2042     /**
2043      * Test for provider::delete_conversations_for_all_users() in the system context.
2044      */
2045     public function test_delete_conversations_for_all_users_systemcontext() {
2046         global $DB;
2048         $this->resetAfterTest();
2049         $this->setAdminUser();
2050         $now = time();
2051         $timeread = $now - DAYSECS;
2052         $systemcontext = \context_system::instance();
2053         $component = 'core_group';
2054         $itemtype = 'groups';
2056         // Create users to test with.
2057         $user1 = $this->getDataGenerator()->create_user();
2058         $user2 = $this->getDataGenerator()->create_user();
2059         $user3 = $this->getDataGenerator()->create_user();
2060         $user4 = $this->getDataGenerator()->create_user();
2061         $user5 = $this->getDataGenerator()->create_user();
2063         // Create contacts.
2064         \core_message\api::add_contact($user1->id, $user2->id);
2065         \core_message\api::add_contact($user2->id, $user3->id);
2067         // Create contact requests.
2068         \core_message\api::create_contact_request($user1->id, $user3->id);
2069         \core_message\api::create_contact_request($user2->id, $user4->id);
2071         // Block a user.
2072         \core_message\api::block_user($user1->id, $user3->id);
2073         \core_message\api::block_user($user3->id, $user4->id);
2075         // Create individual messages.
2076         $im1 = $this->create_message($user1->id, $user2->id, $now + (9 * DAYSECS), true);
2077         $im2 = $this->create_message($user2->id, $user1->id, $now + (8 * DAYSECS), true);
2078         $im3 = $this->create_message($user2->id, $user3->id, $now + (7 * DAYSECS));
2080         // Create notifications.
2081         $n1 = $this->create_notification($user1->id, $user2->id, $now + (9 * DAYSECS), $timeread);
2082         $n2 = $this->create_notification($user2->id, $user1->id, $now + (8 * DAYSECS));
2083         $n3 = $this->create_notification($user2->id, $user3->id, $now + (7 * DAYSECS));
2085         // Delete one of the messages.
2086         \core_message\api::delete_message($user1->id, $im2);
2088         // Create course2.
2089         $course1 = $this->getDataGenerator()->create_course();
2090         $course2 = $this->getDataGenerator()->create_course();
2091         $coursecontext1 = \context_course::instance($course1->id);
2092         $coursecontext2 = \context_course::instance($course2->id);
2094         // Enrol users to courses.
2095         $this->getDataGenerator()->enrol_user($user1->id, $course1->id);
2096         $this->getDataGenerator()->enrol_user($user2->id, $course1->id);
2097         $this->getDataGenerator()->enrol_user($user3->id, $course1->id);
2098         $this->getDataGenerator()->enrol_user($user1->id, $course2->id);
2099         $this->getDataGenerator()->enrol_user($user2->id, $course2->id);
2101         // Create course groups with group messaging enabled.
2102         $group1a = $this->getDataGenerator()->create_group(array('courseid' => $course1->id, 'enablemessaging' => 1));
2103         $group2a = $this->getDataGenerator()->create_group(array('courseid' => $course2->id, 'enablemessaging' => 1));
2105         // Add users to groups.
2106         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user1->id));
2107         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user2->id));
2108         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user3->id));
2109         $this->getDataGenerator()->create_group_member(array('groupid' => $group2a->id, 'userid' => $user1->id));
2110         $this->getDataGenerator()->create_group_member(array('groupid' => $group2a->id, 'userid' => $user2->id));
2112         // Get conversations.
2113         $iconversation1id = \core_message\api::get_conversation_between_users([$user1->id, $user2->id]);
2114         $conversation1 = \core_message\api::get_conversation_by_area(
2115             $component,
2116             $itemtype,
2117             $group1a->id,
2118             $coursecontext1->id
2119         );
2120         $conversation2 = \core_message\api::get_conversation_by_area(
2121             $component,
2122             $itemtype,
2123             $group2a->id,
2124             $coursecontext2->id
2125         );
2127         // Make favourite some conversations.
2128         \core_message\api::set_favourite_conversation($iconversation1id, $user1->id);
2129         \core_message\api::set_favourite_conversation($conversation1->id, $user1->id);
2130         \core_message\api::set_favourite_conversation($conversation1->id, $user2->id);
2132         // Send some messages to the conversation.
2133         $gm1 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1.1', $now + 1);
2134         $gm2 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1.2', $now + 2);
2135         $gm3 = testhelper::send_fake_message_to_conversation($user2, $conversation1->id, 'Message 1.3', $now + 3);
2136         $gm4 = testhelper::send_fake_message_to_conversation($user1, $conversation2->id, 'Message 2.1', $now + 4);
2137         $gm5 = testhelper::send_fake_message_to_conversation($user2, $conversation2->id, 'Message 2.2', $now + 5);
2139         $dbgm3 = $DB->get_record('messages', ['id' => $gm3]);
2141         // Mark some conversations as muted by two users.
2142         \core_message\api::mute_conversation($user1->id, $iconversation1id);
2143         \core_message\api::mute_conversation($user1->id, $conversation1->id);
2144         \core_message\api::mute_conversation($user2->id, $conversation1->id);
2146         // Mark as read one of the conversation messages.
2147         \core_message\api::mark_message_as_read($user1->id, $dbgm3, $now + 5);
2149         // There should be 2 contacts.
2150         $this->assertEquals(2, $DB->count_records('message_contacts'));
2152         // There should be 2 contact requests.
2153         $this->assertEquals(2, $DB->count_records('message_contact_requests'));
2155         // There should be 2 blocked users.
2156         $this->assertEquals(2, $DB->count_records('message_users_blocked'));
2158         // There should be 8 messages.
2159         $this->assertEquals(8, $DB->count_records('messages'));
2161         // There should be 4 user actions - 3 for reading the message, 1 for deleting.
2162         $this->assertEquals(4, $DB->count_records('message_user_actions'));
2164         // There should be 3 muted conversations.
2165         $this->assertEquals(3, $DB->count_records('message_conversation_actions'));
2167         // There should be 4 conversations - 2 individual + 2 group + 5 self-conversations.
2168         $this->assertEquals(9, $DB->count_records('message_conversations'));
2170         // There should be 9 conversation members - (2 + 2) individual + (3 + 2) group + 5 self-conversations.
2171         $this->assertEquals(14, $DB->count_records('message_conversation_members'));
2173         // There should be 5 notifications (3 from create_notification and 2 from create_contact_request).
2174         $this->assertEquals(5, $DB->count_records('notifications'));
2176         // There should be 3 favourite conversations + 5 self-conversations.
2177         $this->assertEquals(8, $DB->count_records('favourite'));
2179         // Delete group conversations for all users in system context.
2180         provider::delete_conversations_for_all_users($systemcontext, $component, $itemtype);
2182         // No conversations should be removed, because they are in the course context.
2183         $this->assertEquals(2, $DB->count_records('message_contacts'));
2184         $this->assertEquals(2, $DB->count_records('message_contact_requests'));
2185         $this->assertEquals(2, $DB->count_records('message_users_blocked'));
2186         $this->assertEquals(8, $DB->count_records('messages'));
2187         $this->assertEquals(4, $DB->count_records('message_user_actions'));
2188         $this->assertEquals(3, $DB->count_records('message_conversation_actions'));
2189         $this->assertEquals(9, $DB->count_records('message_conversations'));
2190         $this->assertEquals(14, $DB->count_records('message_conversation_members'));
2191         $this->assertEquals(5, $DB->count_records('notifications'));
2192         $this->assertEquals(8, $DB->count_records('favourite'));
2194         // Delete individual conversations for all users in system context.
2195         provider::delete_conversations_for_all_users($systemcontext, '', '');
2197         // No conversations should be removed, because they've been moved to user context.
2198         $this->assertEquals(2, $DB->count_records('message_contacts'));
2199         $this->assertEquals(2, $DB->count_records('message_contact_requests'));
2200         $this->assertEquals(2, $DB->count_records('message_users_blocked'));
2201         $this->assertEquals(8, $DB->count_records('messages'));
2202         $this->assertEquals(4, $DB->count_records('message_user_actions'));
2203         $this->assertEquals(3, $DB->count_records('message_conversation_actions'));
2204         $this->assertEquals(9, $DB->count_records('message_conversations'));
2205         $this->assertEquals(14, $DB->count_records('message_conversation_members'));
2206         $this->assertEquals(5, $DB->count_records('notifications'));
2207         $this->assertEquals(8, $DB->count_records('favourite'));
2208     }
2210     /**
2211      * Test for provider::delete_conversations_for_all_users() in the user context.
2212      */
2213     public function test_delete_conversations_for_all_users_usercontext() {
2214         global $DB;
2216         $this->resetAfterTest();
2217         $this->setAdminUser();
2218         $now = time();
2219         $timeread = $now - DAYSECS;
2220         $component = 'core_group';
2221         $itemtype = 'groups';
2223         // Create users to test with.
2224         $user1 = $this->getDataGenerator()->create_user();
2225         $user2 = $this->getDataGenerator()->create_user();
2226         $user3 = $this->getDataGenerator()->create_user();
2227         $user4 = $this->getDataGenerator()->create_user();
2228         $user5 = $this->getDataGenerator()->create_user();
2229         $user1context = \context_user::instance($user1->id);
2231         // Create contacts.
2232         \core_message\api::add_contact($user1->id, $user2->id);
2233         \core_message\api::add_contact($user2->id, $user3->id);
2235         // Create contact requests.
2236         \core_message\api::create_contact_request($user1->id, $user3->id);
2237         \core_message\api::create_contact_request($user2->id, $user4->id);
2239         // Block a user.
2240         \core_message\api::block_user($user1->id, $user3->id);
2241         \core_message\api::block_user($user3->id, $user4->id);
2243         // Create individual messages.
2244         $im1 = $this->create_message($user1->id, $user2->id, $now + (9 * DAYSECS), true);
2245         $im2 = $this->create_message($user2->id, $user1->id, $now + (8 * DAYSECS), true);
2246         $im3 = $this->create_message($user2->id, $user3->id, $now + (7 * DAYSECS));
2248         // Create notifications.
2249         $n1 = $this->create_notification($user1->id, $user2->id, $now + (9 * DAYSECS), $timeread);
2250         $n2 = $this->create_notification($user2->id, $user1->id, $now + (8 * DAYSECS));
2251         $n3 = $this->create_notification($user2->id, $user3->id, $now + (7 * DAYSECS));
2253         // Delete one of the messages.
2254         \core_message\api::delete_message($user1->id, $im2);
2256         // Create course2.
2257         $course1 = $this->getDataGenerator()->create_course();
2258         $course2 = $this->getDataGenerator()->create_course();
2259         $coursecontext1 = \context_course::instance($course1->id);
2260         $coursecontext2 = \context_course::instance($course2->id);
2262         // Enrol users to courses.
2263         $this->getDataGenerator()->enrol_user($user1->id, $course1->id);
2264         $this->getDataGenerator()->enrol_user($user2->id, $course1->id);
2265         $this->getDataGenerator()->enrol_user($user3->id, $course1->id);
2266         $this->getDataGenerator()->enrol_user($user1->id, $course2->id);
2267         $this->getDataGenerator()->enrol_user($user2->id, $course2->id);
2269         // Create course groups with group messaging enabled.
2270         $group1a = $this->getDataGenerator()->create_group(array('courseid' => $course1->id, 'enablemessaging' => 1));
2271         $group2a = $this->getDataGenerator()->create_group(array('courseid' => $course2->id, 'enablemessaging' => 1));
2273         // Add users to groups.
2274         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user1->id));
2275         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user2->id));
2276         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user3->id));
2277         $this->getDataGenerator()->create_group_member(array('groupid' => $group2a->id, 'userid' => $user1->id));
2278         $this->getDataGenerator()->create_group_member(array('groupid' => $group2a->id, 'userid' => $user2->id));
2280         // Get conversation.
2281         $iconversation1id = \core_message\api::get_conversation_between_users([$user1->id, $user2->id]);
2282         $iconversation2id = \core_message\api::get_conversation_between_users([$user2->id, $user3->id]);
2283         $conversation1 = \core_message\api::get_conversation_by_area(
2284             $component,
2285             $itemtype,
2286             $group1a->id,
2287             $coursecontext1->id
2288         );
2289         $conversation2 = \core_message\api::get_conversation_by_area(
2290             $component,
2291             $itemtype,
2292             $group2a->id,
2293             $coursecontext2->id
2294         );
2296         // Make favourite some conversations.
2297         \core_message\api::set_favourite_conversation($iconversation1id, $user1->id);
2298         \core_message\api::set_favourite_conversation($conversation1->id, $user1->id);
2299         \core_message\api::set_favourite_conversation($conversation1->id, $user2->id);
2301         // Send some messages to the conversation.
2302         $gm1 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1.1', $now + 1);
2303         $gm2 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1.2', $now + 2);
2304         $gm3 = testhelper::send_fake_message_to_conversation($user2, $conversation1->id, 'Message 1.3', $now + 3);
2305         $gm4 = testhelper::send_fake_message_to_conversation($user1, $conversation2->id, 'Message 2.1', $now + 4);
2306         $gm5 = testhelper::send_fake_message_to_conversation($user2, $conversation2->id, 'Message 2.2', $now + 5);
2308         $dbgm3 = $DB->get_record('messages', ['id' => $gm3]);
2310         // Mark as read one of the conversation messages.
2311         \core_message\api::mark_message_as_read($user1->id, $dbgm3, $now + 5);
2313         // Mark some of the conversations as muted by two users.
2314         \core_message\api::mute_conversation($user1->id, $iconversation1id);
2315         \core_message\api::mute_conversation($user1->id, $conversation1->id);
2316         \core_message\api::mute_conversation($user2->id, $conversation1->id);
2318         // There should be 2 contacts.
2319         $this->assertEquals(2, $DB->count_records('message_contacts'));
2321         // There should be 2 contact requests.
2322         $this->assertEquals(2, $DB->count_records('message_contact_requests'));
2324         // There should be 2 blocked users.
2325         $this->assertEquals(2, $DB->count_records('message_users_blocked'));
2327         // There should be 8 messages - 3 individual + 5 group.
2328         $this->assertEquals(8, $DB->count_records('messages'));
2330         // There should be 4 user actions - 3 for reading the message, 1 for deleting.
2331         $this->assertEquals(4, $DB->count_records('message_user_actions'));
2333         // There should be 3 muted conversations.
2334         $this->assertEquals(3, $DB->count_records('message_conversation_actions'));
2336         // There should be 4 conversations - 2 individual + 2 group + 5 self-conversations.
2337         $this->assertEquals(9, $DB->count_records('message_conversations'));
2339         // There should be 9 conversation members - (2 + 2) individual + (3 + 2) group + 5 self-conversations.
2340         $this->assertEquals(14, $DB->count_records('message_conversation_members'));
2342         // There should be 5 notifications (3 from create_notification and 2 from create_contact_request).
2343         $this->assertEquals(5, $DB->count_records('notifications'));
2345         // There should be 3 favourite conversations + 5 self-conversations.
2346         $this->assertEquals(8, $DB->count_records('favourite'));
2348         // Delete group conversations for all users in user context.
2349         provider::delete_conversations_for_all_users($user1context, $component, $itemtype);
2351         // No conversations should be removed, because they are in the course context.
2352         $this->assertEquals(2, $DB->count_records('message_contacts'));
2353         $this->assertEquals(2, $DB->count_records('message_contact_requests'));
2354         $this->assertEquals(2, $DB->count_records('message_users_blocked'));
2355         $this->assertEquals(8, $DB->count_records('messages'));
2356         $this->assertEquals(4, $DB->count_records('message_user_actions'));
2357         $this->assertEquals(3, $DB->count_records('message_conversation_actions'));
2358         $this->assertEquals(9, $DB->count_records('message_conversations'));
2359         $this->assertEquals(14, $DB->count_records('message_conversation_members'));
2360         $this->assertEquals(5, $DB->count_records('notifications'));
2361         $this->assertEquals(8, $DB->count_records('favourite'));
2363         // Delete individual conversations for all users in user context.
2364         provider::delete_conversations_for_all_users($user1context, '', '');
2366         // No conversations should be removed, because they are in the course context.
2367         $this->assertEquals(2, $DB->count_records('message_contacts'));
2368         $this->assertEquals(2, $DB->count_records('message_contact_requests'));
2369         $this->assertEquals(2, $DB->count_records('message_users_blocked'));
2370         $this->assertEquals(8, $DB->count_records('messages'));
2371         $this->assertEquals(4, $DB->count_records('message_user_actions'));
2372         $this->assertEquals(3, $DB->count_records('message_conversation_actions'));
2373         $this->assertEquals(9, $DB->count_records('message_conversations'));
2374         $this->assertEquals(14, $DB->count_records('message_conversation_members'));
2375         $this->assertEquals(5, $DB->count_records('notifications'));
2376         $this->assertEquals(8, $DB->count_records('favourite'));
2377     }
2379     /**
2380      * Test for provider::delete_conversations_for_user().
2381      */
2382     public function test_delete_conversations_for_user() {
2383         global $DB;
2385         $this->resetAfterTest();
2386         $this->setAdminUser();
2387         $now = time();
2388         $timeread = $now - DAYSECS;
2389         $systemcontext = \context_system::instance();
2390         $component = 'core_group';
2391         $itemtype = 'groups';
2393         // Create users to test with.
2394         $user1 = $this->getDataGenerator()->create_user();
2395         $user2 = $this->getDataGenerator()->create_user();
2396         $user3 = $this->getDataGenerator()->create_user();
2397         $user4 = $this->getDataGenerator()->create_user();
2398         $user5 = $this->getDataGenerator()->create_user();
2399         $user1context = \context_user::instance($user1->id);
2401         // Create contacts.
2402         \core_message\api::add_contact($user1->id, $user2->id);
2403         \core_message\api::add_contact($user2->id, $user3->id);
2405         // Create contact requests.
2406         \core_message\api::create_contact_request($user1->id, $user3->id);
2407         \core_message\api::create_contact_request($user2->id, $user4->id);
2409         // Block a user.
2410         \core_message\api::block_user($user1->id, $user3->id);
2411         \core_message\api::block_user($user3->id, $user4->id);
2413         // Create private messages.
2414         $pm1 = $this->create_message($user1->id, $user2->id, $now + (9 * DAYSECS), true);
2415         $pm2 = $this->create_message($user2->id, $user1->id, $now + (8 * DAYSECS), true);
2416         $pm3 = $this->create_message($user2->id, $user3->id, $now + (7 * DAYSECS));
2418         // Create notifications.
2419         $n1 = $this->create_notification($user1->id, $user2->id, $now + (9 * DAYSECS), $timeread);
2420         $n2 = $this->create_notification($user2->id, $user1->id, $now + (8 * DAYSECS));
2421         $n3 = $this->create_notification($user2->id, $user3->id, $now + (7 * DAYSECS));
2423         // Delete one of the messages.
2424         \core_message\api::delete_message($user1->id, $pm2);
2426         // Create course.
2427         $course1 = $this->getDataGenerator()->create_course();
2428         $course2 = $this->getDataGenerator()->create_course();
2429         $coursecontext1 = \context_course::instance($course1->id);
2430         $coursecontext2 = \context_course::instance($course2->id);
2432         // Enrol users to courses.
2433         $this->getDataGenerator()->enrol_user($user1->id, $course1->id);
2434         $this->getDataGenerator()->enrol_user($user2->id, $course1->id);
2435         $this->getDataGenerator()->enrol_user($user3->id, $course1->id);
2436         $this->getDataGenerator()->enrol_user($user1->id, $course2->id);
2438         // Create course groups with group messaging enabled.
2439         $group1a = $this->getDataGenerator()->create_group(array('courseid' => $course1->id, 'enablemessaging' => 1));
2441         // Add users to groups.
2442         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user1->id));
2443         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user2->id));
2444         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user3->id));
2446         // Get conversation.
2447         $iconversation1id = \core_message\api::get_conversation_between_users([$user1->id, $user2->id]);
2448         $conversation1 = \core_message\api::get_conversation_by_area(
2449             $component,
2450             $itemtype,
2451             $group1a->id,
2452             $coursecontext1->id
2453         );
2455         // Make favourite some conversations.
2456         \core_message\api::set_favourite_conversation($iconversation1id, $user1->id);
2457         \core_message\api::set_favourite_conversation($conversation1->id, $user1->id);
2458         \core_message\api::set_favourite_conversation($conversation1->id, $user2->id);
2460         // Send some messages to the conversation.
2461         $gm1 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1', $now + 1);
2462         $gm2 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 2', $now + 2);
2463         $gm3 = testhelper::send_fake_message_to_conversation($user2, $conversation1->id, 'Message 3', $now + 3);
2465         $dbm3 = $DB->get_record('messages', ['id' => $gm3]);
2467         // Mark as read one of the conversation messages.
2468         \core_message\api::mark_message_as_read($user1->id, $dbm3, $now + 5);
2470         // Mark some of the conversations as muted by two users.
2471         \core_message\api::mute_conversation($user1->id, $iconversation1id);
2472         \core_message\api::mute_conversation($user1->id, $conversation1->id);
2473         \core_message\api::mute_conversation($user2->id, $conversation1->id);
2475         // There should be 2 contacts.
2476         $this->assertEquals(2, $DB->count_records('message_contacts'));
2478         // There should be 2 contact requests.
2479         $this->assertEquals(2, $DB->count_records('message_contact_requests'));
2481         // There should be 2 blocked users.
2482         $this->assertEquals(2, $DB->count_records('message_users_blocked'));
2484         // There should be 5 notifications.
2485         $this->assertEquals(5, $DB->count_records('notifications'));
2487         // There should be 6 messages.
2488         $this->assertEquals(6, $DB->count_records('messages'));
2490         // There should be 4 user actions - 3 for reading the message, one for deleting.
2491         $this->assertEquals(4, $DB->count_records('message_user_actions'));
2493         // There should be 3 users muting a conversation.
2494         $this->assertEquals(3, $DB->count_records('message_conversation_actions'));
2496         // There should be 3 conversations - 2 private + 1 group + 5 self-conversations.
2497         $this->assertEquals(8, $DB->count_records('message_conversations'));
2499         // There should be 7 conversation members - 2 + 2 private conversations + 3 group conversation + 5 self-conversations.
2500         $this->assertEquals(12, $DB->count_records('message_conversation_members'));
2501         $members = $DB->get_records('message_conversation_members', ['conversationid' => $conversation1->id]);
2502         $members = array_map(function($member) {
2503                 return $member->userid;
2504         }, $members);
2505         $this->assertContains($user1->id, $members);
2507         // There should be three favourite conversations + 5 self-conversations.
2508         $this->assertEquals(8, $DB->count_records('favourite'));
2510         // Delete group conversations for user1 in course1 and course2.
2511         $approvedcontextlist = new \core_privacy\tests\request\approved_contextlist($user1, 'core_message',
2512                 [$coursecontext1->id, $coursecontext2->id]);
2513         provider::delete_conversations_for_user($approvedcontextlist, $component, $itemtype);
2515         // There should be still 2 contacts.
2516         $this->assertEquals(2, $DB->count_records('message_contacts'));
2518         // There should be still 2 contact requests.
2519         $this->assertEquals(2, $DB->count_records('message_contact_requests'));
2521         // There should be still 2 blocked users.
2522         $this->assertEquals(2, $DB->count_records('message_users_blocked'));
2524         // There should be 2 muted conversation.
2525         $this->assertEquals(2, $DB->count_records('message_conversation_actions'));
2527         // There should be 3 notifications.
2528         $this->assertEquals(5, $DB->count_records('notifications'));
2530         // There should be 4 messages - 3 private + 1 group sent by user2.
2531         $this->assertEquals(4, $DB->count_records('messages'));
2532         $messages = $DB->get_records('messages');
2533         $this->assertArrayHasKey($pm1, $messages);
2534         $this->assertArrayHasKey($pm2, $messages);
2535         $this->assertArrayHasKey($pm3, $messages);
2536         $this->assertArrayHasKey($gm3, $messages);
2538         // There should be 3 user actions - 2 for reading the message, one for deleting.
2539         $this->assertEquals(3, $DB->count_records('message_user_actions'));
2540         $useractions = $DB->get_records('message_user_actions');
2541         $useractions = array_map(function($action) {
2542                 return $action->messageid;
2543         }, $useractions);
2544         $this->assertNotContains($gm3, $useractions);
2546         // There should be still 3 conversations - 2 private + 1 group + 5 self-conversations.
2547         $this->assertEquals(8, $DB->count_records('message_conversations'));
2549         // There should be 6 conversation members - 2 + 2 private conversations + 2 group conversation + 5 self-conversations.
2550         $this->assertEquals(11, $DB->count_records('message_conversation_members'));
2551         $members = $DB->get_records('message_conversation_members', ['conversationid' => $conversation1->id]);
2552         $members = array_map(function($member) {
2553                 return $member->userid;
2554         }, $members);
2555         $this->assertNotContains($user1->id, $members);
2557         // Unset favourite self-conversations.
2558         $this->remove_user_self_conversation($user1->id);
2559         $this->remove_user_self_conversation($user2->id);
2560         $this->remove_user_self_conversation($user3->id);
2561         $this->remove_user_self_conversation($user4->id);
2562         $this->remove_user_self_conversation($user5->id);
2564         // There should be 2 favourite conversations - 2 group.
2565         $this->assertEquals(2, $DB->count_records('favourite'));
2566         $favourites = $DB->get_records('favourite');
2567         foreach ($favourites as $favourite) {
2568             if ($favourite->userid == $user1->id) {
2569                 $this->assertEquals($iconversation1id, $favourite->itemid);
2570             } else if ($favourite->userid == $user2->id) {
2571                 $this->assertEquals($conversation1->id, $favourite->itemid);
2572             }
2573         }
2574     }
2577     /**
2578      * Test for provider::delete_conversations_for_users().
2579      */
2580     public function test_delete_conversations_for_users() {
2581         global $DB;
2583         $this->resetAfterTest();
2584         $this->setAdminUser();
2585         $now = time();
2586         $timeread = $now - DAYSECS;
2587         $systemcontext = \context_system::instance();
2588         $component = 'core_group';
2589         $itemtype = 'groups';
2591         // Create users to test with.
2592         $user1 = $this->getDataGenerator()->create_user();
2593         $user2 = $this->getDataGenerator()->create_user();
2594         $user3 = $this->getDataGenerator()->create_user();
2595         $user4 = $this->getDataGenerator()->create_user();
2596         $user5 = $this->getDataGenerator()->create_user();
2597         $user1context = \context_user::instance($user1->id);
2599         // Create contacts.
2600         \core_message\api::add_contact($user1->id, $user2->id);
2601         \core_message\api::add_contact($user2->id, $user3->id);
2603         // Create contact requests.
2604         \core_message\api::create_contact_request($user1->id, $user3->id);
2605         \core_message\api::create_contact_request($user2->id, $user4->id);
2607         // Block a user.
2608         \core_message\api::block_user($user1->id, $user3->id);
2609         \core_message\api::block_user($user3->id, $user4->id);
2611         // Create private messages.
2612         $pm1 = $this->create_message($user1->id, $user2->id, $now + (9 * DAYSECS), true);
2613         $pm2 = $this->create_message($user2->id, $user1->id, $now + (8 * DAYSECS), true);
2614         $pm3 = $this->create_message($user2->id, $user3->id, $now + (7 * DAYSECS));
2616         // Create notifications.
2617         $n1 = $this->create_notification($user1->id, $user2->id, $now + (9 * DAYSECS), $timeread);
2618         $n2 = $this->create_notification($user2->id, $user1->id, $now + (8 * DAYSECS));
2619         $n3 = $this->create_notification($user2->id, $user3->id, $now + (7 * DAYSECS));
2621         // Delete one of the messages.
2622         \core_message\api::delete_message($user1->id, $pm2);
2624         // Create course.
2625         $course1 = $this->getDataGenerator()->create_course();
2626         $course2 = $this->getDataGenerator()->create_course();
2627         $coursecontext1 = \context_course::instance($course1->id);
2628         $coursecontext2 = \context_course::instance($course2->id);
2630         // Enrol users to courses.
2631         $this->getDataGenerator()->enrol_user($user1->id, $course1->id);
2632         $this->getDataGenerator()->enrol_user($user2->id, $course1->id);
2633         $this->getDataGenerator()->enrol_user($user3->id, $course1->id);
2634         $this->getDataGenerator()->enrol_user($user4->id, $course1->id);
2635         $this->getDataGenerator()->enrol_user($user1->id, $course2->id);
2637         // Create course groups with group messaging enabled.
2638         $group1a = $this->getDataGenerator()->create_group(array('courseid' => $course1->id, 'enablemessaging' => 1));
2639         $group2a = $this->getDataGenerator()->create_group(array('courseid' => $course2->id, 'enablemessaging' => 1));
2641         // Add users to groups.
2642         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user1->id));
2643         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user2->id));
2644         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user3->id));
2645         $this->getDataGenerator()->create_group_member(array('groupid' => $group1a->id, 'userid' => $user4->id));
2647         // Get conversation.
2648         $iconversation1id = \core_message\api::get_conversation_between_users([$user1->id, $user2->id]);
2649         $conversation1 = \core_message\api::get_conversation_by_area(
2650             $component,
2651             $itemtype,
2652             $group1a->id,
2653             $coursecontext1->id
2654         );
2656         // Make favourite some conversations.
2657         \core_message\api::set_favourite_conversation($iconversation1id, $user1->id);
2658         \core_message\api::set_favourite_conversation($conversation1->id, $user1->id);
2659         \core_message\api::set_favourite_conversation($conversation1->id, $user3->id);
2661         // Send some messages to the conversation.
2662         $gm1 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1', $now + 1);
2663         $gm2 = testhelper::send_fake_message_to_conversation($user2, $conversation1->id, 'Message 2', $now + 2);
2664         $gm3 = testhelper::send_fake_message_to_conversation($user3, $conversation1->id, 'Message 3', $now + 3);
2666         $dbm3 = $DB->get_record('messages', ['id' => $gm3]);
2668         // Mark as read one of the conversation messages.
2669         \core_message\api::mark_message_as_read($user1->id, $dbm3, $now + 5);
2671         // Mark some of the conversations as muted by two users.
2672         \core_message\api::mute_conversation($user1->id, $iconversation1id);
2673         \core_message\api::mute_conversation($user1->id, $conversation1->id);
2674         \core_message\api::mute_conversation($user2->id, $conversation1->id);
2676         // There should be 2 contacts.
2677         $this->assertEquals(2, $DB->count_records('message_contacts'));
2679         // There should be 2 contact requests.
2680         $this->assertEquals(2, $DB->count_records('message_contact_requests'));
2682         // There should be 2 blocked users.
2683         $this->assertEquals(2, $DB->count_records('message_users_blocked'));
2685         // There should be 5 notifications (3 from create_notification and 2 from create_contact_request).
2686         $this->assertEquals(5, $DB->count_records('notifications'));
2688         // There should be 6 messages.
2689         $this->assertEquals(6, $DB->count_records('messages'));
2691         // There should be 4 user actions - 3 for reading the message, one for deleting.
2692         $this->assertEquals(4, $DB->count_records('message_user_actions'));
2694         // There should be 3 muted conversation.
2695         $this->assertEquals(3, $DB->count_records('message_conversation_actions'));
2697         // There should be 3 conversations - 2 private + 2 group + 5 self-conversations.
2698         $this->assertEquals(9, $DB->count_records('message_conversations'));
2700         // There should be 8 conversation members - (2 + 2) private + 4 group + 5 self-conversations.
2701         $this->assertEquals(13, $DB->count_records('message_conversation_members'));
2702         $members = $DB->get_records('message_conversation_members', ['conversationid' => $conversation1->id]);
2703         $members = array_map(function($member) {
2704                 return $member->userid;
2705         }, $members);
2706         $this->assertContains($user1->id, $members);
2707         $this->assertContains($user4->id, $members);
2709         // There should be 3 favourite conversations + 5 self-conversations.
2710         $this->assertEquals(8, $DB->count_records('favourite'));
2712         // Delete group conversations for user1 and user2 in course2 context.
2713         $approveduserlist = new \core_privacy\local\request\approved_userlist($coursecontext2, 'core_message',
2714                 [$user1->id, $user2->id]);
2715         provider::delete_conversations_for_users($approveduserlist, $component, $itemtype);
2717         // There should be exactly the same content, because $user1 and $user2 don't belong to any group in course2).
2718         $this->assertEquals(2, $DB->count_records('message_contacts'));
2719         $this->assertEquals(2, $DB->count_records('message_contact_requests'));
2720         $this->assertEquals(2, $DB->count_records('message_users_blocked'));
2721         $this->assertEquals(5, $DB->count_records('notifications'));
2722         $this->assertEquals(6, $DB->count_records('messages'));
2723         $this->assertEquals(4, $DB->count_records('message_user_actions'));
2724         $this->assertEquals(3, $DB->count_records('message_conversation_actions'));
2725         $this->assertEquals(9, $DB->count_records('message_conversations'));
2726         $this->assertEquals(13, $DB->count_records('message_conversation_members'));
2727         $this->assertEquals(8, $DB->count_records('favourite'));
2729         // Delete group conversations for user4 in course1 context.
2730         $approveduserlist = new \core_privacy\local\request\approved_userlist($coursecontext1, 'core_message',
2731                 [$user4->id]);
2732         provider::delete_conversations_for_users($approveduserlist, $component, $itemtype);
2734         // There should be the same content except for the members (to remove user4 from the group1 in course1).
2735         $this->assertEquals(2, $DB->count_records('message_contacts'));
2736         $this->assertEquals(2, $DB->count_records('message_contact_requests'));
2737         $this->assertEquals(2, $DB->count_records('message_users_blocked'));
2738         $this->assertEquals(5, $DB->count_records('notifications'));
2739         $this->assertEquals(6, $DB->count_records('messages'));
2740         $this->assertEquals(4, $DB->count_records('message_user_actions'));
2741         $this->assertEquals(3, $DB->count_records('message_conversation_actions'));
2742         $this->assertEquals(9, $DB->count_records('message_conversations'));
2743         $this->assertEquals(8, $DB->count_records('favourite'));
2744         // There should be 7 conversation members - (2 + 2) private + 3 group + 5 self-conversations.
2745         $this->assertEquals(12, $DB->count_records('message_conversation_members'));
2747         // Delete group conversations for user1 and user2 in course1 context.
2748         $approveduserlist = new \core_privacy\local\request\approved_userlist($coursecontext1, 'core_message',
2749                 [$user1->id, $user2->id]);
2750         provider::delete_conversations_for_users($approveduserlist, $component, $itemtype);
2752         // There should be still 2 contacts.
2753         $this->assertEquals(2, $DB->count_records('message_contacts'));
2755         // There should be still 2 contact requests.
2756         $this->assertEquals(2, $DB->count_records('message_contact_requests'));
2758         // There should be still 2 blocked users.
2759         $this->assertEquals(2, $DB->count_records('message_users_blocked'));
2761         // There should be 5 notifications.
2762         $this->assertEquals(5, $DB->count_records('notifications'));
2764         // There should be 4 messages - 3 private + 1 group sent by user3.
2765         $this->assertEquals(4, $DB->count_records('messages'));
2766         $messages = $DB->get_records('messages');
2767         $this->assertArrayHasKey($pm1, $messages);
2768         $this->assertArrayHasKey($pm2, $messages);
2769         $this->assertArrayHasKey($pm3, $messages);
2770         $this->assertArrayHasKey($gm3, $messages);
2772         // There should be 3 user actions - 2 for reading the message, one for deleting.
2773         $this->assertEquals(3, $DB->count_records('message_user_actions'));
2774         $useractions = $DB->get_records('message_user_actions');
2775         $useractions = array_map(function($action) {
2776                 return $action->messageid;
2777         }, $useractions);
2778         $this->assertNotContains($gm3, $useractions);
2780         // There should be 1 muted conversation.
2781         $this->assertEquals(1, $DB->count_records('message_conversation_actions'));
2783         // There should be still 4 conversations - 2 private + 2 group + 5 self-conversations.
2784         $this->assertEquals(9, $DB->count_records('message_conversations'));
2786         // There should be 5 conversation members - (2 + 2) private + 1 group + 5 self-conversations.
2787         $this->assertEquals(10, $DB->count_records('message_conversation_members'));
2788         $members = $DB->get_records('message_conversation_members', ['conversationid' => $conversation1->id]);
2789         $members = array_map(function($member) {
2790                 return $member->userid;
2791         }, $members);
2792         $this->assertNotContains($user1->id, $members);
2793         $this->assertNotContains($user2->id, $members);
2795         // Unset favourite self-conversations.
2796         $this->remove_user_self_conversation($user1->id);
2797         $this->remove_user_self_conversation($user2->id);
2798         $this->remove_user_self_conversation($user3->id);
2799         $this->remove_user_self_conversation($user4->id);
2800         $this->remove_user_self_conversation($user5->id);
2802         // There should be 2 favourite conversations - user1 individual + user3 group.
2803         $this->assertEquals(2, $DB->count_records('favourite'));
2804         $favourites = $DB->get_records('favourite');
2805         foreach ($favourites as $favourite) {
2806             if ($favourite->userid == $user1->id) {
2807                 $this->assertEquals($iconversation1id, $favourite->itemid);
2808             } else if ($favourite->userid == $user3->id) {
2809                 $this->assertEquals($conversation1->id, $favourite->itemid);
2810             }
2811         }
2812     }
2814     /**
2815      * Creates a message to be used for testing.
2816      *
2817      * @param int $useridfrom The user id from
2818      * @param int $useridto The user id to
2819      * @param int $timecreated
2820      * @param bool $read Do we want to mark the message as read?
2821      * @return int The id of the message
2822      * @throws dml_exception
2823      */
2824     private function create_message(int $useridfrom, int $useridto, int $timecreated = null, bool $read = false) {
2825         global $DB;
2827         static $i = 1;
2829         if (is_null($timecreated)) {
2830             $timecreated = time();
2831         }
2833         if (!$conversationid = \core_message\api::get_conversation_between_users([$useridfrom, $useridto])) {
2834             $conversation = \core_message\api::create_conversation(
2835                 \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL,
2836                 [
2837                     $useridfrom,
2838                     $useridto
2839                 ]
2840             );
2841             $conversationid = $conversation->id;
2842         }
2844         // Ok, send the message.
2845         $record = new stdClass();
2846         $record->useridfrom = $useridfrom;
2847         $record->conversationid = $conversationid;
2848         $record->subject = 'No subject';
2849         $record->fullmessage = 'A rad message ' . $i;
2850         $record->smallmessage = 'A rad message ' . $i;
2851         $record->timecreated = $timecreated;
2852         $record->customdata = json_encode(['akey' => 'avalue']);
2854         $i++;
2856         $record->id = $DB->insert_record('messages', $record);
2858         if ($read) {
2859             \core_message\api::mark_message_as_read($useridto, $record);
2860         }
2862         return $record->id;
2863     }
2865     /**
2866      * Creates a notification to be used for testing.
2867      *
2868      * @param int $useridfrom The user id from
2869      * @param int $useridto The user id to
2870      * @param int|null $timecreated The time the notification was created
2871      * @param int|null $timeread The time the notification was read, null if it hasn't been.
2872      * @return int The id of the notification
2873      * @throws dml_exception
2874      */
2875     private function create_notification(int $useridfrom, int $useridto, int $timecreated = null, int $timeread = null) {
2876         global $DB;
2878         static $i = 1;
2880         if (is_null($timecreated)) {
2881             $timecreated = time();
2882         }
2884         $record = new stdClass();
2885         $record->useridfrom = $useridfrom;
2886         $record->useridto = $useridto;
2887         $record->subject = 'No subject';
2888         $record->fullmessage = 'Some rad notification ' . $i;
2889         $record->smallmessage = 'Yo homie, you got some stuff to do, yolo. ' . $i;
2890         $record->timeread = $timeread;
2891         $record->timecreated = $timecreated;
2892         $record->customdata = json_encode(['akey' => 'avalue']);
2894         $i++;
2896         return $DB->insert_record('notifications', $record);
2897     }
2899     /**
2900      * Comparison function for sorting messages.
2901      *
2902      * @param   \stdClass $a
2903      * @param   \stdClass $b
2904      * @return  bool
2905      */
2906     protected static function sort_messages($a, $b) {
2907         return strcmp($a->message, $b->message);
2908     }
2910     /**
2911      * Comparison function for sorting contacts.
2912      *
2913      * @param   \stdClass $a
2914      * @param   \stdClass $b
2915      * @return  bool
2916      */
2917     protected static function sort_contacts($a, $b) {
2918         // Contact attribute contains user id.
2919         return $a->contact <=> $b->contact;
2920     }
2922     /**
2923      * Function to unset favourite and delete all conversation data for a user's self-conversation.
2924      *
2925      * @param int $userid The user id
2926      * @return  void
2927      * @throws moodle_exception
2928      */
2929     protected static function remove_user_self_conversation(int $userid) {
2930         $selfconversation = \core_message\api::get_self_conversation($userid);
2931         \core_message\api::unset_favourite_conversation($selfconversation->id, $userid);
2932         \core_message\api::delete_all_conversation_data($selfconversation->id);
2933     }