This commit is contained in:
marco
2020-07-25 20:19:09 +02:00
parent b19395d8a1
commit 3d47fa2d29
5 changed files with 116 additions and 2 deletions

0
tests/__init__.py Normal file
View File

View File

@@ -0,0 +1,113 @@
<settings version="2">
<setting id="addon_update_enabled">true</setting>
<setting id="addon_update_message">true</setting>
<setting id="addon_update_timer">1</setting>
<setting id="autoplay" default="true">false</setting>
<setting id="autostart" default="true">Off</setting>
<setting id="browser">true</setting>
<setting id="category" default="true"></setting>
<setting id="channel_language" default="true">all</setting>
<setting id="channels_check" default="true"></setting>
<setting id="channels_config" default="true"></setting>
<setting id="channels_onoff" default="true"></setting>
<setting id="checkdns">true</setting>
<setting id="checklinks" default="true">false</setting>
<setting id="checklinks_number">5</setting>
<setting id="custom_start" default="true">false</setting>
<setting id="custom_theme" default="true"></setting>
<setting id="debriders_config" default="true"></setting>
<setting id="debug">true</setting>
<setting id="default_action" default="true">0</setting>
<setting id="delete_key" default="true"></setting>
<setting id="download_adv" default="true"></setting>
<setting id="downloadenabled" default="true">false</setting>
<setting id="downloadlistpath" default="true">special://profile/addon_data/plugin.video.kod/downloads/list/</setting>
<setting id="downloadpath" default="true">special://profile/addon_data/plugin.video.kod/downloads/</setting>
<setting id="elementum_install" default="true"></setting>
<setting id="elementum_on_seed" default="true">false</setting>
<setting id="enable_channels_menu">true</setting>
<setting id="enable_custom_theme" default="true">false</setting>
<setting id="enable_fav_menu">true</setting>
<setting id="enable_library_menu">true</setting>
<setting id="enable_link_menu">true</setting>
<setting id="enable_news_menu">true</setting>
<setting id="enable_onair_menu">true</setting>
<setting id="enable_search_menu">true</setting>
<setting id="extended_info" default="true">false</setting>
<setting id="favorites_servers" default="true">false</setting>
<setting id="filter_servers" default="true">true</setting>
<setting id="folder_movies" default="true">Film</setting>
<setting id="folder_tvshows" default="true">Serie TV</setting>
<setting id="hide_servers" default="true">false</setting>
<setting id="hidepremium" default="true">false</setting>
<setting id="httptools_timeout">15</setting>
<setting id="icon_set" default="true">default</setting>
<setting id="infoplus" default="true">false</setting>
<setting id="infoplus_set" default="true">false</setting>
<setting id="install_trakt" default="true">true</setting>
<setting id="kod_menu">true</setting>
<setting id="language" default="true">ITA</setting>
<setting id="last_search">true</setting>
<setting id="library_move">true</setting>
<setting id="lista_activa" default="true">kodfavorites-default.json</setting>
<setting id="news_anime" default="true"></setting>
<setting id="news_documentaries" default="true"></setting>
<setting id="news_films" default="true"></setting>
<setting id="news_options" default="true"></setting>
<setting id="news_series" default="true"></setting>
<setting id="news_start" default="true">false</setting>
<setting id="next_ep">true</setting>
<setting id="next_ep_seconds">40</setting>
<setting id="next_ep_type" default="true">0</setting>
<setting id="only_channel_icons" default="true">false</setting>
<setting id="player_mode">0</setting>
<setting id="quality" default="true">0</setting>
<setting id="quality_priority" default="true">false</setting>
<setting id="quick_menu">true</setting>
<setting id="resolve_priority" default="true">0</setting>
<setting id="resolve_stop">true</setting>
<setting id="resolver_dns">true</setting>
<setting id="result_mode" default="true">0</setting>
<setting id="saved_searches_limit">10</setting>
<setting id="search_channels" default="true"></setting>
<setting id="server_speed">true</setting>
<setting id="servers_blacklist" default="true"></setting>
<setting id="servers_config" default="true"></setting>
<setting id="servers_favorites" default="true"></setting>
<setting id="settings_path" default="true">special://profile/addon_data/plugin.video.kod/settings_channels</setting>
<setting id="shortcut_key" default="true"></setting>
<setting id="show_once" default="true">true</setting>
<setting id="side_menu" default="true">false</setting>
<setting id="skin_name" default="true">skin.estuary</setting>
<setting id="start_page" default="true">false</setting>
<setting id="subtitle_name" default="true">[B]4[B] - [B]Tamako Market[B]</setting>
<setting id="thread_number" default="true">0</setting>
<setting id="tmdb_active" default="true">true</setting>
<setting id="tmdb_cache">true</setting>
<setting id="tmdb_cache_expire">4</setting>
<setting id="tmdb_clean_db_cache" default="true"></setting>
<setting id="tmdb_plus_info" default="true">false</setting>
<setting id="tmdb_threads">20</setting>
<setting id="touch_view" default="true">false</setting>
<setting id="trakt_sync" default="true">false</setting>
<setting id="tvdb_token" default="true">eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTQwMjkyNzYsImlkIjoicGVsaXNhbGFjYXJ0YSIsIm9yaWdfaWF0IjoxNTkzNDI0NDMyfQ.Op5vL2VNz_YJvnpX0fgz_3FVuOG9c1MT084jYdf-EcBuotgMoQ6-6TtKAAb_x8C-_AMEv1Io5DUpbjxIViSZEaI0wypfkWJEuSIHfTHqOaD80Pdf0hcK9pliSUTPQMPyHaacP-VaVubydMzq-n-5AORpYXuFE1w60KWuTZT4MbPA4F9SAENB4_q3VL-1heqnyrx7iEA5smQVO-LGCKMEgy9rnnCdtUWUP19WXqiaxCgng7Nmx8kICa5zV9I6ov_2XYzikJDF7txEoVdVVotQ1THUkAQfCmQOGb0pPIbFOpjXayNiPzmwj_yCLCakdO82cw0M7cJ2fOERfFKLmVn39w</setting>
<setting id="tvdb_token_date" default="true">2020-06-29</setting>
<setting id="video_thumbnail_type">1</setting>
<setting id="videolibrary_kodi">true</setting>
<setting id="videolibrary_max_quality" default="true">false</setting>
<setting id="videolibrarypath" default="true">special://profile/addon_data/plugin.video.kod/videolibrary/</setting>
<setting id="vidolibrary_delete" default="true"></setting>
<setting id="vidolibrary_export" default="true"></setting>
<setting id="vidolibrary_import" default="true"></setting>
<setting id="vidolibrary_preferences" default="true"></setting>
<setting id="vidolibrary_restore" default="true"></setting>
<setting id="vidolibrary_update" default="true"></setting>
<setting id="view_mode_addon">Muro di Icone, 52</setting>
<setting id="view_mode_channel">Lista Larga, 55</setting>
<setting id="view_mode_episode">Lista, 50</setting>
<setting id="view_mode_movie">Lista, 50</setting>
<setting id="view_mode_season">Predefinito , 0</setting>
<setting id="view_mode_server">Lista Larga, 55</setting>
<setting id="view_mode_tvshow">Lista, 50</setting>
<setting id="watched_setting">80</setting>
</settings>

