[ Index ] |
PHP Cross Reference of moodle-2.8 |
[Summary view] [Print] [Text view]
1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 /** 18 * Tests for messagelib.php. 19 * 20 * @package core_message 21 * @category phpunit 22 * @copyright 2012 The Open Universtiy 23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 24 */ 25 26 defined('MOODLE_INTERNAL') || die(); 27 28 class core_messagelib_testcase extends advanced_testcase { 29 30 public function test_message_provider_disabled() { 31 $this->resetAfterTest(); 32 $this->preventResetByRollback(); 33 unset_config('noemailever'); 34 35 // Disable instantmessage provider. 36 $disableprovidersetting = 'moodle_instantmessage_disable'; 37 set_config($disableprovidersetting, 1, 'message'); 38 $preferences = get_message_output_default_preferences(); 39 $this->assertTrue($preferences->$disableprovidersetting == 1); 40 41 $message = new stdClass(); 42 $message->component = 'moodle'; 43 $message->name = 'instantmessage'; 44 $message->userfrom = get_admin(); 45 $message->userto = $this->getDataGenerator()->create_user();; 46 $message->subject = 'message subject 1'; 47 $message->fullmessage = 'message body'; 48 $message->fullmessageformat = FORMAT_MARKDOWN; 49 $message->fullmessagehtml = '<p>message body</p>'; 50 $message->smallmessage = 'small message'; 51 $message->notification = 0; 52 53 // Check message is not sent. 54 $sink = $this->redirectEmails(); 55 $this->assertTrue(phpunit_util::is_redirecting_phpmailer()); 56 message_send($message); 57 $emails = $sink->get_messages(); 58 $this->assertEmpty($emails); 59 60 // Check message is sent. 61 set_config($disableprovidersetting, 0, 'message'); 62 $preferences = get_message_output_default_preferences(); 63 $this->assertTrue($preferences->$disableprovidersetting == 0); 64 65 $sink = $this->redirectEmails(); 66 $this->assertTrue(phpunit_util::is_redirecting_phpmailer()); 67 message_send($message); 68 $emails = $sink->get_messages(); 69 $email = reset($emails); 70 $this->assertEquals($email->subject, 'message subject 1'); 71 } 72 public function test_message_get_providers_for_user() { 73 global $CFG, $DB; 74 75 $this->resetAfterTest(); 76 77 $generator = $this->getDataGenerator(); 78 79 // Create a course category and course. 80 $cat = $generator->create_category(array('parent' => 0)); 81 $course = $generator->create_course(array('category' => $cat->id)); 82 $quiz = $generator->create_module('quiz', array('course' => $course->id)); 83 $user = $generator->create_user(); 84 85 $coursecontext = context_course::instance($course->id); 86 $quizcontext = context_module::instance($quiz->cmid); 87 $frontpagecontext = context_course::instance(SITEID); 88 89 $studentrole = $DB->get_record('role', array('shortname' => 'student')); 90 91 // The user is a student in a course, and has the capability for quiz 92 // confirmation emails in one quiz in that course. 93 role_assign($studentrole->id, $user->id, $coursecontext->id); 94 assign_capability('mod/quiz:emailconfirmsubmission', CAP_ALLOW, $studentrole->id, $quizcontext->id); 95 96 // Give this message type to the front page role. 97 assign_capability('mod/quiz:emailwarnoverdue', CAP_ALLOW, $CFG->defaultfrontpageroleid, $frontpagecontext->id); 98 99 $providers = message_get_providers_for_user($user->id); 100 $this->assertTrue($this->message_type_present('mod_forum', 'posts', $providers)); 101 $this->assertTrue($this->message_type_present('mod_quiz', 'confirmation', $providers)); 102 $this->assertTrue($this->message_type_present('mod_quiz', 'attempt_overdue', $providers)); 103 $this->assertFalse($this->message_type_present('mod_quiz', 'submission', $providers)); 104 105 // A user is a student in a different course, they should not get confirmation. 106 $course2 = $generator->create_course(array('category' => $cat->id)); 107 $user2 = $generator->create_user(); 108 $coursecontext2 = context_course::instance($course2->id); 109 role_assign($studentrole->id, $user2->id, $coursecontext2->id); 110 accesslib_clear_all_caches_for_unit_testing(); 111 $providers = message_get_providers_for_user($user2->id); 112 $this->assertTrue($this->message_type_present('mod_forum', 'posts', $providers)); 113 $this->assertFalse($this->message_type_present('mod_quiz', 'confirmation', $providers)); 114 115 // Now remove the frontpage role id, and attempt_overdue message should go away. 116 unset_config('defaultfrontpageroleid'); 117 accesslib_clear_all_caches_for_unit_testing(); 118 119 $providers = message_get_providers_for_user($user->id); 120 $this->assertTrue($this->message_type_present('mod_quiz', 'confirmation', $providers)); 121 $this->assertFalse($this->message_type_present('mod_quiz', 'attempt_overdue', $providers)); 122 $this->assertFalse($this->message_type_present('mod_quiz', 'submission', $providers)); 123 } 124 125 public function test_message_get_providers_for_user_more() { 126 global $DB; 127 128 $this->resetAfterTest(); 129 130 // Create a course. 131 $course = $this->getDataGenerator()->create_course(); 132 $coursecontext = context_course::instance($course->id); 133 134 // It would probably be better to use a quiz instance as it has capability controlled messages 135 // however mod_quiz doesn't have a data generator. 136 // Instead we're going to use backup notifications and give and take away the capability at various levels. 137 $assign = $this->getDataGenerator()->create_module('assign', array('course'=>$course->id)); 138 $modulecontext = context_module::instance($assign->cmid); 139 140 // Create and enrol a teacher. 141 $teacherrole = $DB->get_record('role', array('shortname'=>'editingteacher'), '*', MUST_EXIST); 142 $teacher = $this->getDataGenerator()->create_user(); 143 role_assign($teacherrole->id, $teacher->id, $coursecontext); 144 $enrolplugin = enrol_get_plugin('manual'); 145 $enrolplugin->add_instance($course); 146 $enrolinstances = enrol_get_instances($course->id, false); 147 foreach ($enrolinstances as $enrolinstance) { 148 if ($enrolinstance->enrol === 'manual') { 149 break; 150 } 151 } 152 $enrolplugin->enrol_user($enrolinstance, $teacher->id); 153 154 // Make the teacher the current user. 155 $this->setUser($teacher); 156 157 // Teacher shouldn't have the required capability so they shouldn't be able to see the backup message. 158 $this->assertFalse(has_capability('moodle/site:config', $modulecontext)); 159 $providers = message_get_providers_for_user($teacher->id); 160 $this->assertFalse($this->message_type_present('moodle', 'backup', $providers)); 161 162 // Give the user the required capability in an activity module. 163 // They should now be able to see the backup message. 164 assign_capability('moodle/site:config', CAP_ALLOW, $teacherrole->id, $modulecontext->id, true); 165 accesslib_clear_all_caches_for_unit_testing(); 166 $modulecontext = context_module::instance($assign->cmid); 167 $this->assertTrue(has_capability('moodle/site:config', $modulecontext)); 168 169 $providers = message_get_providers_for_user($teacher->id); 170 $this->assertTrue($this->message_type_present('moodle', 'backup', $providers)); 171 172 // Prohibit the capability for the user at the course level. 173 // This overrules the CAP_ALLOW at the module level. 174 // They should not be able to see the backup message. 175 assign_capability('moodle/site:config', CAP_PROHIBIT, $teacherrole->id, $coursecontext->id, true); 176 accesslib_clear_all_caches_for_unit_testing(); 177 $modulecontext = context_module::instance($assign->cmid); 178 $this->assertFalse(has_capability('moodle/site:config', $modulecontext)); 179 180 $providers = message_get_providers_for_user($teacher->id); 181 // Actually, handling PROHIBITs would be too expensive. We do not 182 // care if users with PROHIBITs see a few more preferences than they should. 183 // $this->assertFalse($this->message_type_present('moodle', 'backup', $providers)); 184 } 185 186 public function test_send_message_redirection() { 187 global $DB; 188 189 $this->resetAfterTest(); 190 191 $user1 = $this->getDataGenerator()->create_user(); 192 $user2 = $this->getDataGenerator()->create_user(); 193 194 // Test basic message redirection. 195 $message = new stdClass(); 196 $message->component = 'moodle'; 197 $message->name = 'instantmessage'; 198 $message->userfrom = $user1; 199 $message->userto = $user2; 200 $message->subject = 'message subject 1'; 201 $message->fullmessage = 'message body'; 202 $message->fullmessageformat = FORMAT_MARKDOWN; 203 $message->fullmessagehtml = '<p>message body</p>'; 204 $message->smallmessage = 'small message'; 205 $message->notification = '0'; 206 207 $sink = $this->redirectMessages(); 208 $this->setCurrentTimeStart(); 209 $messageid = message_send($message); 210 $savedmessages = $sink->get_messages(); 211 $this->assertCount(1, $savedmessages); 212 $savedmessage = reset($savedmessages); 213 $this->assertEquals($messageid, $savedmessage->id); 214 $this->assertEquals($user1->id, $savedmessage->useridfrom); 215 $this->assertEquals($user2->id, $savedmessage->useridto); 216 $this->assertEquals($message->fullmessage, $savedmessage->fullmessage); 217 $this->assertEquals($message->fullmessageformat, $savedmessage->fullmessageformat); 218 $this->assertEquals($message->fullmessagehtml, $savedmessage->fullmessagehtml); 219 $this->assertEquals($message->smallmessage, $savedmessage->smallmessage); 220 $this->assertEquals($message->smallmessage, $savedmessage->smallmessage); 221 $this->assertEquals($message->notification, $savedmessage->notification); 222 $this->assertNull($savedmessage->contexturl); 223 $this->assertNull($savedmessage->contexturlname); 224 $this->assertTimeCurrent($savedmessage->timecreated); 225 $record = $DB->get_record('message_read', array('id' => $savedmessage->id), '*', MUST_EXIST); 226 $this->assertEquals($record, $savedmessage); 227 $sink->clear(); 228 $this->assertFalse($DB->record_exists('message', array())); 229 $DB->delete_records('message_read', array()); 230 231 $message = new stdClass(); 232 $message->component = 'moodle'; 233 $message->name = 'instantmessage'; 234 $message->userfrom = $user1->id; 235 $message->userto = $user2->id; 236 $message->subject = 'message subject 1'; 237 $message->fullmessage = 'message body'; 238 $message->fullmessageformat = FORMAT_MARKDOWN; 239 $message->fullmessagehtml = '<p>message body</p>'; 240 $message->smallmessage = 'small message'; 241 $message->notification = '0'; 242 $message->contexturl = new moodle_url('/'); 243 $message->contexturlname = 'front'; 244 $sink = $this->redirectMessages(); 245 $messageid = message_send($message); 246 $savedmessages = $sink->get_messages(); 247 $this->assertCount(1, $savedmessages); 248 $savedmessage = reset($savedmessages); 249 $this->assertEquals($messageid, $savedmessage->id); 250 $this->assertEquals($user1->id, $savedmessage->useridfrom); 251 $this->assertEquals($user2->id, $savedmessage->useridto); 252 $this->assertEquals($message->fullmessage, $savedmessage->fullmessage); 253 $this->assertEquals($message->fullmessageformat, $savedmessage->fullmessageformat); 254 $this->assertEquals($message->fullmessagehtml, $savedmessage->fullmessagehtml); 255 $this->assertEquals($message->smallmessage, $savedmessage->smallmessage); 256 $this->assertEquals($message->smallmessage, $savedmessage->smallmessage); 257 $this->assertEquals($message->notification, $savedmessage->notification); 258 $this->assertEquals($message->contexturl->out(), $savedmessage->contexturl); 259 $this->assertEquals($message->contexturlname, $savedmessage->contexturlname); 260 $this->assertTimeCurrent($savedmessage->timecreated); 261 $record = $DB->get_record('message_read', array('id' => $savedmessage->id), '*', MUST_EXIST); 262 $this->assertEquals($record, $savedmessage); 263 $sink->clear(); 264 $this->assertFalse($DB->record_exists('message', array())); 265 $DB->delete_records('message_read', array()); 266 267 // Test phpunit problem detection. 268 269 $message = new stdClass(); 270 $message->component = 'xxxxx'; 271 $message->name = 'instantmessage'; 272 $message->userfrom = $user1; 273 $message->userto = $user2; 274 $message->subject = 'message subject 1'; 275 $message->fullmessage = 'message body'; 276 $message->fullmessageformat = FORMAT_MARKDOWN; 277 $message->fullmessagehtml = '<p>message body</p>'; 278 $message->smallmessage = 'small message'; 279 $message->notification = '0'; 280 281 $sink = $this->redirectMessages(); 282 try { 283 message_send($message); 284 } catch (moodle_exception $e) { 285 $this->assertInstanceOf('coding_exception', $e); 286 } 287 $this->assertCount(0, $sink->get_messages()); 288 289 $message->component = 'moodle'; 290 $message->name = 'xxx'; 291 $sink = $this->redirectMessages(); 292 try { 293 message_send($message); 294 } catch (moodle_exception $e) { 295 $this->assertInstanceOf('coding_exception', $e); 296 } 297 $this->assertCount(0, $sink->get_messages()); 298 $sink->close(); 299 $this->assertFalse($DB->record_exists('message', array())); 300 $this->assertFalse($DB->record_exists('message_read', array())); 301 302 // Invalid users. 303 304 $message = new stdClass(); 305 $message->component = 'moodle'; 306 $message->name = 'instantmessage'; 307 $message->userfrom = $user1; 308 $message->userto = -1; 309 $message->subject = 'message subject 1'; 310 $message->fullmessage = 'message body'; 311 $message->fullmessageformat = FORMAT_MARKDOWN; 312 $message->fullmessagehtml = '<p>message body</p>'; 313 $message->smallmessage = 'small message'; 314 $message->notification = '0'; 315 316 $messageid = message_send($message); 317 $this->assertFalse($messageid); 318 $this->assertDebuggingCalled('Attempt to send msg to unknown user'); 319 320 $message = new stdClass(); 321 $message->component = 'moodle'; 322 $message->name = 'instantmessage'; 323 $message->userfrom = -1; 324 $message->userto = $user2; 325 $message->subject = 'message subject 1'; 326 $message->fullmessage = 'message body'; 327 $message->fullmessageformat = FORMAT_MARKDOWN; 328 $message->fullmessagehtml = '<p>message body</p>'; 329 $message->smallmessage = 'small message'; 330 $message->notification = '0'; 331 332 $messageid = message_send($message); 333 $this->assertFalse($messageid); 334 $this->assertDebuggingCalled('Attempt to send msg from unknown user'); 335 336 $message = new stdClass(); 337 $message->component = 'moodle'; 338 $message->name = 'instantmessage'; 339 $message->userfrom = $user1; 340 $message->userto = core_user::NOREPLY_USER; 341 $message->subject = 'message subject 1'; 342 $message->fullmessage = 'message body'; 343 $message->fullmessageformat = FORMAT_MARKDOWN; 344 $message->fullmessagehtml = '<p>message body</p>'; 345 $message->smallmessage = 'small message'; 346 $message->notification = '0'; 347 348 $messageid = message_send($message); 349 $this->assertFalse($messageid); 350 $this->assertDebuggingCalled('Attempt to send msg to internal (noreply) user'); 351 352 // Some debugging hints for devs. 353 354 unset($user2->emailstop); 355 $message = new stdClass(); 356 $message->component = 'moodle'; 357 $message->name = 'instantmessage'; 358 $message->userfrom = $user1; 359 $message->userto = $user2; 360 $message->subject = 'message subject 1'; 361 $message->fullmessage = 'message body'; 362 $message->fullmessageformat = FORMAT_MARKDOWN; 363 $message->fullmessagehtml = '<p>message body</p>'; 364 $message->smallmessage = 'small message'; 365 $message->notification = '0'; 366 367 $sink = $this->redirectMessages(); 368 $messageid = message_send($message); 369 $savedmessages = $sink->get_messages(); 370 $this->assertCount(1, $savedmessages); 371 $savedmessage = reset($savedmessages); 372 $this->assertEquals($messageid, $savedmessage->id); 373 $this->assertEquals($user1->id, $savedmessage->useridfrom); 374 $this->assertEquals($user2->id, $savedmessage->useridto); 375 $this->assertDebuggingCalled('Necessary properties missing in userto object, fetching full record'); 376 $sink->clear(); 377 $user2->emailstop = '0'; 378 } 379 380 public function test_send_message() { 381 global $DB, $CFG; 382 $this->preventResetByRollback(); 383 $this->resetAfterTest(); 384 385 unset_config('noemailever'); 386 387 $user1 = $this->getDataGenerator()->create_user(); 388 $user2 = $this->getDataGenerator()->create_user(); 389 390 // Test basic email redirection. 391 $this->assertFileExists("$CFG->dirroot/message/output/email/version.php"); 392 $this->assertFileExists("$CFG->dirroot/message/output/popup/version.php"); 393 394 $DB->set_field_select('message_processors', 'enabled', 0, "name <> 'email' AND name <> 'popup'"); 395 get_message_processors(true, true); 396 397 $eventsink = $this->redirectEvents(); 398 399 set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'none', $user2); 400 401 $message = new stdClass(); 402 $message->component = 'moodle'; 403 $message->name = 'instantmessage'; 404 $message->userfrom = $user1; 405 $message->userto = $user2; 406 $message->subject = 'message subject 1'; 407 $message->fullmessage = 'message body'; 408 $message->fullmessageformat = FORMAT_MARKDOWN; 409 $message->fullmessagehtml = '<p>message body</p>'; 410 $message->smallmessage = 'small message'; 411 $message->notification = '0'; 412 413 $sink = $this->redirectEmails(); 414 $messageid = message_send($message); 415 $emails = $sink->get_messages(); 416 $this->assertCount(0, $emails); 417 $savedmessage = $DB->get_record('message', array('id' => $messageid), '*', MUST_EXIST); 418 $sink->clear(); 419 $this->assertFalse($DB->record_exists('message_read', array())); 420 $DB->delete_records('message', array()); 421 $events = $eventsink->get_events(); 422 $this->assertCount(1, $events); 423 $this->assertInstanceOf('\core\event\message_sent', $events[0]); 424 $eventsink->clear(); 425 426 $CFG->messaging = 0; 427 428 $message = new stdClass(); 429 $message->component = 'moodle'; 430 $message->name = 'instantmessage'; 431 $message->userfrom = $user1; 432 $message->userto = $user2; 433 $message->subject = 'message subject 1'; 434 $message->fullmessage = 'message body'; 435 $message->fullmessageformat = FORMAT_MARKDOWN; 436 $message->fullmessagehtml = '<p>message body</p>'; 437 $message->smallmessage = 'small message'; 438 $message->notification = '0'; 439 440 $messageid = message_send($message); 441 $emails = $sink->get_messages(); 442 $this->assertCount(0, $emails); 443 $savedmessage = $DB->get_record('message_read', array('id' => $messageid), '*', MUST_EXIST); 444 $sink->clear(); 445 $this->assertFalse($DB->record_exists('message', array())); 446 $DB->delete_records('message_read', array()); 447 $events = $eventsink->get_events(); 448 $this->assertCount(2, $events); 449 $this->assertInstanceOf('\core\event\message_sent', $events[0]); 450 $this->assertInstanceOf('\core\event\message_viewed', $events[1]); 451 $eventsink->clear(); 452 453 $CFG->messaging = 1; 454 455 $message = new stdClass(); 456 $message->component = 'moodle'; 457 $message->name = 'instantmessage'; 458 $message->userfrom = $user1; 459 $message->userto = $user2; 460 $message->subject = 'message subject 1'; 461 $message->fullmessage = 'message body'; 462 $message->fullmessageformat = FORMAT_MARKDOWN; 463 $message->fullmessagehtml = '<p>message body</p>'; 464 $message->smallmessage = 'small message'; 465 $message->notification = '1'; 466 467 $messageid = message_send($message); 468 $emails = $sink->get_messages(); 469 $this->assertCount(0, $emails); 470 $savedmessage = $DB->get_record('message_read', array('id' => $messageid), '*', MUST_EXIST); 471 $sink->clear(); 472 $this->assertFalse($DB->record_exists('message', array())); 473 $DB->delete_records('message_read', array()); 474 $events = $eventsink->get_events(); 475 $this->assertCount(2, $events); 476 $this->assertInstanceOf('\core\event\message_sent', $events[0]); 477 $this->assertInstanceOf('\core\event\message_viewed', $events[1]); 478 $eventsink->clear(); 479 480 set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'email', $user2); 481 482 $message = new stdClass(); 483 $message->component = 'moodle'; 484 $message->name = 'instantmessage'; 485 $message->userfrom = $user1; 486 $message->userto = $user2; 487 $message->subject = 'message subject 1'; 488 $message->fullmessage = 'message body'; 489 $message->fullmessageformat = FORMAT_MARKDOWN; 490 $message->fullmessagehtml = '<p>message body</p>'; 491 $message->smallmessage = 'small message'; 492 $message->notification = '0'; 493 494 $user2->emailstop = '1'; 495 496 $sink = $this->redirectEmails(); 497 $messageid = message_send($message); 498 $emails = $sink->get_messages(); 499 $this->assertCount(0, $emails); 500 $savedmessage = $DB->get_record('message', array('id' => $messageid), '*', MUST_EXIST); 501 $sink->clear(); 502 $this->assertFalse($DB->record_exists('message_read', array())); 503 $DB->delete_records('message', array()); 504 $events = $eventsink->get_events(); 505 $this->assertCount(1, $events); 506 $this->assertInstanceOf('\core\event\message_sent', $events[0]); 507 $eventsink->clear(); 508 $user2->emailstop = '0'; 509 510 set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'email', $user2); 511 512 $message = new stdClass(); 513 $message->component = 'moodle'; 514 $message->name = 'instantmessage'; 515 $message->userfrom = $user1; 516 $message->userto = $user2; 517 $message->subject = 'message subject 1'; 518 $message->fullmessage = 'message body'; 519 $message->fullmessageformat = FORMAT_MARKDOWN; 520 $message->fullmessagehtml = '<p>message body</p>'; 521 $message->smallmessage = 'small message'; 522 $message->notification = '0'; 523 524 $messageid = message_send($message); 525 $emails = $sink->get_messages(); 526 $this->assertCount(1, $emails); 527 $email = reset($emails); 528 $savedmessage = $DB->get_record('message_read', array('id' => $messageid), '*', MUST_EXIST); 529 $this->assertSame($user1->email, $email->from); 530 $this->assertSame($user2->email, $email->to); 531 $this->assertSame($message->subject, $email->subject); 532 $this->assertNotEmpty($email->header); 533 $this->assertNotEmpty($email->body); 534 $sink->clear(); 535 $this->assertFalse($DB->record_exists('message', array())); 536 $DB->delete_records('message_read', array()); 537 $events = $eventsink->get_events(); 538 $this->assertCount(2, $events); 539 $this->assertInstanceOf('\core\event\message_sent', $events[0]); 540 $this->assertInstanceOf('\core\event\message_viewed', $events[1]); 541 $eventsink->clear(); 542 543 set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'email,popup', $user2); 544 545 $message = new stdClass(); 546 $message->component = 'moodle'; 547 $message->name = 'instantmessage'; 548 $message->userfrom = $user1; 549 $message->userto = $user2; 550 $message->subject = 'message subject 1'; 551 $message->fullmessage = 'message body'; 552 $message->fullmessageformat = FORMAT_MARKDOWN; 553 $message->fullmessagehtml = '<p>message body</p>'; 554 $message->smallmessage = 'small message'; 555 $message->notification = '0'; 556 557 $messageid = message_send($message); 558 $emails = $sink->get_messages(); 559 $this->assertCount(1, $emails); 560 $email = reset($emails); 561 $savedmessage = $DB->get_record('message', array('id' => $messageid), '*', MUST_EXIST); 562 $working = $DB->get_record('message_working', array('unreadmessageid' => $messageid), '*', MUST_EXIST); 563 $this->assertSame($user1->email, $email->from); 564 $this->assertSame($user2->email, $email->to); 565 $this->assertSame($message->subject, $email->subject); 566 $this->assertNotEmpty($email->header); 567 $this->assertNotEmpty($email->body); 568 $sink->clear(); 569 $this->assertFalse($DB->record_exists('message_read', array())); 570 $DB->delete_records('message', array()); 571 $events = $eventsink->get_events(); 572 $this->assertCount(1, $events); 573 $this->assertInstanceOf('\core\event\message_sent', $events[0]); 574 $eventsink->clear(); 575 576 set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'popup', $user2); 577 578 $message = new stdClass(); 579 $message->component = 'moodle'; 580 $message->name = 'instantmessage'; 581 $message->userfrom = $user1; 582 $message->userto = $user2; 583 $message->subject = 'message subject 1'; 584 $message->fullmessage = 'message body'; 585 $message->fullmessageformat = FORMAT_MARKDOWN; 586 $message->fullmessagehtml = '<p>message body</p>'; 587 $message->smallmessage = 'small message'; 588 $message->notification = '0'; 589 590 $messageid = message_send($message); 591 $emails = $sink->get_messages(); 592 $this->assertCount(0, $emails); 593 $savedmessage = $DB->get_record('message', array('id' => $messageid), '*', MUST_EXIST); 594 $working = $DB->get_record('message_working', array('unreadmessageid' => $messageid), '*', MUST_EXIST); 595 $sink->clear(); 596 $this->assertFalse($DB->record_exists('message_read', array())); 597 $DB->delete_records('message', array()); 598 $events = $eventsink->get_events(); 599 $this->assertCount(1, $events); 600 $this->assertInstanceOf('\core\event\message_sent', $events[0]); 601 $eventsink->clear(); 602 603 $this->assertFalse($DB->is_transaction_started()); 604 $transaction = $DB->start_delegated_transaction(); 605 if (!$DB->is_transaction_started()) { 606 $this->markTestSkipped('Databases that do not support transactions should not be used at all!'); 607 } 608 $transaction->allow_commit(); 609 610 set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'none', $user2); 611 612 $message = new stdClass(); 613 $message->component = 'moodle'; 614 $message->name = 'instantmessage'; 615 $message->userfrom = $user1; 616 $message->userto = $user2; 617 $message->subject = 'message subject 1'; 618 $message->fullmessage = 'message body'; 619 $message->fullmessageformat = FORMAT_MARKDOWN; 620 $message->fullmessagehtml = '<p>message body</p>'; 621 $message->smallmessage = 'small message'; 622 $message->notification = '0'; 623 624 $transaction = $DB->start_delegated_transaction(); 625 $sink = $this->redirectEmails(); 626 $messageid = message_send($message); 627 $emails = $sink->get_messages(); 628 $this->assertCount(0, $emails); 629 $savedmessage = $DB->get_record('message', array('id' => $messageid), '*', MUST_EXIST); 630 $sink->clear(); 631 $this->assertFalse($DB->record_exists('message_read', array())); 632 $DB->delete_records('message', array()); 633 $events = $eventsink->get_events(); 634 $this->assertCount(1, $events); 635 $this->assertInstanceOf('\core\event\message_sent', $events[0]); 636 $eventsink->clear(); 637 $transaction->allow_commit(); 638 $events = $eventsink->get_events(); 639 $this->assertCount(0, $events); 640 641 set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'email', $user2); 642 643 $message = new stdClass(); 644 $message->component = 'moodle'; 645 $message->name = 'instantmessage'; 646 $message->userfrom = $user1; 647 $message->userto = $user2; 648 $message->subject = 'message subject 1'; 649 $message->fullmessage = 'message body'; 650 $message->fullmessageformat = FORMAT_MARKDOWN; 651 $message->fullmessagehtml = '<p>message body</p>'; 652 $message->smallmessage = 'small message'; 653 $message->notification = '0'; 654 655 $transaction = $DB->start_delegated_transaction(); 656 $sink = $this->redirectEmails(); 657 $messageid = message_send($message); 658 $emails = $sink->get_messages(); 659 $this->assertCount(0, $emails); 660 $savedmessage = $DB->get_record('message', array('id' => $messageid), '*', MUST_EXIST); 661 $sink->clear(); 662 $this->assertFalse($DB->record_exists('message_read', array())); 663 $events = $eventsink->get_events(); 664 $this->assertCount(0, $events); 665 $transaction->allow_commit(); 666 $events = $eventsink->get_events(); 667 $this->assertCount(2, $events); 668 $this->assertInstanceOf('\core\event\message_sent', $events[0]); 669 $this->assertInstanceOf('\core\event\message_viewed', $events[1]); 670 $eventsink->clear(); 671 672 $transaction = $DB->start_delegated_transaction(); 673 message_send($message); 674 message_send($message); 675 $this->assertCount(2, $DB->get_records('message')); 676 $this->assertCount(1, $DB->get_records('message_read')); 677 $events = $eventsink->get_events(); 678 $this->assertCount(0, $events); 679 $transaction->allow_commit(); 680 $events = $eventsink->get_events(); 681 $this->assertCount(4, $events); 682 $this->assertInstanceOf('\core\event\message_sent', $events[0]); 683 $this->assertInstanceOf('\core\event\message_viewed', $events[1]); 684 $this->assertInstanceOf('\core\event\message_sent', $events[2]); 685 $this->assertInstanceOf('\core\event\message_viewed', $events[3]); 686 $eventsink->clear(); 687 $DB->delete_records('message', array()); 688 $DB->delete_records('message_read', array()); 689 690 $transaction = $DB->start_delegated_transaction(); 691 message_send($message); 692 message_send($message); 693 $this->assertCount(2, $DB->get_records('message')); 694 $this->assertCount(0, $DB->get_records('message_read')); 695 $events = $eventsink->get_events(); 696 $this->assertCount(0, $events); 697 try { 698 $transaction->rollback(new Exception('ignore')); 699 } catch (Exception $e) { 700 $this->assertSame('ignore', $e->getMessage()); 701 } 702 $events = $eventsink->get_events(); 703 $this->assertCount(0, $events); 704 $this->assertCount(0, $DB->get_records('message')); 705 $this->assertCount(0, $DB->get_records('message_read')); 706 message_send($message); 707 $this->assertCount(0, $DB->get_records('message')); 708 $this->assertCount(1, $DB->get_records('message_read')); 709 $events = $eventsink->get_events(); 710 $this->assertCount(2, $events); 711 $sink->clear(); 712 $DB->delete_records('message_read', array()); 713 } 714 715 public function test_rollback() { 716 global $DB; 717 718 $this->resetAfterTest(); 719 $this->preventResetByRollback(); 720 set_config('noemailever', 1); 721 722 $user1 = $this->getDataGenerator()->create_user(); 723 $user2 = $this->getDataGenerator()->create_user(); 724 725 $message = new stdClass(); 726 $message->component = 'moodle'; 727 $message->name = 'instantmessage'; 728 $message->userfrom = $user1; 729 $message->userto = $user2; 730 $message->subject = 'message subject 1'; 731 $message->fullmessage = 'message body'; 732 $message->fullmessageformat = FORMAT_MARKDOWN; 733 $message->fullmessagehtml = '<p>message body</p>'; 734 $message->smallmessage = 'small message'; 735 $message->notification = '0'; 736 737 message_send($message); 738 $this->assertDebuggingCalled('Not sending email due to $CFG->noemailever config setting'); 739 740 $transaction1 = $DB->start_delegated_transaction(); 741 742 message_send($message); 743 $this->assertDebuggingNotCalled(); 744 745 $transaction2 = $DB->start_delegated_transaction(); 746 747 message_send($message); 748 $this->assertDebuggingNotCalled(); 749 750 try { 751 $transaction2->rollback(new Exception('x')); 752 $this->fail('Expecting exception'); 753 } catch (Exception $e) {} 754 $this->assertDebuggingNotCalled(); 755 756 $this->assertTrue($DB->is_transaction_started()); 757 758 try { 759 $transaction1->rollback(new Exception('x')); 760 $this->fail('Expecting exception'); 761 } catch (Exception $e) {} 762 $this->assertDebuggingNotCalled(); 763 764 $this->assertFalse($DB->is_transaction_started()); 765 766 message_send($message); 767 $this->assertDebuggingCalled('Not sending email due to $CFG->noemailever config setting'); 768 } 769 770 public function test_forced_rollback() { 771 global $DB; 772 773 $this->resetAfterTest(); 774 $this->preventResetByRollback(); 775 set_config('noemailever', 1); 776 777 $user1 = $this->getDataGenerator()->create_user(); 778 $user2 = $this->getDataGenerator()->create_user(); 779 780 $message = new stdClass(); 781 $message->component = 'moodle'; 782 $message->name = 'instantmessage'; 783 $message->userfrom = $user1; 784 $message->userto = $user2; 785 $message->subject = 'message subject 1'; 786 $message->fullmessage = 'message body'; 787 $message->fullmessageformat = FORMAT_MARKDOWN; 788 $message->fullmessagehtml = '<p>message body</p>'; 789 $message->smallmessage = 'small message'; 790 $message->notification = '0'; 791 792 message_send($message); 793 $this->assertDebuggingCalled('Not sending email due to $CFG->noemailever config setting'); 794 795 $transaction1 = $DB->start_delegated_transaction(); 796 797 message_send($message); 798 $this->assertDebuggingNotCalled(); 799 800 $transaction2 = $DB->start_delegated_transaction(); 801 802 message_send($message); 803 $this->assertDebuggingNotCalled(); 804 805 $DB->force_transaction_rollback(); 806 $this->assertFalse($DB->is_transaction_started()); 807 $this->assertDebuggingNotCalled(); 808 809 message_send($message); 810 $this->assertDebuggingCalled('Not sending email due to $CFG->noemailever config setting'); 811 } 812 813 public function test_message_attachment_send() { 814 global $CFG; 815 $this->preventResetByRollback(); 816 $this->resetAfterTest(); 817 818 // Set config setting to allow attachments. 819 $CFG->allowattachments = true; 820 unset_config('noemailever'); 821 822 $user = $this->getDataGenerator()->create_user(); 823 $context = context_user::instance($user->id); 824 825 // Create a test file. 826 $fs = get_file_storage(); 827 $filerecord = array( 828 'contextid' => $context->id, 829 'component' => 'core', 830 'filearea' => 'unittest', 831 'itemid' => 99999, 832 'filepath' => '/', 833 'filename' => 'emailtest.txt' 834 ); 835 $file = $fs->create_file_from_string($filerecord, 'Test content'); 836 837 $message = new stdClass(); 838 $message->component = 'moodle'; 839 $message->name = 'instantmessage'; 840 $message->userfrom = get_admin(); 841 $message->userto = $user; 842 $message->subject = 'message subject 1'; 843 $message->fullmessage = 'message body'; 844 $message->fullmessageformat = FORMAT_MARKDOWN; 845 $message->fullmessagehtml = '<p>message body</p>'; 846 $message->smallmessage = 'small message'; 847 $message->attachment = $file; 848 $message->attachname = 'emailtest.txt'; 849 $message->notification = 0; 850 851 // Make sure we are redirecting emails. 852 $sink = $this->redirectEmails(); 853 $this->assertTrue(phpunit_util::is_redirecting_phpmailer()); 854 message_send($message); 855 856 // Get the email that we just sent. 857 $emails = $sink->get_messages(); 858 $email = reset($emails); 859 $this->assertTrue(strpos($email->body, 'Content-Disposition: attachment;') !== false); 860 $this->assertTrue(strpos($email->body, 'emailtest.txt') !== false); 861 862 // Check if the stored file still exists after remove the temporary attachment. 863 $storedfileexists = $fs->file_exists($filerecord['contextid'], $filerecord['component'], $filerecord['filearea'], 864 $filerecord['itemid'], $filerecord['filepath'], $filerecord['filename']); 865 $this->assertTrue($storedfileexists); 866 } 867 868 /** 869 * Is a particular message type in the list of message types. 870 * @param string $component 871 * @param string $name a message name. 872 * @param array $providers as returned by message_get_providers_for_user. 873 * @return bool whether the message type is present. 874 */ 875 protected function message_type_present($component, $name, $providers) { 876 foreach ($providers as $provider) { 877 if ($provider->component == $component && $provider->name == $name) { 878 return true; 879 } 880 } 881 return false; 882 } 883 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 20:29:05 2014 | Cross-referenced by PHPXref 0.7.1 |