"""Tests für die SMB-Fehlerübersetzung (Speicherziele → Freigaben auflisten).""" from mounts import uebersetze_smb_fehler, validiere_name def test_access_denied_ohne_credentials_erklaert_gastproblem(): meldung = uebersetze_smb_fehler( "session setup failed: NT_STATUS_ACCESS_DENIED", mit_credentials=False ) assert "Gast" in meldung assert "Benutzername + Passwort" in meldung def test_access_denied_mit_credentials_verweist_auf_konto(): meldung = uebersetze_smb_fehler( "session setup failed: NT_STATUS_ACCESS_DENIED", mit_credentials=True ) assert "stimmen nicht" in meldung def test_logon_failure_wird_uebersetzt(): meldung = uebersetze_smb_fehler("NT_STATUS_LOGON_FAILURE", mit_credentials=True) assert "Passwort falsch" in meldung def test_unerreichbar_wird_uebersetzt(): meldung = uebersetze_smb_fehler( "do_connect: Connection to 10.0.0.9 failed (Error NT_STATUS_IO_TIMEOUT)", mit_credentials=False, ) assert "nicht erreichbar" in meldung def test_unbekannter_fehler_bleibt_erhalten_und_gekappt(): meldung = uebersetze_smb_fehler("X" * 500, mit_credentials=False) assert meldung == "X" * 200 def test_validiere_name_bleibt_streng(): assert validiere_name("nas-filme") assert not validiere_name("NAS Filme") def test_stale_mounts_loesen_loest_bis_nichts_mehr_geht(monkeypatch): """Löst gestapelte Schichten per lazy umount, bis umount nichts mehr findet (returncode != 0), und meldet die Zahl der gelösten Schichten.""" import types import mounts aufrufe = [] def fake_run(cmd, **kwargs): aufrufe.append(cmd) rc = 0 if len(aufrufe) <= 3 else 1 # 3 Schichten lösen, dann leer return types.SimpleNamespace(returncode=rc, stdout=b"", stderr=b"") monkeypatch.setattr(mounts.subprocess, "run", fake_run) assert mounts._stale_mounts_loesen("/app/media/x") == 3 assert all(cmd[:2] == ["umount", "-l"] for cmd in aufrufe) def test_mounten_loest_stale_vor_dem_mount(): """Regression (Vorfall 24.07.): mounten() muss Alt-Mounts LÖSEN, bevor es neu mountet — sonst stapelt es auf eine Mount-Leiche (12 Schichten, ls-Timeout).""" import inspect import mounts quelle = inspect.getsource(mounts.mounten) assert "_stale_mounts_loesen(ziel)" in quelle