269
tests/test_generic.py Normal file
View File

@@ -0,0 +1,269 @@
# -*- coding: utf-8 -*-
import os
import sys
import unittest
import HtmlTestRunner
import parameterized
from platformcode import config, logger
config.set_setting('tmdb_active', False)
librerias = os.path.join(config.get_runtime_path(), 'lib')
sys.path.insert(0, librerias)
from core.support import typo
from core.item import Item
from core.httptools import downloadpage
from core import servertools
import channelselector
import re
validUrlRegex = re.compile(
r'^(?:http|ftp)s?://' # http:// or https://
r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' # domain...
r'localhost|' # localhost...
r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
r'(?::\d+)?' # optional port
r'(?:/?|[/?]\S+)$', re.IGNORECASE)
chBlackList = ['url']
chNumRis = {
'altadefinizione01': {
'Film': 20
},
'altadefinizione01_link': {
'Film': 16,
'Serie TV': 16,
},
'altadefinizioneclick': {
'Film': 36,
'Serie TV': 12,
},
'casacinema': {
'Film': 10,
'Serie TV': 10,
},
'cineblog01': {
'Film': 12,
'Serie TV': 13
},
'cinemalibero': {
'Film': 20,
'Serie TV': 20,
},
'cinetecadibologna': {
'Film': 10
},
'eurostreaming': {
'Serie TV': 18
},
'Filmpertutti': {
'Film': 24,
'Serie TV': 24,
},
'guardaSerie TVclick': {
'da controllare': 0
},
'hd4me': {
'Film': 10
},
'ilgeniodellostreaming': {
'Film': 30,
'Serie TV': 30
},
'italiaserie': {
'Serie TV': 20
},
'casacinemaInfo': {
'Film': 150
},
'netfreex': {
'Film': 30,
'Serie TV': 30
},
'piratestreaming': {
'Film': 24,
'Serie TV': 24
},
'polpotv': {
'Film': 12,
'Serie TV': 12
},
'streamingaltadefinizione': {
'Film': 30,
'Serie TV': 30
},
'seriehd': {
'Serie TV': 12
},
'serietvonline': {
'Film': 35,
'Serie TV': 35
},
'tantifilm': {
'Film': 20,
'Serie TV': 20
},
}
servers = []
channels = []
channel_list = channelselector.filterchannels("all")
ret = []
for chItem in channel_list:
try:
ch = chItem.channel
if ch not in chBlackList:
module = __import__('channels.%s' % ch, fromlist=["channels.%s" % ch])
hasChannelConfig = False
mainlist = module.mainlist(Item())
menuItemlist = {}
serversFound = {}
for it in mainlist:
print 'preparing ' + ch + ' -> ' + it.title
serversFound[it.title] = []
if it.action == 'channel_config':
hasChannelConfig = True
continue
if it.action == 'search': # channel-specific
continue
itemlist = getattr(module, it.action)(it)
menuItemlist[it.title] = itemlist
# some sites might have no link inside, but if all results are without servers, there's something wrong
for resIt in itemlist:
if hasattr(module, resIt.action):
serversFound[it.title] = getattr(module, resIt.action)(resIt)
else:
serversFound[it.title] = [resIt]
if serversFound[it.title]:
servers.extend(
{'name': srv.server.lower(), 'server': srv} for srv in serversFound[it.title] if srv.server)
break
channels.append(
{'ch': ch, 'hasChannelConfig': hasChannelConfig, 'mainlist': mainlist, 'menuItemlist': menuItemlist,
'serversFound': serversFound, 'module': module})
except:
import traceback
logger.error(traceback.format_exc())
from specials import news
dictNewsChannels, any_active = news.get_channels_list()
# only 1 server item for single server
serverNames = []
serversFinal = []
for s in servers:
if not s['name'] in serverNames:
serverNames.append(s['name'])
serversFinal.append(s)
@parameterized.parameterized_class(channels)
class GenericChannelTest(unittest.TestCase):
def test_mainlist(self):
self.assertTrue(self.mainlist, 'channel ' + self.ch + ' has no mainlist')
self.assertTrue(self.hasChannelConfig, 'channel ' + self.ch + ' has no channel config')
def test_newest(self):
for cat in dictNewsChannels:
for ch in dictNewsChannels[cat]:
if self.ch == ch[0]:
itemlist = self.module.newest(cat)
self.assertTrue(itemlist, 'channel ' + self.ch + ' returned no news for category ' + cat)
break
@parameterized.parameterized_class(
[{'ch': ch['ch'], 'title': title, 'itemlist': itemlist, 'serversFound': ch['serversFound'][title]} for ch in channels for
title, itemlist in ch['menuItemlist'].items()])
class GenericChannelMenuItemTest(unittest.TestCase):
def test_menu(self):
print 'testing ' + self.ch + ' --> ' + title
self.assertTrue(itemlist, 'channel ' + self.ch + ' -> ' + title + ' is empty')
self.assertTrue(self.serversFound,
'channel ' + self.ch + ' -> ' + title + ' has no servers on all results')
if self.ch in chNumRis: # i know how much results should be
for content in chNumRis[self.ch]:
if content in title:
risNum = len([i for i in itemlist if not i.nextPage]) # not count nextpage
self.assertEqual(chNumRis[self.ch][content], risNum,
'channel ' + self.ch + ' -> ' + title + ' returned wrong number of results')
break
for resIt in itemlist:
print resIt.title + ' -> ' + resIt.url
self.assertLess(len(resIt.fulltitle), 110,
'channel ' + self.ch + ' -> ' + title + ' might contain wrong titles\n' + resIt.fulltitle)
if resIt.url:
self.assertIsInstance(resIt.url, str,
'channel ' + self.ch + ' -> ' + title + ' -> ' + resIt.title + ' contain non-string url')
self.assertIsNotNone(re.match(validUrlRegex, resIt.url),
'channel ' + self.ch + ' -> ' + title + ' -> ' + resIt.title + ' might contain wrong url\n' + resIt.url)
if 'year' in resIt.infoLabels and resIt.infoLabels['year']:
msgYear = 'channel ' + self.ch + ' -> ' + title + ' might contain wrong infolabels year\n' + str(
resIt.infoLabels['year'])
self.assert_(type(resIt.infoLabels['year']) is int or resIt.infoLabels['year'].isdigit(),
msgYear)
self.assert_(int(resIt.infoLabels['year']) > 1900 and int(resIt.infoLabels['year']) < 2100,
msgYear)
if resIt.title == typo(config.get_localized_string(30992), 'color kod bold'): # next page
nextPageItemlist = getattr(self.module, resIt.action)(resIt)
self.assertTrue(nextPageItemlist,
'channel ' + self.ch + ' -> ' + title + ' has nextpage not working')
print '\ntest passed'
@parameterized.parameterized_class(serversFinal)
class GenericServerTest(unittest.TestCase):
def test_get_video_url(self):
module = __import__('servers.%s' % self.name, fromlist=["servers.%s" % self.name])
page_url = self.server.url
print 'testing ' + page_url
self.assert_(hasattr(module, 'test_video_exists'), self.name + ' has no test_video_exists')
try:
if module.test_video_exists(page_url)[0]:
urls = module.get_video_url(page_url)
server_parameters = servertools.get_server_parameters(self.name)
self.assertTrue(urls or server_parameters.get("premium"),
self.name + ' scraper did not return direct urls for ' + page_url)
print urls
for u in urls:
spl = u[1].split('|')
if len(spl) == 2:
directUrl, headersUrl = spl
else:
directUrl, headersUrl = spl[0], ''
headers = {}
if headersUrl:
for name in headersUrl.split('&'):
h, v = name.split('=')
h = str(h)
headers[h] = str(v)
print headers
if 'magnet:?' in directUrl: # check of magnet links not supported
continue
page = downloadpage(directUrl, headers=headers, only_headers=True, use_requests=True)
self.assertTrue(page.success, self.name + ' scraper returned an invalid link')
self.assertLess(page.code, 400, self.name + ' scraper returned a ' + str(page.code) + ' link')
contentType = page.headers['Content-Type']
self.assert_(contentType.startswith(
'video') or 'mpegurl' in contentType or 'octet-stream' in contentType or 'dash+xml' in contentType,
self.name + ' scraper did not return valid url for link ' + page_url + '\nDirect url: ' + directUrl + '\nContent-Type: ' + contentType)
except:
import traceback
logger.error(traceback.format_exc())
if __name__ == '__main__':
unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner(report_name='report', add_timestamp=False,
combine_reports=True, report_title='KoD Test Suite'))