[ Index ]

PHP Cross Reference of moodle-2.8

title

Body

[close]

/lib/tests/ -> messagelib_test.php (source)

   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  }


Generated: Fri Nov 28 20:29:05 2014 Cross-referenced by PHPXref 0.7.1