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 == []