"""Tests für die Phasen-Erkennung — was darf der „Neu"-Knopf anbieten?""" import json import phasen def test_laufender_job_bietet_nichts(): assert phasen.retry_art({"status": "running"}) == phasen.NICHTS assert phasen.retry_art({"status": "completed"}) == phasen.NICHTS def test_toter_transcode_bietet_komprimieren(): job = {"status": "failed", "meta": json.dumps({"rip_fertig": True})} assert phasen.retry_art(job) == phasen.NEU_KOMPRIMIEREN def test_toter_rip_bietet_rippen(): """Der Vorfall vom 26.07.2026: 5,1 GB von 40 GB. Komprimieren wäre falsch.""" job = {"status": "failed", "meta": json.dumps({"rip_fertig": False, "year": 1988})} assert phasen.retry_art(job) == phasen.NEU_RIPPEN def test_bestandsjob_ohne_marke_ist_unklar(): """Jobs von VOR dieser Änderung dürfen nicht geraten werden.""" assert phasen.retry_art({"status": "failed", "meta": None}) == phasen.UNKLAR assert phasen.retry_art({"status": "failed"}) == phasen.UNKLAR assert phasen.retry_art( {"status": "failed", "meta": json.dumps({"year": 1988})} ) == phasen.UNKLAR def test_kaputtes_json_ist_unklar_statt_absturz(): """/jobs darf an einer krummen meta-Zeile nicht scheitern.""" assert phasen.retry_art({"status": "failed", "meta": "{kein json"}) == phasen.UNKLAR assert phasen.retry_art({"status": "failed", "meta": "[1,2]"}) == phasen.UNKLAR assert phasen.retry_art({"status": "failed", "meta": 7}) == phasen.UNKLAR def test_marke_wird_auch_als_dict_gelesen(): """Der Detail-Endpunkt hat die Metadaten schon geparst.""" job = {"status": "failed", "meta": {"rip_fertig": True}} assert phasen.retry_art(job) == phasen.NEU_KOMPRIMIEREN def test_der_schluessel_heisst_im_worker_genauso(): """Zwei Container, kein geteiltes Paket — die Marke muss zusammenpassen. Ohne diese Prüfung ist ein Tippfehler in einer der beiden Dateien lautlos: Der Worker schreibt `rip_fertig`, die API liest `ripFertig`, und JEDER Job wäre für immer „unklar". Genau diese Sorte Auseinanderdriften hat die Zombie-Erkennung ein Release lang blind gemacht („running" vs. „ripping"). """ import pathlib import re quelle = ( pathlib.Path(__file__).resolve().parents[1] / "worker" / "tasks.py" ).read_text(encoding="utf-8") # Der Worker schreibt die Marke über eine Konstante — deren Wert muss hier # ankommen. treffer = re.search(r'^RIP_FERTIG\s*=\s*"([^"]+)"', quelle, re.MULTILINE) assert treffer, "worker/tasks.py definiert RIP_FERTIG nicht mehr" assert treffer.group(1) == phasen.RIP_FERTIG