summaryrefslogtreecommitdiffstats
path: root/test/test_results.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_results.py')
-rw-r--r--test/test_results.py88
1 files changed, 66 insertions, 22 deletions
diff --git a/test/test_results.py b/test/test_results.py
index 4b1c4c1..05b98bf 100644
--- a/test/test_results.py
+++ b/test/test_results.py
@@ -145,7 +145,8 @@ class TestExtractorResults(unittest.TestCase):
config.set((), key, None)
if auth and not any(extr.config(key) for key in AUTH_KEYS):
- return self._skipped.append((result["#url"], "no auth"))
+ self._skipped.append((result["#url"], "no auth"))
+ self.skipTest("no auth")
if "#options" in result:
for key, value in result["#options"].items():
@@ -155,11 +156,16 @@ class TestExtractorResults(unittest.TestCase):
config.set((), "image-range" , result["#range"])
config.set((), "chapter-range", result["#range"])
- tjob = ResultJob(extr, content=("#sha1_content" in result))
+ tjob = ResultJob(extr,
+ content=("#sha1_content" in result),
+ format=(result.get("#metadata") != "post"))
if "#exception" in result:
- with self.assertRaises(result["#exception"], msg="#exception"):
+ with self.assertRaises(result["#exception"], msg="#exception"), \
+ self.assertLogs() as log_info:
tjob.run()
+ if "#log" in result:
+ self.assertLogEqual(result["#log"], log_info.output)
return
try:
@@ -228,7 +234,7 @@ class TestExtractorResults(unittest.TestCase):
if isinstance(count, str):
self.assertRegex(
count, r"^ *(==|!=|<|<=|>|>=) *\d+ *$", msg="#count")
- expr = "{} {}".format(len_urls, count)
+ expr = f"{len_urls} {count}"
self.assertTrue(eval(expr), msg=expr)
elif isinstance(count, range):
self.assertRange(len_urls, count, msg="#count")
@@ -257,7 +263,11 @@ class TestExtractorResults(unittest.TestCase):
metadata = {k: v for k, v in result.items() if k[0] != "#"}
if metadata:
- for kwdict in tjob.kwdict_list:
+ if result.get("#metadata") == "post":
+ kwdicts = tjob.kwdict_post
+ else:
+ kwdicts = tjob.kwdict_list
+ for kwdict in kwdicts:
self._test_kwdict(kwdict, metadata)
def _test_kwdict(self, kwdict, tests, parent=None):
@@ -274,7 +284,7 @@ class TestExtractorResults(unittest.TestCase):
else:
subtest = False
- path = "{}.{}".format(parent, key) if parent else key
+ path = f"{parent}.{key}" if parent else key
if key.startswith("!"):
self.assertNotIn(key[1:], kwdict, msg=path)
@@ -286,7 +296,7 @@ class TestExtractorResults(unittest.TestCase):
if subtest:
self.assertNotIsInstance(value, str, msg=path)
for idx, item in enumerate(value):
- subpath = "{}[{}]".format(path, idx)
+ subpath = f"{path}[{idx}]"
self._test_kwdict_value(item, test, subpath)
else:
self._test_kwdict_value(value, test, path)
@@ -308,12 +318,18 @@ class TestExtractorResults(unittest.TestCase):
for idx, item in enumerate(test):
if isinstance(item, dict):
subtest = True
- subpath = "{}[{}]".format(path, idx)
- self._test_kwdict(value[idx], item, subpath)
+ subpath = f"{path}[{idx}]"
+ try:
+ obj = value[idx]
+ except Exception as exc:
+ self.fail(f"'{exc.__class__.__name__}: {exc}' "
+ f"when accessing {subpath}")
+ self._test_kwdict(obj, item, subpath)
if not subtest:
self.assertEqual(test, value, msg=path)
elif isinstance(test, str):
if test.startswith("re:"):
+ self.assertIsInstance(value, str, msg=path)
self.assertRegex(value, test[3:], msg=path)
elif test.startswith("dt:"):
self.assertIsInstance(value, datetime.datetime, msg=path)
@@ -324,8 +340,29 @@ class TestExtractorResults(unittest.TestCase):
cls, _, length = test[4:].rpartition(":")
if cls:
self.assertEqual(
- cls, type(value).__name__, msg=path + "/type")
- self.assertEqual(int(length), len(value), msg=path)
+ cls, type(value).__name__, msg=f"{path}/type")
+ try:
+ len_value = len(value)
+ except Exception:
+ len_value = 0
+ for _ in value:
+ len_value += 1
+ self.assertEqual(int(length), len_value, msg=path)
+ elif test.startswith("iso:"):
+ iso = test[4:]
+ if iso in ("dt", "datetime", "8601"):
+ msg = f"{path} / ISO 8601"
+ try:
+ dt = datetime.datetime.fromisoformat(value)
+ except Exception as exc:
+ self.fail(f"Invalid datetime '{value}': {exc} {msg}")
+ self.assertIsInstance(dt, datetime.datetime, msg=msg)
+ elif iso in ("lang", "639", "639-1"):
+ msg = f"{path} / ISO 639-1"
+ self.assertIsInstance(value, str, msg=msg)
+ self.assertRegex(value, r"^[a-z]{2}(-\w+)?$", msg=msg)
+ else:
+ self.fail(f"Unsupported ISO test '{test}'")
else:
self.assertEqual(test, value, msg=path)
else:
@@ -335,7 +372,7 @@ class TestExtractorResults(unittest.TestCase):
class ResultJob(job.DownloadJob):
"""Generate test-results for extractor runs"""
- def __init__(self, url, parent=None, content=False):
+ def __init__(self, url, parent=None, content=False, format=True):
job.DownloadJob.__init__(self, url, parent)
self.queue = False
self.content = content
@@ -343,6 +380,7 @@ class ResultJob(job.DownloadJob):
self.url_list = []
self.url_hash = hashlib.sha1()
self.kwdict_list = []
+ self.kwdict_post = []
self.kwdict_hash = hashlib.sha1()
self.archive_list = []
self.archive_hash = hashlib.sha1()
@@ -353,12 +391,17 @@ class ResultJob(job.DownloadJob):
else:
self._update_content = lambda url, kwdict: None
- self.format_directory = TestFormatter(
- "".join(self.extractor.directory_fmt)).format_map
- self.format_filename = TestFormatter(
- self.extractor.filename_fmt).format_map
- self.format_archive = TestFormatter(
- self.extractor.archive_fmt).format_map
+ if format:
+ self.format_directory = TestFormatter(
+ "".join(self.extractor.directory_fmt)).format_map
+ self.format_filename = TestFormatter(
+ self.extractor.filename_fmt).format_map
+ self.format_archive = TestFormatter(
+ self.extractor.archive_fmt).format_map
+ else:
+ self.format_directory = \
+ self.format_filename = \
+ self.format_archive = lambda kwdict: ""
def run(self):
self._init()
@@ -391,6 +434,8 @@ class ResultJob(job.DownloadJob):
def _update_kwdict(self, kwdict, to_list=True):
if to_list:
self.kwdict_list.append(kwdict.copy())
+ else:
+ self.kwdict_post.append(kwdict.copy())
kwdict = util.filter_dict(kwdict)
self.kwdict_hash.update(
json.dumps(kwdict, sort_keys=True, default=str).encode())
@@ -489,8 +534,7 @@ def load_test_config():
except FileNotFoundError:
pass
except Exception as exc:
- sys.exit("Error when loading {}: {}: {}".format(
- path, exc.__class__.__name__, exc))
+ sys.exit(f"Error when loading {path}: {exc.__class__.__name__}: {exc}")
def result_categories(result):
@@ -553,12 +597,12 @@ def generate_tests():
enum = collections.defaultdict(int)
for result in tests:
base, cat, sub = result_categories(result)
- name = "{}_{}".format(cat, sub)
+ name = f"{cat}_{sub}"
enum[name] += 1
method = _generate_method(result)
method.__doc__ = result["#url"]
- method.__name__ = "test_{}_{}".format(name, enum[name])
+ method.__name__ = f"test_{name}_{enum[name]}"
setattr(TestExtractorResults, method.__name__, method)