Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions bandwidth/models/bxml/verbs/transfer.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def __init__(
password: str=None, fallback_username: str=None,
fallback_password: str=None, tag: str=None,
diversion_treatment: str=None, diversion_reason: str=None,
privacy: bool=None
privacy: bool=None, attestation_level: str=None, identity: str=None
):
"""Initialize a <Transfer> verb

Expand Down Expand Up @@ -63,6 +63,8 @@ def __init__(
This parameter is considered only when diversionTreatment is set to stack. Defaults is unknown.
Defaults to None.
privacy (bool, optional): A boolean value to indicate whether the calling number should be hidden. Use transfer_caller_display_name to customize the displayed name. Default is false.
attestation_level (str, optional): The STIR/SHAKEN attestation level to sign the transferred call with. Can be A, B, or C. Only applies to accounts using the Hosted Signing Service. Cannot be combined with identity. Defaults to None.
identity (str, optional): A SIP Identity header value (PASSporT) signed by you, sent unmodified on the transferred call. Max length 2000 characters. Cannot be combined with attestation_level. Defaults to None.
"""
self.transfer_to = transfer_to
self.transfer_caller_id = transfer_caller_id
Expand All @@ -80,6 +82,8 @@ def __init__(
self.diversion_treatment = diversion_treatment
self.diversion_reason = diversion_reason
self.privacy = privacy
self.attestation_level = attestation_level
self.identity = identity
super().__init__(
tag="Transfer",
nested_verbs=self.transfer_to
Expand All @@ -102,7 +106,9 @@ def _attributes(self):
"fallbackPassword": self.fallback_password,
"tag": self.tag,
"diversionTreatment": self.diversion_treatment,
"diversionReason": self.diversion_reason
"diversionReason": self.diversion_reason,
"attestationLevel": self.attestation_level,
"identity": self.identity
}

def add_transfer_recipient(self, recipient: Union[PhoneNumber, SipUri]):
Expand Down
15 changes: 12 additions & 3 deletions test/unit/models/bxml/test_transfer.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ def setUp(self):
fallback_username="fallbackUser",
fallback_password="fallbackPass",
diversion_treatment="propagate",
diversion_reason="away"
diversion_reason="away",
attestation_level="A"
)

def test_instance(self):
Expand All @@ -46,10 +47,18 @@ def test_instance(self):
assert isinstance(self.transfer, Verb)

def test_to_bxml(self):
expected = '<Transfer transferCallerId="+19195554321" privacy="true" transferCallerDisplayName="test" callTimeout="15" transferCompleteUrl="https://example.com/transfer_complete" transferCompleteMethod="POST" transferCompleteFallbackUrl="https://fallback.example.com/transfer_complete" transferCompleteFallbackMethod="GET" username="user" password="pass" fallbackUsername="fallbackUser" fallbackPassword="fallbackPass" tag="test" diversionTreatment="propagate" diversionReason="away"><SipUri uui="test">sip@bw.com</SipUri></Transfer>'
expected = '<Transfer transferCallerId="+19195554321" privacy="true" transferCallerDisplayName="test" callTimeout="15" transferCompleteUrl="https://example.com/transfer_complete" transferCompleteMethod="POST" transferCompleteFallbackUrl="https://fallback.example.com/transfer_complete" transferCompleteFallbackMethod="GET" username="user" password="pass" fallbackUsername="fallbackUser" fallbackPassword="fallbackPass" tag="test" diversionTreatment="propagate" diversionReason="away" attestationLevel="A"><SipUri uui="test">sip@bw.com</SipUri></Transfer>'
assert expected == self.transfer.to_bxml()

def test_add_verb(self):
expected = '<Transfer transferCallerId="+19195554321" privacy="true" transferCallerDisplayName="test" callTimeout="15" transferCompleteUrl="https://example.com/transfer_complete" transferCompleteMethod="POST" transferCompleteFallbackUrl="https://fallback.example.com/transfer_complete" transferCompleteFallbackMethod="GET" username="user" password="pass" fallbackUsername="fallbackUser" fallbackPassword="fallbackPass" tag="test" diversionTreatment="propagate" diversionReason="away"><SipUri uui="test">sip@bw.com</SipUri><PhoneNumber tag="test">+19195551234</PhoneNumber></Transfer>'
expected = '<Transfer transferCallerId="+19195554321" privacy="true" transferCallerDisplayName="test" callTimeout="15" transferCompleteUrl="https://example.com/transfer_complete" transferCompleteMethod="POST" transferCompleteFallbackUrl="https://fallback.example.com/transfer_complete" transferCompleteFallbackMethod="GET" username="user" password="pass" fallbackUsername="fallbackUser" fallbackPassword="fallbackPass" tag="test" diversionTreatment="propagate" diversionReason="away" attestationLevel="A"><SipUri uui="test">sip@bw.com</SipUri><PhoneNumber tag="test">+19195551234</PhoneNumber></Transfer>'
self.transfer.add_transfer_recipient(self.phone_number)
assert expected == self.transfer.to_bxml()

def test_identity_to_bxml(self):
transfer = Transfer(
transfer_to=[self.sip_uri],
identity="eyJhbGciOiJFUzI1NiJ9.e30.c2ln;info=<https://example.com/cert.pem>;ppt=\"shaken\""
)
expected = '<Transfer identity="eyJhbGciOiJFUzI1NiJ9.e30.c2ln;info=<https://example.com/cert.pem>;ppt=&quot;shaken&quot;"><SipUri uui="test">sip@bw.com</SipUri></Transfer>'
assert expected == transfer.to_bxml()