"""Tests für den MakeMKV-Beta-Key-Parser (dependency-frei, nur extract_key).""" import pytest from makemkv_key import extract_key # Beispiel-Key im echten Format (T- + 64 Zeichen [A-Za-z0-9_]). _KEY = "T-BSaJ6gwgMx4eIggWkVYXiVP_6zehm7WAO9dEydvzOHFHoZ6YQ82BL5cGpYDxvyRWnS" def test_extract_key_findet_key_im_html(): html = f'
{_KEY}
' assert extract_key(html) == _KEY def test_extract_key_ohne_key_gibt_none(): assert extract_key("kein Schluessel hier") is None assert extract_key("") is None def test_extract_key_zu_kurz_kein_treffer(): # Format ist streng T- + genau 64 Zeichen — zu kurz fällt raus. assert extract_key("T-zukurz123") is None def test_extract_key_liefert_ganzen_key(): # Regression: die Regex darf den Key NICHT abschneiden (Beta-Keys sind länger # als die im Forum genannten 64 Zeichen — hier der volle Key zwischen Text). treffer = extract_key(f"Vorher-Text {_KEY} Nachher-Text") assert treffer == _KEY assert treffer.startswith("T-") # ── Der Knopf „Jetzt aus dem Forum holen" (Commander 28.08.2026) ───────── # # > „Bezüglich des MKV Beta Keys - der könnte theoretisch auch automatisch # > ausgelesen werden, ich glaube das web rippy kann das" # # Er hatte recht: `refresh_loop()` laeuft seit jeher taeglich mit (main.py, # Startereignis). Gemessen am 28.08.2026: Forum antwortet in 3,3 s, Key mit 62 # Zeichen. Nur war davon NICHTS zu sehen — kein Knopf, keine Meldung. Eine # Automatik, die man nicht sehen kann, ist fuer den Benutzer keine. @pytest.fixture def klient(): from fastapi.testclient import TestClient from main import app return TestClient(app) def test_der_knopf_holt_und_meldet_was_passiert_ist(klient, monkeypatch): import main as api monkeypatch.setattr("makemkv_key.fetch_current_key", lambda *a, **k: _KEY) monkeypatch.setattr("makemkv_key._apply_key", lambda key: True) monkeypatch.setattr(api.db, "add_log", lambda *a, **k: None) antwort = klient.post("/system/makemkv-key/holen") assert antwort.status_code == 200 daten = antwort.json() assert daten["geholt"] is True assert daten["geaendert"] is True assert daten["endet_auf"] == _KEY[-6:] def test_der_key_selbst_wandert_NICHT_ueber_die_leitung(klient, monkeypatch): """Er steht in den Einstellungen. Ein zweiter Weg zu demselben Wert ist ein zweiter Weg, ihn zu verlieren.""" import main as api monkeypatch.setattr("makemkv_key.fetch_current_key", lambda *a, **k: _KEY) monkeypatch.setattr("makemkv_key._apply_key", lambda key: False) monkeypatch.setattr(api.db, "add_log", lambda *a, **k: None) text = klient.post("/system/makemkv-key/holen").text assert _KEY not in text assert _KEY[:20] not in text def test_ein_stummes_forum_ist_ein_klarer_fehler_kein_leerer_erfolg(klient, monkeypatch): """Sonst hiesse „geholt: true" mit leerem Key, es sei alles in Ordnung.""" def wirft(*a, **k): raise OSError("Verbindung abgelehnt") monkeypatch.setattr("makemkv_key.fetch_current_key", wirft) antwort = klient.post("/system/makemkv-key/holen") assert antwort.status_code == 502 assert "Forum" in antwort.json()["detail"] def test_geaendertes_seitenformat_wird_benannt(klient, monkeypatch): """Kein Treffer heisst NICHT „kein Key noetig" — es heisst, die Seite hat sich geaendert. Das muss dastehen, sonst sucht niemand danach.""" monkeypatch.setattr("makemkv_key.fetch_current_key", lambda *a, **k: None) antwort = klient.post("/system/makemkv-key/holen") assert antwort.status_code == 502 assert "geändert" in antwort.json()["detail"]