Revert "Merge branch 'MDL-45594_master_alt' of git://github.com/markn86/moodle"
[moodle.git] / message / tests / messagelib_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  * Test api's in message lib.
19  *
20  * @package core_message
21  * @category test
22  * @copyright 2014 Rajesh Taneja <rajesh@moodle.com>
23  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26 defined('MOODLE_INTERNAL') || die();
28 global $CFG;
29 require_once($CFG->dirroot . '/message/lib.php');
31 /**
32  * Test api's in message lib.
33  *
34  * @package core_message
35  * @category test
36  * @copyright 2014 Rajesh Taneja <rajesh@moodle.com>
37  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38  */
39 class core_message_messagelib_testcase extends advanced_testcase {
41     /** @var phpunit_message_sink keep track of messages. */
42     protected $messagesink = null;
44     /**
45      * Test set up.
46      *
47      * This is executed before running any test in this file.
48      */
49     public function setUp() {
50         $this->preventResetByRollback(); // Messaging is not compatible with transactions.
51         $this->messagesink = $this->redirectMessages();
52         $this->resetAfterTest();
53     }
55     /**
56      * Send a fake message.
57      *
58      * {@link message_send()} does not support transaction, this function will simulate a message
59      * sent from a user to another. We should stop using it once {@link message_send()} will support
60      * transactions. This is not clean at all, this is just used to add rows to the table.
61      *
62      * @param stdClass $userfrom user object of the one sending the message.
63      * @param stdClass $userto user object of the one receiving the message.
64      * @param string $message message to send.
65      */
66     protected function send_fake_message($userfrom, $userto, $message = 'Hello world!') {
67         global $DB;
69         $record = new stdClass();
70         $record->useridfrom = $userfrom->id;
71         $record->useridto = $userto->id;
72         $record->subject = 'No subject';
73         $record->fullmessage = $message;
74         $record->timecreated = time();
75         $insert = $DB->insert_record('message', $record);
76     }
78     /**
79      * Test message_get_blocked_users.
80      */
81     public function test_message_get_blocked_users() {
82         // Set this user as the admin.
83         $this->setAdminUser();
85         // Create a user to add to the admin's contact list.
86         $user1 = $this->getDataGenerator()->create_user();
87         $user2 = $this->getDataGenerator()->create_user();
89         // Add users to the admin's contact list.
90         message_add_contact($user1->id);
91         message_add_contact($user2->id, 1);
93         $this->assertCount(1, message_get_blocked_users());
95         // Block other user.
96         message_block_contact($user1->id);
97         $this->assertCount(2, message_get_blocked_users());
98     }
100     /**
101      * Test message_get_contacts.
102      */
103     public function test_message_get_contacts() {
104         global $USER, $CFG;
106         // Set this user as the admin.
107         $this->setAdminUser();
109         $noreplyuser = core_user::get_noreply_user();
110         $supportuser = core_user::get_support_user();
112         // Create a user to add to the admin's contact list.
113         $user1 = $this->getDataGenerator()->create_user();
114         $user2 = $this->getDataGenerator()->create_user();
115         $user3 = $this->getDataGenerator()->create_user(); // Stranger.
117         // Add users to the admin's contact list.
118         message_add_contact($user1->id);
119         message_add_contact($user2->id);
121         // Send some messages.
122         $this->send_fake_message($user1, $USER);
123         $this->send_fake_message($user2, $USER);
124         $this->send_fake_message($user3, $USER);
126         list($onlinecontacts, $offlinecontacts, $strangers) = message_get_contacts();
127         $this->assertCount(0, $onlinecontacts);
128         $this->assertCount(2, $offlinecontacts);
129         $this->assertCount(1, $strangers);
131         // Send message from noreply and support users.
132         $this->send_fake_message($noreplyuser, $USER);
133         $this->send_fake_message($supportuser, $USER);
134         list($onlinecontacts, $offlinecontacts, $strangers) = message_get_contacts();
135         $this->assertCount(0, $onlinecontacts);
136         $this->assertCount(2, $offlinecontacts);
137         $this->assertCount(3, $strangers);
139         // Block 1 user.
140         message_block_contact($user2->id);
141         list($onlinecontacts, $offlinecontacts, $strangers) = message_get_contacts();
142         $this->assertCount(0, $onlinecontacts);
143         $this->assertCount(1, $offlinecontacts);
144         $this->assertCount(3, $strangers);
146         // Noreply user being valid user.
147         core_user::reset_internal_users();
148         $CFG->noreplyuserid = $user3->id;
149         $noreplyuser = core_user::get_noreply_user();
150         list($onlinecontacts, $offlinecontacts, $strangers) = message_get_contacts();
151         $this->assertCount(0, $onlinecontacts);
152         $this->assertCount(1, $offlinecontacts);
153         $this->assertCount(2, $strangers);
154     }
156     /**
157      * Test message_count_messages.
158      */
159     public function test_message_count_messages() {
160         global $DB;
162         // Create users to send and receive message.
163         $userfrom = $this->getDataGenerator()->create_user();
164         $userto = $this->getDataGenerator()->create_user();
166         message_post_message($userfrom, $userto, 'Message 1', FORMAT_PLAIN);
167         message_post_message($userfrom, $userto, 'Message 2', FORMAT_PLAIN);
168         message_post_message($userto, $userfrom, 'Message 3', FORMAT_PLAIN);
170         // Return 0 when no message.
171         $messages = array();
172         $this->assertEquals(0, message_count_messages($messages, 'Test', 'Test'));
174         // Check number of messages from userfrom and userto.
175         $messages = $this->messagesink->get_messages();
176         $this->assertEquals(2, message_count_messages($messages, 'useridfrom', $userfrom->id));
177         $this->assertEquals(1, message_count_messages($messages, 'useridfrom', $userto->id));
178     }
180     /**
181      * Test message_count_unread_messages.
182      */
183     public function test_message_count_unread_messages() {
184         // Create users to send and receive message.
185         $userfrom1 = $this->getDataGenerator()->create_user();
186         $userfrom2 = $this->getDataGenerator()->create_user();
187         $userto = $this->getDataGenerator()->create_user();
189         $this->assertEquals(0, message_count_unread_messages($userto));
191         // Send fake messages.
192         $this->send_fake_message($userfrom1, $userto);
193         $this->send_fake_message($userfrom2, $userto);
195         $this->assertEquals(2, message_count_unread_messages($userto));
196         $this->assertEquals(1, message_count_unread_messages($userto, $userfrom1));
197     }
199     /**
200      * Test message_count_blocked_users.
201      *
202      */
203     public function test_message_count_blocked_users() {
204         // Set this user as the admin.
205         $this->setAdminUser();
207         // Create users to add to the admin's contact list.
208         $user1 = $this->getDataGenerator()->create_user();
209         $user2 = $this->getDataGenerator()->create_user();
211         $this->assertEquals(0, message_count_blocked_users());
213         // Add 1 blocked and 1 normal contact to admin's contact list.
214         message_add_contact($user1->id);
215         message_add_contact($user2->id, 1);
217         $this->assertEquals(0, message_count_blocked_users($user2));
218         $this->assertEquals(1, message_count_blocked_users());
219     }
221     /**
222      * Test message_add_contact.
223      */
224     public function test_message_add_contact() {
225         // Set this user as the admin.
226         $this->setAdminUser();
228         // Create a user to add to the admin's contact list.
229         $user1 = $this->getDataGenerator()->create_user();
230         $user2 = $this->getDataGenerator()->create_user();
231         $user3 = $this->getDataGenerator()->create_user();
233         message_add_contact($user1->id);
234         message_add_contact($user2->id, 0);
235         // Add duplicate contact and make sure only 1 record exists.
236         message_add_contact($user2->id, 1);
238         $this->assertNotEmpty(message_get_contact($user1->id));
239         $this->assertNotEmpty(message_get_contact($user2->id));
240         $this->assertEquals(false, message_get_contact($user3->id));
241         $this->assertEquals(1, message_count_blocked_users());
242     }
244     /**
245      * Test message_remove_contact.
246      */
247     public function test_message_remove_contact() {
248         // Set this user as the admin.
249         $this->setAdminUser();
251         // Create a user to add to the admin's contact list.
252         $user = $this->getDataGenerator()->create_user();
254         // Add the user to the admin's contact list.
255         message_add_contact($user->id);
256         $this->assertNotEmpty(message_get_contact($user->id));
258         // Remove user from admin's contact list.
259         message_remove_contact($user->id);
260         $this->assertEquals(false, message_get_contact($user->id));
261     }
263     /**
264      * Test message_block_contact.
265      */
266     public function test_message_block_contact() {
267         // Set this user as the admin.
268         $this->setAdminUser();
270         // Create a user to add to the admin's contact list.
271         $user1 = $this->getDataGenerator()->create_user();
272         $user2 = $this->getDataGenerator()->create_user();
274         // Add users to the admin's contact list.
275         message_add_contact($user1->id);
276         message_add_contact($user2->id);
278         $this->assertEquals(0, message_count_blocked_users());
280         // Block 1 user.
281         message_block_contact($user2->id);
282         $this->assertEquals(1, message_count_blocked_users());
284     }
286     /**
287      * Test message_unblock_contact.
288      */
289     public function test_message_unblock_contact() {
290         // Set this user as the admin.
291         $this->setAdminUser();
293         // Create a user to add to the admin's contact list.
294         $user1 = $this->getDataGenerator()->create_user();
295         $user2 = $this->getDataGenerator()->create_user();
297         // Add users to the admin's contact list.
298         message_add_contact($user1->id);
299         message_add_contact($user2->id, 1); // Add blocked contact.
301         $this->assertEquals(1, message_count_blocked_users());
303         // Unblock user.
304         message_unblock_contact($user2->id);
305         $this->assertEquals(0, message_count_blocked_users());
306     }
308     /**
309      * Test message_search_users.
310      */
311     public function test_message_search_users() {
312         // Set this user as the admin.
313         $this->setAdminUser();
315         // Create a user to add to the admin's contact list.
316         $user1 = $this->getDataGenerator()->create_user(array('firstname' => 'Test1', 'lastname' => 'user1'));
317         $user2 = $this->getDataGenerator()->create_user(array('firstname' => 'Test2', 'lastname' => 'user2'));
319         // Add users to the admin's contact list.
320         message_add_contact($user1->id);
321         message_add_contact($user2->id); // Add blocked contact.
323         $this->assertCount(1, message_search_users(0, 'Test1'));
324         $this->assertCount(2, message_search_users(0, 'Test'));
325         $this->assertCount(1, message_search_users(0, 'user1'));
326         $this->assertCount(2, message_search_users(0, 'user'));
327     }
329     /**
330      * Test message_search.
331      */
332     public function test_message_search() {
333         global $USER;
335         // Set this user as the admin.
336         $this->setAdminUser();
338         // Create a user to add to the admin's contact list.
339         $user1 = $this->getDataGenerator()->create_user(array('firstname' => 'Test1', 'lastname' => 'user1'));
340         $user2 = $this->getDataGenerator()->create_user(array('firstname' => 'Test2', 'lastname' => 'user2'));
342         // Send few messages, real (read).
343         message_post_message($user1, $USER, 'Message 1', FORMAT_PLAIN);
344         message_post_message($USER, $user1, 'Message 2', FORMAT_PLAIN);
345         message_post_message($USER, $user2, 'Message 3', FORMAT_PLAIN);
347         $this->assertCount(2, message_search(array('Message'), true, false));
348         $this->assertCount(3, message_search(array('Message'), true, true));
350         // Send fake message (not-read).
351         $this->send_fake_message($USER, $user1, 'Message 4');
352         $this->send_fake_message($user1, $USER, 'Message 5');
353         $this->assertCount(3, message_search(array('Message'), true, false));
354         $this->assertCount(5, message_search(array('Message'), true, true));
356         // If courseid given then should be 0.
357         $this->assertEquals(false, message_search(array('Message'), true, true, ''));
358         $this->assertEquals(false, message_search(array('Message'), true, true, 2));
359         $this->assertCount(5, message_search(array('Message'), true, true, SITEID));
360     }