diff --git a/mail_gateway_whatsapp/models/mail_gateway_whatsapp.py b/mail_gateway_whatsapp/models/mail_gateway_whatsapp.py index 079d710206..d48052ce2d 100644 --- a/mail_gateway_whatsapp/models/mail_gateway_whatsapp.py +++ b/mail_gateway_whatsapp/models/mail_gateway_whatsapp.py @@ -191,6 +191,7 @@ def _process_update(self, chat, message, value): ) .mail_message_id ) + new_message.parent_id = related_message.id if related_message and related_message.gateway_message_id: new_related_message = ( self.env[related_message.gateway_message_id.model] diff --git a/mail_gateway_whatsapp/tests/test_mail_gateway_whatsapp.py b/mail_gateway_whatsapp/tests/test_mail_gateway_whatsapp.py index d95bf78a49..c123b386d1 100644 --- a/mail_gateway_whatsapp/tests/test_mail_gateway_whatsapp.py +++ b/mail_gateway_whatsapp/tests/test_mail_gateway_whatsapp.py @@ -221,6 +221,7 @@ def receive_message(self, message): def test_receive_message_01(self): message = self.receive_message(self.message_01) self.assertFalse(message.author_id) + self.assertFalse(message.parent_id) def test_receive_message_02(self): # Check that the partner is assigned automatically @@ -229,6 +230,62 @@ def test_receive_message_02(self): ) message = self.receive_message(self.message_01) self.assertEqual(message.author_id, partner) + self.assertFalse(message.parent_id) + + def test_receive_related_message(self): + """ + Send outgoing message, and then receive a reply message + with reference to the original. + """ + # Send outgoing + partner = self.env["res.partner"].create( + {"name": "DEMO", "phone": "+34699999999"} + ) + ctx = { + "default_res_model": partner._name, + "default_res_id": partner.id, + "default_number_field_name": "mobile", + "default_composition_mode": "comment", + "default_gateway_id": self.gateway.id, + } + self.gateway.whatsapp_account_id = "123456" + form_composer = Form(self.env["whatsapp.composer"].with_context(**ctx)) + form_composer.body = "Body test" + form_composer.template_id = self.ws_template + composer = form_composer.save() + channel = partner._whatsapp_get_channel( + composer.number_field_name, composer.gateway_id + ) + message_domain = [ + ("gateway_type", "=", "whatsapp"), + ("model", "=", channel._name), + ("res_id", "=", channel.id), + ] + ID_WHATSAPP = "wamid.TEST_UNIQUE_ID_123" + with ( + RecordCapturer(self.env["mail.message"], message_domain) as capture, + patch("requests.post") as post_mock, + ): + response_mock = MagicMock() + response_mock.status_code = 200 + # Mock the response of whatsapp to include an assigned ID + response_mock.json.return_value = {"messages": [{"id": ID_WHATSAPP}]} + post_mock.return_value = response_mock + composer.action_send_whatsapp() + message = capture.records + # Check that the sent message notification contains the received Whatsapp ID + self.assertTrue( + message.notification_ids.filtered( + lambda msg: msg.gateway_message_id == ID_WHATSAPP + ) + ) + # Receive message 01 with related id set. + reply_message = self.message_01 + reply_message["entry"][0]["changes"][0]["value"]["messages"][0]["context"] = { + "id": ID_WHATSAPP + } + received_reply = self.receive_message(reply_message) + self.assertEqual(message.id, received_reply.parent_id.id) def test_receive_message_03(self): class GetImageResponse: