From ddbd5451010e00c2ce64e57ce1d03ddbcd8ab4ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odd=20Str=C3=A5b=C3=B8?= Date: Thu, 17 Dec 2020 04:52:53 +0100 Subject: [PATCH] [test] Start reworking test/test_download.py The goal is being able to run info extractor tests for only a single provider or extractor. This makes the test usable when maintaining individual providers. --- test/test_download.py | 47 +++++++++++++++++++++++++--------- youtube_dl/extractor/common.py | 1 + 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/test/test_download.py b/test/test_download.py index ebe820dfc..96fcda2e1 100644 --- a/test/test_download.py +++ b/test/test_download.py @@ -61,10 +61,10 @@ def _file_md5(fn): return hashlib.md5(f.read()).hexdigest() -defs = gettestcases() +ie_testcases = gettestcases() -class TestDownload(unittest.TestCase): +class BaseDownloadTCase(unittest.TestCase): # Parallel testing in nosetests. See # http://nose.readthedocs.org/en/latest/doc_tests/test_multiprocess/multiprocess.html _multiprocess_shared_ = True @@ -83,8 +83,9 @@ class TestDownload(unittest.TestCase): strclass(self.__class__), ' [%s]' % add_ie if add_ie else '') - def setUp(self): - self.defs = defs + +TestDownload = unittest.TestSuite() + # Dynamically generate tests @@ -246,20 +247,42 @@ def generator(test_case, tname): return test_template +cache = {} + # And add them to TestDownload -for n, test_case in enumerate(defs): - tname = 'test_' + str(test_case['name']) - i = 1 - while hasattr(TestDownload, tname): - tname = 'test_%s_%d' % (test_case['name'], i) +for test_case in ie_testcases: + # Get or create a sub-test for the extractor file + module_name = test_case.get('module_name', 'unknown').rsplit('.', 1)[-1] # type: str + extractor_file_name = str('test_%s' % module_name) + extractor_file_suite = getattr(TestDownload, extractor_file_name, None) + if extractor_file_suite is None: + extractor_file_suite = type(extractor_file_name, (unittest.TestSuite,), {})() + setattr(TestDownload, extractor_file_name, extractor_file_suite) + TestDownload.addTest(extractor_file_suite) + + # Get or create a sub-test for the info extractor + # This class contains the actual tests + extractor_class_name = str('test_%s' % test_case['name']) + ExtractorClass = getattr(extractor_file_suite, extractor_class_name, None) + if ExtractorClass is None: + ExtractorClass = type(extractor_class_name, (BaseDownloadTCase,), {}) + setattr(extractor_file_suite, extractor_class_name, ExtractorClass) + + i = 0 + tname = 'test_%d' % i + while hasattr(ExtractorClass, tname): + tname = 'test_%d' % i i += 1 test_method = generator(test_case, tname) test_method.__name__ = str(tname) ie_list = test_case.get('add_ie') test_method.add_ie = ie_list and ','.join(ie_list) - setattr(TestDownload, test_method.__name__, test_method) - del test_method + + setattr(ExtractorClass, test_method.__name__, test_method) + extractor_file_suite.addTest(ExtractorClass(test_method.__name__)) + + del test_method, test_case if __name__ == '__main__': - unittest.main() + unittest.main(argv=['TestDownload']) diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py index 79138f346..47d22ee7d 100644 --- a/youtube_dl/extractor/common.py +++ b/youtube_dl/extractor/common.py @@ -2940,6 +2940,7 @@ class InfoExtractor(object): if not include_onlymatching and t.get('only_matching', False): continue t['name'] = type(self).__name__[:-len('IE')] + t['module_name'] = type(self).__module__ yield t def is_suitable(self, age_limit):