diff --git a/src/rippy/einrichtung.py b/src/rippy/einrichtung.py index 4000c6d..1f853e4 100644 --- a/src/rippy/einrichtung.py +++ b/src/rippy/einrichtung.py @@ -200,7 +200,27 @@ def pruefe_administrator(erhoeht=None, laufwerke=None) -> dict: "(\\\\Server\\Freigabe) oder Rippy ohne Administrator starten.") -def pruefe_schreibrecht(ziel: str, probe=None, erhoeht=None) -> dict: +def laufwerk_fehlt(ziel: str, vorhanden=None) -> bool: + r"""Zeigt der Pfad auf einen Laufwerksbuchstaben, den es hier nicht gibt? + + `vorhanden` ist einspritzbar — und das ist kein Beiwerk: Die Frage + „existiert Laufwerk Q:" laesst sich auf dem Linux-Runner der Ampel gar + nicht beantworten, dort gibt es ueberhaupt keine Laufwerksbuchstaben. + Ohne Einspritzpunkt waere dieser Zweig nur auf einem Windows-Rechner mit + genau dem passenden fehlenden Laufwerk pruefbar — also nirgends. + """ + laufwerk = pfade.laufwerk_von(ziel or "") + if len(laufwerk) != 2 or not laufwerk.endswith(":"): + return False # UNC-Pfad oder POSIX + if vorhanden is not None: + return not vorhanden + if os.name != "nt": + return False + return not os.path.isdir(laufwerk + "\\") + + +def pruefe_schreibrecht(ziel: str, probe=None, erhoeht=None, + laufwerk_da=None) -> dict: """Darf Rippy dorthin schreiben? Wirklich probiert, nicht geraten. Ein `os.access(..., W_OK)` lügt unter Windows: Es beantwortet die Frage @@ -222,8 +242,8 @@ def pruefe_schreibrecht(ziel: str, probe=None, erhoeht=None) -> dict: # ueber `pfade`, nicht ueber `os.path`: Auf dem Linux-Runner der Ampel # kennt `splitdrive` kein "Q:" und gab einen leeren String zurueck -- # dieselbe Falle, fuer die es `rippy/pfade.py` gibt. Zum vierten Mal. - laufwerk = pfade.laufwerk_von(ziel or "") - if laufwerk and len(laufwerk) == 2 and not os.path.isdir(laufwerk + "\\"): + if laufwerk_fehlt(ziel, laufwerk_da): + laufwerk = pfade.laufwerk_von(ziel or "") # Ein Laufwerksbuchstabe, den es in DIESEM Prozess nicht gibt. zusatz = (" Als Administrator gestartete Programme sehen die " "eingebundenen Netzlaufwerke der Sitzung nicht." diff --git a/src/rippy/test_einrichtung.py b/src/rippy/test_einrichtung.py index c8cd157..dbf80a5 100644 --- a/src/rippy/test_einrichtung.py +++ b/src/rippy/test_einrichtung.py @@ -114,9 +114,13 @@ def test_als_administrator_wird_vor_den_fehlenden_netzlaufwerken_gewarnt(): def test_fehlendes_laufwerk_wird_beim_namen_genannt(): """„Schreibrechte fehlen" war richtig im Wortlaut und unbrauchbar als Auskunft: Das Laufwerk war fuer den erhoehten Prozess gar nicht da.""" + # `laufwerk_da=False` eingespritzt: Die Frage "existiert Q:" laesst sich + # auf dem Linux-Runner der Ampel gar nicht beantworten. Ohne den + # Einspritzpunkt waere dieser Zweig nur auf einem Windows-Rechner mit + # genau diesem fehlenden Laufwerk pruefbar -- also nirgends. befund = e.pruefe_schreibrecht( "Q:" + chr(92) + "Rippy", probe=(False, "Pfad nicht gefunden"), - erhoeht=True) + erhoeht=True, laufwerk_da=False) assert befund["zustand"] == e.FEHLER assert "Q:" in befund["text"] assert "nicht vorhanden" in befund["text"] @@ -261,3 +265,16 @@ def test_netzwerkpfad_ohne_administrator_bekommt_die_normale_meldung(): erhoeht=False) assert befund["zustand"] == e.FEHLER assert "Administrator" not in befund["abhilfe"] or "keine" in befund["abhilfe"] + + +def test_ein_vorhandenes_laufwerk_ist_kein_laufwerks_problem(): + """Sonst waere JEDER Schreibfehler auf C: ein 'Laufwerk fehlt'.""" + B = chr(92) + assert e.laufwerk_fehlt("C:" + B + "Programme", vorhanden=True) is False + assert e.laufwerk_fehlt("Q:" + B + "Rippy", vorhanden=False) is True + + +def test_unc_und_posix_sind_keine_laufwerksbuchstaben(): + B = chr(92) + assert e.laufwerk_fehlt(B + B + "NAS" + B + "Filme") is False + assert e.laufwerk_fehlt("/srv/rippy") is False