Skip to content
This repository has been archived by the owner on Nov 20, 2024. It is now read-only.

Commit

Permalink
Support Refer verb in python sdk (#17)
Browse files Browse the repository at this point in the history
  • Loading branch information
shrishyam-avaya authored Nov 17, 2022
1 parent fcff67c commit 728254e
Show file tree
Hide file tree
Showing 7 changed files with 163 additions and 1 deletion.
22 changes: 22 additions & 0 deletions docs/examples/inboundxml/refer.py
Original file line number Diff line number Diff line change
@@ -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)
2 changes: 2 additions & 0 deletions tests/inboundxml/inboundxml_test_suit.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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))
Expand Down
71 changes: 71 additions & 0 deletions tests/inboundxml/test_refer.py
Original file line number Diff line number Diff line change
@@ -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 = '<Refer></Refer>'
assert Refer().xml == expected

def test_init_with_arguments(self):
text = 'sip:username@example.com'
refer = Refer(address=text)
expected = '<Refer>%s</Refer>' % text
assert refer.xml == expected

def test_init_add_element(self):
text = 'username@example.com'
sip = Sip(text)
refer = Refer()
refer.addElement(sip)
expected = '<Refer><Sip>%s</Sip></Refer>' % 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 = '<Refer><Sip>%s</Sip></Refer>' % text
assert refer.xml == expected
refer.removeElementAtIndex(0)
expected = '<Refer></Refer>'
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 = '<Refer method="%s"></Refer>' % (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 = '<Refer timeout="%s"></Refer>' % (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()
2 changes: 1 addition & 1 deletion tests/test_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down
2 changes: 2 additions & 0 deletions zang/inboundxml/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -34,6 +35,7 @@
'Answer',
'Conference',
'Dial',
'Refer',
'Gather',
'Connect',
'Hangup',
Expand Down
63 changes: 63 additions & 0 deletions zang/inboundxml/elements/refer.py
Original file line number Diff line number Diff line change
@@ -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]
2 changes: 2 additions & 0 deletions zang/inboundxml/elements/response.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -37,6 +38,7 @@ class Response(BaseNode):
PlayLastRecording,
Reject,
Dial,
Refer,
Hangup,
Say,
Play,
Expand Down

0 comments on commit 728254e

Please sign in to comment.