From a55bcf1bdbdf2ecea661bb1641884ded73473da8 Mon Sep 17 00:00:00 2001 From: Erik Harding Date: Thu, 29 Jun 2023 12:59:29 +0200 Subject: [PATCH] Manage fallback channel --- ndoh_hub/tests/test_utils.py | 52 ++++++++++++++++++++++++++++++++++++ ndoh_hub/tests/test_views.py | 27 ++++++++++++++++--- ndoh_hub/utils.py | 18 ++++++++++++- 3 files changed, 93 insertions(+), 4 deletions(-) diff --git a/ndoh_hub/tests/test_utils.py b/ndoh_hub/tests/test_utils.py index 5c253475..78878914 100644 --- a/ndoh_hub/tests/test_utils.py +++ b/ndoh_hub/tests/test_utils.py @@ -1,3 +1,4 @@ +import json from unittest import TestCase import responses @@ -6,6 +7,7 @@ msisdn_to_whatsapp_id, normalise_msisdn, send_whatsapp_template_message, + update_turn_contact_details, ) @@ -29,6 +31,28 @@ def test_msisdn_to_whatsapp_id(self): self.assertEqual(msisdn_to_whatsapp_id("+27820001001"), "27820001001") +class TestUpdateTurnContactDetails(TestCase): + @responses.activate + def test_update_turn_contact_details(self): + """ + Should call the turn api with the correct body + """ + responses.add( + method=responses.PATCH, + url="http://turn/v1/contacts/27820001001", + json={}, + status=200, + ) + + update_turn_contact_details("27820001001", {"field": "new value"}) + + request = json.loads(responses.calls[0].request.body) + self.assertEqual( + request, + {"field": "new value"}, + ) + + class TestSendWhatsappTemplateMessage(TestCase): @responses.activate def test_send_whatsapp_template_message_number_on_whatsapp(self): @@ -40,6 +64,13 @@ def test_send_whatsapp_template_message_number_on_whatsapp(self): msisdn = "+27820001001" template_name = "test template" + responses.add( + method=responses.PATCH, + url="http://turn/v1/contacts/27820001001", + json={}, + status=200, + ) + responses.add( method=responses.POST, url="http://turn/v1/messages", @@ -53,6 +84,8 @@ def test_send_whatsapp_template_message_number_on_whatsapp(self): self.assertEqual(response, "WhatsApp") + self.assertEqual(len(responses.calls), 2) + @responses.activate def test_send_whatsapp_template_message_number_not_on_whatsapp(self): """ @@ -63,6 +96,13 @@ def test_send_whatsapp_template_message_number_not_on_whatsapp(self): msisdn = "+27820001001" template_name = "test template" + responses.add( + method=responses.PATCH, + url="http://turn/v1/contacts/27820001001", + json={}, + status=200, + ) + responses.add( method=responses.POST, url="http://turn/v1/messages", @@ -87,3 +127,15 @@ def test_send_whatsapp_template_message_number_not_on_whatsapp(self): ) self.assertEqual(response, "SMS") + + self.assertEqual(len(responses.calls), 3) + request = json.loads(responses.calls[0].request.body) + self.assertEqual( + request, + {"is_fallback_active": False}, + ) + request = json.loads(responses.calls[2].request.body) + self.assertEqual( + request, + {"is_fallback_active": True}, + ) diff --git a/ndoh_hub/tests/test_views.py b/ndoh_hub/tests/test_views.py index 9c9b1d85..3f84722a 100644 --- a/ndoh_hub/tests/test_views.py +++ b/ndoh_hub/tests/test_views.py @@ -34,6 +34,13 @@ def test_send_whatsapp_template_message_number_on_whatsapp(self): msisdn = "+27820001001" template_name = "test template" + responses.add( + method=responses.PATCH, + url="http://turn/v1/contacts/27820001001", + json={}, + status=200, + ) + responses.add( method=responses.POST, url="http://turn/v1/messages", @@ -53,7 +60,7 @@ def test_send_whatsapp_template_message_number_on_whatsapp(self): self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.json()["preferred_channel"], "WhatsApp") - request = json.loads(responses.calls[0].request.body) + request = json.loads(responses.calls[1].request.body) self.assertEqual( request, { @@ -83,6 +90,13 @@ def test_send_whatsapp_template_message_number_not_on_whatsapp(self): msisdn = "+27820001001" template_name = "test template" + responses.add( + method=responses.PATCH, + url="http://turn/v1/contacts/27820001001", + json={}, + status=200, + ) + responses.add( method=responses.POST, url="http://turn/v1/messages", @@ -113,7 +127,7 @@ def test_send_whatsapp_template_message_number_not_on_whatsapp(self): self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.json()["preferred_channel"], "SMS") - request = json.loads(responses.calls[0].request.body) + request = json.loads(responses.calls[1].request.body) self.assertEqual( request, { @@ -137,6 +151,13 @@ def test_send_whatsapp_template_message_with_media(self): msisdn = "+27820001001" template_name = "test template" + responses.add( + method=responses.PATCH, + url="http://turn/v1/contacts/27820001001", + json={}, + status=200, + ) + responses.add( method=responses.POST, url="http://turn/v1/messages", @@ -156,7 +177,7 @@ def test_send_whatsapp_template_message_with_media(self): self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.json()["preferred_channel"], "WhatsApp") - request = json.loads(responses.calls[0].request.body) + request = json.loads(responses.calls[1].request.body) self.assertEqual( request, { diff --git a/ndoh_hub/utils.py b/ndoh_hub/utils.py index 107b8a62..02bf4394 100644 --- a/ndoh_hub/utils.py +++ b/ndoh_hub/utils.py @@ -206,14 +206,29 @@ def send_slack_message(channel, text): return False +def update_turn_contact_details(wa_id, fields): + headers = { + "Authorization": f"Bearer {settings.TURN_TOKEN}", + "content-type": "application/json", + "Accept": "application/vnd.v1+json", + } + response = requests.patch( + urljoin(settings.TURN_URL, "/v1/contacts/{}".format(wa_id)), + json=fields, + headers=headers, + ) + response.raise_for_status() + + def send_whatsapp_template_message(msisdn, template_name, parameters, media=None): # send whatsapp template headers = { - "Authorization": "Bearer {}".format(settings.TURN_TOKEN), + "Authorization": f"Bearer {settings.TURN_TOKEN}", "Content-Type": "application/json", } wa_id = msisdn_to_whatsapp_id(msisdn) + update_turn_contact_details(wa_id, {"is_fallback_active": False}) components = [] if parameters: @@ -247,5 +262,6 @@ def send_whatsapp_template_message(msisdn, template_name, parameters, media=None if "messages" not in response_data: if response_data["errors"][0]["code"] == 1013: prefered_chanel = "SMS" + update_turn_contact_details(wa_id, {"is_fallback_active": True}) return prefered_chanel