MDL-36941 core: convert existing api to use new table structure

Also deprecated the following functions -

1. message_move_userfrom_unread2read - It is not necessary
   for us to mark a message as read on user deletion.
2. message_get_blocked_users - Horrible logic used to
   determine if a user is blocked via reference on some
   randomly chosen 'isblocked' variable.
3. message_get_contacts - The same as above. This can be
   done in a much nicer way.
4. message_mark_message_read - We want two functions to do
   this to avoid confusing messages and notifications.
5. message_can_delete_message - This assumed the variable
   $message contained the 'useridto' property, which
   was present in the old table structure. We do not want
   future usages where a query is done on the new table
   and is simply passed as this won't contain this property.
6. message_delete_message - Same as above.
This commit is contained in:
Mark Nelson 2018-01-04 15:01:37 +08:00
parent 4cd439887a
commit 883ce42127
29 changed files with 1714 additions and 1096 deletions

View file

@ -631,7 +631,7 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
'messageposition' => 0,
'with' => 'user1',
'subject' => 'S2',
'unreadcount' => 2,
'unreadcount' => 0, // Messages sent to and from the same user are counted as read.
),
),
),
@ -872,11 +872,9 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$subject = $messagedata['subject'];
if (isset($messagedata['state']) && $messagedata['state'] == 'unread') {
$table = 'message';
$messageid = $this->send_fake_message($from, $to, $subject);
} else {
// If there is no state, or the state is not 'unread', assume the message is read.
$table = 'message_read';
$messageid = message_post_message($from, $to, $subject, FORMAT_PLAIN);
}
@ -890,7 +888,7 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$updatemessage->timecreated = $defaulttimecreated;
}
$DB->update_record($table, $updatemessage);
$DB->update_record('messages', $updatemessage);
}
foreach ($expectations as $username => $data) {
@ -1155,34 +1153,39 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
// Send some messages back and forth.
$time = 1;
$this->send_fake_message($user1, $user2, 'Yo!', 0, $time + 1);
$this->send_fake_message($user2, $user1, 'Sup mang?', 0, $time + 2);
$this->send_fake_message($user1, $user2, 'Writing PHPUnit tests!', 0, $time + 3);
$this->send_fake_message($user2, $user1, 'Word.', 0, $time + 4);
$m1id = $this->send_fake_message($user1, $user2, 'Yo!', 0, $time + 1);
$m2id = $this->send_fake_message($user2, $user1, 'Sup mang?', 0, $time + 2);
$m3id = $this->send_fake_message($user1, $user2, 'Writing PHPUnit tests!', 0, $time + 3);
$m4id = $this->send_fake_message($user2, $user1, 'Word.', 0, $time + 4);
// Delete the conversation as user 1.
\core_message\api::delete_conversation($user1->id, $user2->id);
$messages = $DB->get_records('message', array(), 'timecreated ASC');
$this->assertCount(4, $messages);
$muas = $DB->get_records('message_user_actions', array(), 'timecreated ASC');
$this->assertCount(4, $muas);
// Sort by id.
ksort($muas);
$message1 = array_shift($messages);
$message2 = array_shift($messages);
$message3 = array_shift($messages);
$message4 = array_shift($messages);
$mua1 = array_shift($muas);
$mua2 = array_shift($muas);
$mua3 = array_shift($muas);
$mua4 = array_shift($muas);
$this->assertNotEmpty($message1->timeuserfromdeleted);
$this->assertEmpty($message1->timeusertodeleted);
$this->assertEquals($user1->id, $mua1->userid);
$this->assertEquals($m1id, $mua1->messageid);
$this->assertEquals(\core_message\api::MESSAGE_ACTION_DELETED, $mua1->action);
$this->assertEmpty($message2->timeuserfromdeleted);
$this->assertNotEmpty($message2->timeusertodeleted);
$this->assertEquals($user1->id, $mua2->userid);
$this->assertEquals($m2id, $mua2->messageid);
$this->assertEquals(\core_message\api::MESSAGE_ACTION_DELETED, $mua2->action);
$this->assertNotEmpty($message3->timeuserfromdeleted);
$this->assertEmpty($message3->timeusertodeleted);
$this->assertEmpty($message4->timeuserfromdeleted);
$this->assertNotEmpty($message4->timeusertodeleted);
$this->assertEquals($user1->id, $mua3->userid);
$this->assertEquals($m3id, $mua3->messageid);
$this->assertEquals(\core_message\api::MESSAGE_ACTION_DELETED, $mua3->action);
$this->assertEquals($user1->id, $mua4->userid);
$this->assertEquals($m4id, $mua4->messageid);
$this->assertEquals(\core_message\api::MESSAGE_ACTION_DELETED, $mua4->action);
}
/**
@ -1602,4 +1605,320 @@ class core_message_api_testcase extends core_message_messagelib_testcase {
$this->assertContains('Message 2', $message1->text);
$this->assertContains('Message 3', $message2->text);
}
/**
* Test returning blocked users.
*/
public function test_get_blocked_users() {
global $USER;
// Set this user as the admin.
$this->setAdminUser();
// Create a user to add to the admin's contact list.
$user1 = $this->getDataGenerator()->create_user();
$user2 = $this->getDataGenerator()->create_user();
// Add users to the admin's contact list.
message_add_contact($user1->id);
message_add_contact($user2->id, 1);
$this->assertCount(1, \core_message\api::get_blocked_users($USER->id));
// Block other user.
message_block_contact($user1->id);
$this->assertCount(2, \core_message\api::get_blocked_users($USER->id));
// Test deleting users.
delete_user($user1);
$this->assertCount(1, \core_message\api::get_blocked_users($USER->id));
}
/**
* Test returning contacts with unread message count.
*/
public function test_get_contacts_with_unread_message_count() {
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
$user3 = self::getDataGenerator()->create_user();
$user4 = self::getDataGenerator()->create_user();
// Add the users to each of their contacts.
message_add_contact($user1->id, 0, $user2->id);
message_add_contact($user2->id, 0, $user1->id);
message_add_contact($user3->id, 0, $user2->id);
$this->send_fake_message($user1, $user2);
$this->send_fake_message($user1, $user2);
$this->send_fake_message($user1, $user2);
$message4id = $this->send_fake_message($user1, $user2);
$this->send_fake_message($user3, $user2);
$message6id = $this->send_fake_message($user3, $user2);
$this->send_fake_message($user3, $user2);
$this->send_fake_message($user3, $user2);
$this->send_fake_message($user3, $user2);
// Send a message that should never be included as the user is not a contact.
$this->send_fake_message($user4, $user2);
// Get the contacts and the unread message count.
$messages = \core_message\api::get_contacts_with_unread_message_count($user2->id);
// Confirm the size is correct.
$this->assertCount(2, $messages);
ksort($messages);
$messageinfo1 = array_shift($messages);
$messageinfo2 = array_shift($messages);
$this->assertEquals($user1->id, $messageinfo1->id);
$this->assertEquals(4, $messageinfo1->messagecount);
$this->assertEquals($user3->id, $messageinfo2->id);
$this->assertEquals(5, $messageinfo2->messagecount);
// Mark some of the messages as read.
\core_message\api::mark_message_as_read($user2->id, $message4id);
\core_message\api::mark_message_as_read($user2->id, $message6id);
// Get the contacts and the unread message count.
$messages = \core_message\api::get_contacts_with_unread_message_count($user2->id);
// Confirm the size is correct.
$this->assertCount(2, $messages);
ksort($messages);
// Confirm read messages are not included.
$messageinfo1 = array_shift($messages);
$messageinfo2 = array_shift($messages);
$this->assertEquals($user1->id, $messageinfo1->id);
$this->assertEquals(3, $messageinfo1->messagecount);
$this->assertEquals($user3->id, $messageinfo2->id);
$this->assertEquals(4, $messageinfo2->messagecount);
// Now, let's populate the database with messages from user2 to user 1.
$this->send_fake_message($user2, $user1);
$this->send_fake_message($user2, $user1);
$messageid = $this->send_fake_message($user2, $user1);
// Send a message that should never be included as the user is not a contact.
$this->send_fake_message($user4, $user1);
// Get the contacts and the unread message count.
$messages = \core_message\api::get_contacts_with_unread_message_count($user1->id);
// Confirm the size is correct.
$this->assertCount(1, $messages);
$messageinfo1 = array_shift($messages);
$this->assertEquals($user2->id, $messageinfo1->id);
$this->assertEquals(3, $messageinfo1->messagecount);
// Mark the last message as read.
\core_message\api::mark_message_as_read($user1->id, $messageid);
$messages = \core_message\api::get_contacts_with_unread_message_count($user1->id);
// Confirm the size is correct.
$this->assertCount(1, $messages);
// Confirm read messages are not included.
$messageinfo1 = array_shift($messages);
$this->assertEquals($user2->id, $messageinfo1->id);
$this->assertEquals(2, $messageinfo1->messagecount);
}
/**
* Test returning contacts with unread message count when there are no messages.
*/
public function test_get_contacts_with_unread_message_count_no_messages() {
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
// Add the users to each of their contacts.
message_add_contact($user1->id, 0, $user2->id);
// Check we get the correct message count.
$messages = \core_message\api::get_contacts_with_unread_message_count($user2->id);
// Confirm the size is correct.
$this->assertCount(1, $messages);
$messageinfo = array_shift($messages);
$this->assertEquals($user1->id, $messageinfo->id);
$this->assertEquals(0, $messageinfo->messagecount);
}
/**
* Test returning non-contacts with unread message count.
*/
public function test_get_non_contacts_with_unread_message_count() {
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
$user3 = self::getDataGenerator()->create_user();
$user4 = self::getDataGenerator()->create_user();
// Add a user to the contact list of the users we are testing this function with.
message_add_contact($user4->id, 0, $user1->id);
message_add_contact($user4->id, 0, $user2->id);
$this->send_fake_message($user1, $user2);
$this->send_fake_message($user1, $user2);
$this->send_fake_message($user1, $user2);
$message4id = $this->send_fake_message($user1, $user2);
$this->send_fake_message($user3, $user2);
$message6id = $this->send_fake_message($user3, $user2);
$this->send_fake_message($user3, $user2);
$this->send_fake_message($user3, $user2);
$this->send_fake_message($user3, $user2);
// Send a message that should never be included as the user is a contact.
$this->send_fake_message($user4, $user2);
// Get the non-contacts and the unread message count.
$messages = \core_message\api::get_non_contacts_with_unread_message_count($user2->id);
// Check we get the correct message count.
ksort($messages);
$this->assertCount(2, $messages);
$messageinfo1 = array_shift($messages);
$messageinfo2 = array_shift($messages);
$this->assertEquals($user1->id, $messageinfo1->id);
$this->assertEquals(4, $messageinfo1->messagecount);
$this->assertEquals($user3->id, $messageinfo2->id);
$this->assertEquals(5, $messageinfo2->messagecount);
// Mark some of the messages as read.
\core_message\api::mark_message_as_read($user2->id, $message4id);
\core_message\api::mark_message_as_read($user2->id, $message6id);
// Get the non-contacts and the unread message count.
$messages = \core_message\api::get_non_contacts_with_unread_message_count($user2->id);
// Check the marked message is not returned in the message count.
ksort($messages);
$this->assertCount(2, $messages);
$messageinfo1 = array_shift($messages);
$messageinfo2 = array_shift($messages);
$this->assertEquals($user1->id, $messageinfo1->id);
$this->assertEquals(3, $messageinfo1->messagecount);
$this->assertEquals($user3->id, $messageinfo2->id);
$this->assertEquals(4, $messageinfo2->messagecount);
// Now, let's populate the database with messages from user2 to user 1.
$this->send_fake_message($user2, $user1);
$this->send_fake_message($user2, $user1);
$messageid = $this->send_fake_message($user2, $user1);
// Send a message that should never be included as the user is a contact.
$this->send_fake_message($user4, $user1);
// Get the non-contacts and the unread message count.
$messages = \core_message\api::get_non_contacts_with_unread_message_count($user1->id);
// Confirm the size is correct.
$this->assertCount(1, $messages);
$messageinfo1 = array_shift($messages);
$this->assertEquals($user2->id, $messageinfo1->id);
$this->assertEquals(3, $messageinfo1->messagecount);
// Mark the last message as read.
\core_message\api::mark_message_as_read($user1->id, $messageid);
// Get the non-contacts and the unread message count.
$messages = \core_message\api::get_non_contacts_with_unread_message_count($user1->id);
// Check the marked message is not returned in the message count.
$this->assertCount(1, $messages);
$messageinfo1 = array_shift($messages);
$this->assertEquals($user2->id, $messageinfo1->id);
$this->assertEquals(2, $messageinfo1->messagecount);
}
/**
* Test marking a message as read.
*/
public function test_mark_message_as_read() {
global $DB;
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
$this->send_fake_message($user1, $user2);
$m2id = $this->send_fake_message($user1, $user2);
$this->send_fake_message($user2, $user1);
$m4id = $this->send_fake_message($user2, $user1);
\core_message\api::mark_message_as_read($user2->id, $m2id, 11);
\core_message\api::mark_message_as_read($user1->id, $m4id, 12);
// Confirm there are two user actions.
$muas = $DB->get_records('message_user_actions', [], 'timecreated ASC');
$this->assertEquals(2, count($muas));
// Confirm they are correct.
$mua1 = array_shift($muas);
$mua2 = array_shift($muas);
// Confirm first action.
$this->assertEquals($user2->id, $mua1->userid);
$this->assertEquals($m2id, $mua1->messageid);
$this->assertEquals(\core_message\api::MESSAGE_ACTION_READ, $mua1->action);
$this->assertEquals(11, $mua1->timecreated);
// Confirm second action.
$this->assertEquals($user1->id, $mua2->userid);
$this->assertEquals($m4id, $mua2->messageid);
$this->assertEquals(\core_message\api::MESSAGE_ACTION_READ, $mua2->action);
$this->assertEquals(12, $mua2->timecreated);
}
/**
* Test marking a notification as read.
*/
public function test_mark_notification_as_read() {
global $DB;
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
$this->send_fake_message($user1, $user2, 'Notification 1', 1);
$n2id = $this->send_fake_message($user1, $user2, 'Notification 2', 1);
$this->send_fake_message($user2, $user1, 'Notification 3', 1);
$n4id = $this->send_fake_message($user2, $user1, 'Notification 4', 1);
\core_message\api::mark_notification_as_read($user2->id, $n2id, 11);
\core_message\api::mark_notification_as_read($user1->id, $n4id, 12);
// Retrieve the notifications.
$n2 = $DB->get_record('notifications', ['id' => $n2id]);
$n4 = $DB->get_record('notifications', ['id' => $n4id]);
// Confirm they have been marked as read.
$this->assertEquals(11, $n2->timeread);
$this->assertEquals(12, $n4->timeread);
}
/**
* Test a conversation is not returned if there is none.
*/
public function test_get_conversation_between_users_no_conversation() {
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
$this->assertFalse(\core_message\api::get_conversation_between_users($user1->id, $user2->id));
}
/**
* Test we can return a conversation that exists between users.
*/
public function test_get_conversation_between_users_with_existing_conversation() {
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
$conversationid = \core_message\api::create_conversation_between_users($user1->id, $user2->id);
$this->assertEquals($conversationid,
\core_message\api::get_conversation_between_users($user1->id, $user2->id));
}
}

