$this->assertEquals($message2id, $conv['messages'][0]->id);
$this->assertEquals($user2->id, $conv['messages'][0]->useridfrom);
}
+
+ /**
+ * Data provider for test_get_conversation_counts().
+ */
+ public function test_get_conversation_counts_test_cases() {
+ $typeindividual = \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL;
+ $typegroup = \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP;
+ list($user1, $user2, $user3, $user4, $user5, $user6, $user7) = [0, 1, 2, 3, 4, 5, 6];
+ $conversations = [
+ [
+ 'type' => $typeindividual,
+ 'users' => [$user1, $user2],
+ 'messages' => [$user1, $user2],
+ 'favourites' => [$user1],
+ 'enabled' => null // Individual conversations cannot be disabled.
+ ],
+ [
+ 'type' => $typeindividual,
+ 'users' => [$user1, $user3],
+ 'messages' => [$user1, $user1],
+ 'favourites' => [],
+ 'enabled' => null // Individual conversations cannot be disabled.
+ ],
+ [
+ 'type' => $typegroup,
+ 'users' => [$user1, $user2, $user3, $user4],
+ 'messages' => [$user1, $user2, $user3, $user4],
+ 'favourites' => [],
+ 'enabled' => true
+ ],
+ [
+ 'type' => $typegroup,
+ 'users' => [$user6, $user7],
+ 'messages' => [$user6, $user7],
+ 'favourites' => [$user6],
+ 'enabled' => false
+ ],
+ ];
+
+ return [
+ 'No conversations' => [
+ 'conversationConfigs' => $conversations,
+ 'deletemessagesuser' => null,
+ 'deletemessages' => [],
+ 'arguments' => [$user5],
+ 'expected' => ['favourites' => 0, 'types' => [
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 0,
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 0
+ ]],
+ 'deletedusers' => []
+ ],
+ 'No individual conversations, 1 group conversation' => [
+ 'conversationConfigs' => $conversations,
+ 'deletemessagesuser' => null,
+ 'deletemessages' => [],
+ 'arguments' => [$user4],
+ 'expected' => ['favourites' => 0, 'types' => [
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 0,
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
+ ]],
+ 'deletedusers' => []
+ ],
+ '2 individual conversations (one favourited), 1 group conversation' => [
+ 'conversationConfigs' => $conversations,
+ 'deletemessagesuser' => null,
+ 'deletemessages' => [],
+ 'arguments' => [$user1],
+ 'expected' => ['favourites' => 1, 'types' => [
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
+ ]],
+ 'deletedusers' => []
+ ],
+ '1 individual conversation, 1 group conversation' => [
+ 'conversationConfigs' => $conversations,
+ 'deletemessagesuser' => null,
+ 'deletemessages' => [],
+ 'arguments' => [$user2],
+ 'expected' => ['favourites' => 0, 'types' => [
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
+ ]],
+ 'deletedusers' => []
+ ],
+ '1 group conversation only' => [
+ 'conversationConfigs' => $conversations,
+ 'deletemessagesuser' => null,
+ 'deletemessages' => [],
+ 'arguments' => [$user4],
+ 'expected' => ['favourites' => 0, 'types' => [
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 0,
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
+ ]],
+ 'deletedusers' => []
+ ],
+ 'All conversation types, delete a message from individual favourited, messages remaining' => [
+ 'conversationConfigs' => $conversations,
+ 'deletemessagesuser' => $user1,
+ 'deletemessages' => [0],
+ 'arguments' => [$user1],
+ 'expected' => ['favourites' => 1, 'types' => [
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
+ ]],
+ 'deletedusers' => []
+ ],
+ 'All conversation types, delete a message from individual non-favourited, messages remaining' => [
+ 'conversationConfigs' => $conversations,
+ 'deletemessagesuser' => $user1,
+ 'deletemessages' => [2],
+ 'arguments' => [$user1],
+ 'expected' => ['favourites' => 1, 'types' => [
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
+ ]],
+ 'deletedusers' => []
+ ],
+ 'All conversation types, delete all messages from individual favourited, no messages remaining' => [
+ 'conversationConfigs' => $conversations,
+ 'deletemessagesuser' => $user1,
+ 'deletemessages' => [0, 1],
+ 'arguments' => [$user1],
+ 'expected' => ['favourites' => 0, 'types' => [
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
+ ]],
+ 'deletedusers' => []
+ ],
+ 'All conversation types, delete all messages from individual non-favourited, no messages remaining' => [
+ 'conversationConfigs' => $conversations,
+ 'deletemessagesuser' => $user1,
+ 'deletemessages' => [2, 3],
+ 'arguments' => [$user1],
+ 'expected' => ['favourites' => 1, 'types' => [
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 0,
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
+ ]],
+ 'deletedusers' => []
+ ],
+ 'All conversation types, delete all messages from individual favourited, no messages remaining, different user' => [
+ 'conversationConfigs' => $conversations,
+ 'deletemessagesuser' => $user1,
+ 'deletemessages' => [0, 1],
+ 'arguments' => [$user2],
+ 'expected' => ['favourites' => 0, 'types' => [
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
+ ]],
+ 'deletedusers' => []
+ ],
+ 'All conversation types, delete all messages from individual non-favourited, no messages remaining, different user' => [
+ 'conversationConfigs' => $conversations,
+ 'deletemessagesuser' => $user1,
+ 'deletemessages' => [2, 3],
+ 'arguments' => [$user3],
+ 'expected' => ['favourites' => 0, 'types' => [
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
+ ]],
+ 'deletedusers' => []
+ ],
+ 'All conversation types, delete some messages from group non-favourited, messages remaining,' => [
+ 'conversationConfigs' => $conversations,
+ 'deletemessagesuser' => $user1,
+ 'deletemessages' => [4, 5],
+ 'arguments' => [$user1],
+ 'expected' => ['favourites' => 1, 'types' => [
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
+ ]],
+ 'deletedusers' => []
+ ],
+ 'All conversation types, delete all messages from group non-favourited, no messages remaining,' => [
+ 'conversationConfigs' => $conversations,
+ 'deletemessagesuser' => $user1,
+ 'deletemessages' => [4, 5, 6, 7],
+ 'arguments' => [$user1],
+ 'expected' => ['favourites' => 1, 'types' => [
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
+ ]],
+ 'deletedusers' => []
+ ],
+ 'All conversation types, another user soft deleted' => [
+ 'conversationConfigs' => $conversations,
+ 'deletemessagesuser' => null,
+ 'deletemessages' => [],
+ 'arguments' => [$user1],
+ 'expected' => ['favourites' => 1, 'types' => [
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
+ ]],
+ 'deletedusers' => [$user2]
+ ],
+ 'All conversation types, all group users soft deleted' => [
+ 'conversationConfigs' => $conversations,
+ 'deletemessagesuser' => null,
+ 'deletemessages' => [],
+ 'arguments' => [$user1],
+ 'expected' => ['favourites' => 1, 'types' => [
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 1,
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 1
+ ]],
+ 'deletedusers' => [$user2, $user3, $user4]
+ ],
+ 'Group conversation which is disabled, favourited' => [
+ 'conversationConfigs' => $conversations,
+ 'deletemessagesuser' => null,
+ 'deletemessages' => [],
+ 'arguments' => [$user6],
+ 'expected' => ['favourites' => 0, 'types' => [
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 0,
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 0
+ ]],
+ 'deletedusers' => []
+ ],
+ 'Group conversation which is disabled, non-favourited' => [
+ 'conversationConfigs' => $conversations,
+ 'deletemessagesuser' => null,
+ 'deletemessages' => [],
+ 'arguments' => [$user7],
+ 'expected' => ['favourites' => 0, 'types' => [
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL => 0,
+ \core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP => 0
+ ]],
+ 'deletedusers' => []
+ ],
+ ];
+ }
+
+ /**
+ * Test the get_conversation_counts() function.
+ *
+ * @dataProvider test_get_conversation_counts_test_cases()
+ * @param array $conversationconfigs Conversations to create
+ * @param int $deletemessagesuser The user who is deleting the messages
+ * @param array $deletemessages The list of messages to delete (by index)
+ * @param array $arguments Arguments for the count conversations function
+ * @param array $expected The expected result
+ * @param array $deletedusers the array of users to soft delete.
+ */
+ public function test_get_conversation_counts(
+ $conversationconfigs,
+ $deletemessagesuser,
+ $deletemessages,
+ $arguments,
+ $expected,
+ $deletedusers
+ ) {
+ $this->resetAfterTest();
+ $generator = $this->getDataGenerator();
+ $users = [
+ $generator->create_user(),
+ $generator->create_user(),
+ $generator->create_user(),
+ $generator->create_user(),
+ $generator->create_user(),
+ $generator->create_user(),
+ $generator->create_user()
+ ];
+
+ $deleteuser = !is_null($deletemessagesuser) ? $users[$deletemessagesuser] : null;
+ $this->setUser($users[$arguments[0]]);
+ $arguments[0] = $users[$arguments[0]]->id;
+ $systemcontext = \context_system::instance();
+ $conversations = [];
+ $messageids = [];
+
+ foreach ($conversationconfigs as $config) {
+ $conversation = \core_message\api::create_conversation(
+ $config['type'],
+ array_map(function($userindex) use ($users) {
+ return $users[$userindex]->id;
+ }, $config['users']),
+ null,
+ ($config['enabled'] ?? true)
+ );
+
+ foreach ($config['messages'] as $userfromindex) {
+ $userfrom = $users[$userfromindex];
+ $messageids[] = testhelper::send_fake_message_to_conversation($userfrom, $conversation->id);
+ }
+
+ foreach ($config['favourites'] as $userfromindex) {
+ $userfrom = $users[$userfromindex];
+ $usercontext = \context_user::instance($userfrom->id);
+ $ufservice = \core_favourites\service_factory::get_service_for_user_context($usercontext);
+ $ufservice->create_favourite('core_message', 'message_conversations', $conversation->id, $systemcontext);
+ }
+
+ $conversations[] = $conversation;
+ }
+
+ foreach ($deletemessages as $messageindex) {
+ \core_message\api::delete_message($deleteuser->id, $messageids[$messageindex]);
+ }
+
+ foreach ($deletedusers as $deleteduser) {
+ delete_user($users[$deleteduser]);
+ }
+
+ $counts = core_message_external::get_conversation_counts(...$arguments);
+ $counts = external_api::clean_returnvalue(core_message_external::get_conversation_counts_returns(), $counts);
+
+ $this->assertEquals($expected['favourites'], $counts['favourites']);
+ $this->assertEquals($expected['types'][\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL],
+ $counts['types'][\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL]);
+ $this->assertEquals($expected['types'][\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP],
+ $counts['types'][\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP]);
+ }
}