Skip to content

Commit 0ddc183

Browse files
authored
DX-2842 add StartStream and StopStream BXML (#109)
* DX-2842 add `StartStream` and `StopStream` BXML * Wrong import statements copy/paste error * Skip missed generate_transfer_bxml unit tests * add pytest import statement
1 parent ee67e2d commit 0ddc183

File tree

4 files changed

+137
-1
lines changed

4 files changed

+137
-1
lines changed

bandwidth/model/bxml/verbs/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,5 @@
2020
from .start_gather import StartGather
2121
from .tag import Tag
2222
from .sip_uri import SipUri
23+
from .start_stream import StartStream
24+
from .stop_stream import StopStream
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
"""
2+
start_stream.py
3+
Representation of Bandwidth's start stream BXML verb
4+
@copyright Bandwidth INC
5+
"""
6+
7+
from lxml import etree
8+
9+
from .base_verb import AbstractBxmlVerb
10+
11+
START_STREAM_TAG = "StartStream"
12+
13+
14+
class StartStream(AbstractBxmlVerb):
15+
16+
def __init__(self, destination, name=None, tracks=None, streamEventUrl=None, streamEventMethod=None, username=None, password=None):
17+
"""
18+
Initializes the PlayAudio class with the following parameters
19+
:param str destination: A websocket URI to send the stream to
20+
:param str name: A name to refer to this stream by
21+
:param str tracks: The part of the call to send a stream from. `inbound`, `outbound` or `both`.
22+
:param str streamEventUrl: URL to send the associated Webhook events to during this stream's lifetime
23+
:param str streamEventMethod: The HTTP method to use for the request to `streamEventUrl`. `GET` or `POST`
24+
:param str username: The username to send in the HTTP request to `streamEventUrl`
25+
:param str password: The password to send in the HTTP request to `streamEventUrl`
26+
"""
27+
self.destination = destination
28+
self.name = name
29+
self.tracks = tracks
30+
self.streamEventUrl = streamEventUrl
31+
self.streamEventMethod = streamEventMethod
32+
self.username = username
33+
self.password = password
34+
35+
def to_etree_element(self):
36+
"""
37+
Converts the class into an etree element. Used for other verb classes to build xml
38+
:return etree.Element: The etree Element representing this class
39+
"""
40+
root = etree.Element(START_STREAM_TAG)
41+
root.set("destination", self.destination)
42+
if self.name is not None:
43+
root.set("name", self.name)
44+
if self.tracks is not None:
45+
root.set("tracks", self.tracks)
46+
if self.streamEventUrl is not None:
47+
root.set("streamEventUrl", self.streamEventUrl)
48+
if self.streamEventMethod is not None:
49+
root.set("streamEventMethod", self.streamEventMethod)
50+
if self.username is not None:
51+
root.set("username", self.username)
52+
if self.password is not None:
53+
root.set("password", self.password)
54+
return root
55+
56+
def to_bxml(self):
57+
return etree.tostring(self.to_etree_element()).decode()
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
2+
3+
"""
4+
start_stream.py
5+
Representation of Bandwidth's start stream BXML verb
6+
@copyright Bandwidth INC
7+
"""
8+
9+
from lxml import etree
10+
11+
from .base_verb import AbstractBxmlVerb
12+
13+
STOP_STREAM_TAG = "StopStream"
14+
15+
16+
class StopStream(AbstractBxmlVerb):
17+
18+
def __init__(self, name):
19+
"""
20+
Initializes the PlayAudio class with the following parameters
21+
:param str name: The name of the stream to stop
22+
"""
23+
self.name = name
24+
25+
def to_etree_element(self):
26+
"""
27+
Converts the class into an etree element. Used for other verb classes to build xml
28+
:return etree.Element: The etree Element representing this class
29+
"""
30+
root = etree.Element(STOP_STREAM_TAG)
31+
root.set("name", self.name)
32+
return root
33+
34+
def to_bxml(self):
35+
return etree.tostring(self.to_etree_element()).decode()

test/unit/test_bxml.py

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
66
@copyright Bandwidth Inc.
77
"""
8+
import pytest
89

910
from bandwidth.model.bxml.response import Response
1011
from bandwidth.model.bxml.bxml import Bxml
@@ -396,5 +397,46 @@ def test_bxml_speak_sentence_pause(self):
396397
bxml.add_verb(pause)
397398
assert bxml.to_bxml() == expected_bxml
398399

400+
@pytest.mark.skip(reason="This model is not yet implemented")
401+
def test_generate_transfer_bxml(self):
402+
expected = '<?xml version="1.0" encoding="UTF-8"?><Response><Transfer><SipUri uui="93d6f3c0be5845960b744fa28015d8ede84bd1a4;encoding=base64,asdf;encoding=jwt">sip:sipx.webrtc.bandwidth.com:5060</SipUri></Transfer></Response>'
403+
actual = generate_transfer_bxml(
404+
'asdf', 'c-93d6f3c0-be584596-0b74-4fa2-8015-d8ede84bd1a4')
405+
assert actual == expected
406+
407+
@pytest.mark.skip(reason="This model is not yet implemented")
408+
def test_generate_transfer_bxml_verb(self):
409+
expected = '<Transfer><SipUri uui="93d6f3c0be5845960b744fa28015d8ede84bd1a4;encoding=base64,asdf;encoding=jwt">sip:sipx.webrtc.bandwidth.com:5060</SipUri></Transfer>'
410+
actual = generate_transfer_bxml_verb(
411+
'asdf', 'c-93d6f3c0-be584596-0b74-4fa2-8015-d8ede84bd1a4')
412+
assert actual == expected
413+
414+
def test_start_stream_bxml_verb(self):
415+
expected = '<?xml version="1.0" encoding="UTF-8"?><Response><StartStream destination="https://www.test.com/stream" name="test_stream" tracks="inbound" streamEventUrl="https://www.test.com/event" streamEventMethod="POST" username="username" password="password"/></Response>'
416+
response = Response()
417+
start_stream = StartStream(
418+
destination='https://www.test.com/stream',
419+
name='test_stream',
420+
tracks='inbound',
421+
streamEventUrl='https://www.test.com/event',
422+
streamEventMethod='POST',
423+
username='username',
424+
password='password'
425+
)
426+
response.add_verb(start_stream)
427+
actual = response.to_bxml()
428+
429+
assert expected == actual
430+
431+
def test_stop_stream_bxml_verb(self):
432+
expected = '<?xml version="1.0" encoding="UTF-8"?><Response><StopStream name="test_stream"/></Response>'
433+
response = Response()
434+
stop_stream = StopStream(
435+
name='test_stream'
436+
)
437+
response.add_verb(stop_stream)
438+
actual = response.to_bxml()
439+
440+
assert expected == actual
441+
399442

400-

0 commit comments

Comments
 (0)