View file

@ -25,7 +25,19 @@
defined('MOODLE_INTERNAL') || die();
class core_message_events_testcase extends advanced_testcase {
global $CFG;
require_once($CFG->dirroot . '/message/tests/messagelib_test.php');
/**
* Class containing the tests for message related events.
*
* @package core_message
* @category test
* @copyright 2014 Mark Nelson <markn@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class core_message_events_testcase extends core_message_messagelib_testcase {
/**
* Test set up.
@ -197,11 +209,11 @@ class core_message_events_testcase extends advanced_testcase {
*/
public function test_message_sent() {
$event = \core\event\message_sent::create(array(
'objectid' => 3,
'userid' => 1,
'context' => context_system::instance(),
'relateduserid' => 2,
'other' => array(
'messageid' => 3,
'courseid' => 4
)
));
@ -219,7 +231,7 @@ class core_message_events_testcase extends advanced_testcase {
$this->assertEventLegacyLogData($expected, $event);
$url = new moodle_url('/message/index.php', array('user1' => $event->userid, 'user2' => $event->relateduserid));
$this->assertEquals($url, $event->get_url());
$this->assertEquals(3, $event->other['messageid']);
$this->assertEquals(3, $event->objectid);
$this->assertEquals(4, $event->other['courseid']);
}
@ -256,7 +268,7 @@ class core_message_events_testcase extends advanced_testcase {
$this->assertEventLegacyLogData($expected, $event);
$url = new moodle_url('/message/index.php', array('user1' => $event->userid, 'user2' => $event->relateduserid));
$this->assertEquals($url, $event->get_url());
$this->assertEquals(3, $event->other['messageid']);
$this->assertEquals(3, $event->objectid);
$this->assertEquals(4, $event->other['courseid']);
}
@ -276,32 +288,33 @@ class core_message_events_testcase extends advanced_testcase {
$this->assertEquals(SITEID, $event->other['courseid']);
}
/**
* Test the message viewed event.
*/
public function test_message_viewed() {
global $DB;
// Create a message to mark as read.
$message = new stdClass();
$message->useridfrom = '1';
$message->useridto = '2';
$message->subject = 'Subject';
$message->message = 'Message';
$message->id = $DB->insert_record('message', $message);
// Create users to send messages between.
$user1 = $this->getDataGenerator()->create_user();
$user2 = $this->getDataGenerator()->create_user();
$messageid = $this->send_fake_message($user1, $user2);
// Trigger and capture the event.
$sink = $this->redirectEvents();
message_mark_message_read($message, time());
\core_message\api::mark_message_as_read($user1->id, $messageid);
$events = $sink->get_events();
$event = reset($events);
// Get the usage action.
$mua = $DB->get_record('message_user_actions', ['userid' => $user1->id, 'messageid' => $messageid,
'action' => \core_message\api::MESSAGE_ACTION_READ]);
// Check that the event data is valid.
$this->assertInstanceOf('\core\event\message_viewed', $event);
$this->assertEquals(context_user::instance(2), $event->get_context());
$this->assertEquals(context_user::instance($user1->id), $event->get_context());
$this->assertEquals($mua->id, $event->objectid);
$this->assertEquals($messageid, $event->other['messageid']);
$url = new moodle_url('/message/index.php', array('user1' => $event->userid, 'user2' => $event->relateduserid));
$this->assertEquals($url, $event->get_url());
}
@ -312,56 +325,53 @@ class core_message_events_testcase extends advanced_testcase {
public function test_message_deleted() {
global $DB;
// Create a message.
$message = new stdClass();
$message->useridfrom = '1';
$message->useridto = '2';
$message->subject = 'Subject';
$message->message = 'Message';
$message->timeuserfromdeleted = 0;
$message->timeusertodeleted = 0;
$message->id = $DB->insert_record('message', $message);
// Create users to send messages between.
$user1 = $this->getDataGenerator()->create_user();
$user2 = $this->getDataGenerator()->create_user();
$messageid = $this->send_fake_message($user1, $user2);
// Trigger and capture the event.
$sink = $this->redirectEvents();
message_delete_message($message, $message->useridfrom);
\core_message\api::delete_message($user1->id, $messageid);
$events = $sink->get_events();
$event = reset($events);
// Get the usage action.
$mua = $DB->get_record('message_user_actions', ['userid' => $user1->id, 'messageid' => $messageid,
'action' => \core_message\api::MESSAGE_ACTION_DELETED]);
// Check that the event data is valid.
$this->assertInstanceOf('\core\event\message_deleted', $event);
$this->assertEquals($message->useridfrom, $event->userid); // The user who deleted it.
$this->assertEquals($message->useridto, $event->relateduserid);
$this->assertEquals('message', $event->other['messagetable']);
$this->assertEquals($message->id, $event->other['messageid']);
$this->assertEquals($message->useridfrom, $event->other['useridfrom']);
$this->assertEquals($message->useridto, $event->other['useridto']);
$this->assertEquals($user1->id, $event->userid); // The user who deleted it.
$this->assertEquals($user2->id, $event->relateduserid);
$this->assertEquals($mua->id, $event->objectid);
$this->assertEquals($messageid, $event->other['messageid']);
$this->assertEquals($user1->id, $event->other['useridfrom']);
$this->assertEquals($user2->id, $event->other['useridto']);
// Create a read message.
$message = new stdClass();
$message->useridfrom = '2';
$message->useridto = '1';
$message->subject = 'Subject';
$message->message = 'Message';
$message->timeuserfromdeleted = 0;
$message->timeusertodeleted = 0;
$message->timeread = time();
$message->id = $DB->insert_record('message_read', $message);
$messageid = $this->send_fake_message($user1, $user2);
\core_message\api::mark_message_as_read($user2->id, $messageid);
// Trigger and capture the event.
$sink = $this->redirectEvents();
message_delete_message($message, $message->useridto);
\core_message\api::delete_message($user2->id, $messageid);
$events = $sink->get_events();
$event = reset($events);
// Get the usage action.
$mua = $DB->get_record('message_user_actions', ['userid' => $user2->id, 'messageid' => $messageid,
'action' => \core_message\api::MESSAGE_ACTION_DELETED]);
// Check that the event data is valid.
$this->assertInstanceOf('\core\event\message_deleted', $event);
$this->assertEquals($message->useridto, $event->userid);
$this->assertEquals($message->useridfrom, $event->relateduserid);
$this->assertEquals('message_read', $event->other['messagetable']);
$this->assertEquals($message->id, $event->other['messageid']);
$this->assertEquals($message->useridfrom, $event->other['useridfrom']);
$this->assertEquals($message->useridto, $event->other['useridto']);
$this->assertEquals($user2->id, $event->userid);
$this->assertEquals($user1->id, $event->relateduserid);
$this->assertEquals($mua->id, $event->objectid);
$this->assertEquals($messageid, $event->other['messageid']);
$this->assertEquals($user1->id, $event->other['useridfrom']);
$this->assertEquals($user2->id, $event->other['useridto']);
}
/**
@ -370,65 +380,65 @@ class core_message_events_testcase extends advanced_testcase {
public function test_message_deleted_whole_conversation() {
global $DB;
// Create a message.
$message = new stdClass();
$message->useridfrom = '1';
$message->useridto = '2';
$message->subject = 'Subject';
$message->message = 'Message';
$message->timeuserfromdeleted = 0;
$message->timeusertodeleted = 0;
$message->timecreated = 1;
// Create some users.
$user1 = self::getDataGenerator()->create_user();
$user2 = self::getDataGenerator()->create_user();
// The person doing the search.
$this->setUser($user1);
// Send some messages back and forth.
$time = 1;
$messages = [];
// Send this a few times.
$messages[] = $DB->insert_record('message', $message);
$messages[] = $this->send_fake_message($user1, $user2, 'Yo!', 0, $time + 1);
$messages[] = $this->send_fake_message($user2, $user1, 'Sup mang?', 0, $time + 2);
$messages[] = $this->send_fake_message($user1, $user2, 'Writing PHPUnit tests!', 0, $time + 3);
$messages[] = $this->send_fake_message($user2, $user1, 'Word.', 0, $time + 4);
$messages[] = $this->send_fake_message($user1, $user2, 'You doing much?', 0, $time + 5);
$messages[] = $this->send_fake_message($user2, $user1, 'Nah', 0, $time + 6);
$messages[] = $this->send_fake_message($user1, $user2, 'You nubz0r!', 0, $time + 7);
$messages[] = $this->send_fake_message($user2, $user1, 'Ouch.', 0, $time + 8);
$message->timecreated++;
$messages[] = $DB->insert_record('message', $message);
$message->timecreated++;
$messages[] = $DB->insert_record('message', $message);
$message->timecreated++;
$messages[] = $DB->insert_record('message', $message);
// Create a read message.
$message->timeread = time();
// Send this a few times.
$message->timecreated++;
$messages[] = $DB->insert_record('message_read', $message);
$message->timecreated++;
$messages[] = $DB->insert_record('message_read', $message);
$message->timecreated++;
$messages[] = $DB->insert_record('message_read', $message);
$message->timecreated++;
$messages[] = $DB->insert_record('message_read', $message);
// Mark the last 4 messages as read.
\core_message\api::mark_message_as_read($user2->id, $messages[4]);
\core_message\api::mark_message_as_read($user1->id, $messages[5]);
\core_message\api::mark_message_as_read($user2->id, $messages[6]);
\core_message\api::mark_message_as_read($user1->id, $messages[7]);
// Trigger and capture the event.
$sink = $this->redirectEvents();
\core_message\api::delete_conversation(1, 2);
\core_message\api::delete_conversation($user1->id, $user2->id);
$events = $sink->get_events();
// Get the user actions for the messages deleted by that user.
$muas = $DB->get_records('message_user_actions', ['userid' => $user1->id,
'action' => \core_message\api::MESSAGE_ACTION_DELETED], 'timecreated ASC');
$this->assertCount(8, $muas);
// Create a list we can use for testing.
$muatest = [];
foreach ($muas as $mua) {
$muatest[$mua->messageid] = $mua;
}
// Check that there were the correct number of events triggered.
$this->assertEquals(8, count($events));
// Check that the event data is valid.
$i = 0;
$i = 1;
foreach ($events as $event) {
$table = ($i > 3) ? 'message_read' : 'message';
$useridfromid = ($i % 2 == 0) ? $user2->id : $user1->id;
$useridtoid = ($i % 2 == 0) ? $user1->id : $user2->id;
$messageid = $messages[$i - 1];
$this->assertInstanceOf('\core\event\message_deleted', $event);
$this->assertEquals($message->useridfrom, $event->userid);
$this->assertEquals($message->useridto, $event->relateduserid);
$this->assertEquals($table, $event->other['messagetable']);
$this->assertEquals($messages[$i], $event->other['messageid']);
$this->assertEquals($message->useridfrom, $event->other['useridfrom']);
$this->assertEquals($message->useridto, $event->other['useridto']);
$this->assertEquals($muatest[$messageid]->id, $event->objectid);
$this->assertEquals($user1->id, $event->userid);
$this->assertEquals($user2->id, $event->relateduserid);
$this->assertEquals($messageid, $event->other['messageid']);
$this->assertEquals($useridfromid, $event->other['useridfrom']);
$this->assertEquals($useridtoid, $event->other['useridto']);
$i++;
}

View file

@ -61,16 +61,33 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$time = time();
}
if ($notification) {
$record = new stdClass();
$record->useridfrom = $userfrom->id;
$record->useridto = $userto->id;
$record->subject = 'No subject';
$record->fullmessage = $message;
$record->smallmessage = $message;
$record->timecreated = $time;
return $DB->insert_record('notifications', $record);
}
if (!$conversationid = \core_message\api::get_conversation_between_users($userfrom->id, $userto->id)) {
$conversationid = \core_message\api::create_conversation_between_users($userfrom->id,
$userto->id);
}
// Ok, send the message.
$record = new stdClass();
$record->useridfrom = $userfrom->id;
$record->useridto = $userto->id;
$record->conversationid = $conversationid;
$record->subject = 'No subject';
$record->smallmessage = $message;
$record->fullmessage = $message;
$record->smallmessage = $message;
$record->timecreated = $time;
$record->notification = $notification;
return $DB->insert_record('message', $record);
return $DB->insert_record('messages', $record);
}
/**
@ -110,7 +127,15 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
// We need to execute the return values cleaning process to simulate the web service server.
$sentmessages = external_api::clean_returnvalue(core_message_external::send_instant_messages_returns(), $sentmessages);
$themessage = $DB->get_record('message', array('id' => $sentmessages[0]['msgid']));
$sql = "SELECT m.*, mcm.userid as useridto
FROM {messages} m
INNER JOIN {message_conversations} mc
ON m.conversationid = mc.id
INNER JOIN {message_conversation_members} mcm
ON mcm.conversationid = mc.id
WHERE mcm.userid != ?
AND m.id = ?";
$themessage = $DB->get_record_sql($sql, [$USER->id, $sentmessages[0]['msgid']]);
// Confirm that the message was inserted correctly.
$this->assertEquals($themessage->useridfrom, $USER->id);
@ -465,8 +490,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
// Delete the message.
$message = array_shift($messages['messages']);
$messagetobedeleted = $DB->get_record('message_read', array('id' => $message['id']));
message_delete_message($messagetobedeleted, $user1->id);
\core_message\api::delete_message($user1->id, $message['id']);
$messages = core_message_external::get_messages($user2->id, $user1->id, 'conversations', true, true, 0, 0);
$messages = external_api::clean_returnvalue(core_message_external::get_messages_returns(), $messages);
@ -495,8 +519,7 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
// Delete the message.
$message = array_shift($messages['messages']);
$messagetobedeleted = $DB->get_record('message_read', array('id' => $message['id']));
message_delete_message($messagetobedeleted, $user2->id);
\core_message\api::delete_message($user2->id, $message['id']);
$messages = core_message_external::get_messages($user2->id, $user3->id, 'conversations', true, true, 0, 0);
$messages = external_api::clean_returnvalue(core_message_external::get_messages_returns(), $messages);
@ -735,10 +758,10 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
// Invalid message ids.
try {
$messageid = core_message_external::mark_message_read($messageids[0]['messageid'] * 2, time());
$messageid = core_message_external::mark_message_read(1337, time());
$this->fail('Exception expected due invalid messageid.');
} catch (dml_missing_record_exception $e) {
$this->assertEquals('invalidrecord', $e->errorcode);
$this->assertEquals('invalidrecordunknown', $e->errorcode);
}
// A message to a different user.
@ -783,8 +806,8 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$result = external_api::clean_returnvalue(core_message_external::delete_message_returns(), $result);
$this->assertTrue($result['status']);
$this->assertCount(0, $result['warnings']);
$deletedmessage = $DB->get_record('message', array('id' => $m1to2));
$this->assertNotEquals(0, $deletedmessage->timeuserfromdeleted);
$mua = $DB->get_record('message_user_actions', array('messageid' => $m1to2, 'userid' => $user1->id));
$this->assertEquals(\core_message\api::MESSAGE_ACTION_DELETED, $mua->action);
// Try to delete the same message again.
$result = core_message_external::delete_message($m1to2, $user1->id, false);
@ -805,25 +828,24 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$result = external_api::clean_returnvalue(core_message_external::delete_message_returns(), $result);
$this->assertTrue($result['status']);
$this->assertCount(0, $result['warnings']);
$deletedmessage = $DB->get_record('message', array('id' => $m2to3));
$this->assertNotEquals(0, $deletedmessage->timeusertodeleted);
$this->assertTrue($DB->record_exists('message_user_actions', array('messageid' => $m2to3, 'userid' => $user3->id,
'action' => \core_message\api::MESSAGE_ACTION_DELETED)));
// Delete a message read.
$message = $DB->get_record('message', array('id' => $m3to2));
$messageid = message_mark_message_read($message, time());
$result = core_message_external::delete_message($messageid, $user3->id);
\core_message\api::mark_message_as_read($user3->id, $m3to2, time());
$result = core_message_external::delete_message($m3to2, $user3->id);
$result = external_api::clean_returnvalue(core_message_external::delete_message_returns(), $result);
$this->assertTrue($result['status']);
$this->assertCount(0, $result['warnings']);
$deletedmessage = $DB->get_record('message_read', array('id' => $messageid));
$this->assertNotEquals(0, $deletedmessage->timeuserfromdeleted);
$this->assertTrue($DB->record_exists('message_user_actions', array('messageid' => $m3to2, 'userid' => $user3->id,
'action' => \core_message\api::MESSAGE_ACTION_DELETED)));
// Invalid message ids.
try {
$result = core_message_external::delete_message(-1, $user1->id);
$this->fail('Exception expected due invalid messageid.');
} catch (dml_missing_record_exception $e) {
$this->assertEquals('invalidrecord', $e->errorcode);
$this->assertEquals('invalidrecordunknown', $e->errorcode);
}
// Invalid user.
@ -849,8 +871,8 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$result = external_api::clean_returnvalue(core_message_external::delete_message_returns(), $result);
$this->assertTrue($result['status']);
$this->assertCount(0, $result['warnings']);
$deletedmessage = $DB->get_record('message', array('id' => $m3to4));
$this->assertNotEquals(0, $deletedmessage->timeusertodeleted);
$this->assertTrue($DB->record_exists('message_user_actions', array('messageid' => $m3to4, 'userid' => $user4->id,
'action' => \core_message\api::MESSAGE_ACTION_DELETED)));
}
@ -902,15 +924,15 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$this->send_message($sender3, $recipient, 'Notification', 1);
core_message_external::mark_all_notifications_as_read($recipient->id, $sender1->id);
$readnotifications = $DB->get_records('message_read', ['useridto' => $recipient->id]);
$unreadnotifications = $DB->get_records('message', ['useridto' => $recipient->id]);
$readnotifications = $DB->get_records_select('notifications', 'useridto = ? AND timeread IS NOT NULL', [$recipient->id]);
$unreadnotifications = $DB->get_records_select('notifications', 'useridto = ? AND timeread IS NULL', [$recipient->id]);
$this->assertCount(2, $readnotifications);
$this->assertCount(4, $unreadnotifications);
core_message_external::mark_all_notifications_as_read($recipient->id, 0);
$readnotifications = $DB->get_records('message_read', ['useridto' => $recipient->id]);
$unreadnotifications = $DB->get_records('message', ['useridto' => $recipient->id]);
$readnotifications = $DB->get_records_select('notifications', 'useridto = ? AND timeread IS NOT NULL', [$recipient->id]);
$unreadnotifications = $DB->get_records_select('notifications', 'useridto = ? AND timeread IS NULL', [$recipient->id]);
$this->assertCount(6, $readnotifications);
$this->assertCount(0, $unreadnotifications);
@ -2400,18 +2422,10 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
$this->send_message($sender3, $recipient, 'Message');
core_message_external::mark_all_messages_as_read($recipient->id, $sender1->id);
$readnotifications = $DB->get_records('message_read', array('useridto' => $recipient->id));
$unreadnotifications = $DB->get_records('message', array('useridto' => $recipient->id));
$this->assertCount(2, $readnotifications);
$this->assertCount(4, $unreadnotifications);
$this->assertEquals(2, $DB->count_records('message_user_actions'));
core_message_external::mark_all_messages_as_read($recipient->id, 0);
$readnotifications = $DB->get_records('message_read', array('useridto' => $recipient->id));
$unreadnotifications = $DB->get_records('message', array('useridto' => $recipient->id));
$this->assertCount(6, $readnotifications);
$this->assertCount(0, $unreadnotifications);
$this->assertEquals(6, $DB->count_records('message_user_actions'));
}
/**
@ -2529,33 +2543,39 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
// Send some messages back and forth.
$time = time();
$this->send_message($user1, $user2, 'Yo!', 0, $time);
$this->send_message($user2, $user1, 'Sup mang?', 0, $time + 1);
$this->send_message($user1, $user2, 'Writing PHPUnit tests!', 0, $time + 2);
$this->send_message($user2, $user1, 'Word.', 0, $time + 3);
$m1id = $this->send_message($user1, $user2, 'Yo!', 0, $time);
$m2id = $this->send_message($user2, $user1, 'Sup mang?', 0, $time + 1);
$m3id = $this->send_message($user1, $user2, 'Writing PHPUnit tests!', 0, $time + 2);
$m4id = $this->send_message($user2, $user1, 'Word.', 0, $time + 3);
// Delete the conversation.
core_message_external::delete_conversation($user1->id, $user2->id);
$messages = $DB->get_records('message', array(), 'timecreated ASC');
$this->assertCount(4, $messages);
$muas = $DB->get_records('message_user_actions', array(), 'timecreated ASC');
$this->assertCount(4, $muas);
// Sort by id.
ksort($muas);
$message1 = array_shift($messages);
$message2 = array_shift($messages);
$message3 = array_shift($messages);
$message4 = array_shift($messages);
$mua1 = array_shift($muas);
$mua2 = array_shift($muas);
$mua3 = array_shift($muas);
$mua4 = array_shift($muas);
$this->assertNotEmpty($message1->timeuserfromdeleted);
$this->assertEmpty($message1->timeusertodeleted);
$this->assertEquals($user1->id, $mua1->userid);
$this->assertEquals($m1id, $mua1->messageid);
$this->assertEquals(\core_message\api::MESSAGE_ACTION_DELETED, $mua1->action);
$this->assertEmpty($message2->timeuserfromdeleted);
$this->assertNotEmpty($message2->timeusertodeleted);
$this->assertEquals($user1->id, $mua2->userid);
$this->assertEquals($m2id, $mua2->messageid);
$this->assertEquals(\core_message\api::MESSAGE_ACTION_DELETED, $mua2->action);
$this->assertNotEmpty($message3->timeuserfromdeleted);
$this->assertEmpty($message3->timeusertodeleted);
$this->assertEquals($user1->id, $mua3->userid);
$this->assertEquals($m3id, $mua3->messageid);
$this->assertEquals(\core_message\api::MESSAGE_ACTION_DELETED, $mua3->action);
$this->assertEmpty($message4->timeuserfromdeleted);
$this->assertNotEmpty($message4->timeusertodeleted);
$this->assertEquals($user1->id, $mua4->userid);
$this->assertEquals($m4id, $mua4->messageid);
$this->assertEquals(\core_message\api::MESSAGE_ACTION_DELETED, $mua4->action);
}
/**
@ -2574,33 +2594,39 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
// Send some messages back and forth.
$time = time();
$this->send_message($user1, $user2, 'Yo!', 0, $time);
$this->send_message($user2, $user1, 'Sup mang?', 0, $time + 1);
$this->send_message($user1, $user2, 'Writing PHPUnit tests!', 0, $time + 2);
$this->send_message($user2, $user1, 'Word.', 0, $time + 3);
$m1id = $this->send_message($user1, $user2, 'Yo!', 0, $time);
$m2id = $this->send_message($user2, $user1, 'Sup mang?', 0, $time + 1);
$m3id = $this->send_message($user1, $user2, 'Writing PHPUnit tests!', 0, $time + 2);
$m4id = $this->send_message($user2, $user1, 'Word.', 0, $time + 3);
// Delete the conversation.
core_message_external::delete_conversation($user1->id, $user2->id);
$messages = $DB->get_records('message', array(), 'timecreated ASC');
$this->assertCount(4, $messages);
$muas = $DB->get_records('message_user_actions', array(), 'timecreated ASC');
$this->assertCount(4, $muas);
// Sort by id.
ksort($muas);
$message1 = array_shift($messages);
$message2 = array_shift($messages);
$message3 = array_shift($messages);
$message4 = array_shift($messages);
$mua1 = array_shift($muas);
$mua2 = array_shift($muas);
$mua3 = array_shift($muas);
$mua4 = array_shift($muas);
$this->assertNotEmpty($message1->timeuserfromdeleted);
$this->assertEmpty($message1->timeusertodeleted);
$this->assertEquals($user1->id, $mua1->userid);
$this->assertEquals($m1id, $mua1->messageid);
$this->assertEquals(\core_message\api::MESSAGE_ACTION_DELETED, $mua1->action);
$this->assertEmpty($message2->timeuserfromdeleted);
$this->assertNotEmpty($message2->timeusertodeleted);
$this->assertEquals($user1->id, $mua2->userid);
$this->assertEquals($m2id, $mua2->messageid);
$this->assertEquals(\core_message\api::MESSAGE_ACTION_DELETED, $mua2->action);
$this->assertNotEmpty($message3->timeuserfromdeleted);
$this->assertEmpty($message3->timeusertodeleted);
$this->assertEquals($user1->id, $mua3->userid);
$this->assertEquals($m3id, $mua3->messageid);
$this->assertEquals(\core_message\api::MESSAGE_ACTION_DELETED, $mua3->action);
$this->assertEmpty($message4->timeuserfromdeleted);
$this->assertNotEmpty($message4->timeusertodeleted);
$this->assertEquals($user1->id, $mua4->userid);
$this->assertEquals($m4id, $mua4->messageid);
$this->assertEquals(\core_message\api::MESSAGE_ACTION_DELETED, $mua4->action);
}
/**

View file

@ -73,16 +73,33 @@ class core_message_messagelib_testcase extends advanced_testcase {
$time = time();
}
if ($notification) {
$record = new stdClass();
$record->useridfrom = $userfrom->id;
$record->useridto = $userto->id;
$record->subject = 'No subject';
$record->fullmessage = $message;
$record->smallmessage = $message;
$record->timecreated = $time;
return $DB->insert_record('notifications', $record);
}
if (!$conversationid = \core_message\api::get_conversation_between_users($userfrom->id, $userto->id)) {
$conversationid = \core_message\api::create_conversation_between_users($userfrom->id,
$userto->id);
}
// Ok, send the message.
$record = new stdClass();
$record->useridfrom = $userfrom->id;
$record->useridto = $userto->id;
$record->conversationid = $conversationid;
$record->subject = 'No subject';
$record->fullmessage = $message;
$record->smallmessage = $message;
$record->timecreated = $time;
$record->notification = $notification;
return $DB->insert_record('message', $record);
return $DB->insert_record('messages', $record);
}
/**
@ -101,14 +118,17 @@ class core_message_messagelib_testcase extends advanced_testcase {
message_add_contact($user2->id, 1);
$this->assertCount(1, message_get_blocked_users());
$this->assertDebuggingCalled();
// Block other user.
message_block_contact($user1->id);
$this->assertCount(2, message_get_blocked_users());
$this->assertDebuggingCalled();
// Test deleting users.
delete_user($user1);
$this->assertCount(1, message_get_blocked_users());
$this->assertDebuggingCalled();
}
/**
@ -138,6 +158,7 @@ class core_message_messagelib_testcase extends advanced_testcase {
$this->send_fake_message($user3, $USER);
list($onlinecontacts, $offlinecontacts, $strangers) = message_get_contacts();
$this->assertDebuggingCalled();
$this->assertCount(0, $onlinecontacts);
$this->assertCount(2, $offlinecontacts);
$this->assertCount(1, $strangers);
@ -146,6 +167,7 @@ class core_message_messagelib_testcase extends advanced_testcase {
$this->send_fake_message($noreplyuser, $USER);
$this->send_fake_message($supportuser, $USER);
list($onlinecontacts, $offlinecontacts, $strangers) = message_get_contacts();
$this->assertDebuggingCalled();
$this->assertCount(0, $onlinecontacts);
$this->assertCount(2, $offlinecontacts);
$this->assertCount(3, $strangers);
@ -153,6 +175,7 @@ class core_message_messagelib_testcase extends advanced_testcase {
// Block 1 user.
message_block_contact($user2->id);
list($onlinecontacts, $offlinecontacts, $strangers) = message_get_contacts();
$this->assertDebuggingCalled();
$this->assertCount(0, $onlinecontacts);
$this->assertCount(1, $offlinecontacts);
$this->assertCount(3, $strangers);
@ -161,6 +184,7 @@ class core_message_messagelib_testcase extends advanced_testcase {
core_user::reset_internal_users();
$CFG->noreplyuserid = $user3->id;
list($onlinecontacts, $offlinecontacts, $strangers) = message_get_contacts();
$this->assertDebuggingCalled();
$this->assertCount(0, $onlinecontacts);
$this->assertCount(1, $offlinecontacts);
$this->assertCount(2, $strangers);
@ -168,8 +192,9 @@ class core_message_messagelib_testcase extends advanced_testcase {
// Test deleting users.
delete_user($user1);
delete_user($user3);
core_user::reset_internal_users();
list($onlinecontacts, $offlinecontacts, $strangers) = message_get_contacts();
$this->assertDebuggingCalled();
$this->assertCount(0, $onlinecontacts);
$this->assertCount(0, $offlinecontacts);
$this->assertCount(1, $strangers);
@ -195,9 +220,9 @@ class core_message_messagelib_testcase extends advanced_testcase {
}
/**
* Test message_count_unread_messages with notifications.
* Test message_count_unread_messages with read messages.
*/
public function test_message_count_unread_messages_with_notifications() {
public function test_message_count_unread_messages_with_read_messages() {
// Create users to send and receive messages.
$userfrom1 = $this->getDataGenerator()->create_user();
$userfrom2 = $this->getDataGenerator()->create_user();
@ -206,16 +231,15 @@ class core_message_messagelib_testcase extends advanced_testcase {
$this->assertEquals(0, message_count_unread_messages($userto));
// Send fake messages.
$this->send_fake_message($userfrom1, $userto);
$messageid = $this->send_fake_message($userfrom1, $userto);
$this->send_fake_message($userfrom2, $userto);
// Send fake notifications.
$this->send_fake_message($userfrom1, $userto, 'Notification', 1);
$this->send_fake_message($userfrom2, $userto, 'Notification', 1);
// Mark message as read.
\core_message\api::mark_message_as_read($userto->id, $messageid);
// Should only count the messages.
$this->assertEquals(2, message_count_unread_messages($userto));
$this->assertEquals(1, message_count_unread_messages($userto, $userfrom1));
// Should only count the messages that weren't read by the current user.
$this->assertEquals(1, message_count_unread_messages($userto));
$this->assertEquals(0, message_count_unread_messages($userto, $userfrom1));
}
/**
@ -235,13 +259,8 @@ class core_message_messagelib_testcase extends advanced_testcase {
$messageid = $this->send_fake_message($userfrom1, $userto);
$this->send_fake_message($userfrom2, $userto);
// Send fake notifications.
$this->send_fake_message($userfrom1, $userto, 'Notification', 1);
$this->send_fake_message($userfrom2, $userto, 'Notification', 1);
// Delete a message.
$message = $DB->get_record('message', array('id' => $messageid));
message_delete_message($message, $userto->id);
\core_message\api::delete_message($userto->id, $messageid);
// Should only count the messages that weren't deleted by the current user.
$this->assertEquals(1, message_count_unread_messages($userto));

View file

@ -273,7 +273,7 @@ class message_received_search_testcase extends advanced_testcase {
$this->assertEquals(\core_search\manager::ACCESS_DENIED, $searcharea->check_access($messageid));
}
message_delete_message($message, $user2->id);
\core_message\api::delete_message($user2->id, $message->id);
$this->assertEquals(\core_search\manager::ACCESS_DELETED, $searcharea->check_access($messageid));
$this->setUser($user3);

View file

@ -284,7 +284,7 @@ class message_sent_search_testcase extends advanced_testcase {
$this->assertEquals(\core_search\manager::ACCESS_DELETED, $searcharea->check_access(-123));
message_delete_message($message, $user1->id);
\core_message\api::delete_message($user1->id, $message->id);
$this->assertEquals(\core_search\manager::ACCESS_DELETED, $searcharea->check_access($messageid));
$this->setUser($user2);