Skip to content

Commit fe5d76f

Browse files
committed
changes in create_session with tests. fixes #7, fixes #8, fixes #9, fixes #11
1 parent 5789053 commit fe5d76f

File tree

6 files changed

+130
-24
lines changed

6 files changed

+130
-24
lines changed

opentok/__init__.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from .opentok import OpenTok, Roles
2+
from .session import Session
23
from .exceptions import OpenTokException
3-
4-
# see: http://legacy.python.org/dev/peps/pep-0440/#public-version-identifiers
5-
__version__ = '2.2.0a0'
4+
from .version import __version__
65

opentok/opentok.py

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@
77
import random # generate_token
88
import requests # create_session, archiving
99
import json # archiving
10+
from socket import inet_aton # create_session
11+
import xml.dom.minidom as xmldom # create_session
1012

1113
from .exceptions import OpenTokException, RequestError, AuthError, NotFoundError, ArchiveError
14+
from .session import Session
15+
from .version import __version__
1216

1317
# compat
1418
from six.moves import map
@@ -25,12 +29,6 @@ class Roles(Enum):
2529
moderator = u('moderator') # Can do the above along with forceDisconnect and forceUnpublish
2630

2731

28-
class OpenTokSession(object):
29-
30-
def __init__(self, session_id):
31-
self.session_id = session_id
32-
33-
3432
class OpenTokArchive(object):
3533

3634
def __init__(self, sdk, values):
@@ -160,7 +158,7 @@ def generate_token(self, session_id, role=Roles.publisher, expire_time=None, con
160158
)
161159
return token
162160

163-
def create_session(self, location='', properties={}, **kwargs):
161+
def create_session(self, location=None, p2p=False):
164162
"""Create a new session in the OpenTok API. Returns an OpenTokSession
165163
object with a session_id property. location: IP address of the user
166164
requesting the session. This is used for geolocation to choose which
@@ -169,21 +167,29 @@ def create_session(self, location='', properties={}, **kwargs):
169167
to use features of the groups API. Look in the documentation for more
170168
details. Also accepts any dict-like object.
171169
"""
172-
#ip_passthru is a deprecated argument and has been replaced with location
173-
if 'ip_passthru' in kwargs:
174-
location = kwargs['ip_passthru']
175-
params = dict(api_key=self.api_key)
176-
params['location'] = location
177-
params.update(properties)
170+
171+
# build options
172+
options = {}
173+
if p2p:
174+
if not isinstance(p2p, bool):
175+
raise OpenTokException(u('Cannot create session. p2p must be a bool {0}').format(p2p))
176+
options[u('p2p.preference')] = u('enabled')
177+
if location:
178+
# validate IP address
179+
try:
180+
inet_aton(location)
181+
except:
182+
raise OpenTokException(u('Cannot create session. Location must be either None or a valid IPv4 address {0}').format(location))
183+
options[u('location')] = location
178184

179185
try:
180-
response = requests.post(self.session_url(), data=params, headers=self.headers())
186+
response = requests.post(self.session_url(), data=options, headers=self.headers())
187+
response.encoding = 'utf-8'
181188

182189
if response.status_code == 403:
183190
raise AuthError('Failed to create session, invalid credentials')
184191
if not response.content:
185192
raise RequestError()
186-
import xml.dom.minidom as xmldom
187193
dom = xmldom.parseString(response.content)
188194
except Exception as e:
189195
raise RequestError('Failed to create session: %s' % str(e))
@@ -195,7 +201,7 @@ def create_session(self, location='', properties={}, **kwargs):
195201
raise AuthError('Failed to create session (code=%s): %s' % (error.attributes['code'].value, error.firstChild.attributes['message'].value))
196202

197203
session_id = dom.getElementsByTagName('session_id')[0].childNodes[0].nodeValue
198-
return OpenTokSession(session_id)
204+
return Session(session_id, location=location, p2p=p2p)
199205
except Exception as e:
200206
raise OpenTokException('Failed to generate session: %s' % str(e))
201207

@@ -211,7 +217,7 @@ def archive_headers(self):
211217
return result
212218

213219
def session_url(self):
214-
url = OpenTok.API_URL + '/session/create'
220+
url = self.api_url + '/session/create'
215221
return url
216222

