import unittest
from .core import Roku, COMMANDS
TEST_APPS = (
('11', '1.0.1', 'Fake Roku Channel Store'),
('22', '2.0.2', 'Fake Netflix'),
('33', '3.0.3', 'Fake YouTube'),
)
TEST_DEV_INFO = ''.join([
'',
'',
' 00000000-1111-2222-3333-444444444444',
' 111111111111',
' 222222222222',
' Roku',
' 4200X',
' Roku 3',
' 00:11:22:33:44:55',
' 00:11:22:33:44:56',
' ethernet',
' ',
' 7.00',
' 09044',
' true',
' en',
' US',
' en_US',
' US/Eastern',
' -300',
' PowerOn',
' false',
' true',
' true',
' true',
' false',
' false',
''
])
class TestRoku(Roku):
def __init__(self, *args, **kwargs):
super(TestRoku, self).__init__(*args, **kwargs)
self._calls = []
def _call(self, method, path, *args, **kwargs):
resp = None
if path == '/query/apps':
fmt = '%s'
resp = '%s' % "".join(fmt % a for a in TEST_APPS)
elif path == '/query/device-info':
resp = TEST_DEV_INFO
self._calls.append((method, path, args, kwargs, resp))
return resp
def calls(self):
return self._calls
def last_call(self):
return self._calls[-1]
class RokuTestCase(unittest.TestCase):
def setUp(self):
self.roku = TestRoku('0.0.0.0')
def testApps(self):
apps = self.roku.apps
self.assertEqual(len(apps), 3)
for i, app in enumerate(apps):
self.assertEqual(app.id, TEST_APPS[i][0])
self.assertEqual(app.version, TEST_APPS[i][1])
self.assertEqual(app.name, TEST_APPS[i][2])
app = self.roku['22']
self.assertEqual(app.id, TEST_APPS[1][0])
self.assertEqual(app.version, TEST_APPS[1][1])
self.assertEqual(app.name, TEST_APPS[1][2])
app = self.roku['Fake YouTube']
self.assertEqual(app.id, TEST_APPS[2][0])
self.assertEqual(app.version, TEST_APPS[2][1])
self.assertEqual(app.name, TEST_APPS[2][2])
def testDeviceInfo(self):
d = self.roku.device_info
self.assertEqual(d.modelname, 'Roku 3')
self.assertEqual(d.modelnum, '4200X')
self.assertEqual(d.swversion, '7.00.09044')
self.assertEqual(d.sernum, '111111111111')
def testCommands(self):
for cmd in self.roku.commands:
if cmd == 'literal':
continue
getattr(self.roku, cmd)()
call = self.roku.last_call()
self.assertEqual(call[0], 'POST')
self.assertEqual(call[1], '/keypress/%s' % COMMANDS[cmd])
self.assertEqual(call[2], ())
self.assertEqual(call[3], {})
def testLiteral(self):
text = 'Stargate'
self.roku.literal(text)
for i, call in enumerate(self.roku.calls()):
self.assertEqual(call[0], 'POST')
self.assertEqual(call[1], '/keypress/Lit_%s' % text[i].upper())
self.assertEqual(call[2], ())
self.assertEqual(call[3], {})
def testStore(self):
for app in self.roku.apps:
self.roku.store(app)
call = self.roku.last_call()
self.assertEqual(call[0], 'POST')
self.assertEqual(call[1], '/launch/11')
self.assertEqual(call[2], ())
self.assertEqual(call[3], {'params': {'contentID': app.id}})
def testLaunch(self):
for app in self.roku.apps:
self.roku.launch(app)
call = self.roku.last_call()
self.assertEqual(call[0], 'POST')
self.assertEqual(call[1], '/launch/%s' % app.id)
self.assertEqual(call[2], ())
self.assertEqual(call[3], {'params': {'contentID': app.id}})
if __name__ == '__main__':
unittest.main()