fix: added tests(fixed)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index cba6759..bc04b77 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -30,6 +30,9 @@
rev: 9cb0a69f4d0030cdf687eddf314468b39ed54119
hooks:
- id: black
+ additional_dependencies: [
+ 'click==8.0.4'
+ ]
- repo: https://github.com/timothycrosley/isort
rev: 5.9.1
diff --git a/erpnext/telephony/doctype/call_log/call_log.py b/erpnext/telephony/doctype/call_log/call_log.py
index 21fa9c9..7ef16d7 100644
--- a/erpnext/telephony/doctype/call_log/call_log.py
+++ b/erpnext/telephony/doctype/call_log/call_log.py
@@ -35,7 +35,6 @@
# Add Employee Name
if self.is_incoming_call():
# Taking the last 10 digits of the number
- employee_number = strip_number(self.get("to"))
employee = get_employees_with_number(self.get("to"))
self.call_received_by = employee[0].get("name")
diff --git a/erpnext/tests/test_exotel.py b/erpnext/tests/test_exotel.py
new file mode 100644
index 0000000..91e8f50
--- /dev/null
+++ b/erpnext/tests/test_exotel.py
@@ -0,0 +1,199 @@
+import os
+import time
+import unittest
+
+import frappe
+import requests
+from frappe.contacts.doctype.contact.test_contact import create_contact
+
+from erpnext.hr.doctype.employee.test_employee import make_employee
+
+
+class TestExotel(unittest.TestCase):
+ def setUp(self):
+ make_employee("test_employee_exotel@company.com", cell_number="9999999999")
+ phones = [{"phone": "+91 9999999991", "is_primary_phone": 0, "is_primary_mobile_no": 1}]
+ create_contact("Test Contact", "Mr", phones=phones)
+
+ def test_for_successful_call(self):
+ data = {
+ "CallSid": "23c162077629863c1a2d7f29263a162m",
+ "CallFrom": "09999999991",
+ "CallTo": "09999999980",
+ "Direction": "incoming",
+ "Created": "Wed, 23 Feb 2022 12:31:59",
+ "From": "09999999991",
+ "To": "09999999988",
+ "CurrentTime": "2022-02-23 12:32:02",
+ "DialWhomNumber": "09999999999",
+ "Status": "busy",
+ "EventType": "Dial",
+ "AgentEmail": "test_employee_exotel@company.com",
+ }
+ end_call_data = {
+ "CallSid": "23c162077629863c1a2d7f29263a162m",
+ "CallFrom": "09999999991",
+ "CallTo": "09999999980",
+ "Direction": "incoming",
+ "ForwardedFrom": "null",
+ "Created": "Wed, 23 Feb 2022 12:31:59",
+ "DialCallDuration": "17",
+ "RecordingUrl": "https://s3-ap-southeast-1.amazonaws.com/exotelrecordings/erpnext/23c162077629863c1a2d7f29263a162n.mp3",
+ "StartTime": "2022-02-23 12:31:58",
+ "EndTime": "1970-01-01 05:30:00",
+ "DialCallStatus": "completed",
+ "CallType": "completed",
+ "DialWhomNumber": "09999999999",
+ "ProcessStatus": "null",
+ "flow_id": "228040",
+ "tenant_id": "67291",
+ "From": "09999999991",
+ "To": "09999999988",
+ "RecordingAvailableBy": "Wed, 23 Feb 2022 12:37:25",
+ "CurrentTime": "2022-02-23 12:32:25",
+ "OutgoingPhoneNumber": "09999999988",
+ "Legs": [
+ {
+ "Number": "09999999999",
+ "Type": "single",
+ "OnCallDuration": "10",
+ "CallerId": "09999999980",
+ "CauseCode": "NORMAL_CLEARING",
+ "Cause": "16",
+ }
+ ],
+ }
+ api_method = "handle_incoming_call"
+ end_call_api_method = "handle_end_call"
+ emulate_api_call(data, api_method, end_call_data, end_call_api_method)
+
+ frappe.reload_doctype("Call Log")
+ call_log = frappe.get_doc(
+ "Call Log", {"from": "09999999991", "to": "09999999999", "status": "Completed"}
+ )
+
+ self.assertEqual(call_log.get("from"), "09999999991")
+ self.assertEqual(call_log.get("to"), "09999999999")
+ self.assertEqual(call_log.get("call_received_by"), "EMP-00001")
+ self.assertEqual(call_log.get("status"), "Completed")
+
+ def test_for_disconnected_call(self):
+ data = {
+ "CallSid": "d96421addce69e24bdc7ce5880d1162l",
+ "CallFrom": "09999999991",
+ "CallTo": "09999999980",
+ "Direction": "incoming",
+ "ForwardedFrom": "null",
+ "Created": "Mon, 21 Feb 2022 15:58:12",
+ "DialCallDuration": "0",
+ "StartTime": "2022-02-21 15:58:12",
+ "EndTime": "1970-01-01 05:30:00",
+ "DialCallStatus": "canceled",
+ "CallType": "client-hangup",
+ "DialWhomNumber": "09999999999",
+ "ProcessStatus": "null",
+ "flow_id": "228040",
+ "tenant_id": "67291",
+ "From": "09999999991",
+ "To": "09999999988",
+ "CurrentTime": "2022-02-21 15:58:47",
+ "OutgoingPhoneNumber": "09999999988",
+ "Legs": [
+ {
+ "Number": "09999999999",
+ "Type": "single",
+ "OnCallDuration": "0",
+ "CallerId": "09999999980",
+ "CauseCode": "RING_TIMEOUT",
+ "Cause": "1003",
+ }
+ ],
+ }
+ api_method = "handle_missed_call"
+ emulate_api_call(data, api_method)
+
+ frappe.reload_doctype("Call Log")
+ call_log = frappe.get_doc(
+ "Call Log", {"from": "09999999991", "to": "09999999999", "status": "Canceled"}
+ )
+
+ self.assertEqual(call_log.get("from"), "09999999991")
+ self.assertEqual(call_log.get("to"), "09999999999")
+ self.assertEqual(call_log.get("call_received_by"), "EMP-00001")
+ self.assertEqual(call_log.get("status"), "Canceled")
+
+ def test_for_call_not_answered(self):
+ data = {
+ "CallSid": "fdb67a2b4b2d057b610a52ef43f81622",
+ "CallFrom": "09999999991",
+ "CallTo": "09999999980",
+ "Direction": "incoming",
+ "ForwardedFrom": "null",
+ "Created": "Mon, 21 Feb 2022 15:47:02",
+ "DialCallDuration": "0",
+ "StartTime": "2022-02-21 15:47:02",
+ "EndTime": "1970-01-01 05:30:00",
+ "DialCallStatus": "no-answer",
+ "CallType": "incomplete",
+ "DialWhomNumber": "09999999999",
+ "ProcessStatus": "null",
+ "flow_id": "228040",
+ "tenant_id": "67291",
+ "From": "09999999991",
+ "To": "09999999988",
+ "CurrentTime": "2022-02-21 15:47:40",
+ "OutgoingPhoneNumber": "09999999988",
+ "Legs": [
+ {
+ "Number": "09999999999",
+ "Type": "single",
+ "OnCallDuration": "0",
+ "CallerId": "09999999980",
+ "CauseCode": "RING_TIMEOUT",
+ "Cause": "1003",
+ }
+ ],
+ }
+ api_method = "handle_missed_call"
+ emulate_api_call(data, api_method)
+
+ frappe.reload_doctype("Call Log")
+ call_log = frappe.get_doc(
+ "Call Log", {"from": "09999999991", "to": "09999999999", "status": "No Answer"}
+ )
+
+ self.assertEqual(call_log.get("from"), "09999999991")
+ self.assertEqual(call_log.get("to"), "09999999999")
+ self.assertEqual(call_log.get("call_received_by"), "EMP-00001")
+ self.assertEqual(call_log.get("status"), "No Answer")
+
+ def tearDown(self):
+ frappe.db.rollback()
+
+
+def emulate_api_call(data, api_method, end_call_data=None, end_call_api_method=None):
+ # Build URL
+ port = frappe.get_site_config().webserver_port or "8000"
+
+ if os.environ.get("CI"):
+ host = "localhost"
+ else:
+ host = frappe.local.site
+
+ url = "http://{site}:{port}/api/method/erpnext.erpnext_integrations.exotel_integration.{api_method}".format(
+ site=host, port=port, api_method=api_method
+ )
+
+ if end_call_data:
+ end_call_url = "http://{site}:{port}/api/method/erpnext.erpnext_integrations.exotel_integration.{end_call_api_method}".format(
+ site=host, port=port, end_call_api_method=end_call_api_method
+ )
+
+ requests.post(url=url, data=data)
+ time.sleep(3)
+
+ if end_call_data:
+ requests.post(url=end_call_url, data=end_call_data)
+ time.sleep(3)
+
+ return