class SearchTests(testtools.TestCase): @mock.patch('resources.lib.search.addon', fakes.FakeAddon(SEARCH_HISTORY='["foo", "bar", "FOOBAR"]')) def test_get_search_history(self): expected = ['foo', 'bar', 'FOOBAR'] observed = search.get_search_history() self.assertEqual(expected, observed) @mock.patch('xbmcgui.Dialog.input') @mock.patch('resources.lib.search.add_to_search_history') @responses.activate def test_get_search_input(self, mock_add, mock_input): mock_input.return_value = 'foobar' mock_resources = mock.MagicMock() with mock.patch.dict('sys.modules', {'resources': mock_resources}): search.get_search_input() mock_resources.lib.index.make_search_list.assert_called_once_with( {'name': 'foobar'}) mock_add.assert_called_once_with('foobar') @mock.patch('resources.lib.search.addon', new_callable=fakes.FakeAddon) def test_set_search_history(self, mock_addon): search.set_search_history(['foo', 'bar', 'FOOBAR']) self.assertEqual('["foo", "bar", "FOOBAR"]', mock_addon.getSetting('SEARCH_HISTORY')) @mock.patch('resources.lib.search.get_search_history') def test_get_search_history_listing(self, mock_history): mock_history.return_value = ['foo', 'bar', 'FOOBAR'] observed = search.get_search_history_listing() expected = ['New Search', 'foo', 'bar', 'FOOBAR'] self.assertEqual(expected, observed) @mock.patch('resources.lib.search.addon', new_callable=fakes.FakeAddon) @mock.patch('resources.lib.search.get_search_history') def test_add_to_search_history(self, mock_history, mock_addon): mock_history.return_value = ['foo', 'bar', 'FOOBAR'] search.add_to_search_history('Baz') observed = json.loads(mock_addon.getSetting('SEARCH_HISTORY')) expected = ['foo', 'bar', 'FOOBAR', 'Baz'] self.assertEqual(expected, observed) @mock.patch('resources.lib.search.addon', new_callable=fakes.FakeAddon) @mock.patch('resources.lib.search.get_search_history') def test_remove_from_search_history(self, mock_history, mock_addon): mock_history.return_value = ['foo', 'bar', 'FOOBAR'] search.remove_from_search_history('foo') observed = json.loads(mock_addon.getSetting('SEARCH_HISTORY')) expected = ['bar', 'FOOBAR'] self.assertEqual(expected, observed)
def test_get_stream_kodi18(self, mock_addon, mock_token, mock_uuid, mock_ver): mock_addon.return_value = fakes.FakeAddon(user_token='foo', DAI='true') mock_ver.return_value = 18 mock_uuid.side_effect = fakes.UUID mock_token.return_value = 'foo' program = comm.classes.Program() program.id = '1234' url = re.compile('^https://www.sbs.com.au/api/v3/video_stream') responses.add(responses.GET, url, body=self.VIDEO_STREAM_JSON, status=200) observed = comm.get_stream(program) self.assertEqual({'stream_url': 'https://foo.bar/content.m3u8'}, observed)
def test_make_index_list_logged_in(self, mock_listitem, mock_version, mock_addon): mock_addon.return_value = fakes.FakeAddon(user_token='foo') mock_version.return_value = 18 mock_plugin = fakes.FakePlugin() mock_listitem.side_effect = fakes.FakeListItem responses.add(responses.GET, config.CONFIG_URL, body=self.VIDEO_CONFIG_JSON) with mock.patch.dict('sys.modules', xbmcplugin=mock_plugin): import resources.lib.index as index index.make_index_list() observed = [] expected = ['Featured', 'Programs', 'Movies', 'Catchup', 'Search', 'Favourites', 'Settings'] for res in mock_plugin.directory: observed.append(res.get('listitem').getLabel()) self.assertEqual(expected, observed)
def test_make_entries_list_context_items( self, mock_listitem, mock_version, mock_addon): mock_addon.return_value = fakes.FakeAddon(user_token='foo') mock_version.return_value = 18 mock_plugin = fakes.FakePlugin() mock_listitem.side_effect = fakes.FakeListItem feed_url = 'http://foo.bar/api/v3/video_program&range=1-50' responses.add(responses.GET, feed_url, body=self.VIDEO_PROGRAM_COLLECTION_JSON) with mock.patch.dict('sys.modules', xbmcplugin=mock_plugin): import resources.lib.index as index params = index.utils.get_url(sys.argv[2][1:]) index.make_entries_list(params) observed = [] for res in mock_plugin.directory: if res.get('listitem').context_items: observed.extend(res.get('listitem').context_items) self.assertEqual(27, len(observed)) seen = False for item in observed: if '3236' in item[1]: seen = True self.assertIs(True, seen)
class StreamAuthTests(testtools.TestCase): @classmethod def setUpClass(self): cwd = os.path.join(os.getcwd(), 'resources/tests') with open(os.path.join(cwd, 'fakes/json/AUTH.json'), 'rb') as f: self.AUTH_JSON = io.BytesIO(f.read()).read() with open(os.path.join(cwd, 'fakes/json/AUTH_FAILED.json'), 'rb') as f: self.AUTH_FAILED_JSON = io.BytesIO(f.read()).read() with open(os.path.join(cwd, 'fakes/json/BP_AUTH.json'), 'rb') as f: self.BP_AUTH_JSON = io.BytesIO(f.read()).read() with open(os.path.join(cwd, 'fakes/json/BP_AUTH_FAIL.json'), 'rb') as f: self.BP_AUTH_FAIL_JSON = io.BytesIO(f.read()).read() with open(os.path.join(cwd, 'fakes/json/EMBED_TOKEN.json'), 'rb') as f: self.EMBED_TOKEN_JSON = io.BytesIO(f.read()).read() with open(os.path.join(cwd, 'fakes/json/EMBED_TOKEN_FAIL.json'), 'rb') as f: self.EMBED_TOKEN_FAIL_JSON = io.BytesIO(f.read()).read() with open(os.path.join(cwd, 'fakes/json/SESSION.json'), 'rb') as f: self.SESSION_JSON = io.BytesIO(f.read()).read() @mock.patch('resources.lib.stream_auth.cache.delete') def test_clear_ticket(self, mock_delete): stream_auth.clear_token() mock_delete.assert_called_with('AFLTOKEN') @mock.patch('resources.lib.stream_auth.addon.getSetting') @mock.patch('resources.lib.stream_auth.cache.get') def test_get_user_ticket_cached(self, mock_ticket, mock_sub_type): mock_ticket.return_value = 'foobar123456' mock_sub_type.return_value = '0' observed = stream_auth.get_user_token() self.assertEqual('foobar123456', observed) @mock.patch( 'resources.lib.stream_auth.telstra_auth.TelstraAuth.get_free_token') @mock.patch('resources.lib.stream_auth.addon.getSetting') @mock.patch('resources.lib.stream_auth.cache.get') def test_get_user_ticket_free(self, mock_ticket, mock_sub_type, mock_token): mock_ticket.return_value = '' mock_sub_type.return_value = '1' mock_token.return_value = 'foobar456789' @mock.patch( 'resources.lib.stream_auth.telstra_auth.TelstraAuth.get_mobile_token') @mock.patch('resources.lib.stream_auth.addon.getSetting') @mock.patch('resources.lib.stream_auth.cache.get') @responses.activate def test_get_user_ticket_mobile(self, mock_ticket, mock_setting, mock_token): def get_setting(param): if param == 'LIVE_SUBSCRIPTION': return 'true' else: return 3 responses.add(responses.POST, config.TOKEN_URL, body=json.dumps({'token': 'abcdef'}), status=200) mock_ticket.return_value = '' mock_setting.side_effect = get_setting mock_token.return_value = 'foobar654321' observed = stream_auth.get_user_token() self.assertEqual('foobar654321', observed) @mock.patch('resources.lib.stream_auth.addon', fakes.FakeAddon(sub_type=0)) @mock.patch('resources.lib.stream_auth.cache.get') @responses.activate def test_get_user_ticket_paid(self, mock_ticket): responses.add(responses.POST, config.TOKEN_URL, body=json.dumps({'token': 'abcdef'}), status=200) responses.add(responses.POST, config.LOGIN_URL, body=self.BP_AUTH_JSON, status=200) responses.add(responses.GET, config.SESSION_URL.format('artifactstring%23'), body=self.SESSION_JSON, status=200) mock_ticket.return_value = '' observed = stream_auth.get_user_token() self.assertEqual(fakes.MIS_UUID, observed) @mock.patch('resources.lib.stream_auth.addon', fakes.FakeAddon(sub_type=0)) @mock.patch('resources.lib.stream_auth.cache.get') @responses.activate def test_get_user_ticket_paid_fail(self, mock_ticket): responses.add(responses.POST, config.TOKEN_URL, body=json.dumps({'token': 'abcdef'}), status=200) responses.add(responses.POST, config.LOGIN_URL, body=self.BP_AUTH_FAIL_JSON, status=200) mock_ticket.return_value = '' self.assertRaises(stream_auth.AussieAddonsException, stream_auth.get_user_token) @mock.patch('resources.lib.stream_auth.addon', fakes.FakeAddon(sub_type=0, live_sub=False)) def test_get_user_ticket_nosub(self): with testtools.ExpectedException(stream_auth.AussieAddonsException, 'AFL Live Pass sub*'): stream_auth.get_user_token() @mock.patch('resources.lib.stream_auth.addon', fakes.FakeAddon(sub_type=2)) def test_get_user_ticket_iap(self): observed = stream_auth.get_user_token() self.assertEqual(fakes.MIS_UUID, observed) @mock.patch('resources.lib.stream_auth.addon', fakes.FakeAddon(sub_type=2, iap_token='gghhiijjkkllmm')) def test_get_user_ticket_iap_fail_bad_format(self): with testtools.ExpectedException(stream_auth.AussieAddonsException, 'mis-uuid token must*'): stream_auth.get_user_token() @responses.activate def test_get_embed_token(self): responses.add(responses.GET, config.EMBED_TOKEN_URL.format(fakes.MIS_UUID, 'foo'), body=self.EMBED_TOKEN_JSON, status=200) responses.add(responses.POST, config.TOKEN_URL, body=json.dumps({'token': 'abcdef'}), status=200) observed = stream_auth.get_embed_token(fakes.MIS_UUID, 'foo') self.assertEqual(quote('http://foobar.com/video'), observed) @responses.activate @mock.patch('resources.lib.stream_auth.addon', fakes.FakeAddon(sub_type=1)) @mock.patch('resources.lib.stream_auth.cache.delete') def test_get_embed_token_fail(self, mock_delete): responses.add(responses.GET, config.EMBED_TOKEN_URL.format(fakes.MIS_UUID, 'foo'), body=self.EMBED_TOKEN_FAIL_JSON, status=400) responses.add(responses.POST, config.TOKEN_URL, body=json.dumps({'token': 'abcdef'}), status=200) with testtools.ExpectedException(stream_auth.AussieAddonsException, 'Stored login token*'): stream_auth.get_embed_token(fakes.MIS_UUID, 'foo') mock_delete.assert_called_with('AFLTOKEN') @responses.activate def test_get_secure_token(self): responses.add(responses.GET, 'https://foo.bar/', body=self.AUTH_JSON, status=200) observed = stream_auth.get_secure_token('https://foo.bar/', fakes.VIDEO_ID) self.assertEqual(fakes.M3U8_URL_OOYALA, observed) @responses.activate def test_get_secure_token_fail_keyerror(self): responses.add(responses.GET, 'https://foo.bar/', body=self.AUTH_FAILED_JSON, status=200) self.assertRaises(stream_auth.AussieAddonsException, stream_auth.get_secure_token, 'https://foo.bar/', fakes.VIDEO_ID) @responses.activate @mock.patch('resources.lib.stream_auth.cache.get') def test_get_m3u8_playlist(self, mock_ticket): mock_ticket.return_value = 'foobar123456' auth_url = config.AUTH_URL.format( config.PCODE, fakes.VIDEO_ID, quote_plus('http://foobar.com/video')) responses.add(responses.GET, auth_url, body=self.AUTH_JSON, status=200) responses.add(responses.GET, config.EMBED_TOKEN_URL.format(fakes.MIS_UUID, fakes.VIDEO_ID), body=self.EMBED_TOKEN_JSON, status=200) observed = stream_auth.get_m3u8_playlist(fakes.VIDEO_ID, '') self.assertEqual(fakes.M3U8_URL_OOYALA, observed)