From 04b3657dfeedce12a174e13bb83d7c9248e8a380 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 26 Oct 2026 20:25:54 +0100 Subject: [PATCH] =?UTF-8?q?Test-Audit=20sn=5Fbasis=20fortgesetzt:=20sys=5F?= =?UTF-8?q?wrapper.py=20fachlich=20gepr=C3=BCft=20(#76)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 10 Testfälle nach Freigabe als geprüft markiert: test_sys_wrapper.py komplett (5 bisher ungeprüfte, davon 1 geschärft, und 5 neue für file_exists und getattr_safe; get_plugin_root war bereits am 17.09.2026 geprüft). Ein neuer Test hält den Ist-Zustand fest, dass file_exists auch Verzeichnisse als vorhanden meldet; dazu Issue-Entwurf „file_exists: Verzeichnis gilt als vorhandene Datei" vorbereitet. Testkatalog neu erzeugt. Co-Authored-By: Claude Opus 5.5 --- docs/status/testpruefungen.json | 40 ++++++++++++++++++++++++++++++ docs/tests/testkatalog.html | 44 +++++++++++++++++++++------------ docs/tests/testkatalog.md | 34 ++++++++++++++----------- 3 files changed, 88 insertions(+), 30 deletions(-) diff --git a/docs/status/testpruefungen.json b/docs/status/testpruefungen.json index 133c66c..aa3ec01 100644 --- a/docs/status/testpruefungen.json +++ b/docs/status/testpruefungen.json @@ -1059,6 +1059,46 @@ "datum": "2026-09-17", "hash": "7a3d7bd800c3" }, + "sn_basis.tests.test_sys_wrapper.EnsureDirTests.test_legt_fehlendes_verzeichnis_inklusive_eltern_an": { + "datum": "2026-10-26", + "hash": "dada5d5e45b9" + }, + "sn_basis.tests.test_sys_wrapper.EnsureDirTests.test_vorhandenes_verzeichnis_wirft_keinen_fehler": { + "datum": "2026-10-26", + "hash": "923d99e4edf3" + }, + "sn_basis.tests.test_sys_wrapper.FileExistsTests.test_fehlende_datei_liefert_false": { + "datum": "2026-10-26", + "hash": "455c81b667df" + }, + "sn_basis.tests.test_sys_wrapper.FileExistsTests.test_ungueltiger_pfad_liefert_false_statt_ausnahme": { + "datum": "2026-10-26", + "hash": "b2baf1004522" + }, + "sn_basis.tests.test_sys_wrapper.FileExistsTests.test_verzeichnis_gilt_derzeit_als_vorhandene_datei": { + "datum": "2026-10-26", + "hash": "8e791a249d44" + }, + "sn_basis.tests.test_sys_wrapper.FileExistsTests.test_vorhandene_datei_liefert_true": { + "datum": "2026-10-26", + "hash": "914d1ed618fd" + }, + "sn_basis.tests.test_sys_wrapper.GetattrSafeTests.test_liefert_default_bei_fehlendem_attribut": { + "datum": "2026-10-26", + "hash": "bfcc23ca76f3" + }, + "sn_basis.tests.test_sys_wrapper.GetattrSafeTests.test_liefert_default_wenn_attributzugriff_andere_ausnahme_wirft": { + "datum": "2026-10-26", + "hash": "6a2e61b48bbc" + }, + "sn_basis.tests.test_sys_wrapper.GetattrSafeTests.test_liefert_vorhandenes_attribut": { + "datum": "2026-10-26", + "hash": "1ab2ddfc9d4f" + }, + "sn_basis.tests.test_sys_wrapper.JoinPathTests.test_verbindet_mehrere_pfadbestandteile": { + "datum": "2026-10-26", + "hash": "5954b3f27357" + }, "sn_basis.tests.test_sys_wrapper.TestGetPluginRoot.test_get_plugin_root_folgt_keiner_verzeichnisverknuepfung": { "datum": "2026-09-17", "hash": "c9b434520d62" diff --git a/docs/tests/testkatalog.html b/docs/tests/testkatalog.html index 2c159c9..02bb613 100644 --- a/docs/tests/testkatalog.html +++ b/docs/tests/testkatalog.html @@ -123,24 +123,24 @@

Prüfstand

Testkatalog der sn_*-Plugins — was die Suite heute prüft, auf einen Blick.
-
Quelle: docs/tests/testkatalog.md
Baseline: docs/status/testbaseline.json (SHA-256 aeabc946a7f3)
Prüf-Audit: docs/status/testpruefungen.json (SHA-256 119f79e142a0)
+
Quelle: docs/tests/testkatalog.md
Baseline: docs/status/testbaseline.json (SHA-256 aeabc946a7f3)
Prüf-Audit: docs/status/testpruefungen.json (SHA-256 925d01586dbc)
-
691Testfälle
-
648grün
+
696Testfälle
+
653grün
35rot (Baseline)
79%mit Docstring
-
38%aktuell geprüft
+
40%aktuell geprüft
55Testdateien
34%ohne Testbezug
Verteilung je Paket
-
sn_basis32 Dateien · 358 Testfälle
+
sn_basis32 Dateien · 363 Testfälle
sn_verfahrensgebiet18 Dateien · 289 Testfälle
sn_plan415 Dateien · 44 Testfälle
@@ -159,11 +159,11 @@

sn_basis

Plattform-Plugin · Ordner Plugin_SN_Basis

- -
32Testdateien
358Testfälle
358grün
0rot (Baseline)
100%mit Docstring
74%geprüft
70ohne Testbezug
+
32Testdateien
363Testfälle
363grün
0rot (Baseline)
100%mit Docstring
76%geprüft
70ohne Testbezug

Tests für sn_basis/ui/base_dockwidget.py::closeEvent (Issue #65).

CloseEventTests 5
flowchart TD
   root(["test_base_dockwidget.py"])
   class root rootnode
@@ -1153,7 +1153,7 @@
   classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
-  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
TestStilpruefer
test_keine_datei_angegeben
Prüft, dass eine leere Pfadangabe als 'ok' ohne Kontext akzeptiert wird (Stil ist optional).grüngeprüft am 2026-09-17
TestStilpruefer
test_datei_existiert_mit_qml
Prüft, dass eine existierende .qml-Datei als 'stil_anwendbar' bestätigt wird.grüngeprüft am 2026-09-17
TestStilpruefer
test_datei_existiert_falsche_endung
Prüft, dass eine existierende Datei ohne .qml-Endung als 'falsche_endung' abgelehnt wird.grüngeprüft am 2026-09-17
TestStilpruefer
test_datei_existiert_nicht
Prüft, dass ein nicht existierender .qml-Pfad als 'datei_nicht_gefunden' abgelehnt wird.grüngeprüft am 2026-09-17

Unit-Tests für sn_basis.functions.sys_wrapper.get_plugin_root().

TestGetPluginRoot 1JoinPathTests 1EnsureDirTests 2GetattrSafeTests 2
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
TestStilpruefer
test_keine_datei_angegeben
Prüft, dass eine leere Pfadangabe als 'ok' ohne Kontext akzeptiert wird (Stil ist optional).grüngeprüft am 2026-09-17
TestStilpruefer
test_datei_existiert_mit_qml
Prüft, dass eine existierende .qml-Datei als 'stil_anwendbar' bestätigt wird.grüngeprüft am 2026-09-17
TestStilpruefer
test_datei_existiert_falsche_endung
Prüft, dass eine existierende Datei ohne .qml-Endung als 'falsche_endung' abgelehnt wird.grüngeprüft am 2026-09-17
TestStilpruefer
test_datei_existiert_nicht
Prüft, dass ein nicht existierender .qml-Pfad als 'datei_nicht_gefunden' abgelehnt wird.grüngeprüft am 2026-09-17

Unit-Tests für sn_basis.functions.sys_wrapper.get_plugin_root().

TestGetPluginRoot 1JoinPathTests 1FileExistsTests 4EnsureDirTests 2GetattrSafeTests 3
flowchart TD
   root(["test_sys_wrapper.py"])
   class root rootnode
   root --> g1["TestGetPluginRoot (1)"]
@@ -1162,25 +1162,37 @@
   root --> g2["JoinPathTests (1)"]
   class g2 groupnode
   g2 --> t2("verbindet_mehrere_pfadbestandteile")
-  root --> g3["EnsureDirTests (2)"]
+  root --> g3["FileExistsTests (4)"]
   class g3 groupnode
-  g3 --> t3("legt_fehlendes_verzeichnis_inklusive_eltern_an")
-  g3 --> t4("vorhandenes_verzeichnis_wirft_keinen_fehler")
-  root --> g4["GetattrSafeTests (2)"]
+  g3 --> t3("vorhandene_datei_liefert_true")
+  g3 --> t4("fehlende_datei_liefert_false")
+  g3 --> t5("ungueltiger_pfad_liefert_false_statt_ausnahme")
+  g3 --> t6("verzeichnis_gilt_derzeit_als_vorhandene_datei")
+  root --> g4["EnsureDirTests (2)"]
   class g4 groupnode
-  g4 --> t5("liefert_vorhandenes_attribut")
-  g4 --> t6("liefert_default_bei_fehlendem_attribut")
+  g4 --> t7("legt_fehlendes_verzeichnis_inklusive_eltern_an")
+  g4 --> t8("vorhandenes_verzeichnis_wirft_keinen_fehler")
+  root --> g5["GetattrSafeTests (3)"]
+  class g5 groupnode
+  g5 --> t9("liefert_vorhandenes_attribut")
+  g5 --> t10("liefert_default_bei_fehlendem_attribut")
+  g5 --> t11("liefert_default_wenn_attributzugriff_andere_ausnahme_wirft")
   class t1 ok
   class t2 ok
   class t3 ok
   class t4 ok
   class t5 ok
   class t6 ok
+  class t7 ok
+  class t8 ok
+  class t9 ok
+  class t10 ok
+  class t11 ok
   classDef rootnode fill:#1f4038,stroke:#16302a,stroke-width:1px,color:#f4f1e8,font-weight:600;
   classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
-  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
TestGetPluginRoot
test_get_plugin_root_folgt_keiner_verzeichnisverknuepfung
Prüft, dass get_plugin_root() bei einem über eine Verzeichnisverknüpfung (wie von link_qgis_profile.py angelegt) erreichten Modul den verlinkten Pfad liefert, statt zum echten Zielverzeichnis aufzulösen (Verfahrensgebiet #50).grüngeprüft am 2026-09-17
JoinPathTests
test_verbindet_mehrere_pfadbestandteile
Prüft, dass join_path mehrere Bestandteile OS-sicher zu einem Path zusammenfügt.grünnie geprüft
EnsureDirTests
test_legt_fehlendes_verzeichnis_inklusive_eltern_an
Prüft, dass ensure_dir ein fehlendes Verzeichnis samt Elternverzeichnissen anlegt.grünnie geprüft
EnsureDirTests
test_vorhandenes_verzeichnis_wirft_keinen_fehler
Prüft, dass ensure_dir bei einem bereits vorhandenen Verzeichnis keinen Fehler wirft.grünnie geprüft
GetattrSafeTests
test_liefert_vorhandenes_attribut
Prüft, dass getattr_safe ein vorhandenes Attribut liefert.grünnie geprüft
GetattrSafeTests
test_liefert_default_bei_fehlendem_attribut
Prüft, dass getattr_safe bei fehlendem Attribut den Default-Wert liefert.grünnie geprüft

Unit-Tests für `sn_basis.functions.text_wrapper`.

TestSanitizeBezeichner 7
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
TestGetPluginRoot
test_get_plugin_root_folgt_keiner_verzeichnisverknuepfung
Prüft, dass get_plugin_root() bei einem über eine Verzeichnisverknüpfung (wie von link_qgis_profile.py angelegt) erreichten Modul den verlinkten Pfad liefert, statt zum echten Zielverzeichnis aufzulösen (Verfahrensgebiet #50).grüngeprüft am 2026-09-17
JoinPathTests
test_verbindet_mehrere_pfadbestandteile
Prüft, dass join_path mehrere Bestandteile OS-sicher zu einem Path zusammenfügt.grüngeprüft am 2026-10-26
FileExistsTests
test_vorhandene_datei_liefert_true
Prüft, dass file_exists für eine vorhandene Datei True liefert.grüngeprüft am 2026-10-26
FileExistsTests
test_fehlende_datei_liefert_false
Prüft, dass file_exists für eine nicht vorhandene Datei False liefert.grüngeprüft am 2026-10-26
FileExistsTests
test_ungueltiger_pfad_liefert_false_statt_ausnahme
Prüft, dass file_exists für einen ungültigen Pfad (Nullzeichen) False liefert, statt eine Ausnahme zu werfen.grüngeprüft am 2026-10-26
FileExistsTests
test_verzeichnis_gilt_derzeit_als_vorhandene_datei
Prüft, dass file_exists derzeit auch für ein Verzeichnis True liefert (Ist-Zustand, nicht bestätigt gewünscht).grüngeprüft am 2026-10-26
EnsureDirTests
test_legt_fehlendes_verzeichnis_inklusive_eltern_an
Prüft, dass ensure_dir ein fehlendes Verzeichnis samt Elternverzeichnissen anlegt.grüngeprüft am 2026-10-26
EnsureDirTests
test_vorhandenes_verzeichnis_wirft_keinen_fehler
Prüft, dass ensure_dir bei einem bereits vorhandenen Verzeichnis keinen Fehler wirft und den Pfad liefert.grüngeprüft am 2026-10-26
GetattrSafeTests
test_liefert_vorhandenes_attribut
Prüft, dass getattr_safe ein vorhandenes Attribut liefert.grüngeprüft am 2026-10-26
GetattrSafeTests
test_liefert_default_bei_fehlendem_attribut
Prüft, dass getattr_safe bei fehlendem Attribut den Default-Wert liefert.grüngeprüft am 2026-10-26
GetattrSafeTests
test_liefert_default_wenn_attributzugriff_andere_ausnahme_wirft
Prüft, dass getattr_safe auch bei einer anderen Ausnahme als AttributeError den Default-Wert liefert.grüngeprüft am 2026-10-26

Unit-Tests für `sn_basis.functions.text_wrapper`.

TestSanitizeBezeichner 7
flowchart TD
   root(["test_text_wrapper.py"])
   class root rootnode
   root --> g1["TestSanitizeBezeichner (7)"]
diff --git a/docs/tests/testkatalog.md b/docs/tests/testkatalog.md
index 0df1da7..b4789f4 100644
--- a/docs/tests/testkatalog.md
+++ b/docs/tests/testkatalog.md
@@ -8,21 +8,21 @@ für die fachliche Frage, ob die Abdeckung sinnvoll ist. Die Angaben stammen aus
 selbst (Docstrings) und aus der Testbaseline.
 
 Stand der Baseline: `docs/status/testbaseline.json` (SHA-256 `aeabc946a7f3`)
-Stand des Prüf-Audits: `docs/status/testpruefungen.json` (SHA-256 `119f79e142a0`)
+Stand des Prüf-Audits: `docs/status/testpruefungen.json` (SHA-256 `925d01586dbc`)
 
-Gesamt: 3 Pakete, 55 Testdateien, 691 Testfälle – 648 grün, 35 rot (Baseline), 8 übersprungen.
-Mit Beschreibung (Docstring): 546 von 691 (79 %).
-Fachlich geprüft: 266 von 691 (38 %) aktuell, 0 veraltet seit Codeänderung, 425 nie geprüft.
+Gesamt: 3 Pakete, 55 Testdateien, 696 Testfälle – 653 grün, 35 rot (Baseline), 8 übersprungen.
+Mit Beschreibung (Docstring): 551 von 696 (79 %).
+Fachlich geprüft: 276 von 696 (40 %) aktuell, 0 veraltet seit Codeänderung, 420 nie geprüft.
 Strukturelle Lücken (heuristisch, Namensabgleich): 160 von 470 (34 %) Funktionen/Methoden ohne erkennbaren Testbezug – Abschnitt „Ungetestete Funktionen“.
 
 ## Zusammenfassung
 
 | Paket | Testdateien | Testfälle | grün | rot (Baseline) | übersprungen | mit Beschreibung | fachlich geprüft | ohne Testbezug |
 | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
-| `sn_basis` | 32 | 358 | 358 | 0 | 0 | 358 von 358 (100 %) | 266 von 358 (74 %) | 70 von 229 (31 %) |
+| `sn_basis` | 32 | 363 | 363 | 0 | 0 | 363 von 363 (100 %) | 276 von 363 (76 %) | 70 von 229 (31 %) |
 | `sn_verfahrensgebiet` | 18 | 289 | 247 | 34 | 8 | 187 von 289 (65 %) | 0 von 289 (0 %) | 51 von 161 (32 %) |
 | `sn_plan41` | 5 | 44 | 43 | 1 | 0 | 1 von 44 (2 %) | 0 von 44 (0 %) | 39 von 80 (49 %) |
-| **Summe** | **55** | **691** | **648** | **35** | **8** | **546 von 691 (79 %)** | **266 von 691 (38 %)** | **160 von 470 (34 %)** |
+| **Summe** | **55** | **696** | **653** | **35** | **8** | **551 von 696 (79 %)** | **276 von 696 (40 %)** | **160 von 470 (34 %)** |
 
 ### Legende
 
@@ -36,7 +36,7 @@ Strukturelle Lücken (heuristisch, Namensabgleich): 160 von 470 (34 %) Funktione
 
 ## Paket `sn_basis`
 
-Plattform-Plugin, Ordner `Plugin_SN_Basis` – 32 Testdateien mit 358 Testfällen (358 grün, 0 rot, 0 übersprungen).
+Plattform-Plugin, Ordner `Plugin_SN_Basis` – 32 Testdateien mit 363 Testfällen (363 grün, 0 rot, 0 übersprungen).
 
 ### `Plugin_SN_Basis/tests/test_base_dockwidget.py`
 
@@ -722,17 +722,23 @@ Testgruppen:
 
 - `TestGetPluginRoot` (1 Testfälle): — (Docstring fehlt)
 - `JoinPathTests` (1 Testfälle): — (Docstring fehlt)
+- `FileExistsTests` (4 Testfälle): — (Docstring fehlt)
 - `EnsureDirTests` (2 Testfälle): — (Docstring fehlt)
-- `GetattrSafeTests` (2 Testfälle): — (Docstring fehlt)
+- `GetattrSafeTests` (3 Testfälle): — (Docstring fehlt)
 
 | Testfall | prüft | Status | geprüft |
 | --- | --- | --- | --- |
 | `TestGetPluginRoot.test_get_plugin_root_folgt_keiner_verzeichnisverknuepfung` | Prüft, dass get_plugin_root() bei einem über eine Verzeichnisverknüpfung (wie von link_qgis_profile.py angelegt) erreichten Modul den verlinkten Pfad liefert, statt zum echten Zielverzeichnis aufzulösen (Verfahrensgebiet #50). | grün | geprüft am 2026-09-17 |
-| `JoinPathTests.test_verbindet_mehrere_pfadbestandteile` | Prüft, dass join_path mehrere Bestandteile OS-sicher zu einem Path zusammenfügt. | grün | nie geprüft |
-| `EnsureDirTests.test_legt_fehlendes_verzeichnis_inklusive_eltern_an` | Prüft, dass ensure_dir ein fehlendes Verzeichnis samt Elternverzeichnissen anlegt. | grün | nie geprüft |
-| `EnsureDirTests.test_vorhandenes_verzeichnis_wirft_keinen_fehler` | Prüft, dass ensure_dir bei einem bereits vorhandenen Verzeichnis keinen Fehler wirft. | grün | nie geprüft |
-| `GetattrSafeTests.test_liefert_vorhandenes_attribut` | Prüft, dass getattr_safe ein vorhandenes Attribut liefert. | grün | nie geprüft |
-| `GetattrSafeTests.test_liefert_default_bei_fehlendem_attribut` | Prüft, dass getattr_safe bei fehlendem Attribut den Default-Wert liefert. | grün | nie geprüft |
+| `JoinPathTests.test_verbindet_mehrere_pfadbestandteile` | Prüft, dass join_path mehrere Bestandteile OS-sicher zu einem Path zusammenfügt. | grün | geprüft am 2026-10-26 |
+| `FileExistsTests.test_vorhandene_datei_liefert_true` | Prüft, dass file_exists für eine vorhandene Datei True liefert. | grün | geprüft am 2026-10-26 |
+| `FileExistsTests.test_fehlende_datei_liefert_false` | Prüft, dass file_exists für eine nicht vorhandene Datei False liefert. | grün | geprüft am 2026-10-26 |
+| `FileExistsTests.test_ungueltiger_pfad_liefert_false_statt_ausnahme` | Prüft, dass file_exists für einen ungültigen Pfad (Nullzeichen) False liefert, statt eine Ausnahme zu werfen. | grün | geprüft am 2026-10-26 |
+| `FileExistsTests.test_verzeichnis_gilt_derzeit_als_vorhandene_datei` | Prüft, dass file_exists derzeit auch für ein Verzeichnis True liefert (Ist-Zustand, nicht bestätigt gewünscht). | grün | geprüft am 2026-10-26 |
+| `EnsureDirTests.test_legt_fehlendes_verzeichnis_inklusive_eltern_an` | Prüft, dass ensure_dir ein fehlendes Verzeichnis samt Elternverzeichnissen anlegt. | grün | geprüft am 2026-10-26 |
+| `EnsureDirTests.test_vorhandenes_verzeichnis_wirft_keinen_fehler` | Prüft, dass ensure_dir bei einem bereits vorhandenen Verzeichnis keinen Fehler wirft und den Pfad liefert. | grün | geprüft am 2026-10-26 |
+| `GetattrSafeTests.test_liefert_vorhandenes_attribut` | Prüft, dass getattr_safe ein vorhandenes Attribut liefert. | grün | geprüft am 2026-10-26 |
+| `GetattrSafeTests.test_liefert_default_bei_fehlendem_attribut` | Prüft, dass getattr_safe bei fehlendem Attribut den Default-Wert liefert. | grün | geprüft am 2026-10-26 |
+| `GetattrSafeTests.test_liefert_default_wenn_attributzugriff_andere_ausnahme_wirft` | Prüft, dass getattr_safe auch bei einer anderen Ausnahme als AttributeError den Default-Wert liefert. | grün | geprüft am 2026-10-26 |
 
 ### `Plugin_SN_Basis/tests/test_text_wrapper.py`
 
@@ -1443,7 +1449,7 @@ Arbeitsliste: Diese Testfälle haben keinen Docstring; was sie fachlich prüfen,
 aus dem Quelltext erschließen. Jeder Eintrag braucht eine einzeilige Beschreibung im Testfall,
 dann verschwindet er hier von selbst.
 
-### `sn_basis` – 0 von 358 Testfällen ohne Beschreibung
+### `sn_basis` – 0 von 363 Testfällen ohne Beschreibung
 
 Keine Lücken.