217223
def archive_url(self, archive_id=None):

opentok/session.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class Session(object):
2+
def __init__(self, session_id, **kwargs):
3+
self.session_id = session_id
4+
for key, value in kwargs.items():
5+
setattr(self, key, value)

opentok/version.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# see: http://legacy.python.org/dev/peps/pep-0440/#public-version-identifiers
2+
__version__ = '2.2.0a0'

setup.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def find_version(*file_paths):
2828

2929
setup(
3030
name = 'opentok',
31-
version = find_version('opentok', '__init__.py'),
31+
version = find_version('opentok', 'version.py'),
3232
description = 'OpenTok server-side SDK',
3333
long_description=long_description,
3434

@@ -70,10 +70,12 @@ def find_version(*file_paths):
7070
packages=find_packages(exclude=["contrib", "docs", "tests*"]),
7171

7272
install_requires=[
73-
'requests>=1,<2',
73+
'requests',
7474
'enum34',
7575
'six',
76-
'pytz'
76+
'pytz',
77+
'httpretty',
78+
'sure',
7779
],
7880

7981
# TODO: these aren't in the sample package, but might again become imp
@@ -86,6 +88,8 @@ def find_version(*file_paths):
8688
test_suite='nose.collector',
8789
tests_require=[
8890
'nose',
89-
'six'
91+
'six',
92+
'httpretty',
93+
'sure',
9094
],
9195
)

