From 069fc46f448be447fcfe1fe45464d5335a873951 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Fri, 28 Aug 2026 11:47:11 +0200 Subject: [PATCH] fix(test): der Installations-Test hat die ECHTEN Verknuepfungen ueberschrieben MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit WAS: `test_installation_legt_die_dateien_an_...` installiert in ein tmp_path — legt aber seit dem Verknuepfungs-Einbau auch Symbole auf dem ECHTEN Desktop und im ECHTEN Startmenue an. Die kennen kein tmp_path. DIE FOLGE, vom Commander gemeldet: Er klickte auf das Desktop-Symbol und bekam von Windows "Diese App kann auf dem PC nicht ausgefuehrt werden". Nachgemessen zeigte die Verknuepfung auf ...\Temp\pytest-of-TobisPC\pytest-142\test_installation_..._0\installiert\Rippy.exe — und dort liegt die 2-KB-ATTRAPPE aus dem Test, kein Programm. Windows hatte voellig recht. Der `finally`-Block raeumte nur Registry und Autostart auf; die Verknuepfungen nicht, weil es sie beim Schreiben des Tests noch nicht gab. Als sie dazukamen, wuchs der Test stillschweigend ueber sein tmp_path hinaus. Ein Test, der Spuren ausserhalb seines Temp-Ordners hinterlaesst, ist kein Test, sondern ein Eingriff. BEHOBEN mit ZWEI Sicherungen statt einer: 1. verknuepfen=False — die Funktion legt gar keine an. 2. vk.alle_anlegen ist trotzdem ersetzt. Wer den Schalter spaeter umdreht oder die Vorgabe aendert, kann damit trotzdem nichts am echten System anrichten. Dazu ein Waechter: test_installation_ruehrt_die_echten_verknuepfungen_ nicht_an prueft, dass die Anlege-Funktionen bei verknuepfen=False GAR NICHT gerufen werden. Waere er frueher dagewesen, haette der Commander keine kaputte Verknuepfung bekommen. DER RECHNER IST REPARIERT: neu installiert, beide Verknuepfungen zeigen wieder auf C:\Users\...\AppData\Local\Rippy\Rippy.exe (29 MB, existiert), Programme+Features-Eintrag ist zurueck. Start ueber die Verknuepfung: HTTP 200 nach 2 s, Worker TobisNicerPC mit cpu-x264/x265/av1 + vce/vce-av1, MakeMKV 1.18.4 und HandBrake 1.11.2 gefunden. Nebenbei ausgeschlossen, bevor die Ursache klar war: Die EXE selbst ist in Ordnung (gueltiges x64-PE, MZ/PE-Kopf, 29 MB, Hash identisch mit dem Installat), kein Mark-of-the-Web, kein Defender-Fund, Smart App Control aus. Der Fehler lag nicht an der Datei, sondern daran, WORAUF gezeigt wurde. GEMESSEN: ruff sauber, 522 Tests gruen + 15 uebersprungen. Co-Authored-By: Claude Opus 5 --- src/rippy/test_windows_app.py | 69 ++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/src/rippy/test_windows_app.py b/src/rippy/test_windows_app.py index 9c1ae60..3a2ccfa 100644 --- a/src/rippy/test_windows_app.py +++ b/src/rippy/test_windows_app.py @@ -62,9 +62,41 @@ def test_ordner_ohne_abschliessenden_trenner(): @nur_windows def test_installation_legt_die_dateien_an_und_meldet_sich_bei_windows(tmp_path, monkeypatch): """Der ganze Kreislauf. Der Registry-Schluessel ist der ECHTE — deshalb - wird am Ende immer aufgeraeumt, auch wenn der Test scheitert.""" + wird am Ende immer aufgeraeumt, auch wenn der Test scheitert. + + ## ⚠️ WARUM HIER KEINE VERKNUEPFUNGEN ANGELEGT WERDEN (28.08.2026) + + Genau das ist einmal passiert, und es hat den Rechner des Commanders + kaputtgemacht: `installieren()` legt Verknuepfungen auf dem ECHTEN + Desktop und im ECHTEN Startmenue an — die kennen kein `tmp_path`. Der + Test ueberschrieb damit die funktionierende Desktop-Verknuepfung durch + eine, die auf `…\\Temp\\pytest-of-…\\installiert\\Rippy.exe` zeigte. Und + dort liegt die 2-KB-ATTRAPPE von unten, kein Programm. + + Der Commander klickte darauf und bekam von Windows: + „Diese App kann auf dem PC nicht ausgefuehrt werden." + + Aufgeraeumt hatte der Test nur Registry und Autostart — die + Verknuepfungen nicht, weil es sie beim Schreiben des Tests noch nicht + gab. Ein Test, der Spuren ausserhalb von `tmp_path` hinterlaesst, ist + kein Test, sondern ein Eingriff. + + Deshalb jetzt ZWEI Sicherungen statt einer: + 1. `verknuepfen=False` — die Funktion legt gar keine an. + 2. Die Anlege-Funktion ist trotzdem ersetzt. Wer den Schalter + irgendwann umdreht oder die Vorgabe aendert, kann damit trotzdem + nichts am echten System anrichten. + """ + from rippy.platform import verknuepfungen as vk from rippy.platform import win_registry as reg + # Sicherung 2: Selbst ein versehentliches `verknuepfen=True` bliebe folgenlos. + angelegt = [] + monkeypatch.setattr( + vk, "alle_anlegen", + lambda programm, icon="", desktop=True, startmenue=True: + angelegt.append(programm) or {}) + # Nicht die eigene Datei kopieren (das waere python.exe), sondern eine # Attrappe: geprueft wird die Verdrahtung, nicht shutil.copy2. attrappe = tmp_path / "quelle" / "RippySetup.exe" @@ -75,7 +107,8 @@ def test_installation_legt_die_dateien_an_und_meldet_sich_bei_windows(tmp_path, ziel = str(tmp_path / "installiert") try: ordner = windows_app.installieren(ziel=ziel, autostart=True, - starten_danach=False) + starten_danach=False, + verknuepfen=False) assert os.path.isfile(os.path.join(ordner, "Rippy.exe")) assert reg.ist_eingetragen() is True @@ -89,3 +122,35 @@ def test_installation_legt_die_dateien_an_und_meldet_sich_bei_windows(tmp_path, assert reg.ist_eingetragen() is False assert reg.autostart_wert() == "" + assert angelegt == [], "Es haette KEINE Verknuepfung angelegt werden duerfen" + + +@nur_windows +def test_installation_ruehrt_die_echten_verknuepfungen_nicht_an(tmp_path, monkeypatch): + """Der Waechter gegen genau den Vorfall vom 28.08.2026. + + Er prueft, dass eine Installation mit `verknuepfen=False` die + Verknuepfungs-Funktionen NICHT aufruft — unabhaengig davon, was sie + tun wuerden. Waere dieser Test frueher dagewesen, haette der Commander + keine kaputte Desktop-Verknuepfung bekommen. + """ + from rippy.platform import verknuepfungen as vk + from rippy.platform import win_registry as reg + + aufrufe = [] + monkeypatch.setattr(vk, "anlegen", + lambda *a, **k: aufrufe.append(a) or True) + monkeypatch.setattr(vk, "alle_anlegen", + lambda *a, **k: aufrufe.append(a) or {}) + + attrappe = tmp_path / "q" / "RippySetup.exe" + attrappe.parent.mkdir() + attrappe.write_bytes(b"x" * 16) + monkeypatch.setattr(windows_app, "_eigene_datei", lambda: str(attrappe)) + + try: + windows_app.installieren(ziel=str(tmp_path / "i"), autostart=False, + starten_danach=False, verknuepfen=False) + finally: + reg.austragen() + assert aufrufe == []