blob: d2e317ac6c6e1da008b244da39498c445caf7d0c [file] [log] [blame]
Subin Tome57e7bb2022-04-02 17:16:56 +05301import os
2import time
3import unittest
4
5import frappe
6import requests
7from frappe.contacts.doctype.contact.test_contact import create_contact
8
9from erpnext.hr.doctype.employee.test_employee import make_employee
10
11
12class TestExotel(unittest.TestCase):
13 def setUp(self):
14 make_employee("test_employee_exotel@company.com", cell_number="9999999999")
15 phones = [{"phone": "+91 9999999991", "is_primary_phone": 0, "is_primary_mobile_no": 1}]
16 create_contact("Test Contact", "Mr", phones=phones)
17
18 def test_for_successful_call(self):
Suraj Shetty0e9ebad2022-04-04 07:23:08 +053019 from .exotel_test_data import call_initiation_data, call_end_data
Subin Tome57e7bb2022-04-02 17:16:56 +053020 api_method = "handle_incoming_call"
21 end_call_api_method = "handle_end_call"
Subin Tome57e7bb2022-04-02 17:16:56 +053022
Subin Tome57e7bb2022-04-02 17:16:56 +053023
Suraj Shetty0e9ebad2022-04-04 07:23:08 +053024 emulate_api_call(call_initiation_data, api_method)
25 emulate_api_call(call_end_data, end_call_api_method)
Subin Tome57e7bb2022-04-02 17:16:56 +053026 self.assertEqual(call_log.get("from"), "09999999991")
27 self.assertEqual(call_log.get("to"), "09999999999")
Suraj Shetty0e9ebad2022-04-04 07:23:08 +053028 call_log = frappe.get_doc("Call Log", call_initiation_data.CallSid)
29
30 self.assertEqual(call_log.get("from"), call_initiation_data.CallFrom)
31 self.assertEqual(call_log.get("to"), call_initiation_data.DialWhomNumber)
Subin Tome57e7bb2022-04-02 17:16:56 +053032 self.assertEqual(call_log.get("call_received_by"), "EMP-00001")
33 self.assertEqual(call_log.get("status"), "Completed")
34
35 def test_for_disconnected_call(self):
Suraj Shetty0e9ebad2022-04-04 07:23:08 +053036 from .exotel_test_data import call_disconnected_data
Subin Tome57e7bb2022-04-02 17:16:56 +053037 api_method = "handle_missed_call"
Suraj Shetty0e9ebad2022-04-04 07:23:08 +053038 emulate_api_call(call_disconnected_data, api_method)
39 call_log = frappe.get_doc("Call Log", call_disconnected_data.CallSid)
Subin Tome57e7bb2022-04-02 17:16:56 +053040
Suraj Shetty0e9ebad2022-04-04 07:23:08 +053041 self.assertEqual(call_log.get("from"), call_disconnected_data.CallFrom)
42 self.assertEqual(call_log.get("to"), call_disconnected_data.DialWhomNumber)
Subin Tome57e7bb2022-04-02 17:16:56 +053043 self.assertEqual(call_log.get("call_received_by"), "EMP-00001")
44 self.assertEqual(call_log.get("status"), "Canceled")
45
46 def test_for_call_not_answered(self):
Suraj Shetty0e9ebad2022-04-04 07:23:08 +053047 from .exotel_test_data import call_not_answered_data
Subin Tome57e7bb2022-04-02 17:16:56 +053048 api_method = "handle_missed_call"
Suraj Shetty0e9ebad2022-04-04 07:23:08 +053049 emulate_api_call(call_not_answered_data, api_method)
Subin Tome57e7bb2022-04-02 17:16:56 +053050
Suraj Shetty0e9ebad2022-04-04 07:23:08 +053051 call_log = frappe.get_doc("Call Log", call_not_answered_data.CallSid)
Subin Tome57e7bb2022-04-02 17:16:56 +053052
Suraj Shetty0e9ebad2022-04-04 07:23:08 +053053 self.assertEqual(call_log.get("from"), call_not_answered_data.CallFrom)
54 self.assertEqual(call_log.get("to"), call_not_answered_data.DialWhomNumber)
Subin Tome57e7bb2022-04-02 17:16:56 +053055 self.assertEqual(call_log.get("call_received_by"), "EMP-00001")
56 self.assertEqual(call_log.get("status"), "No Answer")
57
58 def tearDown(self):
59 frappe.db.rollback()
60
61
Suraj Shetty0e9ebad2022-04-04 07:23:08 +053062def emulate_api_call(data, api_method):
Subin Tome57e7bb2022-04-02 17:16:56 +053063 # Build URL
Suraj Shetty0e9ebad2022-04-04 07:23:08 +053064 url = get_exotel_handler_endpoint(api_method)
65 res = requests.post(url=url, data=frappe.as_json(data))
66 res.raise_for_status()
67 time.sleep(1)
68
69def get_exotel_handler_endpoint(method):
70 site = "localhost" if os.environ.get("CI") else frappe.local.site
Subin Tome57e7bb2022-04-02 17:16:56 +053071 port = frappe.get_site_config().webserver_port or "8000"
Suraj Shetty0e9ebad2022-04-04 07:23:08 +053072 return f"http://{site}:{port}/api/method/erpnext.erpnext_integrations.exotel_integration.{method}"