MDL-64224 core_message: fix for isfavourite in api::get_conversation()
authorJake Dallimore <jake@moodle.com>
Wed, 28 Nov 2018 00:48:14 +0000 (08:48 +0800)
committerJake Dallimore <jake@moodle.com>
Wed, 28 Nov 2018 01:09:07 +0000 (09:09 +0800)
message/classes/api.php
message/tests/externallib_test.php

index d579223..4211fc3 100644 (file)
@@ -839,6 +839,12 @@ class api {
             return null;
         }
 
+        // Get the context of the conversation. This will be used to check whether the conversation is a favourite.
+        // This will be either 'user' (for individual conversations) or, in the case of linked conversations,
+        // the context stored in the record.
+        $userctx = \context_user::instance($userid);
+        $conversationctx = empty($conversation->contextid) ? $userctx : \context::instance_by_id($conversation->contextid);
+
         $isconversationmember = $DB->record_exists(
             'message_conversation_members',
             [
@@ -873,7 +879,7 @@ class api {
         );
 
         $service = \core_favourites\service_factory::get_service_for_user_context(\context_user::instance($userid));
-        $isfavourite = $service->favourite_exists('core_message', 'message_conversations', $conversationid, $systemcontext);
+        $isfavourite = $service->favourite_exists('core_message', 'message_conversations', $conversationid, $conversationctx);
 
         $convextrafields = self::get_linked_conversation_extra_fields([$conversation]);
         $subname = isset($convextrafields[$conversationid]) ? $convextrafields[$conversationid]['subname'] : null;
index 2d7dea8..64f5d08 100644 (file)
@@ -5949,6 +5949,89 @@ class core_message_externallib_testcase extends externallib_advanced_testcase {
         external_api::clean_returnvalue(core_message_external::get_conversation_returns(), $conv);
     }
 
+    /**
+     * Test verifying that the correct favourite information is returned for a non-linked converastion at user context.
+     */
+    public function test_get_conversation_favourited() {
+        $this->resetAfterTest();
+
+        $user1 = self::getDataGenerator()->create_user();
+        $user2 = self::getDataGenerator()->create_user();
+
+        // Create a conversation between the 2 users.
+        $conversation = \core_message\api::create_conversation(
+            \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL,
+            [
+                $user1->id,
+                $user2->id,
+            ],
+            'An individual conversation'
+        );
+
+        // Favourite the conversation as user 1 only.
+        \core_message\api::set_favourite_conversation($conversation->id, $user1->id);
+
+        // Get the conversation for user1 and confirm it's favourited.
+        $this->setUser($user1);
+        $conv = core_message_external::get_conversation($user1->id, $conversation->id);
+        $conv = external_api::clean_returnvalue(core_message_external::get_conversation_returns(), $conv);
+        $this->assertTrue($conv['isfavourite']);
+
+        // Get the conversation for user2 and confirm it's NOT favourited.
+        $this->setUser($user2);
+        $conv = core_message_external::get_conversation($user2->id, $conversation->id);
+        $conv = external_api::clean_returnvalue(core_message_external::get_conversation_returns(), $conv);
+        $this->assertFalse($conv['isfavourite']);
+    }
+
+    /**
+     * Test verifying that the correct favourite information is returned for a group-linked conversation at course context.
+     */
+    public function test_get_conversation_favourited_group_linked() {
+        $this->resetAfterTest();
+        global $DB;
+
+        $user1 = self::getDataGenerator()->create_user();
+        $user2 = self::getDataGenerator()->create_user();
+        $user3 = self::getDataGenerator()->create_user();
+
+        $course1 = $this->getDataGenerator()->create_course();
+        $course1context = \context_course::instance($course1->id);
+
+        // Create a group with a linked conversation and a valid image.
+        $this->setAdminUser();
+        $this->getDataGenerator()->enrol_user($user1->id, $course1->id);
+        $this->getDataGenerator()->enrol_user($user2->id, $course1->id);
+        $this->getDataGenerator()->enrol_user($user3->id, $course1->id);
+        $group1 = $this->getDataGenerator()->create_group([
+            'courseid' => $course1->id,
+            'enablemessaging' => 1
+        ]);
+
+        // Add users to group1.
+        $this->getDataGenerator()->create_group_member(array('groupid' => $group1->id, 'userid' => $user1->id));
+        $this->getDataGenerator()->create_group_member(array('groupid' => $group1->id, 'userid' => $user2->id));
+
+        // Verify that the conversation is a group linked conversation in the course context.
+        $conversationrecord = $DB->get_record('message_conversations', ['component' => 'core_group', 'itemtype' => 'groups']);
+        $this->assertEquals($course1context->id, $conversationrecord->contextid);
+
+        // Favourite the conversation as user 1 only.
+        \core_message\api::set_favourite_conversation($conversationrecord->id, $user1->id);
+
+        // Get the conversation for user1 and confirm it's favourited.
+        $this->setUser($user1);
+        $conv = core_message_external::get_conversation($user1->id, $conversationrecord->id);
+        $conv = external_api::clean_returnvalue(core_message_external::get_conversation_returns(), $conv);
+        $this->assertTrue($conv['isfavourite']);
+
+        // Get the conversation for user2 and confirm it's NOT favourited.
+        $this->setUser($user2);
+        $conv = core_message_external::get_conversation($user2->id, $conversationrecord->id);
+        $conv = external_api::clean_returnvalue(core_message_external::get_conversation_returns(), $conv);
+        $this->assertFalse($conv['isfavourite']);
+    }
+
     /**
      * Test getting a conversation with no messages.
      */