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,