75 lines
2.5 KiB
Python
75 lines
2.5 KiB
Python
import importlib.util
|
|
import sys
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
SPEC = importlib.util.spec_from_file_location("rcjav_rules", ROOT / "rc-jav.py")
|
|
RCJAV = importlib.util.module_from_spec(SPEC)
|
|
sys.modules[SPEC.name] = RCJAV
|
|
SPEC.loader.exec_module(RCJAV)
|
|
|
|
|
|
def entry(path, size=1_000, jav_id="TEST-001"):
|
|
return RCJAV.FileEntry(
|
|
source="Target",
|
|
remote="cq:JAV",
|
|
path=path,
|
|
size=size,
|
|
mod_time="",
|
|
jav_id=jav_id,
|
|
)
|
|
|
|
|
|
class IdRuleTests(unittest.TestCase):
|
|
def test_builtin_multipart_shapes_keep_parts_distinct(self):
|
|
expected = {
|
|
"KV-118 - Aiba Reika_PART1.mp4": "KV-118#part1",
|
|
"KV-118_A.mp4": "KV-118#part1",
|
|
"OFJE-195-7 [480p].mp4": "OFJE-195#part7",
|
|
"ABC-027.mp4": "ABC-027",
|
|
}
|
|
for name, jav_id in expected.items():
|
|
with self.subTest(name=name):
|
|
self.assertEqual(RCJAV.extract_id(name), jav_id)
|
|
|
|
def test_multipart_files_do_not_form_base_duplicate_group(self):
|
|
files = [
|
|
entry("KV-118 - Aiba Reika_PART1.mp4", jav_id="KV-118"),
|
|
entry("KV-118 - Aiba Reika_PART2.mp4", jav_id="KV-118"),
|
|
entry("KV-118 - Aiba Reika_PART3.mp4", jav_id="KV-118"),
|
|
]
|
|
self.assertEqual(RCJAV.find_dupes(files), {})
|
|
|
|
def test_large_same_id_group_gets_manual_review_risk(self):
|
|
files = [
|
|
entry("TEST-001 direct.mp4"),
|
|
entry("TEST-001 edit.mp4"),
|
|
entry("TEST-001 mirror.mp4"),
|
|
]
|
|
risks = RCJAV.describe_dupe_risks("TEST-001", files)
|
|
self.assertIn("large_same_id_group", {risk["code"] for risk in risks})
|
|
|
|
|
|
class KeepRankingTests(unittest.TestCase):
|
|
def test_vip_folder_beats_larger_non_vip_copy(self):
|
|
keep, reason = RCJAV.decide_keep_with_reason([
|
|
entry("ClearJAV/TEST-001.mp4", size=2_000),
|
|
entry("Other/TEST-001 [1080p].mkv", size=9_000),
|
|
])
|
|
self.assertEqual(keep.path, "ClearJAV/TEST-001.mp4")
|
|
self.assertEqual(reason["code"], "vip_folder")
|
|
|
|
def test_ts_loses_to_non_ts_even_when_larger(self):
|
|
keep, reason = RCJAV.decide_keep_with_reason([
|
|
entry("Other/TEST-001.ts", size=9_000),
|
|
entry("Other/TEST-001.mp4", size=8_000),
|
|
])
|
|
self.assertEqual(keep.path, "Other/TEST-001.mp4")
|
|
self.assertEqual(reason["code"], "container")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|