diff --git a/CHANGES.md b/CHANGES.md index 83979d5..28b832a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,7 +1,8 @@ -### 0.18.9 (2018-12-19 12:20:00 UTC) +### 0.18.9 (2019-01-08 01:00:00 UTC) * Change ensure utf-8 locale for Ubuntu snap * Change remove non-release group stuff from newnab results +* Add detection of NZBHydra and NZBHydra 2 to config providers * Remove Torrentz2 diff --git a/gui/slick/images/providers/warning16.png b/gui/slick/images/providers/warning16.png new file mode 100644 index 0000000..2735496 Binary files /dev/null and b/gui/slick/images/providers/warning16.png differ diff --git a/gui/slick/interfaces/default/config_providers.tmpl b/gui/slick/interfaces/default/config_providers.tmpl index e934eb5..447a783 100644 --- a/gui/slick/interfaces/default/config_providers.tmpl +++ b/gui/slick/interfaces/default/config_providers.tmpl @@ -97,6 +97,7 @@ #set $cur_url = $cur_provider.url #set $show_type = $sickbeard.USE_NZBS and $sickbeard.USE_TORRENTS and $GenericProvider.NZB == $cur_provider.providerType #set $spotweb = ('', 'sw ')[$getattr($cur_provider, 'server_type', None) == $NewznabConstants.SERVER_SPOTWEB and type($cur_provider).__name__ not in ['TorrentRssProvider']] + #set $is_hydra = $getattr($cur_provider, 'server_type', None) in ($NewznabConstants.SERVER_HYDRA1, $NewznabConstants.SERVER_HYDRA2) #set $bad_url = not $cur_url and cur_provider.is_enabled() #set $tip = ($cur_provider.name + ('', ' (enable for link)')[not $cur_url and not cur_provider.is_enabled()], 'Site Down')[$bad_url] @@ -109,6 +110,8 @@ (PA) #end if##if $show_type##slurp ($spotweb$cur_provider.providerType) + #end if##if $is_hydra##slurp + (read this) #end if##if not $cur_provider.supports_backlog#*#set $backlog_only_tip=True##end if##slurp diff --git a/sickbeard/providers/newznab.py b/sickbeard/providers/newznab.py index 6a78adf..aacade9 100755 --- a/sickbeard/providers/newznab.py +++ b/sickbeard/providers/newznab.py @@ -94,9 +94,13 @@ class NewznabConstants: SERVER_DEFAULT = 0 SERVER_SPOTWEB = 1 + SERVER_HYDRA1 = 2 + SERVER_HYDRA2 = 3 server_types = {SERVER_DEFAULT: 'newznab', - SERVER_SPOTWEB: 'spotweb'} + SERVER_SPOTWEB: 'spotweb', + SERVER_HYDRA1: 'NZBHydra', + SERVER_HYDRA2: 'NZBHydra 2'} def __init__(self): pass @@ -194,6 +198,8 @@ class NewznabProvider(generic.NZBProvider): def image_name(self): + if self.server_type not in (NewznabConstants.SERVER_DEFAULT, NewznabConstants.SERVER_SPOTWEB): + return 'warning16.png' return generic.GenericProvider.image_name( self, ('newznab', 'spotweb')[self.server_type == NewznabConstants.SERVER_SPOTWEB]) @@ -239,9 +245,17 @@ class NewznabProvider(generic.NZBProvider): if None is not xml_caps: server_node = xml_caps.find('.//server') if None is not server_node: - self.server_type = (NewznabConstants.SERVER_DEFAULT, NewznabConstants.SERVER_SPOTWEB)[ - NewznabConstants.server_types.get(NewznabConstants.SERVER_SPOTWEB) in - (server_node.get('type', '') or server_node.get('title', '')).lower()] + if NewznabConstants.server_types.get(NewznabConstants.SERVER_SPOTWEB) in \ + (server_node.get('type', '') or server_node.get('title', '')).lower(): + self.server_type = NewznabConstants.SERVER_SPOTWEB + elif 'nzbhydra 2' in server_node.get('title', '').lower() or \ + 'nzbhydra2' in server_node.get('url', '').lower(): + self.server_type = NewznabConstants.SERVER_HYDRA2 + elif 'nzbhydra' == server_node.get('title', '').lower().strip() or \ + server_node.get('url', '').lower().strip().endswith('nzbhydra'): + self.server_type = NewznabConstants.SERVER_HYDRA1 + else: + self.server_type = NewznabConstants.SERVER_DEFAULT tv_search = xml_caps.find('.//tv-search') if None is not tv_search: diff --git a/tests/all_tests.py b/tests/all_tests.py index 34eb3df..f9a54e0 100644 --- a/tests/all_tests.py +++ b/tests/all_tests.py @@ -19,7 +19,10 @@ # along with SickGear. If not, see . from __future__ import print_function -if __name__ == '__main__': +if '__main__' == __name__: + import warnings + warnings.filterwarnings('ignore', module=r'.*fuz.*', message='.*Sequence.*') + import glob import unittest import sys @@ -32,10 +35,24 @@ if __name__ == '__main__': print('==================') print('STARTING - ALL TESTS') print('==================') - print('this will include') - for includedfiles in test_file_strings: - print('- ' + includedfiles) - text_runner = unittest.TextTestRunner().run(testSuite) - if not text_runner.wasSuccessful(): - sys.exit(-1) + test_individually = False + + if not test_individually: + print('this will include') + for includedfiles in test_file_strings: + print('- ' + includedfiles) + + text_runner = unittest.TextTestRunner().run(testSuite) + if not text_runner.wasSuccessful(): + sys.exit(-1) + else: + complete_success = True + for file_string in module_strings: + testSuite = unittest.TestSuite([unittest.defaultTestLoader.loadTestsFromName(file_string)]) + print('- running ' + file_string) + test_runner = unittest.TextTestRunner().run(testSuite) + if complete_success and not test_runner.wasSuccessful(): + complete_success = False + if not complete_success: + sys.exit(-1) diff --git a/tests/network_timezone_tests.py b/tests/network_timezone_tests.py index 22c7a09..09dd672 100644 --- a/tests/network_timezone_tests.py +++ b/tests/network_timezone_tests.py @@ -1,3 +1,8 @@ +import warnings +warnings.filterwarnings('ignore', module=r'.*fuz.*', message='.*Sequence.*') +warnings.filterwarnings('ignore', module=r'.*connectionpool.*', message='.*certificate verification.*') +warnings.filterwarnings('ignore', module=r'.*zoneinfo.*', message='.*no such file.*') + import unittest import test_lib as test import os.path diff --git a/tests/newznab_data/hydra1_caps.xml b/tests/newznab_data/hydra1_caps.xml new file mode 100644 index 0000000..7f928c1 --- /dev/null +++ b/tests/newznab_data/hydra1_caps.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/newznab_data/hydra2_caps.xml b/tests/newznab_data/hydra2_caps.xml new file mode 100644 index 0000000..7ea1a91 --- /dev/null +++ b/tests/newznab_data/hydra2_caps.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/newznab_data/newznab_caps.xml b/tests/newznab_data/newznab_caps.xml new file mode 100644 index 0000000..0656f2e --- /dev/null +++ b/tests/newznab_data/newznab_caps.xml @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/newznab_data/nntmux_caps.xml b/tests/newznab_data/nntmux_caps.xml new file mode 100644 index 0000000..8e7f536 --- /dev/null +++ b/tests/newznab_data/nntmux_caps.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/newznab_data/nzedb_caps.xml b/tests/newznab_data/nzedb_caps.xml new file mode 100644 index 0000000..46ff8c3 --- /dev/null +++ b/tests/newznab_data/nzedb_caps.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/newznab_data/spotweb_caps.xml b/tests/newznab_data/spotweb_caps.xml new file mode 100644 index 0000000..b649c09 --- /dev/null +++ b/tests/newznab_data/spotweb_caps.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/newznab_tests.py b/tests/newznab_tests.py new file mode 100644 index 0000000..1124283 --- /dev/null +++ b/tests/newznab_tests.py @@ -0,0 +1,350 @@ +# coding=utf-8 +from __future__ import print_function +import warnings +warnings.filterwarnings('ignore', module=r'.*fuz.*', message='.*Sequence.*') +warnings.filterwarnings('ignore', module=r'.*dateutil.*', message='.*Unicode.*') + +import datetime +import os.path +import random +import sys +import test_lib as test +import unittest + +sys.path.insert(1, os.path.abspath('..')) +sys.path.insert(1, os.path.abspath('../lib')) + +try: + from lxml import etree +except ImportError: + try: + import xml.etree.cElementTree as etree + except ImportError: + import xml.etree.ElementTree as etree + +from lib.dateutil import parser +from sickbeard.indexers.indexer_config import * +from sickbeard.network_timezones import sb_timezone +from sickbeard.providers import newznab + +import sickbeard + +sickbeard.SYS_ENCODING = 'UTF-8' + +DEBUG = VERBOSE = False + +item_parse_test_cases = [ + (('Show.Name.S02E01.720p.HDTV.x264-GROUP', 'https://test.h/test/hhhh'), + ('Show.Name.S02E01.720p.HDTV.x264-GROUP', 'https://test.h/test/hhhh')), + (('Show.Name.S02E02.720p.HDTV.x264-GROUP-JUNK', 'https://test.h/test/hhhh'), + ('Show.Name.S02E02.720p.HDTV.x264-GROUP', 'https://test.h/test/hhhh')), + (('Show.Name.S02E03.720p.HDTV.x264-GROUP[JUNK]', 'https://test.h'), + ('Show.Name.S02E03.720p.HDTV.x264-GROUP', 'https://test.h')), + (('Show.Name.S02E04.720p.HDTV.x264-GROUP-JUNK-JUNK', 'https://test.h'), + ('Show.Name.S02E04.720p.HDTV.x264-GROUP', 'https://test.h')), + (('Show.Name.S02E05.720p.HDTV.x264-GROUP-JUNK[JUNK]', 'https://test.h'), + ('Show.Name.S02E05.720p.HDTV.x264-GROUP', 'https://test.h')), + ((u'Show.Name.S02E06.720p.HDTV.x264-GROUP-JUNK[JUNK帝]', 'https://test.h'), + (u'Show.Name.S02E06.720p.HDTV.x264-GROUP', 'https://test.h')), + ((u'Show.Name.S02E07-EpName帝.720p.HDTV.x264-GROUP帝-JUNK[JUNK帝]', 'https://test.h'), + (u'Show.Name.S02E07-EpName帝.720p.HDTV.x264-GROUP帝', 'https://test.h')), + ((u'[grp 帝] Show Name - 11 [1024x576 h264 AAC ger-sub][123456].mp4', 'https://test.h'), + (u'[grp.帝].Show.Name.-.11.[1024x576.h264.AAC.ger-sub][123456]', 'https://test.h')), +] + +size_test_cases = [ + ((1000, 'ad87987dadf7987987'), (1000, 'ad87987dadf7987987')), + ((1254105454, 'ffdds7766dgdzhghdzghdgg'), (1254105454, 'ffdds7766dgdzhghdzghdgg')), + ((-1, ''), (-1, None)) +] + +pubdate_test_cases = [ + 'Sat, 28 Jul 2018 07:33:06 +0000', + 'Sun, 10 Sep 2017 23:11:09 +0200' +] + +caps_test_cases = [ + { + 'name': 'newznab', + 'data_files': {'caps': 'newznab_caps.xml'}, + 'caps': { + INDEXER_TVDB: 'tvdbid', INDEXER_TVRAGE: 'rid', INDEXER_TVMAZE: 'tvmazeid', + newznab.NewznabConstants.SEARCH_EPISODE: 'ep', newznab.NewznabConstants.SEARCH_SEASON: 'season', + newznab.NewznabConstants.SEARCH_TEXT: 'q' + }, + 'cats': { + newznab.NewznabConstants.CAT_SD: ['5030'], newznab.NewznabConstants.CAT_SPORT: ['5060'], + newznab.NewznabConstants.CAT_ANIME: ['5070'], newznab.NewznabConstants.CAT_UHD: ['5045'], + newznab.NewznabConstants.CAT_HD: ['5040'] + }, + 'all_cats': [ + {'id': '5070', 'name': 'Anime'}, {'id': '5185', 'name': 'Docu HD'}, + {'id': '5180', 'name': 'Docu SD'}, {'id': '5020', 'name': 'Foreign'}, + {'id': '5040', 'name': 'HD'}, {'id': '5200', 'name': 'HEVC'}, + {'id': '5050', 'name': 'Other'}, {'id': '5030', 'name': 'SD'}, + {'id': '5060', 'name': 'Sport'}, {'id': '5045', 'name': 'UHD'} + ], + 'limits': 100, + 'server_type': newznab.NewznabConstants.SERVER_DEFAULT + }, { + 'name': 'nzedb', + 'data_files': {'caps': 'nzedb_caps.xml'}, + 'caps': { + INDEXER_TVDB: 'tvdbid', INDEXER_TVRAGE: 'rid', INDEXER_TVMAZE: 'tvmazeid', INDEXER_TRAKT: 'traktid', + INDEXER_IMDB: 'imdbid', INDEXER_TMDB: 'tmdbid', + newznab.NewznabConstants.SEARCH_EPISODE: 'ep', newznab.NewznabConstants.SEARCH_SEASON: 'season', + newznab.NewznabConstants.SEARCH_TEXT: 'q' + }, + 'cats': { + newznab.NewznabConstants.CAT_SD: ['5030'], newznab.NewznabConstants.CAT_SPORT: ['5060'], + newznab.NewznabConstants.CAT_ANIME: ['5070'], newznab.NewznabConstants.CAT_UHD: ['5045'], + newznab.NewznabConstants.CAT_HD: ['5040'], newznab.NewznabConstants.CAT_WEBDL: ['5010'] + }, + 'all_cats': [ + {'id': '5070', 'name': 'Anime'}, {'id': '5080', 'name': 'Documentary'}, + {'id': '5020', 'name': 'Foreign'}, {'id': '5040', 'name': 'HD'}, + {'id': '5999', 'name': 'Other'}, {'id': '5030', 'name': 'SD'}, + {'id': '5060', 'name': 'Sport'}, {'id': '5045', 'name': 'UHD'}, + {'id': '5010', 'name': 'WEB-DL'} + ], + 'limits': 100, + 'server_type': newznab.NewznabConstants.SERVER_DEFAULT + }, { + 'name': 'nntmux', + 'data_files': {'caps': 'nntmux_caps.xml'}, + 'caps': { + INDEXER_TVDB: 'tvdbid', INDEXER_TVRAGE: 'rid', INDEXER_TVMAZE: 'tvmazeid', INDEXER_TRAKT: 'traktid', + INDEXER_IMDB: 'imdbid', INDEXER_TMDB: 'tmdbid', + newznab.NewznabConstants.SEARCH_EPISODE: 'ep', newznab.NewznabConstants.SEARCH_SEASON: 'season', + newznab.NewznabConstants.SEARCH_TEXT: 'q' + }, + 'cats': { + newznab.NewznabConstants.CAT_SD: ['5030'], newznab.NewznabConstants.CAT_SPORT: ['5060'], + newznab.NewznabConstants.CAT_ANIME: ['5070'], newznab.NewznabConstants.CAT_UHD: ['5045'], + newznab.NewznabConstants.CAT_HD: ['5040'], newznab.NewznabConstants.CAT_WEBDL: ['5010'] + }, + 'all_cats': [ + {'id': '5070', 'name': 'Anime'}, {'id': '5080', 'name': 'Documentary'}, + {'id': '5020', 'name': 'Foreign'}, {'id': '5040', 'name': 'HD'}, {'id': '5999', 'name': 'Other'}, + {'id': '5030', 'name': 'SD'}, {'id': '5060', 'name': 'Sport'}, {'id': '5045', 'name': 'UHD'}, + {'id': '5010', 'name': 'WEB-DL'}, {'id': '5090', 'name': 'X265'} + ], + 'limits': 100, + 'server_type': newznab.NewznabConstants.SERVER_DEFAULT + }, { + 'name': 'spotweb', + 'data_files': {'caps': 'spotweb_caps.xml'}, + 'caps': { + INDEXER_TVRAGE: 'rid', INDEXER_TVMAZE: 'tvmazeid', + newznab.NewznabConstants.SEARCH_EPISODE: 'ep', newznab.NewznabConstants.SEARCH_SEASON: 'season', + newznab.NewznabConstants.SEARCH_TEXT: 'q' + }, + 'cats': { + newznab.NewznabConstants.CAT_SD: ['5030'], newznab.NewznabConstants.CAT_SPORT: ['5060'], + newznab.NewznabConstants.CAT_ANIME: ['5070'], newznab.NewznabConstants.CAT_HD: ['5040'] + }, + 'all_cats': [ + {'id': '5020', 'name': 'Foreign'}, {'id': '5030', 'name': 'SD'}, {'id': '5040', 'name': 'HD'}, + {'id': '5050', 'name': 'Other'}, {'id': '5060', 'name': 'Sport'}, {'id': '5070', 'name': 'Anime'} + ], + 'limits': 500, + 'server_type': newznab.NewznabConstants.SERVER_SPOTWEB + }, { + 'name': 'NZBHydra', + 'data_files': {'caps': 'hydra1_caps.xml'}, + 'caps': { + INDEXER_TVDB: 'tvdbid', INDEXER_TVRAGE: 'rid', + newznab.NewznabConstants.SEARCH_EPISODE: 'ep', newznab.NewznabConstants.SEARCH_SEASON: 'season', + newznab.NewznabConstants.SEARCH_TEXT: 'q' + }, + 'cats': { + newznab.NewznabConstants.CAT_SD: ['5030'], newznab.NewznabConstants.CAT_SPORT: ['5060'], + newznab.NewznabConstants.CAT_ANIME: ['5070'], newznab.NewznabConstants.CAT_HD: ['5040'] + }, + 'all_cats': [ + {'id': '5020', 'name': 'Foreign'}, {'id': '5030', 'name': 'SD'}, {'id': '5040', 'name': 'HD'}, + {'id': '5050', 'name': 'Other'}, {'id': '5060', 'name': 'Sport'}, {'id': '5070', 'name': 'Anime'}, + {'id': '5080', 'name': 'Documentary'} + ], + 'limits': 100, + 'server_type': newznab.NewznabConstants.SERVER_HYDRA1 + }, { + 'name': 'NZBHydra 2', + 'data_files': {'caps': 'hydra2_caps.xml'}, + 'caps': { + INDEXER_TVDB: 'tvdbid', INDEXER_TVRAGE: 'rid', INDEXER_TVMAZE: 'tvmazeid', INDEXER_TRAKT: 'traktid', + newznab.NewznabConstants.SEARCH_EPISODE: 'ep', newznab.NewznabConstants.SEARCH_SEASON: 'season', + newznab.NewznabConstants.SEARCH_TEXT: 'q' + }, + 'cats': { + newznab.NewznabConstants.CAT_SD: ['5030'], newznab.NewznabConstants.CAT_SPORT: ['5060'], + newznab.NewznabConstants.CAT_ANIME: ['5070'], newznab.NewznabConstants.CAT_HD: ['5040'] + }, + 'all_cats': [ + {'id': '5070', 'name': 'Anime'}, {'id': '5040', 'name': 'TV HD'}, {'id': '5030', 'name': 'TV SD'} + ], + 'limits': 100, + 'server_type': newznab.NewznabConstants.SERVER_HYDRA2 + }, +] + + +class FakeNewznabProvider(newznab.NewznabProvider): + + def __init__(self, *args, **kwargs): + self.FILEDIR = os.path.join(test.TESTDIR, 'newznab_data') + self._data_files_dict = ({}, kwargs['data_files_dict'])[isinstance(kwargs.get('data_files_dict'), dict)] + if 'data_files_dict' in kwargs: + del kwargs['data_files_dict'] + super(FakeNewznabProvider, self).__init__(*args, **kwargs) + + def _read_data(self, filename): + try: + f = os.path.join(self.FILEDIR, filename) + if os.path.isfile(f): + with open(f, 'r') as d: + return d.read().decode('UTF-8') + except (StandardError, Exception): + return + + # simulate Data from provider + def get_url(self, url, skip_auth=False, use_tmr_limit=True, *args, **kwargs): + data = None + if '/api?' in url: + api_parameter = url[url.find('/api?') + 5:] + if 't=caps' in api_parameter and 'caps' in self._data_files_dict: + data = self._read_data(self._data_files_dict['caps']) + return data + + +class BasicTests(test.SickbeardTestDBCase): + + ns = {'newznab': 'http://www.newznab.com/DTD/2010/feeds/attributes/', 'atom': 'http://www.w3.org/2005/Atom'} + ns_parsed = dict((k, '{%s}' % v) for (k, v) in ns.items()) + + @staticmethod + def _create_item(title, link, size=-1, uuid='', ids=None, pubdate=None): + item = etree.Element('item', nsmap=BasicTests.ns) + title_item = etree.Element('title') + title_item.text = title + link_item = etree.Element('link') + link_item.text = link + item.append(title_item) + item.append(link_item) + if -1 != size: + size_item = etree.Element('{%s}attr' % BasicTests.ns['newznab'], nsmap=BasicTests.ns) + size_item.set('name', 'size') + size_item.set('value', '%s' % size) + item.append(size_item) + if uuid: + uuid_item = etree.Element('{%s}attr' % BasicTests.ns['newznab'], nsmap=BasicTests.ns) + uuid_item.set('name', 'guid') + uuid_item.set('value', '%s' % uuid) + item.append(uuid_item) + if ids: + for a, b in ids.iteritems(): + ids_item = etree.Element('{%s}attr' % BasicTests.ns['newznab'], nsmap=BasicTests.ns) + ids_item.set('name', a) + ids_item.set('value', '%s' % b) + item.append(ids_item) + if pubdate: + pubdate_item = etree.Element('pubDate') + pubdate_item.text = pubdate + item.append(pubdate_item) + return item + + def test_title_and_url(self): + + if VERBOSE: + print('Running tests') + + newznab_provider = newznab.NewznabProvider('test', '') + + for cur_test, cur_expected in item_parse_test_cases: + item = self._create_item(cur_test[0], cur_test[1]) + result = newznab_provider._title_and_url(item) + self.assertEqual(cur_expected, result) + + def test_get_size_uid(self): + + newznab_provider = newznab.NewznabProvider('test', '') + + for cur_test, cur_expected in size_test_cases: + item = self._create_item('Show.Name.S01E01.x264-Group', 'http://test.h', cur_test[0], cur_test[1]) + result = newznab_provider.get_size_uid(item, name_space=BasicTests.ns_parsed) + self.assertEqual(cur_expected, result) + + def test_parse_ids(self): + ids_test_cases = [] + for k in newznab.NewznabConstants.providerToIndexerMapping.iterkeys(): + rand_id = random.randrange(1, 99999999) + ids_test_cases.append(({k: rand_id}, {newznab.NewznabConstants.providerToIndexerMapping[k]: rand_id})) + + all_case = {} + all_case_ex = {} + for k in newznab.NewznabConstants.providerToIndexerMapping.iterkeys(): + rand_id = random.randrange(1, 99999999) + all_case.update({k: rand_id}) + all_case_ex.update({newznab.NewznabConstants.providerToIndexerMapping[k]: rand_id}) + + ids_test_cases.append((all_case, all_case_ex)) + + newznab_provider = newznab.NewznabProvider('test', '') + + for cur_test, cur_expected in ids_test_cases: + item = self._create_item('Show.Name.S01E01.x264-Group', 'https://test.h', ids=cur_test) + result = newznab_provider.cache.parse_ids(item, BasicTests.ns_parsed) + self.assertEqual(cur_expected, result) + + @staticmethod + def _parse_pub_date(date_str): + parsed_date = None + try: + if date_str: + p = parser.parse(date_str, fuzzy=True) + try: + p = p.astimezone(sb_timezone) + except (StandardError, Exception): + pass + if isinstance(p, datetime.datetime): + parsed_date = p.replace(tzinfo=None) + except (StandardError, Exception): + pass + + return parsed_date + + def test_parse_pub_date(self): + newznab_provider = newznab.NewznabProvider('test', '') + + for cur_test in pubdate_test_cases: + item = self._create_item('Show.Name.S01E01.x264-Group', 'https://test.h', pubdate=cur_test) + result = newznab_provider._parse_pub_date(item) + cur_expected = self._parse_pub_date(cur_test) + self.assertEqual(cur_expected, result) + + +class FakeProviderTests(test.SickbeardTestDBCase): + + def test_caps(self): + self.longMessage = True + for cur_test in caps_test_cases: + newznab_provider = FakeNewznabProvider('test', 'https://fake.fake/', data_files_dict=cur_test['data_files']) + newznab_provider.enabled = True + newznab_provider.get_caps() + msg = 'Test case: %s' % cur_test['name'] + self.assertEqual(cur_test['server_type'], newznab_provider.server_type, msg=msg) + self.assertEqual(cur_test['limits'], newznab_provider.limits, msg=msg) + self.assertEqual(cur_test['caps'], newznab_provider.caps, msg=msg) + self.assertEqual(cur_test['cats'], newznab_provider.cats, msg=msg) + self.assertEqual(cur_test['all_cats'], newznab_provider.all_cats, msg=msg) + + +if __name__ == '__main__': + if len(sys.argv) > 1: + suite = unittest.TestLoader().loadTestsFromName('newznab_tests.BasicTests.test_' + sys.argv[1]) + else: + suite = unittest.TestLoader().loadTestsFromTestCase(BasicTests) + unittest.TextTestRunner(verbosity=2).run(suite) + + suite = unittest.TestLoader().loadTestsFromTestCase(FakeProviderTests) + unittest.TextTestRunner(verbosity=2).run(FakeNewznabProvider) diff --git a/tests/scene_helpers_tests.py b/tests/scene_helpers_tests.py index ebce80f..dbed765 100644 --- a/tests/scene_helpers_tests.py +++ b/tests/scene_helpers_tests.py @@ -1,4 +1,7 @@ # coding=utf-8 +import warnings +warnings.filterwarnings('ignore', module=r'.*fuz.*', message='.*Sequence.*') +warnings.filterwarnings('ignore', module=r'.*connectionpool.*', message='.*certificate verification.*') import unittest import test_lib as test diff --git a/tests/search_tests.py b/tests/search_tests.py index c4a2aad..c852ee7 100644 --- a/tests/search_tests.py +++ b/tests/search_tests.py @@ -1,41 +1,45 @@ -import unittest - -from sickbeard import properFinder - -import sickbeard -import test_lib as test - -sickbeard.SYS_ENCODING = 'UTF-8' - - -class ProperTests(test.SickbeardTestDBCase): - def check_webdl_type(self, cases): - for c in cases: - self.assertEqual(properFinder.get_webdl_type(*c[0]), c[1]) - - def check_get_codec(self, cases): - for c in cases: - self.assertEqual(properFinder._get_codec(c[0]), c[1]) - - def test_webdl_type(self): - self.check_webdl_type([ - (('1080p.WEB.x264', 'The.Show.Name.S04E10.1080p.WEB.x264-GROUP'), 'webrip'), - (('720p.WEB-DL.DD5.1.H.264', 'The.Show.Name.720p.WEB-DL.DD5.1.H.264-GROUP'), 'webdl'), - (('1080p.AMZN.WEB-DL.DD5.1.H.264', 'The.Show.Name.1080p.AMZN.WEB-DL.DD5.1.H.264-GROUP'), 'Amazon'), - ]) - - def test_get_codec(self): - self.check_get_codec([ - ('1080p.WEB.x264', '264'), - ('720p.WEB.h264', '264'), - ('HDTV.XviD', 'xvid'), - ('720p.HEVC.x265', 'hevc'), - ('1080p.HEVC.AC3', 'hevc'), - ('10Bit.1080p.DD5.1.H.265', 'hevc'), - ('720p.DD5.1.Widescreen.x265', 'hevc'), - ]) - - -if __name__ == '__main__': - suite = unittest.TestLoader().loadTestsFromTestCase(ProperTests) - unittest.TextTestRunner(verbosity=2).run(suite) +import warnings +warnings.filterwarnings('ignore', module=r'.*fuz.*', message='.*Sequence.*') +warnings.filterwarnings('ignore', module=r'.*connectionpool.*', message='.*certificate verification.*') + +import unittest + +from sickbeard import properFinder + +import sickbeard +import test_lib as test + +sickbeard.SYS_ENCODING = 'UTF-8' + + +class ProperTests(test.SickbeardTestDBCase): + def check_webdl_type(self, cases): + for c in cases: + self.assertEqual(properFinder.get_webdl_type(*c[0]), c[1]) + + def check_get_codec(self, cases): + for c in cases: + self.assertEqual(properFinder._get_codec(c[0]), c[1]) + + def test_webdl_type(self): + self.check_webdl_type([ + (('1080p.WEB.x264', 'The.Show.Name.S04E10.1080p.WEB.x264-GROUP'), 'webrip'), + (('720p.WEB-DL.DD5.1.H.264', 'The.Show.Name.720p.WEB-DL.DD5.1.H.264-GROUP'), 'webdl'), + (('1080p.AMZN.WEB-DL.DD5.1.H.264', 'The.Show.Name.1080p.AMZN.WEB-DL.DD5.1.H.264-GROUP'), 'Amazon'), + ]) + + def test_get_codec(self): + self.check_get_codec([ + ('1080p.WEB.x264', '264'), + ('720p.WEB.h264', '264'), + ('HDTV.XviD', 'xvid'), + ('720p.HEVC.x265', 'hevc'), + ('1080p.HEVC.AC3', 'hevc'), + ('10Bit.1080p.DD5.1.H.265', 'hevc'), + ('720p.DD5.1.Widescreen.x265', 'hevc'), + ]) + + +if __name__ == '__main__': + suite = unittest.TestLoader().loadTestsFromTestCase(ProperTests) + unittest.TextTestRunner(verbosity=2).run(suite)