From a54db1e42cea490661105cd2f7bd6895b003b8a9 Mon Sep 17 00:00:00 2001 From: AJ Rice <53190766+ajrice6713@users.noreply.github.com> Date: Tue, 13 Sep 2022 14:52:25 -0400 Subject: [PATCH 1/3] DX-2849 Add `webrtc_utils` Add WebRTC Utilities module with helper methods to generate transfer BXML --- bandwidth/utilities/init.py | 0 bandwidth/utilities/web_rtc.py | 49 ++++++++++++++++++++++++++++++ test/unit/test_bxml.py | 15 +-------- test/unit/test_webrtc_utilities.py | 19 ++++++++++++ 4 files changed, 69 insertions(+), 14 deletions(-) create mode 100644 bandwidth/utilities/init.py create mode 100644 bandwidth/utilities/web_rtc.py create mode 100644 test/unit/test_webrtc_utilities.py diff --git a/bandwidth/utilities/init.py b/bandwidth/utilities/init.py new file mode 100644 index 00000000..e69de29b diff --git a/bandwidth/utilities/web_rtc.py b/bandwidth/utilities/web_rtc.py new file mode 100644 index 00000000..74d8ac1c --- /dev/null +++ b/bandwidth/utilities/web_rtc.py @@ -0,0 +1,49 @@ +from bandwidth.model.bxml.response import Response +from bandwidth.model.bxml.verbs import * + + +def generate_transfer_verb(device_token: str, voice_call_id: str, sip_uri: str = 'sip:sipx.webrtc.bandwidth.com:5060') -> str: + """Returns the Transfer verb to perform the SIP transfer without the Response wrapper + + Args: + device_token (str): The device token. + voice_call_id (str): The Bandwidth voice Call ID. + sip_uri (str, optional): The SIP URI to transfer the call to. Defaults to 'sip:sipx.webrtc.bandwidth.com:5060'. + + Returns: + str: BXML Verb + """ + uui = "".join(voice_call_id.split("-")[1::]) + sip_uri = SipUri( + uui=f"{uui};encoding=base64,{device_token};encoding=jwt", + uri=sip_uri + ) + transfer = Transfer( + sip_uris=[sip_uri] + + ) + return transfer.to_bxml() + + +def generate_transfer_bxml(device_token: str, voice_call_id: str, sip_uri: str = 'sip:sipx.webrtc.bandwidth.com:5060') -> str: + """Generate BXML document with WebRTC a device token to perform a SIP transfer + + Args: + device_token (str): The device token. + voice_call_id (str): The Bandwidth voice Call ID. + sip_uri (str, optional): The SIP URI to transfer the call to. Defaults to 'sip:sipx.webrtc.bandwidth.com:5060'. + + Returns: + str: BXML document with transfer BXML + """ + uui = "".join(voice_call_id.split("-")[1::]) + transfer_bxml = Response() + sip_uri = SipUri( + uui=f"{uui};encoding=base64,{device_token};encoding=jwt", + uri=sip_uri + ) + transfer = Transfer( + sip_uris=[sip_uri] + ) + transfer_bxml.add_verb(transfer) + return transfer_bxml.to_bxml() diff --git a/test/unit/test_bxml.py b/test/unit/test_bxml.py index 95c7c062..27918c11 100644 --- a/test/unit/test_bxml.py +++ b/test/unit/test_bxml.py @@ -10,6 +10,7 @@ from bandwidth.model.bxml.response import Response from bandwidth.model.bxml.bxml import Bxml from bandwidth.model.bxml.verbs import * +from bandwidth.utilities import web_rtc class TestBxml: @@ -396,20 +397,6 @@ def test_bxml_speak_sentence_pause(self): bxml.add_verb(speak_sentence) bxml.add_verb(pause) assert bxml.to_bxml() == expected_bxml - - @pytest.mark.skip(reason="This model is not yet implemented") - def test_generate_transfer_bxml(self): - expected = 'sip:sipx.webrtc.bandwidth.com:5060' - actual = generate_transfer_bxml( - 'asdf', 'c-93d6f3c0-be584596-0b74-4fa2-8015-d8ede84bd1a4') - assert actual == expected - - @pytest.mark.skip(reason="This model is not yet implemented") - def test_generate_transfer_bxml_verb(self): - expected = 'sip:sipx.webrtc.bandwidth.com:5060' - actual = generate_transfer_bxml_verb( - 'asdf', 'c-93d6f3c0-be584596-0b74-4fa2-8015-d8ede84bd1a4') - assert actual == expected def test_start_stream_bxml_verb(self): expected = '' diff --git a/test/unit/test_webrtc_utilities.py b/test/unit/test_webrtc_utilities.py new file mode 100644 index 00000000..da42823f --- /dev/null +++ b/test/unit/test_webrtc_utilities.py @@ -0,0 +1,19 @@ +from bandwidth.utilities.web_rtc import * + + +class TestWebRtcUtilities: + """ + Class for the WebRTC Utilities Tests + """ + + def test_generate_transfer_bxml(self): + expected = 'sip:sipx.webrtc.bandwidth.com:5060' + actual = generate_transfer_bxml( + 'asdf', 'c-93d6f3c0-be584596-0b74-4fa2-8015-d8ede84bd1a4') + assert actual == expected + + def test_generate_transfer_verb(self): + expected = 'sip:sipx.webrtc.bandwidth.com:5060' + actual = generate_transfer_verb( + 'asdf', 'c-93d6f3c0-be584596-0b74-4fa2-8015-d8ede84bd1a4') + assert actual == expected From 484052f13390adb4f6c7e82b51ff1f3a9baeac3f Mon Sep 17 00:00:00 2001 From: AJ Rice <53190766+ajrice6713@users.noreply.github.com> Date: Tue, 13 Sep 2022 16:29:47 -0400 Subject: [PATCH 2/3] Made it fancier --- bandwidth/utilities/web_rtc.py | 37 +++++++++++++++++------------- test/unit/test_webrtc_utilities.py | 8 +++---- 2 files changed, 25 insertions(+), 20 deletions(-) diff --git a/bandwidth/utilities/web_rtc.py b/bandwidth/utilities/web_rtc.py index 74d8ac1c..3a7a1b29 100644 --- a/bandwidth/utilities/web_rtc.py +++ b/bandwidth/utilities/web_rtc.py @@ -2,8 +2,8 @@ from bandwidth.model.bxml.verbs import * -def generate_transfer_verb(device_token: str, voice_call_id: str, sip_uri: str = 'sip:sipx.webrtc.bandwidth.com:5060') -> str: - """Returns the Transfer verb to perform the SIP transfer without the Response wrapper +def _generate_transfer_verb(device_token: str, voice_call_id: str, sip_uri: str = 'sip:sipx.webrtc.bandwidth.com:5060') -> Transfer: + """Generate a Transfer object for a WebRTC Session Args: device_token (str): The device token. @@ -11,7 +11,7 @@ def generate_transfer_verb(device_token: str, voice_call_id: str, sip_uri: str = sip_uri (str, optional): The SIP URI to transfer the call to. Defaults to 'sip:sipx.webrtc.bandwidth.com:5060'. Returns: - str: BXML Verb + Transfer: Returns a Transfer BXML Verb Object """ uui = "".join(voice_call_id.split("-")[1::]) sip_uri = SipUri( @@ -20,12 +20,25 @@ def generate_transfer_verb(device_token: str, voice_call_id: str, sip_uri: str = ) transfer = Transfer( sip_uris=[sip_uri] - ) - return transfer.to_bxml() + return transfer def generate_transfer_bxml(device_token: str, voice_call_id: str, sip_uri: str = 'sip:sipx.webrtc.bandwidth.com:5060') -> str: + """Returns the Transfer verb to perform the SIP transfer without the Response wrapper + + Args: + device_token (str): The device token. + voice_call_id (str): The Bandwidth voice Call ID. + sip_uri (str, optional): The SIP URI to transfer the call to. Defaults to 'sip:sipx.webrtc.bandwidth.com:5060'. + + Returns: + str: BXML Verb + """ + return _generate_transfer_verb(device_token, voice_call_id, sip_uri).to_bxml() + + +def generate_transfer_bxml_document(device_token: str, voice_call_id: str, sip_uri: str = 'sip:sipx.webrtc.bandwidth.com:5060') -> str: """Generate BXML document with WebRTC a device token to perform a SIP transfer Args: @@ -36,14 +49,6 @@ def generate_transfer_bxml(device_token: str, voice_call_id: str, sip_uri: str = Returns: str: BXML document with transfer BXML """ - uui = "".join(voice_call_id.split("-")[1::]) - transfer_bxml = Response() - sip_uri = SipUri( - uui=f"{uui};encoding=base64,{device_token};encoding=jwt", - uri=sip_uri - ) - transfer = Transfer( - sip_uris=[sip_uri] - ) - transfer_bxml.add_verb(transfer) - return transfer_bxml.to_bxml() + response = Response() + response.add_verb(_generate_transfer_verb(device_token, voice_call_id, sip_uri)) + return response.to_bxml() diff --git a/test/unit/test_webrtc_utilities.py b/test/unit/test_webrtc_utilities.py index da42823f..9aea55a1 100644 --- a/test/unit/test_webrtc_utilities.py +++ b/test/unit/test_webrtc_utilities.py @@ -7,13 +7,13 @@ class TestWebRtcUtilities: """ def test_generate_transfer_bxml(self): - expected = 'sip:sipx.webrtc.bandwidth.com:5060' + expected = 'sip:sipx.webrtc.bandwidth.com:5060' actual = generate_transfer_bxml( 'asdf', 'c-93d6f3c0-be584596-0b74-4fa2-8015-d8ede84bd1a4') assert actual == expected - def test_generate_transfer_verb(self): - expected = 'sip:sipx.webrtc.bandwidth.com:5060' - actual = generate_transfer_verb( + def test_generate_transfer_bxml_document(self): + expected = 'sip:sipx.webrtc.bandwidth.com:5060' + actual = generate_transfer_bxml_document( 'asdf', 'c-93d6f3c0-be584596-0b74-4fa2-8015-d8ede84bd1a4') assert actual == expected From 3541e1263424b510009912e118f5d4bfcdeb59cb Mon Sep 17 00:00:00 2001 From: AJ Rice <53190766+ajrice6713@users.noreply.github.com> Date: Thu, 15 Sep 2022 10:07:02 -0400 Subject: [PATCH 3/3] Refactor function names --- bandwidth/utilities/web_rtc.py | 10 +++++----- test/unit/test_webrtc_utilities.py | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/bandwidth/utilities/web_rtc.py b/bandwidth/utilities/web_rtc.py index 3a7a1b29..8358e09d 100644 --- a/bandwidth/utilities/web_rtc.py +++ b/bandwidth/utilities/web_rtc.py @@ -2,7 +2,7 @@ from bandwidth.model.bxml.verbs import * -def _generate_transfer_verb(device_token: str, voice_call_id: str, sip_uri: str = 'sip:sipx.webrtc.bandwidth.com:5060') -> Transfer: +def _generate_transfer_model(device_token: str, voice_call_id: str, sip_uri: str = 'sip:sipx.webrtc.bandwidth.com:5060') -> Transfer: """Generate a Transfer object for a WebRTC Session Args: @@ -24,7 +24,7 @@ def _generate_transfer_verb(device_token: str, voice_call_id: str, sip_uri: str return transfer -def generate_transfer_bxml(device_token: str, voice_call_id: str, sip_uri: str = 'sip:sipx.webrtc.bandwidth.com:5060') -> str: +def generate_transfer_bxml_verb(device_token: str, voice_call_id: str, sip_uri: str = 'sip:sipx.webrtc.bandwidth.com:5060') -> str: """Returns the Transfer verb to perform the SIP transfer without the Response wrapper Args: @@ -35,10 +35,10 @@ def generate_transfer_bxml(device_token: str, voice_call_id: str, sip_uri: str = Returns: str: BXML Verb """ - return _generate_transfer_verb(device_token, voice_call_id, sip_uri).to_bxml() + return _generate_transfer_model(device_token, voice_call_id, sip_uri).to_bxml() -def generate_transfer_bxml_document(device_token: str, voice_call_id: str, sip_uri: str = 'sip:sipx.webrtc.bandwidth.com:5060') -> str: +def generate_transfer_bxml(device_token: str, voice_call_id: str, sip_uri: str = 'sip:sipx.webrtc.bandwidth.com:5060') -> str: """Generate BXML document with WebRTC a device token to perform a SIP transfer Args: @@ -50,5 +50,5 @@ def generate_transfer_bxml_document(device_token: str, voice_call_id: str, sip_u str: BXML document with transfer BXML """ response = Response() - response.add_verb(_generate_transfer_verb(device_token, voice_call_id, sip_uri)) + response.add_verb(_generate_transfer_model(device_token, voice_call_id, sip_uri)) return response.to_bxml() diff --git a/test/unit/test_webrtc_utilities.py b/test/unit/test_webrtc_utilities.py index 9aea55a1..9a60d81d 100644 --- a/test/unit/test_webrtc_utilities.py +++ b/test/unit/test_webrtc_utilities.py @@ -8,12 +8,12 @@ class TestWebRtcUtilities: def test_generate_transfer_bxml(self): expected = 'sip:sipx.webrtc.bandwidth.com:5060' - actual = generate_transfer_bxml( + actual = generate_transfer_bxml_verb( 'asdf', 'c-93d6f3c0-be584596-0b74-4fa2-8015-d8ede84bd1a4') assert actual == expected def test_generate_transfer_bxml_document(self): expected = 'sip:sipx.webrtc.bandwidth.com:5060' - actual = generate_transfer_bxml_document( + actual = generate_transfer_bxml( 'asdf', 'c-93d6f3c0-be584596-0b74-4fa2-8015-d8ede84bd1a4') assert actual == expected