Proyectos de Subversion Moodle

Rev

Rev 1 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
// This file is part of Moodle - http://moodle.org/
3
//
4
// Moodle is free software: you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation, either version 3 of the License, or
7
// (at your option) any later version.
8
//
9
// Moodle is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
// GNU General Public License for more details.
13
//
14
// You should have received a copy of the GNU General Public License
15
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16
 
17
namespace core;
18
 
19
/**
20
 * Test script for message class.
21
 *
22
 * Test classes for \core\message\message.
23
 *
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
28
 */
29
class message_test extends \advanced_testcase {
30
 
31
    /**
32
     * Test the method get_eventobject_for_processor().
33
     */
11 efrain 34
    public function test_get_eventobject_for_processor(): void {
1 efrain 35
        global $USER;
36
        $this->resetAfterTest();
37
        $this->setAdminUser();
38
 
39
        $user = $this->getDataGenerator()->create_user();
40
 
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);
60
 
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';
71
 
72
        $fs = get_file_storage();
73
        $file = $fs->create_file_from_string($file, 'file1 content');
74
        $message->attachment = $file;
75
 
76
        $stdClass = $message->get_eventobject_for_processor('test');
77
 
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);
93
 
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);
101
 
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);
110
 
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);
119
    }
120
 
121
    /**
122
     * Test sending messages as email works with the new class.
123
     */
11 efrain 124
    public function test_send_message(): void {
1 efrain 125
        global $DB, $CFG;
126
        $this->preventResetByRollback();
127
        $this->resetAfterTest();
128
 
129
        $user1 = $this->getDataGenerator()->create_user(array('maildisplay' => 1));
130
        $user2 = $this->getDataGenerator()->create_user();
131
        set_config('allowedemaildomains', 'example.com');
132
 
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");
136
 
137
        $DB->set_field_select('message_processors', 'enabled', 0, "name <> 'email'");
138
        set_user_preference('message_provider_moodle_instantmessage_enabled', 'email', $user2);
139
 
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);
155
 
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();
170
 
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();
179
 
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);
196
 
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);
209
 
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();
218
    }
219
 
11 efrain 220
    public function test_send_message_with_prefix(): void {
1 efrain 221
        global $DB, $CFG;
222
        $this->preventResetByRollback();
223
        $this->resetAfterTest();
224
 
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]');
229
 
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");
233
 
234
        $DB->set_field_select('message_processors', 'enabled', 0, "name <> 'email'");
235
        set_user_preference('message_provider_moodle_instantmessage_enabled', 'email', $user2);
236
 
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();
259
    }
260
 
261
    /**
262
     * Test get_messages_by_component method.
263
     *
264
     * @covers \phpunit_message_sink::get_messages_by_component
265
     * @covers \phpunit_message_sink::get_messages_by_component_and_type
266
     */
267
    public function test_get_messages_by_component(): void {
268
        $this->resetAfterTest();
269
 
270
        // Create users.
271
        $admin = get_admin();
272
        $user = $this->getDataGenerator()->create_user();
273
        // Create course.
274
        $course = $this->getDataGenerator()->create_course();
275
 
276
        // Redirect messages.
277
        $sink = $this->redirectMessages();
278
 
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);
294
 
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);
310
 
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);
326
 
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);
344
        }
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);
352
 
353
        // Clear sink.
354
        $sink->clear();
355
    }
356
}