tests/test_session_creation.py

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import unittest
2+
from six import text_type, u, b, PY2, PY3
3+
from six.moves.urllib.parse import parse_qs
4+
from nose.tools import raises
5+
from sure import expect
6+
import httpretty
7+
8+
from opentok import OpenTok, Session, OpenTokException, __version__
9+
10+
class OpenTokSessionCreationTest(unittest.TestCase):
11+
def setUp(self):
12+
self.api_key = u('123456')
13+
self.api_secret = u('1234567890abcdef1234567890abcdef1234567890')
14+
# self.api_key = u('854511')
15+
# self.api_secret = u('***REMOVED***')
16+
self.opentok = OpenTok(self.api_key, self.api_secret)
17+
18+
@httpretty.activate
19+
def test_create_default_session(self):
20+
httpretty.register_uri(httpretty.POST, u('https://api.opentok.com/session/create'),
21+
body=u('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><sessions><Session><session_id>1_MX4xMjM0NTZ-fk1vbiBNYXIgMTcgMDA6NDE6MzEgUERUIDIwMTR-MC42ODM3ODk1MzQ0OTQyODA4fg</session_id><partner_id>123456</partner_id><create_dt>Mon Mar 17 00:41:31 PDT 2014</create_dt></Session></sessions>'),
22+
status=200,
23+
content_type=u('text/xml'))
24+
25+
session = self.opentok.create_session()
26+
27+
expect(httpretty.last_request().headers[u('x-tb-partner-auth')]).to.equal(self.api_key+u(':')+self.api_secret)
28+
expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
29+
expect(session).to.be.a(Session)
30+
expect(session).to.have.property(u('session_id')).being.equal(u('1_MX4xMjM0NTZ-fk1vbiBNYXIgMTcgMDA6NDE6MzEgUERUIDIwMTR-MC42ODM3ODk1MzQ0OTQyODA4fg'))
31+
expect(session).to.have.property(u('p2p')).being.equal(False)
32+
expect(session).to.have.property(u('location')).being.equal(None)
33+
34+
@httpretty.activate
35+
def test_create_p2p_session(self):
36+
httpretty.register_uri(httpretty.POST, u('https://api.opentok.com/session/create'),
37+
body=u('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><sessions><Session><session_id>1_MX4xMjM0NTZ-fk1vbiBNYXIgMTcgMDA6NDE6MzEgUERUIDIwMTR-MC42ODM3ODk1MzQ0OTQyODA4fg</session_id><partner_id>123456</partner_id><create_dt>Mon Mar 17 00:41:31 PDT 2014</create_dt></Session></sessions>'),
38+
status=200,
39+
content_type=u('text/xml'))
40+
41+
session = self.opentok.create_session(p2p=True)
42+
43+
expect(httpretty.last_request().headers[u('x-tb-partner-auth')]).to.equal(self.api_key+u(':')+self.api_secret)
44+
expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
45+
expect(httpretty.last_request().body).to.equal(b('p2p.preference=enabled'))
46+
expect(session).to.be.a(Session)
47+
expect(session).to.have.property(u('session_id')).being.equal(u('1_MX4xMjM0NTZ-fk1vbiBNYXIgMTcgMDA6NDE6MzEgUERUIDIwMTR-MC42ODM3ODk1MzQ0OTQyODA4fg'))
48+
expect(session).to.have.property(u('p2p')).being.equal(True)
49+
expect(session).to.have.property(u('location')).being.equal(None)
50+
51+
@httpretty.activate
52+
def test_create_session_with_location_hint(self):
53+
httpretty.register_uri(httpretty.POST, u('https://api.opentok.com/session/create'),
54+
body=u('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><sessions><Session><session_id>1_MX4xMjM0NTZ-fk1vbiBNYXIgMTcgMDA6NDE6MzEgUERUIDIwMTR-MC42ODM3ODk1MzQ0OTQyODA4fg</session_id><partner_id>123456</partner_id><create_dt>Mon Mar 17 00:41:31 PDT 2014</create_dt></Session></sessions>'),
55+
status=200,
56+
content_type=u('text/xml'))
57+
58+
session = self.opentok.create_session(location='12.34.56.78')
59+
60+
expect(httpretty.last_request().headers[u('x-tb-partner-auth')]).to.equal(self.api_key+u(':')+self.api_secret)
61+
expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
62+
expect(httpretty.last_request().body).to.equal(b('location=12.34.56.78'))
63+
expect(session).to.be.a(Session)
64+
expect(session).to.have.property(u('session_id')).being.equal(u('1_MX4xMjM0NTZ-fk1vbiBNYXIgMTcgMDA6NDE6MzEgUERUIDIwMTR-MC42ODM3ODk1MzQ0OTQyODA4fg'))
65+
expect(session).to.have.property(u('p2p')).being.equal(False)
66+
expect(session).to.have.property(u('location')).being.equal(u('12.34.56.78'))
67+
68+
@httpretty.activate
69+
def test_create_p2p_session_with_location_hint(self):
70+
httpretty.register_uri(httpretty.POST, u('https://api.opentok.com/session/create'),
71+
body=u('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><sessions><Session><session_id>1_MX4xMjM0NTZ-fk1vbiBNYXIgMTcgMDA6NDE6MzEgUERUIDIwMTR-MC42ODM3ODk1MzQ0OTQyODA4fg</session_id><partner_id>123456</partner_id><create_dt>Mon Mar 17 00:41:31 PDT 2014</create_dt></Session></sessions>'),
72+
status=200,
73+
content_type=u('text/xml'))
74+
75+
session = self.opentok.create_session(location='12.34.56.78', p2p=True)
76+
77+
expect(httpretty.last_request().headers[u('x-tb-partner-auth')]).to.equal(self.api_key+u(':')+self.api_secret)
78+
expect(httpretty.last_request().headers[u('user-agent')]).to.contain(u('OpenTok-Python-SDK/')+__version__)
79+
# ordering of keys is non-deterministic, must parse the body to see if it is correct
80+
body = parse_qs(httpretty.last_request().body)
81+
expect(body).to.have.key(b('location')).being.equal([b('12.34.56.78')])
82+
expect(body).to.have.key(b('p2p.preference')).being.equal([b('enabled')])
83+
expect(session).to.be.a(Session)
84+
expect(session).to.have.property(u('session_id')).being.equal(u('1_MX4xMjM0NTZ-fk1vbiBNYXIgMTcgMDA6NDE6MzEgUERUIDIwMTR-MC42ODM3ODk1MzQ0OTQyODA4fg'))
85+
expect(session).to.have.property(u('p2p')).being.equal(True)
86+
expect(session).to.have.property(u('location')).being.equal(u('12.34.56.78'))
87+
88+
# TODO: all the cases that throw exceptions
89+
# TODO: custom api_url requests
90+

0 commit comments

Comments
 (0)