Merge branch 'MDL-73483-master' of https://github.com/dmitriim/moodle
[moodle.git] / lib / tests / message_test.php
blobc9a76c862dc62fba0ab076a4531acd3e3721edd0
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.
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 namespace core;
19 /**
20 * Test script for message class.
22 * Test classes for \core\message\message.
24 * @package core
25 * @category test
26 * @copyright 2015 onwards Ankit Agarwal
27 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
29 class message_test extends \advanced_testcase {
31 /**
32 * Test the method get_eventobject_for_processor().
34 public function test_get_eventobject_for_processor() {
35 global $USER;
36 $this->resetAfterTest();
37 $this->setAdminUser();
39 $user = $this->getDataGenerator()->create_user();
41 $message = new \core\message\message();
42 $message->courseid = SITEID;
43 $message->component = 'moodle';
44 $message->name = 'instantmessage';
45 $message->userfrom = $USER;
46 $message->userto = $user;
47 $message->subject = 'message subject 1';
48 $message->fullmessage = 'message body';
49 $message->fullmessageformat = FORMAT_MARKDOWN;
50 $message->fullmessagehtml = '<p>message body</p>';
51 $message->smallmessage = 'small message';
52 $message->notification = '0';
53 $message->contexturl = 'http://GalaxyFarFarAway.com';
54 $message->contexturlname = 'Context name';
55 $message->replyto = "random@example.com";
56 $message->replytoname = fullname($USER);
57 $message->attachname = 'attachment';
58 $content = array('*' => array('header' => ' test ', 'footer' => ' test ')); // Extra content for all types of messages.
59 $message->set_additional_content('test', $content);
61 // Create a file instance.
62 $usercontext = \context_user::instance($user->id);
63 $file = new \stdClass;
64 $file->contextid = $usercontext->id;
65 $file->component = 'user';
66 $file->filearea = 'private';
67 $file->itemid = 0;
68 $file->filepath = '/';
69 $file->filename = '1.txt';
70 $file->source = 'test';
72 $fs = get_file_storage();
73 $file = $fs->create_file_from_string($file, 'file1 content');
74 $message->attachment = $file;
76 $stdClass = $message->get_eventobject_for_processor('test');
78 $this->assertSame($message->courseid, $stdClass->courseid);
79 $this->assertSame($message->component, $stdClass->component);
80 $this->assertSame($message->name, $stdClass->name);
81 $this->assertSame($message->userfrom, $stdClass->userfrom);
82 $this->assertSame($message->userto, $stdClass->userto);
83 $this->assertSame($message->subject, $stdClass->subject);
84 $this->assertSame(' test ' . $message->fullmessage . ' test ', $stdClass->fullmessage);
85 $this->assertSame(' test ' . $message->fullmessagehtml . ' test ', $stdClass->fullmessagehtml);
86 $this->assertSame(' test ' . $message->smallmessage . ' test ', $stdClass->smallmessage);
87 $this->assertSame($message->notification, $stdClass->notification);
88 $this->assertSame($message->contexturl, $stdClass->contexturl);
89 $this->assertSame($message->contexturlname, $stdClass->contexturlname);
90 $this->assertSame($message->replyto, $stdClass->replyto);
91 $this->assertSame($message->replytoname, $stdClass->replytoname);
92 $this->assertSame($message->attachname, $stdClass->attachname);
94 // Extra content for fullmessage only.
95 $content = array('fullmessage' => array('header' => ' test ', 'footer' => ' test '));
96 $message->set_additional_content('test', $content);
97 $stdClass = $message->get_eventobject_for_processor('test');
98 $this->assertSame(' test ' . $message->fullmessage . ' test ', $stdClass->fullmessage);
99 $this->assertSame($message->fullmessagehtml, $stdClass->fullmessagehtml);
100 $this->assertSame($message->smallmessage, $stdClass->smallmessage);
102 // Extra content for fullmessagehtml and smallmessage only.
103 $content = array('fullmessagehtml' => array('header' => ' test ', 'footer' => ' test '),
104 'smallmessage' => array('header' => ' testsmall ', 'footer' => ' testsmall '));
105 $message->set_additional_content('test', $content);
106 $stdClass = $message->get_eventobject_for_processor('test');
107 $this->assertSame($message->fullmessage, $stdClass->fullmessage);
108 $this->assertSame(' test ' . $message->fullmessagehtml . ' test ', $stdClass->fullmessagehtml);
109 $this->assertSame(' testsmall ' . $message->smallmessage . ' testsmall ', $stdClass->smallmessage);
111 // Extra content for * and smallmessage.
112 $content = array('*' => array('header' => ' test ', 'footer' => ' test '),
113 'smallmessage' => array('header' => ' testsmall ', 'footer' => ' testsmall '));
114 $message->set_additional_content('test', $content);
115 $stdClass = $message->get_eventobject_for_processor('test');
116 $this->assertSame(' test ' . $message->fullmessage . ' test ', $stdClass->fullmessage);
117 $this->assertSame(' test ' . $message->fullmessagehtml . ' test ', $stdClass->fullmessagehtml);
118 $this->assertSame(' testsmall ' . ' test ' . $message->smallmessage . ' test ' . ' testsmall ', $stdClass->smallmessage);
122 * Test sending messages as email works with the new class.
124 public function test_send_message() {
125 global $DB, $CFG;
126 $this->preventResetByRollback();
127 $this->resetAfterTest();
129 $user1 = $this->getDataGenerator()->create_user(array('maildisplay' => 1));
130 $user2 = $this->getDataGenerator()->create_user();
131 set_config('allowedemaildomains', 'example.com');
133 // Test basic email processor.
134 $this->assertFileExists("$CFG->dirroot/message/output/email/version.php");
135 $this->assertFileExists("$CFG->dirroot/message/output/popup/version.php");
137 $DB->set_field_select('message_processors', 'enabled', 0, "name <> 'email'");
138 set_user_preference('message_provider_moodle_instantmessage_enabled', 'email', $user2);
140 // Extra content for all types of messages.
141 $message = new \core\message\message();
142 $message->courseid = 1;
143 $message->component = 'moodle';
144 $message->name = 'instantmessage';
145 $message->userfrom = $user1;
146 $message->userto = $user2;
147 $message->subject = 'message subject 1';
148 $message->fullmessage = 'message body';
149 $message->fullmessageformat = FORMAT_MARKDOWN;
150 $message->fullmessagehtml = '<p>message body</p>';
151 $message->smallmessage = 'small message';
152 $message->notification = '0';
153 $content = array('*' => array('header' => ' test ', 'footer' => ' test '));
154 $message->set_additional_content('email', $content);
156 $sink = $this->redirectEmails();
157 $messageid = message_send($message);
158 $emails = $sink->get_messages();
159 $this->assertCount(1, $emails);
160 $email = reset($emails);
161 $recordexists = $DB->record_exists('messages', array('id' => $messageid));
162 $this->assertSame(true, $recordexists);
163 $this->assertSame($user1->email, $email->from);
164 $this->assertSame($user2->email, $email->to);
165 $this->assertSame(get_string('unreadnewmessage', 'message', fullname($user1)), $email->subject);
166 $this->assertNotEmpty($email->header);
167 $this->assertNotEmpty($email->body);
168 $this->assertMatchesRegularExpression('/test.*message body.*test/s', $email->body);
169 $sink->clear();
171 // Test that event fired includes the courseid.
172 $eventsink = $this->redirectEvents();
173 $messageid = message_send($message);
174 $events = $eventsink->get_events();
175 $event = reset($events);
176 $this->assertEquals($message->courseid, $event->other['courseid']);
177 $eventsink->clear();
178 $sink->clear();
180 // Extra content for small message only. Shouldn't show up in emails as we sent fullmessage and fullmessagehtml only in
181 // the emails.
182 $message = new \core\message\message();
183 $message->courseid = 1;
184 $message->component = 'moodle';
185 $message->name = 'instantmessage';
186 $message->userfrom = $user1;
187 $message->userto = $user2;
188 $message->subject = 'message subject 1';
189 $message->fullmessage = 'message body';
190 $message->fullmessageformat = FORMAT_MARKDOWN;
191 $message->fullmessagehtml = '<p>message body</p>';
192 $message->smallmessage = 'small message';
193 $message->notification = '0';
194 $content = array('smallmessage' => array('header' => ' test ', 'footer' => ' test '));
195 $message->set_additional_content('email', $content);
197 $messageid = message_send($message);
198 $emails = $sink->get_messages();
199 $this->assertCount(1, $emails);
200 $email = reset($emails);
201 $recordexists = $DB->record_exists('messages', array('id' => $messageid));
202 $this->assertSame(true, $recordexists);
203 $this->assertSame($user1->email, $email->from);
204 $this->assertSame($user2->email, $email->to);
205 $this->assertSame(get_string('unreadnewmessage', 'message', fullname($user1)), $email->subject);
206 $this->assertNotEmpty($email->header);
207 $this->assertNotEmpty($email->body);
208 $this->assertDoesNotMatchRegularExpression('/test.*message body test/', $email->body);
210 // Test that event fired includes the courseid.
211 $eventsink = $this->redirectEvents();
212 $messageid = message_send($message);
213 $events = $eventsink->get_events();
214 $event = reset($events);
215 $this->assertEquals($message->courseid, $event->other['courseid']);
216 $eventsink->close();
217 $sink->close();
220 public function test_send_message_with_prefix() {
221 global $DB, $CFG;
222 $this->preventResetByRollback();
223 $this->resetAfterTest();
225 $user1 = $this->getDataGenerator()->create_user(array('maildisplay' => 1));
226 $user2 = $this->getDataGenerator()->create_user();
227 set_config('allowedemaildomains', 'example.com');
228 set_config('emailsubjectprefix', '[Prefix Text]');
230 // Test basic email processor.
231 $this->assertFileExists("$CFG->dirroot/message/output/email/version.php");
232 $this->assertFileExists("$CFG->dirroot/message/output/popup/version.php");
234 $DB->set_field_select('message_processors', 'enabled', 0, "name <> 'email'");
235 set_user_preference('message_provider_moodle_instantmessage_enabled', 'email', $user2);
237 // Check that prefix is ammended to the subject of the email.
238 $message = new \core\message\message();
239 $message->courseid = 1;
240 $message->component = 'moodle';
241 $message->name = 'instantmessage';
242 $message->userfrom = $user1;
243 $message->userto = $user2;
244 $message->subject = get_string('unreadnewmessage', 'message', fullname($user1));
245 $message->fullmessage = 'message body';
246 $message->fullmessageformat = FORMAT_MARKDOWN;
247 $message->fullmessagehtml = '<p>message body</p>';
248 $message->smallmessage = 'small message';
249 $message->notification = '0';
250 $content = array('*' => array('header' => ' test ', 'footer' => ' test '));
251 $message->set_additional_content('email', $content);
252 $sink = $this->redirectEmails();
253 $messageid = message_send($message);
254 $emails = $sink->get_messages();
255 $this->assertCount(1, $emails);
256 $email = reset($emails);
257 $this->assertSame('[Prefix Text] '. get_string('unreadnewmessage', 'message', fullname($user1)), $email->subject);
258 $sink->clear();
262 * Test get_messages_by_component method.
264 * @covers \phpunit_message_sink::get_messages_by_component
265 * @covers \phpunit_message_sink::get_messages_by_component_and_type
267 public function test_get_messages_by_component(): void {
268 $this->resetAfterTest();
270 // Create users.
271 $admin = get_admin();
272 $user = $this->getDataGenerator()->create_user();
273 // Create course.
274 $course = $this->getDataGenerator()->create_course();
276 // Redirect messages.
277 $sink = $this->redirectMessages();
279 // Create the first message.
280 // This message will belong to mod_forum component.
281 $message1 = new \core\message\message();
282 $message1->courseid = $course->id;
283 $message1->component = 'mod_forum';
284 $message1->name = 'posts';
285 $message1->userfrom = $admin;
286 $message1->userto = $user;
287 $message1->subject = 'Test message 1';
288 $message1->fullmessage = 'Message body 1';
289 $message1->fullmessageformat = FORMAT_MARKDOWN;
290 $message1->fullmessagehtml = '<p>Message body 1</p>';
291 $message1->smallmessage = 'Small message 1';
292 $message1->notification = 1;
293 message_send($message1);
295 // Create the second message.
296 // This message will belong to core component.
297 $message2 = new \core\message\message();
298 $message2->courseid = $course->id;
299 $message2->component = 'moodle';
300 $message2->name = 'instantmessage';
301 $message2->userfrom = $admin;
302 $message2->userto = $user;
303 $message2->subject = 'Test message 2';
304 $message2->fullmessage = 'Message body 2';
305 $message2->fullmessageformat = FORMAT_MARKDOWN;
306 $message2->fullmessagehtml = '<p>Message body 2</p>';
307 $message2->smallmessage = 'Small message 2';
308 $message2->notification = 1;
309 message_send($message2);
311 // Create the third message.
312 // This message will belong to core component but different name.
313 $message3 = new \core\message\message();
314 $message3->courseid = SITEID;
315 $message3->component = 'moodle';
316 $message3->name = 'messagecontactrequests';
317 $message3->userfrom = $admin;
318 $message3->userto = $user;
319 $message3->subject = 'Test message 3';
320 $message3->fullmessage = 'Message body 3';
321 $message3->fullmessageformat = FORMAT_MARKDOWN;
322 $message3->fullmessagehtml = '<p>Message body 3</p>';
323 $message3->smallmessage = 'Small message 3';
324 $message3->notification = 1;
325 message_send($message3);
327 // Sink should contain three messages.
328 $this->assertCount(3, $sink->get_messages());
329 // Sink should contain one message for mod_forum component.
330 $messages = $sink->get_messages_by_component('mod_forum');
331 $this->assertCount(1, $messages);
332 $message = reset($messages);
333 $this->assertSame($message1->component, $message->component);
334 $this->assertSame($message1->name, $message->eventtype);
335 $this->assertSame($message1->subject, $message->subject);
336 // Sink should contain two messages for core component.
337 $messages = $sink->get_messages_by_component('core');
338 $this->assertCount(2, $messages);
339 foreach ($messages as $message) {
340 $expectedmessage = $message->eventtype == 'messagecontactrequests' ? $message3 : $message2;
341 $this->assertSame($expectedmessage->component, $message->component);
342 $this->assertSame($expectedmessage->name, $message->eventtype);
343 $this->assertSame($expectedmessage->subject, $message->subject);
345 // Sink should contain one message for core component with type is messagecontactrequests.
346 $messages = $sink->get_messages_by_component_and_type('core', 'messagecontactrequests');
347 $this->assertCount(1, $messages);
348 $message = reset($messages);
349 $this->assertSame($message3->component, $message->component);
350 $this->assertSame($message3->name, $message->eventtype);
351 $this->assertSame($message3->subject, $message->subject);
353 // Clear sink.
354 $sink->clear();