From 728254e4e44feaee867abf1465c8408d0b4b44df Mon Sep 17 00:00:00 2001
From: shrishyam-avaya <90774352+shrishyam-avaya@users.noreply.github.com>
Date: Thu, 17 Nov 2022 21:38:59 +0530
Subject: [PATCH] Support Refer verb in python sdk (#17)
---
docs/examples/inboundxml/refer.py | 22 ++++++++
tests/inboundxml/inboundxml_test_suit.py | 2 +
tests/inboundxml/test_refer.py | 71 ++++++++++++++++++++++++
tests/test_util.py | 2 +-
zang/inboundxml/__init__.py | 2 +
zang/inboundxml/elements/refer.py | 63 +++++++++++++++++++++
zang/inboundxml/elements/response.py | 2 +
7 files changed, 163 insertions(+), 1 deletion(-)
create mode 100644 docs/examples/inboundxml/refer.py
create mode 100644 tests/inboundxml/test_refer.py
create mode 100644 zang/inboundxml/elements/refer.py
diff --git a/docs/examples/inboundxml/refer.py b/docs/examples/inboundxml/refer.py
new file mode 100644
index 0000000..4bcb60f
--- /dev/null
+++ b/docs/examples/inboundxml/refer.py
@@ -0,0 +1,22 @@
+from zang.inboundxml import Response, Refer, Sip
+
+from zang.domain.enums.http_method import HttpMethod
+
+refer = Refer(
+ action="https://example.com/actionURL",
+ method=HttpMethod.POST,
+ timeout=180,
+ callbackUrl="https://example.com/callbackURL",
+ callbackMethod=HttpMethod.POST,
+ )
+
+sip = Sip("username@example.com",
+ username="username",
+ password="pass",)
+
+refer.addElement(sip)
+
+response = Response()
+response.addElement(refer)
+
+print(response.xml)
diff --git a/tests/inboundxml/inboundxml_test_suit.py b/tests/inboundxml/inboundxml_test_suit.py
index 421fb49..fd41207 100644
--- a/tests/inboundxml/inboundxml_test_suit.py
+++ b/tests/inboundxml/inboundxml_test_suit.py
@@ -3,6 +3,7 @@
from tests.inboundxml.test_hangup import TestHangup
from tests.inboundxml.test_pause import TestPause
from tests.inboundxml.test_ping import TestPing
+from tests.inboundxml.test_refer import TestRefer
from tests.inboundxml.test_sip import TestSip
from tests.inboundxml.test_number import TestNumber
from tests.inboundxml.test_reject import TestReject
@@ -26,6 +27,7 @@ def suite():
test_suite = unittest.TestSuite()
test_suite.addTest(unittest.makeSuite(TestResponse))
test_suite.addTest(unittest.makeSuite(TestDial))
+ test_suite.addTest(unittest.makeSuite(TestRefer))
test_suite.addTest(unittest.makeSuite(TestGather))
test_suite.addTest(unittest.makeSuite(TestSms))
test_suite.addTest(unittest.makeSuite(TestMms))
diff --git a/tests/inboundxml/test_refer.py b/tests/inboundxml/test_refer.py
new file mode 100644
index 0000000..b6738d7
--- /dev/null
+++ b/tests/inboundxml/test_refer.py
@@ -0,0 +1,71 @@
+import unittest
+from zang.inboundxml.elements.refer import Refer
+from zang.domain.enums.http_method import HttpMethod
+from zang.inboundxml.elements.sip import Sip
+
+
+class TestRefer(unittest.TestCase):
+
+ def test_init_with_required_values(self):
+ expected = ''
+ assert Refer().xml == expected
+
+ def test_init_with_arguments(self):
+ text = 'sip:username@example.com'
+ refer = Refer(address=text)
+ expected = '%s' % text
+ assert refer.xml == expected
+
+ def test_init_add_element(self):
+ text = 'username@example.com'
+ sip = Sip(text)
+ refer = Refer()
+ refer.addElement(sip)
+ expected = '%s' % text
+ assert refer.xml == expected
+
+ def test_init_remove_element_at_index(self):
+ text = 'Hello from Avaya CPaaS!'
+ sip = Sip(text)
+ refer = Refer()
+ refer.addElement(sip)
+ expected = '%s' % text
+ assert refer.xml == expected
+ refer.removeElementAtIndex(0)
+ expected = ''
+ assert refer.xml == expected
+
+ def test_remove_element_at_out_of_range_index(self):
+ text = 'Hello from Avaya CPaaS!'
+ sip = Sip(text)
+ refer = Refer()
+ refer.addElement(sip)
+ index = len(refer._content)
+ self.assertRaises(
+ IndexError, lambda: refer.removeElementAtIndex(index))
+
+ def test_init_with_optional_attributes(self):
+ method = HttpMethod.GET
+ refer = Refer(method=method)
+ expected = '' % (method.value)
+ assert refer.xml == expected
+
+ def test_init_with_unsupported_attributes(self):
+ self.assertRaises(TypeError, lambda: Refer(foo='bar'))
+
+ def test_with_update_attributes(self):
+ refer = Refer()
+ timeout = 0
+ refer.timeout = 0
+ expected = '' % (timeout)
+ assert refer.xml == expected
+
+ def test_udefinded_method_with_primitive_type(self):
+ self.assertRaises(TypeError, lambda: Refer().addElement(0.5))
+
+ def test_udefinded_method_with_base_node(self):
+ self.assertRaises(AttributeError, lambda: Refer().url)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/tests/test_util.py b/tests/test_util.py
index 3b1d3b5..3a1dc89 100644
--- a/tests/test_util.py
+++ b/tests/test_util.py
@@ -17,7 +17,7 @@
AUTH_TOKEN = 'TestToken'
PORT_NUMBER = 41123
-URL = 'https://localhost:' + str(PORT_NUMBER)
+URL = 'http://localhost:' + str(PORT_NUMBER)
RESOURCES_PATH = os.path.abspath(os.path.join(
os.path.dirname(__file__), 'resources')
diff --git a/zang/inboundxml/__init__.py b/zang/inboundxml/__init__.py
index 1bb5764..7fb32ea 100644
--- a/zang/inboundxml/__init__.py
+++ b/zang/inboundxml/__init__.py
@@ -3,6 +3,7 @@
from .elements.answer import Answer # NOQA
from .elements.conference import Conference # NOQA
from .elements.dial import Dial # NOQA
+from .elements.refer import Refer # NOQA
from .elements.gather import Gather # NOQA
from .elements.connect import Connect # NOQA
from .elements.hangup import Hangup # NOQA
@@ -34,6 +35,7 @@
'Answer',
'Conference',
'Dial',
+ 'Refer',
'Gather',
'Connect',
'Hangup',
diff --git a/zang/inboundxml/elements/refer.py b/zang/inboundxml/elements/refer.py
new file mode 100644
index 0000000..f4ac9a3
--- /dev/null
+++ b/zang/inboundxml/elements/refer.py
@@ -0,0 +1,63 @@
+# -*- coding: utf-8 -*-
+
+"""
+zang.inboundxml.elements.refer
+~~~~~~~~~~~~~~~~~~~
+Module containing `Refer` inbound xml element
+"""
+
+from zang.inboundxml.elements.base_node import BaseNode
+from zang.inboundxml.elements.sip import Sip
+
+import sys
+if sys.version_info > (3, 0):
+ str_classes = (str, bytes)
+
+
+class Refer(BaseNode):
+
+ _allowedContentClass = (
+ str,
+ int,
+ Sip,
+ )
+
+ def __init__(
+ self,
+ address=None,
+ action=None,
+ method=None,
+ timeout=None,
+ callbackUrl=None,
+ callbackMethod=None,):
+ self._value = address
+ self.action = action
+ self.method = method
+ self.timeout = timeout
+ self.callbackUrl = callbackUrl
+ self.callbackMethod = callbackMethod
+
+ self._content = []
+
+ @property
+ def address(self):
+ return self._value
+
+ @address.setter
+ def address(self, value):
+ if value is None:
+ raise TypeError
+ self._value = value
+
+ @property
+ def elements(self):
+ return self._content
+
+ def addElement(self, element):
+ if isinstance(element, type(self)._allowedContentClass):
+ self._content.append(element)
+ else:
+ raise TypeError('Element not allowed for content model')
+
+ def removeElementAtIndex(self, index):
+ del self._content[index]
diff --git a/zang/inboundxml/elements/response.py b/zang/inboundxml/elements/response.py
index 71fba13..69b02a6 100644
--- a/zang/inboundxml/elements/response.py
+++ b/zang/inboundxml/elements/response.py
@@ -18,6 +18,7 @@
from zang.inboundxml.elements.play_last_recording import PlayLastRecording
from zang.inboundxml.elements.reject import Reject
from zang.inboundxml.elements.dial import Dial
+from zang.inboundxml.elements.refer import Refer
from zang.inboundxml.elements.hangup import Hangup
from zang.inboundxml.elements.say import Say
from zang.inboundxml.elements.play import Play
@@ -37,6 +38,7 @@ class Response(BaseNode):
PlayLastRecording,
Reject,
Dial,
+ Refer,
Hangup,
Say,
Play,