From 049a5ffe1d157a667c8963303dbadc1cdb7528cb Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 21 Sep 2026 08:50:32 +0200 Subject: [PATCH] =?UTF-8?q?Testkatalog=20neu=20erzeugt,=20Wissensbasis=20f?= =?UTF-8?q?=C3=BCr=20Basis=20#70=20nachgezogen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit sn_basis steht laut Prüfstand jetzt bei 0 ungeklärten Funktionen. Fallstricke.md um den Windows-Fallstrick "sqlite3-Verbindung aus with-Block schließt nicht, TemporaryDirectory- Cleanup schlägt fehl" ergänzt (Fund aus Basis #70). Co-Authored-By: Claude Sonnet 5 --- docs/tests/testkatalog.html | 74 ++++++++++++++++++++++++------------- docs/tests/testkatalog.md | 56 ++++++++++++++-------------- docs/wissen/fallstricke.md | 7 ++++ 3 files changed, 85 insertions(+), 52 deletions(-) diff --git a/docs/tests/testkatalog.html b/docs/tests/testkatalog.html index 910af04..1ade333 100644 --- a/docs/tests/testkatalog.html +++ b/docs/tests/testkatalog.html @@ -125,22 +125,22 @@ 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 68b590c8feef)
-
569Testfälle
-
526grün
+
580Testfälle
+
537grün
35rot (Baseline)
75%mit Docstring
-
10%aktuell geprüft
+
9%aktuell geprüft
49Testdateien
-
36%ohne Testbezug
+
35%ohne Testbezug
Verteilung je Paket
-
sn_basis32 Dateien · 317 Testfälle
+
sn_basis32 Dateien · 328 Testfälle
sn_verfahrensgebiet12 Dateien · 208 Testfälle
sn_plan415 Dateien · 44 Testfälle
@@ -159,11 +159,11 @@

sn_basis

Plattform-Plugin · Ordner Plugin_SN_Basis

- -
32Testdateien
317Testfälle
317grün
0rot (Baseline)
100%mit Docstring
17%geprüft
76ohne Testbezug
+
32Testdateien
328Testfälle
328grün
0rot (Baseline)
100%mit Docstring
17%geprüft
72ohne 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
@@ -208,10 +208,10 @@
   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
TestDataGrabber
test_analyze_source_type_detects_excel
Prüft, dass eine erreichbare .xlsx-Datei als Quelltyp 'excel' erkannt wird.grüngeprüft am 2026-09-16
TestDataGrabber
test_analyze_source_type_returns_unknown_filetype
Prüft, dass eine erreichbare Datei mit unbekannter Endung als 'unbekannter_dateityp' eingestuft wird.grüngeprüft am 2026-09-16
TestDataGrabber
test_analyze_source_type_detects_service_when_file_check_fails
Prüft, dass eine Quelle als 'dienst' erkannt wird, wenn die Dateiprüfung fehlschlägt, die URL aber erreichbar ist.grüngeprüft am 2026-09-16
TestDataGrabber
test_analyze_source_type_returns_unbekannte_quelle_on_full_failure
Prüft, dass eine Quelle als 'unbekannte_quelle' eingestuft wird, wenn weder Datei- noch Linkprüfung erfolgreich sind.grüngeprüft am 2026-09-16
TestDataGrabber
test_run_returns_success_summary_with_valid_rows
Prüft, dass run() bei erfolgreichem Excel-Import eine Erfolgsmeldung mit den geladenen Zeilen liefert.grüngeprüft am 2026-09-16
TestDataGrabber
test_run_returns_failure_summary_without_rows
Prüft, dass run() bei nicht erkennbarer Quelle eine Fehlermeldung ohne Zeilen liefert.grüngeprüft am 2026-09-16
TestDataGrabber
test_aggregate_results_mit_zeilen_liefert_erfolgsergebnis
Prüft, dass _aggregate_results bei vorhandenen Zeilen ein Erfolgsergebnis mit Zeilenzahl liefert.grünnie geprüft
TestDataGrabber
test_aggregate_results_ohne_zeilen_liefert_keine_validen_eintraege
Prüft, dass _aggregate_results ohne Zeilen ok=False mit Aktion 'keine_validen_eintraege' liefert.grünnie geprüft

— (Docstring fehlt)

TestDateipruefer 12
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
TestDataGrabber
test_analyze_source_type_detects_excel
Prüft, dass eine erreichbare .xlsx-Datei als Quelltyp 'excel' erkannt wird.grüngeprüft am 2026-09-16
TestDataGrabber
test_analyze_source_type_returns_unknown_filetype
Prüft, dass eine erreichbare Datei mit unbekannter Endung als 'unbekannter_dateityp' eingestuft wird.grüngeprüft am 2026-09-16
TestDataGrabber
test_analyze_source_type_detects_service_when_file_check_fails
Prüft, dass eine Quelle als 'dienst' erkannt wird, wenn die Dateiprüfung fehlschlägt, die URL aber erreichbar ist.grüngeprüft am 2026-09-16
TestDataGrabber
test_analyze_source_type_returns_unbekannte_quelle_on_full_failure
Prüft, dass eine Quelle als 'unbekannte_quelle' eingestuft wird, wenn weder Datei- noch Linkprüfung erfolgreich sind.grüngeprüft am 2026-09-16
TestDataGrabber
test_run_returns_success_summary_with_valid_rows
Prüft, dass run() bei erfolgreichem Excel-Import eine Erfolgsmeldung mit den geladenen Zeilen liefert.grüngeprüft am 2026-09-16
TestDataGrabber
test_run_returns_failure_summary_without_rows
Prüft, dass run() bei nicht erkennbarer Quelle eine Fehlermeldung ohne Zeilen liefert.grüngeprüft am 2026-09-16
TestDataGrabber
test_aggregate_results_mit_zeilen_liefert_erfolgsergebnis
Prüft, dass _aggregate_results bei vorhandenen Zeilen ein Erfolgsergebnis mit Zeilenzahl liefert.grünnie geprüft
TestDataGrabber
test_aggregate_results_ohne_zeilen_liefert_keine_validen_eintraege
Prüft, dass _aggregate_results ohne Zeilen ok=False mit Aktion 'keine_validen_eintraege' liefert.grünnie geprüft

— (Docstring fehlt)

TestDateipruefer 17
flowchart TD
   root(["test_dateipruefer.py"])
   class root rootnode
-  root --> g1["TestDateipruefer (12)"]
+  root --> g1["TestDateipruefer (17)"]
   class g1 groupnode
   g1 --> t1("leereingabe_erlaubt")
   g1 --> t2("leereingabe_nicht_erlaubt")
@@ -225,6 +225,11 @@
   g1 --> t10("ist_gueltiger_gpkg_pfad_akzeptiert_vorhandenes_verzeichnis")
   g1 --> t11("ist_gueltiger_gpkg_pfad_lehnt_falsche_endung_ab")
   g1 --> t12("ist_gueltiger_gpkg_pfad_lehnt_fehlendes_verzeichnis_ab")
+  g1 --> t13("ist_leer_erkennt_none_und_nicht_string_als_leer")
+  g1 --> t14("ist_leer_erkennt_reinen_whitespace_als_leer")
+  g1 --> t15("ist_leer_meldet_pfad_mit_sichtbaren_zeichen_nicht_als_leer")
+  g1 --> t16("leere_eingabe_bevorzugt_leereingabe_erlaubt_vor_standarddatei")
+  g1 --> t17("leere_eingabe_bevorzugt_standarddatei_vor_temporaer_erlaubt")
   class t1 ok
   class t2 ok
   class t3 ok
@@ -237,11 +242,16 @@
   class t10 ok
   class t11 ok
   class t12 ok
+  class t13 ok
+  class t14 ok
+  class t15 ok
+  class t16 ok
+  class t17 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
TestDateipruefer
test_leereingabe_erlaubt
Prüft, dass eine leere Pfadangabe bei leereingabe_erlaubt=True als 'leereingabe_erlaubt' ohne Kontext gemeldet wird.grüngeprüft am 2026-09-17
TestDateipruefer
test_leereingabe_nicht_erlaubt
Prüft, dass eine leere Pfadangabe ohne leereingabe_erlaubt als 'leereingabe_nicht_erlaubt' abgelehnt wird.grüngeprüft am 2026-09-17
TestDateipruefer
test_standarddatei_vorschlagen
Prüft, dass bei leerer Pfadangabe mit gesetzter Standarddatei 'standarddatei_vorschlagen' mit dem Standardpfad als Kontext geliefert wird.grünnie geprüft
TestDateipruefer
test_temporaer_erlaubt
Prüft, dass eine leere Pfadangabe bei temporaer_erlaubt=True als 'temporaer_erlaubt' ohne Kontext gemeldet wird.grüngeprüft am 2026-09-17
TestDateipruefer
test_datei_nicht_gefunden
Prüft, dass ein nicht existierender Dateipfad als 'datei_nicht_gefunden' mit dem Pfad als Kontext abgelehnt wird.grüngeprüft am 2026-09-17
TestDateipruefer
test_datei_ok
Prüft, dass ein existierender Dateipfad als 'ok' mit dem Pfad als Kontext bestätigt wird.grüngeprüft am 2026-09-17
TestDateipruefer
test_erkenne_dateityp_unterscheidet_excel_datenbank_und_unbekannt
Prüft, dass erkenne_dateityp .xlsx als 'excel', .gpkg/.sqlite als 'datenbank' und Rest als 'unbekannt' erkennt.grünnie geprüft
TestDateipruefer
test_pfad_verbindet_relativen_pfad_mit_basispfad
Prüft, dass _pfad einen relativen Pfad mit dem Basisverzeichnis verbindet.grünnie geprüft
TestDateipruefer
test_pfad_laesst_absoluten_pfad_unveraendert
Prüft, dass _pfad einen bereits absoluten Pfad nicht mit dem Basisverzeichnis verbindet.grünnie geprüft
TestDateipruefer
test_ist_gueltiger_gpkg_pfad_akzeptiert_vorhandenes_verzeichnis
Prüft, dass ein .gpkg-Pfad mit vorhandenem Zielverzeichnis als gültig gilt.grünnie geprüft
TestDateipruefer
test_ist_gueltiger_gpkg_pfad_lehnt_falsche_endung_ab
Prüft, dass ein Pfad ohne .gpkg-Endung als ungültig gilt, auch bei vorhandenem Verzeichnis.grünnie geprüft
TestDateipruefer
test_ist_gueltiger_gpkg_pfad_lehnt_fehlendes_verzeichnis_ab
Prüft, dass ein .gpkg-Pfad in einem nicht vorhandenen Verzeichnis als ungültig gilt.grünnie geprüft

Tests für sn_basis/modules/Datenabruf.py (Datenabruf-Kernpipeline, Issue #63).

DetermineSpatialFilterTests 7BuildProviderUrlTests 9FetchFeaturesTests 5DatenabrufOrchestrierungTests 3
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
TestDateipruefer
test_leereingabe_erlaubt
Prüft, dass eine leere Pfadangabe bei leereingabe_erlaubt=True als 'leereingabe_erlaubt' ohne Kontext gemeldet wird.grüngeprüft am 2026-09-17
TestDateipruefer
test_leereingabe_nicht_erlaubt
Prüft, dass eine leere Pfadangabe ohne leereingabe_erlaubt als 'leereingabe_nicht_erlaubt' abgelehnt wird.grüngeprüft am 2026-09-17
TestDateipruefer
test_standarddatei_vorschlagen
Prüft, dass bei leerer Pfadangabe mit gesetzter Standarddatei 'standarddatei_vorschlagen' mit dem Standardpfad als Kontext geliefert wird.grünnie geprüft
TestDateipruefer
test_temporaer_erlaubt
Prüft, dass eine leere Pfadangabe bei temporaer_erlaubt=True als 'temporaer_erlaubt' ohne Kontext gemeldet wird.grüngeprüft am 2026-09-17
TestDateipruefer
test_datei_nicht_gefunden
Prüft, dass ein nicht existierender Dateipfad als 'datei_nicht_gefunden' mit dem Pfad als Kontext abgelehnt wird.grüngeprüft am 2026-09-17
TestDateipruefer
test_datei_ok
Prüft, dass ein existierender Dateipfad als 'ok' mit dem Pfad als Kontext bestätigt wird.grüngeprüft am 2026-09-17
TestDateipruefer
test_erkenne_dateityp_unterscheidet_excel_datenbank_und_unbekannt
Prüft, dass erkenne_dateityp .xlsx als 'excel', .gpkg/.sqlite als 'datenbank' und Rest als 'unbekannt' erkennt.grünnie geprüft
TestDateipruefer
test_pfad_verbindet_relativen_pfad_mit_basispfad
Prüft, dass _pfad einen relativen Pfad mit dem Basisverzeichnis verbindet.grünnie geprüft
TestDateipruefer
test_pfad_laesst_absoluten_pfad_unveraendert
Prüft, dass _pfad einen bereits absoluten Pfad nicht mit dem Basisverzeichnis verbindet.grünnie geprüft
TestDateipruefer
test_ist_gueltiger_gpkg_pfad_akzeptiert_vorhandenes_verzeichnis
Prüft, dass ein .gpkg-Pfad mit vorhandenem Zielverzeichnis als gültig gilt.grünnie geprüft
TestDateipruefer
test_ist_gueltiger_gpkg_pfad_lehnt_falsche_endung_ab
Prüft, dass ein Pfad ohne .gpkg-Endung als ungültig gilt, auch bei vorhandenem Verzeichnis.grünnie geprüft
TestDateipruefer
test_ist_gueltiger_gpkg_pfad_lehnt_fehlendes_verzeichnis_ab
Prüft, dass ein .gpkg-Pfad in einem nicht vorhandenen Verzeichnis als ungültig gilt.grünnie geprüft
TestDateipruefer
test_ist_leer_erkennt_none_und_nicht_string_als_leer
Prüft, dass _ist_leer sowohl None als auch einen Nicht-String-Wert als leer meldet.grünnie geprüft
TestDateipruefer
test_ist_leer_erkennt_reinen_whitespace_als_leer
Prüft, dass _ist_leer eine Eingabe aus reinen Leerzeichen als leer meldet.grünnie geprüft
TestDateipruefer
test_ist_leer_meldet_pfad_mit_sichtbaren_zeichen_nicht_als_leer
Prüft, dass _ist_leer einen Pfad mit sichtbaren Zeichen nicht als leer meldet.grünnie geprüft
TestDateipruefer
test_leere_eingabe_bevorzugt_leereingabe_erlaubt_vor_standarddatei
Prüft, dass bei leerer Eingabe leereingabe_erlaubt Vorrang vor einer gesetzten Standarddatei hat.grünnie geprüft
TestDateipruefer
test_leere_eingabe_bevorzugt_standarddatei_vor_temporaer_erlaubt
Prüft, dass bei leerer Eingabe eine gesetzte Standarddatei Vorrang vor temporaer_erlaubt hat.grünnie geprüft

Tests für sn_basis/modules/Datenabruf.py (Datenabruf-Kernpipeline, Issue #63).

DetermineSpatialFilterTests 7BuildProviderUrlTests 9FetchFeaturesTests 5DatenabrufOrchestrierungTests 3
flowchart TD
   root(["test_datenabruf.py"])
   class root rootnode
   root --> g1["DetermineSpatialFilterTests (7)"]
@@ -304,7 +314,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
DetermineSpatialFilterTests
test_raumfilter_ohne_liefert_none
Prüft, dass Raumfilter 'ohne' unabhängig vom Layer immer None liefert.grünnie geprüft
DetermineSpatialFilterTests
test_fehlender_layer_liefert_none
Prüft, dass ohne Verfahrensgebiet-Layer kein Raumfilter gebaut wird.grünnie geprüft
DetermineSpatialFilterTests
test_unbekannter_raumfilter_liefert_none
Prüft, dass ein unbekannter Raumfilter-Wert None liefert, statt einen Fehler zu werfen.grünnie geprüft
DetermineSpatialFilterTests
test_verfahrensgebiet_liefert_extent_und_crs
Prüft, dass Raumfilter 'Verfahrensgebiet' Extent und CRS des Verfahrensgebiet-Layers liefert.grünnie geprüft
DetermineSpatialFilterTests
test_verfahrensgebiet_ohne_extent_liefert_none
Prüft, dass ein Verfahrensgebiet-Layer ohne ermittelbaren Extent None liefert.grünnie geprüft
DetermineSpatialFilterTests
test_pufferlayer_liefert_extent_des_pufferlayers
Prüft, dass Raumfilter 'Pufferlayer' Extent und CRS des erzeugten Pufferlayers liefert.grünnie geprüft
DetermineSpatialFilterTests
test_pufferlayer_ohne_puffer_liefert_none
Prüft, dass 'Pufferlayer' None liefert, wenn kein Pufferlayer erzeugt werden konnte.grünnie geprüft
BuildProviderUrlTests
test_wms_liefert_link_unveraendert
Prüft, dass bei Provider WMS der Link unverändert durchgereicht wird, auch mit Raumfilter.grünnie geprüft
BuildProviderUrlTests
test_url_praefix_wird_entfernt
Prüft, dass ein vorangestelltes 'url=' aus dem Link entfernt wird.grünnie geprüft
BuildProviderUrlTests
test_wfs_baut_standardparameter_und_bbox_mit_crs
Prüft, dass WFS-Abrufe Standardparameter, umbenanntes TYPENAMES und BBOX mit CRS-URN erhalten.grünnie geprüft
BuildProviderUrlTests
test_wfs_repariert_doppeltes_fragezeichen
Prüft, dass ein zweites '?' im WFS-Link zu '&' korrigiert wird, statt eine ungültige URL zu erzeugen.grünnie geprüft
BuildProviderUrlTests
test_wfs_ohne_raumfilter_setzt_keine_bbox
Prüft, dass WFS ohne Raumfilter (bbox_geom=None) keinen BBOX-Parameter setzt.grünnie geprüft
BuildProviderUrlTests
test_rest_provider_haengt_query_endpunkt_an
Prüft, dass REST/ArcGIS-Links ohne '/query'-Endpunkt automatisch ergänzt werden.grünnie geprüft
BuildProviderUrlTests
test_rest_provider_mit_bbox_baut_geometry_envelope_und_srid
Prüft, dass REST-Abrufe mit Raumfilter eine Geometry-Envelope und inSR/outSR aus dem CRS setzen.grünnie geprüft
BuildProviderUrlTests
test_default_provider_haengt_generischen_bbox_parameter_an
Prüft, dass ein unbekannter Provider mit Raumfilter einen generischen bbox-Parameter erhält.grünnie geprüft
BuildProviderUrlTests
test_default_provider_ohne_raumfilter_laesst_query_unveraendert
Prüft, dass ein unbekannter Provider ohne Raumfilter keinen bbox-Parameter ergänzt.grünnie geprüft
FetchFeaturesTests
test_wms_liefert_keine_features_ohne_fehler
Prüft, dass bei Provider WMS kein Featureabruf stattfindet und kein Fehler gemeldet wird.grünnie geprüft
FetchFeaturesTests
test_abbruch_vor_abruf_liefert_fehlermeldung
Prüft, dass ein bereits gesetzter Abbruch vor dem eigentlichen Abruf erkannt wird.grünnie geprüft
FetchFeaturesTests
test_json_featurecollection_wird_geparst
Prüft, dass eine JSON-FeatureCollection-Antwort in eine Feature-Liste umgewandelt wird.grünnie geprüft
FetchFeaturesTests
test_netzwerkfehler_wird_als_fehlermeldung_gemeldet
Prüft, dass ein fehlgeschlagener HTTP-Abruf eine Fehlermeldung statt einer Ausnahme liefert.grünnie geprüft
FetchFeaturesTests
test_wfs_xml_liefert_anzahl_aus_numberofmatched
Prüft, dass eine WFS-XML-Antwort ohne JSON die Trefferzahl aus numberOfMatched übernimmt.grünnie geprüft
DatenabrufOrchestrierungTests
test_fehlende_pflichtfelder_werden_als_ungueltig_gemeldet
Prüft, dass eine Zeile ohne Link/Provider mit Aktion 'pflichtfelder_fehlen' gemeldet und übersprungen wird.grünnie geprüft
DatenabrufOrchestrierungTests
test_wms_zeile_ohne_features_landet_in_ausserhalb
Prüft, dass eine erfolgreich abgerufene WMS-Zeile mit 0 Features als 'ausserhalb' gezählt wird.grünnie geprüft
DatenabrufOrchestrierungTests
test_abbruch_ueber_progress_stoppt_weitere_zeilen
Prüft, dass ein Abbruch über das Progress-Objekt die Verarbeitung weiterer Zeilen stoppt.grünnie geprüft

Tests für sn_basis/modules/Datenschreiber.py (Schreib-/Ladepipeline, Issue #63).

WriteLayerToGpkgTests 2ResolveStylePathTests 3SchreibeDatenTests 4LadeLayerTests 3SchreibeLogTests 2
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
DetermineSpatialFilterTests
test_raumfilter_ohne_liefert_none
Prüft, dass Raumfilter 'ohne' unabhängig vom Layer immer None liefert.grünnie geprüft
DetermineSpatialFilterTests
test_fehlender_layer_liefert_none
Prüft, dass ohne Verfahrensgebiet-Layer kein Raumfilter gebaut wird.grünnie geprüft
DetermineSpatialFilterTests
test_unbekannter_raumfilter_liefert_none
Prüft, dass ein unbekannter Raumfilter-Wert None liefert, statt einen Fehler zu werfen.grünnie geprüft
DetermineSpatialFilterTests
test_verfahrensgebiet_liefert_extent_und_crs
Prüft, dass Raumfilter 'Verfahrensgebiet' Extent und CRS des Verfahrensgebiet-Layers liefert.grünnie geprüft
DetermineSpatialFilterTests
test_verfahrensgebiet_ohne_extent_liefert_none
Prüft, dass ein Verfahrensgebiet-Layer ohne ermittelbaren Extent None liefert.grünnie geprüft
DetermineSpatialFilterTests
test_pufferlayer_liefert_extent_des_pufferlayers
Prüft, dass Raumfilter 'Pufferlayer' Extent und CRS des erzeugten Pufferlayers liefert.grünnie geprüft
DetermineSpatialFilterTests
test_pufferlayer_ohne_puffer_liefert_none
Prüft, dass 'Pufferlayer' None liefert, wenn kein Pufferlayer erzeugt werden konnte.grünnie geprüft
BuildProviderUrlTests
test_wms_liefert_link_unveraendert
Prüft, dass bei Provider WMS der Link unverändert durchgereicht wird, auch mit Raumfilter.grünnie geprüft
BuildProviderUrlTests
test_url_praefix_wird_entfernt
Prüft, dass ein vorangestelltes 'url=' aus dem Link entfernt wird.grünnie geprüft
BuildProviderUrlTests
test_wfs_baut_standardparameter_und_bbox_mit_crs
Prüft, dass WFS-Abrufe Standardparameter, umbenanntes TYPENAMES und BBOX mit CRS-URN erhalten.grünnie geprüft
BuildProviderUrlTests
test_wfs_repariert_doppeltes_fragezeichen
Prüft, dass ein zweites '?' im WFS-Link zu '&' korrigiert wird, statt eine ungültige URL zu erzeugen.grünnie geprüft
BuildProviderUrlTests
test_wfs_ohne_raumfilter_setzt_keine_bbox
Prüft, dass WFS ohne Raumfilter (bbox_geom=None) keinen BBOX-Parameter setzt.grünnie geprüft
BuildProviderUrlTests
test_rest_provider_haengt_query_endpunkt_an
Prüft, dass REST/ArcGIS-Links ohne '/query'-Endpunkt automatisch ergänzt werden.grünnie geprüft
BuildProviderUrlTests
test_rest_provider_mit_bbox_baut_geometry_envelope_und_srid
Prüft, dass REST-Abrufe mit Raumfilter eine Geometry-Envelope und inSR/outSR aus dem CRS setzen.grünnie geprüft
BuildProviderUrlTests
test_default_provider_haengt_generischen_bbox_parameter_an
Prüft, dass ein unbekannter Provider mit Raumfilter einen generischen bbox-Parameter erhält.grünnie geprüft
BuildProviderUrlTests
test_default_provider_ohne_raumfilter_laesst_query_unveraendert
Prüft, dass ein unbekannter Provider ohne Raumfilter keinen bbox-Parameter ergänzt.grünnie geprüft
FetchFeaturesTests
test_wms_liefert_keine_features_ohne_fehler
Prüft, dass bei Provider WMS kein Featureabruf stattfindet und kein Fehler gemeldet wird.grünnie geprüft
FetchFeaturesTests
test_abbruch_vor_abruf_liefert_fehlermeldung
Prüft, dass ein bereits gesetzter Abbruch vor dem eigentlichen Abruf erkannt wird.grünnie geprüft
FetchFeaturesTests
test_json_featurecollection_wird_geparst
Prüft, dass eine JSON-FeatureCollection-Antwort in eine Feature-Liste umgewandelt wird.grünnie geprüft
FetchFeaturesTests
test_netzwerkfehler_wird_als_fehlermeldung_gemeldet
Prüft, dass ein fehlgeschlagener HTTP-Abruf eine Fehlermeldung statt einer Ausnahme liefert.grünnie geprüft
FetchFeaturesTests
test_wfs_xml_liefert_anzahl_aus_numberofmatched
Prüft, dass eine WFS-XML-Antwort ohne JSON die Trefferzahl aus numberOfMatched übernimmt.grünnie geprüft
DatenabrufOrchestrierungTests
test_fehlende_pflichtfelder_werden_als_ungueltig_gemeldet
Prüft, dass eine Zeile ohne Link/Provider mit Aktion 'pflichtfelder_fehlen' gemeldet und übersprungen wird.grünnie geprüft
DatenabrufOrchestrierungTests
test_wms_zeile_ohne_features_landet_in_ausserhalb
Prüft, dass eine erfolgreich abgerufene WMS-Zeile mit 0 Features als 'ausserhalb' gezählt wird.grünnie geprüft
DatenabrufOrchestrierungTests
test_abbruch_ueber_progress_stoppt_weitere_zeilen
Prüft, dass ein Abbruch über das Progress-Objekt die Verarbeitung weiterer Zeilen stoppt.grünnie geprüft

Tests für sn_basis/modules/Datenschreiber.py (Schreib-/Ladepipeline, Issue #63).

WriteLayerToGpkgTests 2ResolveStylePathTests 3SchreibeDatenTests 4LadeLayerTests 3SchreibeLogTests 2StoreStyleInGpkgTests 4
flowchart TD
   root(["test_datenschreiber.py"])
   class root rootnode
   root --> g1["WriteLayerToGpkgTests (2)"]
@@ -331,6 +341,12 @@
   class g5 groupnode
   g5 --> t13("ohne_speicherort_wirft_valueerror")
   g5 --> t14("schreibt_json_datei_mit_ergebnissen_und_gibt_pfad_zurueck")
+  root --> g6["StoreStyleInGpkgTests (4)"]
+  class g6 groupnode
+  g6 --> t15("legt_tabelle_an_und_speichert_stil_als_default")
+  g6 --> t16("setzt_bisherigen_default_stil_desselben_layers_zurueck")
+  g6 --> t17("liest_geometriespalte_ueber_geometrycolumn_aus")
+  g6 --> t18("fehlender_stilpfad_meldet_fehler_ueber_pruefmanager_statt_absturz")
   class t1 ok
   class t2 ok
   class t3 ok
@@ -345,11 +361,15 @@
   class t12 ok
   class t13 ok
   class t14 ok
+  class t15 ok
+  class t16 ok
+  class t17 ok
+  class t18 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
WriteLayerToGpkgTests
test_ungueltiger_layer_liefert_fehlermeldung
Prüft, dass ein ungültiger Layer eine Fehlermeldung statt eines Absturzes liefert.grünnie geprüft
WriteLayerToGpkgTests
test_gueltiger_layer_wird_ohne_fehler_geschrieben
Prüft, dass ein gültiger Layer im Mock-Modus ohne Fehlermeldung geschrieben wird.grünnie geprüft
ResolveStylePathTests
test_leerer_stilpfad_liefert_none
Prüft, dass ein leerer oder fehlender Stilpfad None liefert.grünnie geprüft
ResolveStylePathTests
test_absoluter_vorhandener_stilpfad_wird_aufgeloest
Prüft, dass ein absoluter, vorhandener Stilpfad normalisiert und unverändert erkannt wird.grünnie geprüft
ResolveStylePathTests
test_nicht_vorhandener_stilpfad_liefert_none
Prüft, dass ein nicht vorhandener Stilpfad None liefert, statt einen ungültigen Pfad zurückzugeben.grünnie geprüft
SchreibeDatenTests
test_ohne_speicherort_wirft_valueerror
Prüft, dass schreibe_Daten ohne Speicherort einen ValueError wirft.grünnie geprüft
SchreibeDatenTests
test_eintrag_ohne_gueltigen_layer_wird_uebersprungen
Prüft, dass ein Eintrag ohne gültigen Layer übersprungen wird und ein Fehlerergebnis meldet.grünnie geprüft
SchreibeDatenTests
test_erfolgreicher_eintrag_liefert_layer_path_und_thema
Prüft, dass ein gültiger Layer einen Layer-Path mit GPKG-Pfad und Layername liefert.grünnie geprüft
SchreibeDatenTests
test_ohne_thema_wird_ident_als_layername_verwendet
Prüft, dass ohne passendes Thema in processed_results der ident als Layername verwendet wird.grünnie geprüft
LadeLayerTests
test_ohne_layer_path_wird_uebersprungen
Prüft, dass ein Eintrag ohne layer_path übersprungen wird, ohne einen Fehler zu melden.grünnie geprüft
LadeLayerTests
test_gueltiger_layer_wird_dem_projekt_hinzugefuegt
Prüft, dass ein gültig ladbarer Layer ohne Fehlermeldung verarbeitet wird.grünnie geprüft
LadeLayerTests
test_ungueltiger_layer_meldet_layer_nicht_gefunden
Prüft, dass ein ungültig ladbarer Layer als 'layer_nicht_gefunden' gemeldet wird.grünnie geprüft
SchreibeLogTests
test_ohne_speicherort_wirft_valueerror
Prüft, dass schreibe_log ohne Speicherort einen ValueError wirft.grünnie geprüft
SchreibeLogTests
test_schreibt_json_datei_mit_ergebnissen_und_gibt_pfad_zurueck
Prüft, dass schreibe_log eine lesbare JSON-Log-Datei erzeugt und deren Pfad zurückgibt.grünnie geprüft

Tests für sn_basis/ui/dockmanager.py (nur ein Dock gleichzeitig sichtbar, Issue #65).

DockManagerShowTests 6
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
WriteLayerToGpkgTests
test_ungueltiger_layer_liefert_fehlermeldung
Prüft, dass ein ungültiger Layer eine Fehlermeldung statt eines Absturzes liefert.grünnie geprüft
WriteLayerToGpkgTests
test_gueltiger_layer_wird_ohne_fehler_geschrieben
Prüft, dass ein gültiger Layer im Mock-Modus ohne Fehlermeldung geschrieben wird.grünnie geprüft
ResolveStylePathTests
test_leerer_stilpfad_liefert_none
Prüft, dass ein leerer oder fehlender Stilpfad None liefert.grünnie geprüft
ResolveStylePathTests
test_absoluter_vorhandener_stilpfad_wird_aufgeloest
Prüft, dass ein absoluter, vorhandener Stilpfad normalisiert und unverändert erkannt wird.grünnie geprüft
ResolveStylePathTests
test_nicht_vorhandener_stilpfad_liefert_none
Prüft, dass ein nicht vorhandener Stilpfad None liefert, statt einen ungültigen Pfad zurückzugeben.grünnie geprüft
SchreibeDatenTests
test_ohne_speicherort_wirft_valueerror
Prüft, dass schreibe_Daten ohne Speicherort einen ValueError wirft.grünnie geprüft
SchreibeDatenTests
test_eintrag_ohne_gueltigen_layer_wird_uebersprungen
Prüft, dass ein Eintrag ohne gültigen Layer übersprungen wird und ein Fehlerergebnis meldet.grünnie geprüft
SchreibeDatenTests
test_erfolgreicher_eintrag_liefert_layer_path_und_thema
Prüft, dass ein gültiger Layer einen Layer-Path mit GPKG-Pfad und Layername liefert.grünnie geprüft
SchreibeDatenTests
test_ohne_thema_wird_ident_als_layername_verwendet
Prüft, dass ohne passendes Thema in processed_results der ident als Layername verwendet wird.grünnie geprüft
LadeLayerTests
test_ohne_layer_path_wird_uebersprungen
Prüft, dass ein Eintrag ohne layer_path übersprungen wird, ohne einen Fehler zu melden.grünnie geprüft
LadeLayerTests
test_gueltiger_layer_wird_dem_projekt_hinzugefuegt
Prüft, dass ein gültig ladbarer Layer ohne Fehlermeldung verarbeitet wird.grünnie geprüft
LadeLayerTests
test_ungueltiger_layer_meldet_layer_nicht_gefunden
Prüft, dass ein ungültig ladbarer Layer als 'layer_nicht_gefunden' gemeldet wird.grünnie geprüft
SchreibeLogTests
test_ohne_speicherort_wirft_valueerror
Prüft, dass schreibe_log ohne Speicherort einen ValueError wirft.grünnie geprüft
SchreibeLogTests
test_schreibt_json_datei_mit_ergebnissen_und_gibt_pfad_zurueck
Prüft, dass schreibe_log eine lesbare JSON-Log-Datei erzeugt und deren Pfad zurückgibt.grünnie geprüft
StoreStyleInGpkgTests
test_legt_tabelle_an_und_speichert_stil_als_default
Prüft, dass _store_style_in_gpkg die layer_styles-Tabelle anlegt und den Stil als Default speichert.grünnie geprüft
StoreStyleInGpkgTests
test_setzt_bisherigen_default_stil_desselben_layers_zurueck
Prüft, dass _store_style_in_gpkg den useAsDefault-Wert vorhandener Stile desselben Layers zurücksetzt.grünnie geprüft
StoreStyleInGpkgTests
test_liest_geometriespalte_ueber_geometrycolumn_aus
Prüft, dass _store_style_in_gpkg die Geometriespalte eines Layers mit geometryColumn() übernimmt.grünnie geprüft
StoreStyleInGpkgTests
test_fehlender_stilpfad_meldet_fehler_ueber_pruefmanager_statt_absturz
Prüft, dass ein nicht lesbarer Stilpfad über den Pruefmanager gemeldet wird statt eine Exception zu werfen.grünnie geprüft

Tests für sn_basis/ui/dockmanager.py (nur ein Dock gleichzeitig sichtbar, Issue #65).

DockManagerShowTests 6
flowchart TD
   root(["test_dockmanager.py"])
   class root rootnode
   root --> g1["DockManagerShowTests (6)"]
@@ -863,10 +883,10 @@
   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
IstVerfahrensDbAktionTests
test_liefert_true_fuer_alle_verfahrens_db_aktionen
Prüft, dass ist_verfahrens_db_aktion für alle vier Verfahrens-DB-Aktionscodes True liefert.grünnie geprüft
IstVerfahrensDbAktionTests
test_liefert_false_fuer_andere_aktionen
Prüft, dass ist_verfahrens_db_aktion für Nicht-Verfahrens-DB-Aktionen und ohne Aktion False liefert.grünnie geprüft
ErlaubtePersistierungTests
test_liefert_true_fuer_erzeugen_ueberschreiben_anhaengen
Prüft, dass erlaubte_persistierung für Erzeugen/Überschreiben/Anhängen True liefert.grünnie geprüft
ErlaubtePersistierungTests
test_liefert_false_fuer_ueberspringen_und_reines_existieren
Prüft, dass erlaubte_persistierung bei Überspringen und reinem 'datei_existiert' False liefert.grünnie geprüft
DateipfadTests
test_liefert_path_wenn_kontext_ein_path_ist
Prüft, dass dateipfad den Kontext liefert, wenn dieser bereits ein Path-Objekt ist.grünnie geprüft
DateipfadTests
test_liefert_none_wenn_kontext_kein_path_ist
Prüft, dass dateipfad None liefert, wenn der Kontext kein Path-Objekt ist (z. B. String oder Layer).grünnie geprüft

— (Docstring fehlt)

TestPruefmanager 24
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
IstVerfahrensDbAktionTests
test_liefert_true_fuer_alle_verfahrens_db_aktionen
Prüft, dass ist_verfahrens_db_aktion für alle vier Verfahrens-DB-Aktionscodes True liefert.grünnie geprüft
IstVerfahrensDbAktionTests
test_liefert_false_fuer_andere_aktionen
Prüft, dass ist_verfahrens_db_aktion für Nicht-Verfahrens-DB-Aktionen und ohne Aktion False liefert.grünnie geprüft
ErlaubtePersistierungTests
test_liefert_true_fuer_erzeugen_ueberschreiben_anhaengen
Prüft, dass erlaubte_persistierung für Erzeugen/Überschreiben/Anhängen True liefert.grünnie geprüft
ErlaubtePersistierungTests
test_liefert_false_fuer_ueberspringen_und_reines_existieren
Prüft, dass erlaubte_persistierung bei Überspringen und reinem 'datei_existiert' False liefert.grünnie geprüft
DateipfadTests
test_liefert_path_wenn_kontext_ein_path_ist
Prüft, dass dateipfad den Kontext liefert, wenn dieser bereits ein Path-Objekt ist.grünnie geprüft
DateipfadTests
test_liefert_none_wenn_kontext_kein_path_ist
Prüft, dass dateipfad None liefert, wenn der Kontext kein Path-Objekt ist (z. B. String oder Layer).grünnie geprüft

— (Docstring fehlt)

TestPruefmanager 26
flowchart TD
   root(["test_pruefmanager.py"])
   class root rootnode
-  root --> g1["TestPruefmanager (24)"]
+  root --> g1["TestPruefmanager (26)"]
   class g1 groupnode
   g1 --> t1("ok")
   g1 --> t2("leereingabe_erlaubt_ja")
@@ -884,14 +904,16 @@
   g1 --> t14("datei_existiert_in_non_qgis_mode_returns_input")
   g1 --> t15("verfahrensgebiet_layer_existiert_ergaenzen")
   g1 --> t16("verfahrensgebiet_layer_existiert_abbrechen")
-  g1 --> t17("verfahrensgebiet_layer_existiert_in_non_qgis_mode_returns_input")
-  g1 --> t18("report_error_kritische_aktion_ruft_error_auf")
-  g1 --> t19("report_error_warn_aktion_ruft_warning_auf")
-  g1 --> t20("report_error_unbekannte_aktion_faellt_auf_warning_zurueck")
-  g1 --> t21("frage_ja_nein_im_qgis_modus_fragt_nutzer")
-  g1 --> t22("frage_ja_nein_ausserhalb_qgis_liefert_default_ohne_rueckfrage")
-  g1 --> t23("frage_text_im_qgis_modus_fragt_nutzer")
-  g1 --> t24("frage_text_ausserhalb_qgis_liefert_default_ohne_rueckfrage")
+  g1 --> t17("verfahrensgebiet_layer_existiert_entfernen")
+  g1 --> t18("verfahrensgebiet_layer_existiert_ersetzen")
+  g1 --> t19("verfahrensgebiet_layer_existiert_in_non_qgis_mode_returns_input")
+  g1 --> t20("report_error_kritische_aktion_ruft_error_auf")
+  g1 --> t21("report_error_warn_aktion_ruft_warning_auf")
+  g1 --> t22("report_error_unbekannte_aktion_faellt_auf_warning_zurueck")
+  g1 --> t23("frage_ja_nein_im_qgis_modus_fragt_nutzer")
+  g1 --> t24("frage_ja_nein_ausserhalb_qgis_liefert_default_ohne_rueckfrage")
+  g1 --> t25("frage_text_im_qgis_modus_fragt_nutzer")
+  g1 --> t26("frage_text_ausserhalb_qgis_liefert_default_ohne_rueckfrage")
   class t1 ok
   class t2 ok
   class t3 ok
@@ -916,11 +938,13 @@
   class t22 ok
   class t23 ok
   class t24 ok
+  class t25 ok
+  class t26 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
TestPruefmanager
test_ok
Prüft, dass ein bereits erfolgreiches Prüfergebnis ohne Nutzerinteraktion als 'ok' durchgereicht wird.grüngeprüft am 2026-09-17
TestPruefmanager
test_leereingabe_erlaubt_ja
Prüft, dass bei erlaubter leerer Eingabe eine Ja-Antwort des Nutzers die Entscheidung 'ok' liefert.grüngeprüft am 2026-09-17
TestPruefmanager
test_leereingabe_erlaubt_nein
Prüft, dass bei erlaubter leerer Eingabe eine Nein-Antwort die Aktion 'leereingabe_erlaubt' als abgelehnt bestehen lässt.grüngeprüft am 2026-09-17
TestPruefmanager
test_standarddatei_vorschlagen_ja
Prüft, dass eine Ja-Antwort auf den Vorschlag der Standarddatei die Entscheidung 'ok' mit dem Standardpfad als Kontext liefert.grüngeprüft am 2026-09-17
TestPruefmanager
test_standarddatei_vorschlagen_nein
Prüft, dass eine Nein-Antwort auf den Vorschlag der Standarddatei die Aktion 'standarddatei_vorschlagen' als abgelehnt bestehen lässt.grüngeprüft am 2026-09-17
TestPruefmanager
test_temporaer_erlaubt_ja
Prüft, dass eine Ja-Antwort auf die Rückfrage nach einer temporären Datei die Aktion 'temporaer_erzeugen' auslöst.grüngeprüft am 2026-09-17
TestPruefmanager
test_temporaer_erlaubt_nein
Prüft, dass eine Nein-Antwort auf die Rückfrage nach einer temporären Datei die Aktion 'temporaer_erlaubt' als abgelehnt bestehen lässt.grüngeprüft am 2026-09-17
TestPruefmanager
test_layer_unsichtbar_ja
Prüft, dass eine Ja-Antwort bei unsichtbarem Layer den Layer sichtbar schaltet und die Entscheidung 'ok' liefert.grüngeprüft am 2026-09-17
TestPruefmanager
test_layer_unsichtbar_nein
Prüft, dass eine Nein-Antwort bei unsichtbarem Layer die Aktion 'layer_unsichtbar' als abgelehnt bestehen lässt.grüngeprüft am 2026-09-17
TestPruefmanager
test_unbekannte_aktion
Prüft, dass eine unbekannte Aktion eine Warnung auslöst und unverarbeitet als Fehlschlag zurückgegeben wird.grüngeprüft am 2026-09-17
TestPruefmanager
test_datei_existiert_overwrite
Prüft, dass die Nutzerwahl 'überschreiben' bei bestehender Datei zur Aktion 'datei_existiert_ueberschreiben' führt.grüngeprüft am 2026-09-17
TestPruefmanager
test_datei_existiert_append
Prüft, dass die Nutzerwahl 'anhängen' bei bestehender Datei zur Aktion 'datei_existiert_anhaengen' führt.grüngeprüft am 2026-09-17
TestPruefmanager
test_datei_existiert_cancel
Prüft, dass die Nutzerwahl 'abbrechen' bei bestehender Datei zur Aktion 'datei_existiert_ueberspringen' führt.grüngeprüft am 2026-09-17
TestPruefmanager
test_datei_existiert_in_non_qgis_mode_returns_input
Prüft, dass außerhalb des QGIS-Modus bei bestehender Datei keine Rückfrage erfolgt, sondern die ursprüngliche Aktion unentschieden zurückgegeben wird.grüngeprüft am 2026-09-17
TestPruefmanager
test_verfahrensgebiet_layer_existiert_ergaenzen
Prüft, dass die Nutzerwahl 'ergänzen' bei bestehendem Verfahrensgebiet zur Aktion 'verfahrensgebiet_ergaenzen' führt.grünnie geprüft
TestPruefmanager
test_verfahrensgebiet_layer_existiert_abbrechen
Prüft, dass die Nutzerwahl 'abbrechen' bei bestehendem Verfahrensgebiet ok=False mit Aktion 'verfahrensgebiet_abbrechen' liefert.grünnie geprüft
TestPruefmanager
test_verfahrensgebiet_layer_existiert_in_non_qgis_mode_returns_input
Prüft, dass außerhalb des QGIS-Modus bei bestehendem Verfahrensgebiet keine Rückfrage erfolgt.grünnie geprüft
TestPruefmanager
test_report_error_kritische_aktion_ruft_error_auf
Prüft, dass eine kritische Aktion (z. B. 'netzwerkfehler') über error() gemeldet wird, nicht über warning().grünnie geprüft
TestPruefmanager
test_report_error_warn_aktion_ruft_warning_auf
Prüft, dass eine Warn-Aktion (z. B. 'datei_nicht_gefunden') über warning() gemeldet wird, nicht über error().grünnie geprüft
TestPruefmanager
test_report_error_unbekannte_aktion_faellt_auf_warning_zurueck
Prüft, dass eine nicht eingestufte Aktion als Fallback über warning() gemeldet wird.grünnie geprüft
TestPruefmanager
test_frage_ja_nein_im_qgis_modus_fragt_nutzer
Prüft, dass frage_ja_nein im QGIS-Modus den Nutzer fragt und dessen Antwort liefert.grünnie geprüft
TestPruefmanager
test_frage_ja_nein_ausserhalb_qgis_liefert_default_ohne_rueckfrage
Prüft, dass frage_ja_nein außerhalb des QGIS-Modus den Default-Wert liefert, ohne den Nutzer zu fragen.grünnie geprüft
TestPruefmanager
test_frage_text_im_qgis_modus_fragt_nutzer
Prüft, dass frage_text im QGIS-Modus den Nutzer fragt und Text plus OK-Status liefert.grünnie geprüft
TestPruefmanager
test_frage_text_ausserhalb_qgis_liefert_default_ohne_rueckfrage
Prüft, dass frage_text außerhalb des QGIS-Modus den Standardtext mit OK=True liefert, ohne den Nutzer zu fragen.grünnie geprüft

Tests für sn_basis/functions/qgiscore_wrapper.py::polygon_zu_linie/layer_exists_in_gpkg/create_buffer_layer (Issue #65/#67).

PolygonZuLinieTests 7LayerExistsInGpkgTests 4CreateBufferLayerTests 3
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
TestPruefmanager
test_ok
Prüft, dass ein bereits erfolgreiches Prüfergebnis ohne Nutzerinteraktion als 'ok' durchgereicht wird.grüngeprüft am 2026-09-17
TestPruefmanager
test_leereingabe_erlaubt_ja
Prüft, dass bei erlaubter leerer Eingabe eine Ja-Antwort des Nutzers die Entscheidung 'ok' liefert.grüngeprüft am 2026-09-17
TestPruefmanager
test_leereingabe_erlaubt_nein
Prüft, dass bei erlaubter leerer Eingabe eine Nein-Antwort die Aktion 'leereingabe_erlaubt' als abgelehnt bestehen lässt.grüngeprüft am 2026-09-17
TestPruefmanager
test_standarddatei_vorschlagen_ja
Prüft, dass eine Ja-Antwort auf den Vorschlag der Standarddatei die Entscheidung 'ok' mit dem Standardpfad als Kontext liefert.grüngeprüft am 2026-09-17
TestPruefmanager
test_standarddatei_vorschlagen_nein
Prüft, dass eine Nein-Antwort auf den Vorschlag der Standarddatei die Aktion 'standarddatei_vorschlagen' als abgelehnt bestehen lässt.grüngeprüft am 2026-09-17
TestPruefmanager
test_temporaer_erlaubt_ja
Prüft, dass eine Ja-Antwort auf die Rückfrage nach einer temporären Datei die Aktion 'temporaer_erzeugen' auslöst.grüngeprüft am 2026-09-17
TestPruefmanager
test_temporaer_erlaubt_nein
Prüft, dass eine Nein-Antwort auf die Rückfrage nach einer temporären Datei die Aktion 'temporaer_erlaubt' als abgelehnt bestehen lässt.grüngeprüft am 2026-09-17
TestPruefmanager
test_layer_unsichtbar_ja
Prüft, dass eine Ja-Antwort bei unsichtbarem Layer den Layer sichtbar schaltet und die Entscheidung 'ok' liefert.grüngeprüft am 2026-09-17
TestPruefmanager
test_layer_unsichtbar_nein
Prüft, dass eine Nein-Antwort bei unsichtbarem Layer die Aktion 'layer_unsichtbar' als abgelehnt bestehen lässt.grüngeprüft am 2026-09-17
TestPruefmanager
test_unbekannte_aktion
Prüft, dass eine unbekannte Aktion eine Warnung auslöst und unverarbeitet als Fehlschlag zurückgegeben wird.grüngeprüft am 2026-09-17
TestPruefmanager
test_datei_existiert_overwrite
Prüft, dass die Nutzerwahl 'überschreiben' bei bestehender Datei zur Aktion 'datei_existiert_ueberschreiben' führt.grüngeprüft am 2026-09-17
TestPruefmanager
test_datei_existiert_append
Prüft, dass die Nutzerwahl 'anhängen' bei bestehender Datei zur Aktion 'datei_existiert_anhaengen' führt.grüngeprüft am 2026-09-17
TestPruefmanager
test_datei_existiert_cancel
Prüft, dass die Nutzerwahl 'abbrechen' bei bestehender Datei zur Aktion 'datei_existiert_ueberspringen' führt.grüngeprüft am 2026-09-17
TestPruefmanager
test_datei_existiert_in_non_qgis_mode_returns_input
Prüft, dass außerhalb des QGIS-Modus bei bestehender Datei keine Rückfrage erfolgt, sondern die ursprüngliche Aktion unentschieden zurückgegeben wird.grüngeprüft am 2026-09-17
TestPruefmanager
test_verfahrensgebiet_layer_existiert_ergaenzen
Prüft, dass die Nutzerwahl 'ergänzen' bei bestehendem Verfahrensgebiet zur Aktion 'verfahrensgebiet_ergaenzen' führt.grünnie geprüft
TestPruefmanager
test_verfahrensgebiet_layer_existiert_abbrechen
Prüft, dass die Nutzerwahl 'abbrechen' bei bestehendem Verfahrensgebiet ok=False mit Aktion 'verfahrensgebiet_abbrechen' liefert.grünnie geprüft
TestPruefmanager
test_verfahrensgebiet_layer_existiert_entfernen
Prüft, dass die Nutzerwahl 'entfernen' bei bestehendem Verfahrensgebiet zur Aktion 'verfahrensgebiet_entfernen' führt.grünnie geprüft
TestPruefmanager
test_verfahrensgebiet_layer_existiert_ersetzen
Prüft, dass die Nutzerwahl 'ersetzen' bei bestehendem Verfahrensgebiet zur Aktion 'verfahrensgebiet_ersetzen' führt.grünnie geprüft
TestPruefmanager
test_verfahrensgebiet_layer_existiert_in_non_qgis_mode_returns_input
Prüft, dass außerhalb des QGIS-Modus bei bestehendem Verfahrensgebiet keine Rückfrage erfolgt.grünnie geprüft
TestPruefmanager
test_report_error_kritische_aktion_ruft_error_auf
Prüft, dass eine kritische Aktion (z. B. 'netzwerkfehler') über error() gemeldet wird, nicht über warning().grünnie geprüft
TestPruefmanager
test_report_error_warn_aktion_ruft_warning_auf
Prüft, dass eine Warn-Aktion (z. B. 'datei_nicht_gefunden') über warning() gemeldet wird, nicht über error().grünnie geprüft
TestPruefmanager
test_report_error_unbekannte_aktion_faellt_auf_warning_zurueck
Prüft, dass eine nicht eingestufte Aktion als Fallback über warning() gemeldet wird.grünnie geprüft
TestPruefmanager
test_frage_ja_nein_im_qgis_modus_fragt_nutzer
Prüft, dass frage_ja_nein im QGIS-Modus den Nutzer fragt und dessen Antwort liefert.grünnie geprüft
TestPruefmanager
test_frage_ja_nein_ausserhalb_qgis_liefert_default_ohne_rueckfrage
Prüft, dass frage_ja_nein außerhalb des QGIS-Modus den Default-Wert liefert, ohne den Nutzer zu fragen.grünnie geprüft
TestPruefmanager
test_frage_text_im_qgis_modus_fragt_nutzer
Prüft, dass frage_text im QGIS-Modus den Nutzer fragt und Text plus OK-Status liefert.grünnie geprüft
TestPruefmanager
test_frage_text_ausserhalb_qgis_liefert_default_ohne_rueckfrage
Prüft, dass frage_text außerhalb des QGIS-Modus den Standardtext mit OK=True liefert, ohne den Nutzer zu fragen.grünnie geprüft

Tests für sn_basis/functions/qgiscore_wrapper.py::polygon_zu_linie/layer_exists_in_gpkg/create_buffer_layer (Issue #65/#67).

PolygonZuLinieTests 7LayerExistsInGpkgTests 4CreateBufferLayerTests 3
flowchart TD
   root(["test_qgiscore_wrapper_helpers.py"])
   class root rootnode
   root --> g1["PolygonZuLinieTests (7)"]
@@ -1172,7 +1196,7 @@
   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
TestVerfahrensgebietManager
test_get_verfahrensgebiet_layer_id_returns_value
Prüft, dass get_verfahrensgebiet_layer_id() die in der Projektvariable gespeicherte Layer-ID liefert.grünnie geprüft
TestVerfahrensgebietManager
test_get_verfahrensgebiet_layer_id_returns_none_for_empty_value
Prüft, dass get_verfahrensgebiet_layer_id() bei leerer Projektvariable None statt eines leeren Strings liefert.grünnie geprüft
TestVerfahrensgebietManager
test_set_verfahrensgebiet_layer_id_writes_project_variable
Prüft, dass set_verfahrensgebiet_layer_id() die Layer-ID als Projektvariable 'verfahrensgebiet_layer' speichert.grünnie geprüft
TestVerfahrensgebietManager
test_update_without_layer_does_not_write_when_already_empty
Prüft, dass ohne gefundenen Verfahrensgebiet-Layer keine Schreibaktion erfolgt, wenn die Variable bereits leer ist.grünnie geprüft
TestVerfahrensgebietManager
test_update_with_layer_writes_variable
Prüft, dass ein gefundener Verfahrensgebiet-Layer seine ID als Projektvariable speichert.grünnie geprüft
OnHandlerTests
test_on_project_changed_ohne_layer_setzt_variable_leer
Prüft, dass _on_project_changed die Variable leert, wenn kein Verfahrensgebiet-Layer existiert.grünnie geprüft
OnHandlerTests
test_on_project_changed_mit_layer_setzt_variable
Prüft, dass _on_project_changed die Layer-ID eines gefundenen Verfahrensgebiet-Layers übernimmt.grünnie geprüft
OnHandlerTests
test_on_layers_added_findet_neuen_layer
Prüft, dass _on_layers_added nach neu hinzugefügten Layern sucht und die Variable aktualisiert.grünnie geprüft
OnHandlerTests
test_on_layer_removed_bei_aktuellem_layer_sucht_neu
Prüft, dass das Entfernen des aktuell aktiven Verfahrensgebiet-Layers eine Neusuche auslöst.grünnie geprüft
OnHandlerTests
test_on_layer_removed_bei_anderem_layer_aendert_nichts
Prüft, dass das Entfernen eines anderen Layers keine Neusuche auslöst.grünnie geprüft
ListenerSetupTests
test_setup_ohne_qgis_tut_nichts
Prüft, dass setup_verfahrensgebiet_listener ohne QGIS keine Signale registriert.grünnie geprüft
ListenerSetupTests
test_setup_verbindet_signale_und_ist_idempotent
Prüft, dass setup_verfahrensgebiet_listener die Projektsignale verbindet und ein zweiter Aufruf nichts doppelt registriert.grünnie geprüft
ListenerSetupTests
test_teardown_trennt_alle_signale_und_ist_idempotent
Prüft, dass teardown_verfahrensgebiet_listener alle Signale trennt und mehrfacher Aufruf nicht fehlschlägt.grünnie geprüft
-

Heuristik: Name kommt in keiner Testdatei des Pakets vor (Details siehe docs/tests/testkatalog.md). beabsichtigt liest den Docstring der Funktion – ein Vermerk wie „von Test abgesehen, weil …“ oder „Test ausgesetzt, zunächst Refactor“ gilt als bewusste Entscheidung. ungeklärt hat weder Test noch Vermerk.

DateiFunktion/MethodeZeileStatus
functions/dialog_wrapper.pyshow_info_dialog42beabsichtigt
functions/dialog_wrapper.pyask_detailpruefung_oder_vg_laden192beabsichtigt
functions/dialog_wrapper.pyask_detailpruefung_oder_abbrechen244beabsichtigt
functions/dialog_wrapper.pyProgressDialog.set_total339beabsichtigt
functions/dialog_wrapper.pyProgressDialog.set_value348beabsichtigt
functions/dialog_wrapper.pyProgressDialog.set_label361beabsichtigt
functions/dialog_wrapper.pyProgressDialog.is_canceled371beabsichtigt
functions/dialog_wrapper.pyProgressDialog.raise_to_front389beabsichtigt
functions/dialog_wrapper.pycreate_progress_dialog408beabsichtigt
functions/message_wrapper.pyinfo67beabsichtigt
functions/message_wrapper.pysuccess84beabsichtigt
functions/os_wrapper.pynormalize_path43beabsichtigt
functions/os_wrapper.pyget_home_dir55beabsichtigt
functions/os_wrapper.pyis_absolute_path64beabsichtigt
functions/os_wrapper.pybasename75beabsichtigt
functions/os_wrapper.pypath_suffix106beabsichtigt
functions/qgisui_wrapper.pyadd_toolbar204beabsichtigt
functions/qt_wrapper.pyexec_dialog60beabsichtigt
functions/qt_wrapper.pydebug_qt_status67beabsichtigt
modules/DataGrabber.pyDataGrabber.set_source68beabsichtigt
modules/DataGrabber.pyDataGrabber._process_database_source312beabsichtigt
modules/DataGrabber.pyDataGrabber._process_service_source324beabsichtigt
modules/Dateipruefer.pyDateipruefer._ist_leer98ungeklärt
modules/Dateipruefer.pyDateipruefer._handle_leere_eingabe227ungeklärt
modules/Datenschreiber.pyDatenschreiber._store_style_in_gpkg77ungeklärt
modules/LayerLoader.pyLayerLoader._was_canceled42beabsichtigt
modules/LayerLoader.pyLayerLoader._process_events51beabsichtigt
modules/Pruefmanager.pyPruefmanager.report_summary45beabsichtigt
modules/Pruefmanager.pyPruefmanager.zeige_hinweis63beabsichtigt
modules/Pruefmanager.pyPruefmanager._handle_datei_existiert87ungeklärt
modules/Pruefmanager.pyPruefmanager._handle_verfahrensgebiet_layer_existiert234ungeklärt
modules/Pruefmanager.pyPruefmanager._ask_use_or_replace_pufferlayer277ungeklärt
modules/linkpruefer.pyLinkpruefer._ist_url41ungeklärt
modules/linkpruefer.pyLinkpruefer._pruefe_url81ungeklärt
modules/linkpruefer.pyLinkpruefer._pruefe_dateipfad115ungeklärt
modules/print_layout.pyPrintLayout._create_map_item98beabsichtigt
modules/print_layout.pyPrintLayout._set_item_frame_stroke_width120beabsichtigt
modules/print_layout.pyPrintLayout._fit_extent_to_map_item156beabsichtigt
modules/print_layout.pyPrintLayout.add_text_label214beabsichtigt
modules/print_layout.pyPrintLayout._setup_layout_objects246beabsichtigt
modules/print_layout.pyPrintLayout._create_label_item378beabsichtigt
modules/print_layout.pyPrintLayout._resolve_visible_map_layers476beabsichtigt
modules/print_layout.pyPrintLayout._apply_grid_common_settings798beabsichtigt
modules/print_layout.pyPrintLayout._safe_grid_call805beabsichtigt
modules/print_layout.pyPrintLayout._apply_grid_annotation_text_style817beabsichtigt
modules/print_layout.pyPrintLayout._create_rectangle_box_item918beabsichtigt
modules/print_layout_baufreigabe.pyPrintLayoutBaufreigabe.create_baufreigabe_layout90beabsichtigt
modules/print_layout_baufreigabe.pyPrintLayoutBaufreigabe._setup_layout_objects_baufreigabe264beabsichtigt
modules/print_layout_baufreigabe.pyPrintLayoutBaufreigabe._calc_atlas_margin_percent398beabsichtigt
modules/print_logic.pyPrintLogic._failed_result123beabsichtigt
modules/print_logic.pyPrintLogic._show_target_size_too_small127beabsichtigt
modules/print_logic.pyPrintLogic._is_enabled_flag135beabsichtigt
modules/print_logic.pyPrintLogic._resolve_layer_from_project141beabsichtigt
modules/print_logic.pyPrintLogic._resolve_active_layer162beabsichtigt
modules/print_logic.pyPrintLogic._get_druckpuffer_cm172beabsichtigt
modules/print_logic.pyPrintLogic._get_druckpuffer_m181beabsichtigt
modules/print_logic.pyPrintLogic._import_qgis_symbol185beabsichtigt
modules/print_logic.pyPrintLogic._build_rectangle193beabsichtigt
modules/print_logic.pyPrintLogic._clone_extent203beabsichtigt
modules/print_logic.pyPrintLogic._get_existing_layer_by_name270beabsichtigt
modules/print_logic.pyPrintLogic._create_druckrechteck_layer284beabsichtigt
modules/print_logic.pyPrintLogic._clear_layer_features313beabsichtigt
modules/print_logic.pyPrintLogic.configure_atlas_for_baufreigabe_layout483beabsichtigt
modules/print_logic.pyPrintLogic._store_druckrechteck631beabsichtigt
modules/print_logic.pyPrintLogic.activate_druckrechteck_capture680beabsichtigt
modules/print_logic.pyPrintLogic._resolve_selection_layer811beabsichtigt
modules/print_logic.pyPrintLogic._get_selected_extent825beabsichtigt
modules/print_logic.pyPrintLogic._get_plot_dimensions_mm1078beabsichtigt
modules/print_logic.pyPrintLogic._get_required_map_dimensions_mm1088beabsichtigt
ui/tabs/print_tab.pyPrintTab._build_ui115beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_kartenname_changed335beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_massstab_changed349beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_zielgroesse_changed361beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_formfaktor_changed367beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_druckbereich_changed374beabsichtigt
ui/tabs/print_tab.pyPrintTab._format_druckpuffer_label432beabsichtigt
+

Heuristik: Name kommt in keiner Testdatei des Pakets vor (Details siehe docs/tests/testkatalog.md). beabsichtigt liest den Docstring der Funktion – ein Vermerk wie „von Test abgesehen, weil …“ oder „Test ausgesetzt, zunächst Refactor“ gilt als bewusste Entscheidung. ungeklärt hat weder Test noch Vermerk.

DateiFunktion/MethodeZeileStatus
functions/dialog_wrapper.pyshow_info_dialog42beabsichtigt
functions/dialog_wrapper.pyask_detailpruefung_oder_vg_laden192beabsichtigt
functions/dialog_wrapper.pyask_detailpruefung_oder_abbrechen244beabsichtigt
functions/dialog_wrapper.pyProgressDialog.set_total339beabsichtigt
functions/dialog_wrapper.pyProgressDialog.set_value348beabsichtigt
functions/dialog_wrapper.pyProgressDialog.set_label361beabsichtigt
functions/dialog_wrapper.pyProgressDialog.is_canceled371beabsichtigt
functions/dialog_wrapper.pyProgressDialog.raise_to_front389beabsichtigt
functions/dialog_wrapper.pycreate_progress_dialog408beabsichtigt
functions/message_wrapper.pyinfo67beabsichtigt
functions/message_wrapper.pysuccess84beabsichtigt
functions/os_wrapper.pynormalize_path43beabsichtigt
functions/os_wrapper.pyget_home_dir55beabsichtigt
functions/os_wrapper.pyis_absolute_path64beabsichtigt
functions/os_wrapper.pybasename75beabsichtigt
functions/os_wrapper.pypath_suffix106beabsichtigt
functions/qgisui_wrapper.pyadd_toolbar204beabsichtigt
functions/qt_wrapper.pyexec_dialog60beabsichtigt
functions/qt_wrapper.pydebug_qt_status67beabsichtigt
modules/DataGrabber.pyDataGrabber.set_source68beabsichtigt
modules/DataGrabber.pyDataGrabber._process_database_source312beabsichtigt
modules/DataGrabber.pyDataGrabber._process_service_source324beabsichtigt
modules/LayerLoader.pyLayerLoader._was_canceled42beabsichtigt
modules/LayerLoader.pyLayerLoader._process_events51beabsichtigt
modules/Pruefmanager.pyPruefmanager.report_summary45beabsichtigt
modules/Pruefmanager.pyPruefmanager.zeige_hinweis63beabsichtigt
modules/Pruefmanager.pyPruefmanager._handle_datei_existiert87beabsichtigt
modules/Pruefmanager.pyPruefmanager._ask_use_or_replace_pufferlayer280beabsichtigt
modules/linkpruefer.pyLinkpruefer._ist_url41beabsichtigt
modules/linkpruefer.pyLinkpruefer._pruefe_url84beabsichtigt
modules/linkpruefer.pyLinkpruefer._pruefe_dateipfad121beabsichtigt
modules/print_layout.pyPrintLayout._create_map_item98beabsichtigt
modules/print_layout.pyPrintLayout._set_item_frame_stroke_width120beabsichtigt
modules/print_layout.pyPrintLayout._fit_extent_to_map_item156beabsichtigt
modules/print_layout.pyPrintLayout.add_text_label214beabsichtigt
modules/print_layout.pyPrintLayout._setup_layout_objects246beabsichtigt
modules/print_layout.pyPrintLayout._create_label_item378beabsichtigt
modules/print_layout.pyPrintLayout._resolve_visible_map_layers476beabsichtigt
modules/print_layout.pyPrintLayout._apply_grid_common_settings798beabsichtigt
modules/print_layout.pyPrintLayout._safe_grid_call805beabsichtigt
modules/print_layout.pyPrintLayout._apply_grid_annotation_text_style817beabsichtigt
modules/print_layout.pyPrintLayout._create_rectangle_box_item918beabsichtigt
modules/print_layout_baufreigabe.pyPrintLayoutBaufreigabe.create_baufreigabe_layout90beabsichtigt
modules/print_layout_baufreigabe.pyPrintLayoutBaufreigabe._setup_layout_objects_baufreigabe264beabsichtigt
modules/print_layout_baufreigabe.pyPrintLayoutBaufreigabe._calc_atlas_margin_percent398beabsichtigt
modules/print_logic.pyPrintLogic._failed_result123beabsichtigt
modules/print_logic.pyPrintLogic._show_target_size_too_small127beabsichtigt
modules/print_logic.pyPrintLogic._is_enabled_flag135beabsichtigt
modules/print_logic.pyPrintLogic._resolve_layer_from_project141beabsichtigt
modules/print_logic.pyPrintLogic._resolve_active_layer162beabsichtigt
modules/print_logic.pyPrintLogic._get_druckpuffer_cm172beabsichtigt
modules/print_logic.pyPrintLogic._get_druckpuffer_m181beabsichtigt
modules/print_logic.pyPrintLogic._import_qgis_symbol185beabsichtigt
modules/print_logic.pyPrintLogic._build_rectangle193beabsichtigt
modules/print_logic.pyPrintLogic._clone_extent203beabsichtigt
modules/print_logic.pyPrintLogic._get_existing_layer_by_name270beabsichtigt
modules/print_logic.pyPrintLogic._create_druckrechteck_layer284beabsichtigt
modules/print_logic.pyPrintLogic._clear_layer_features313beabsichtigt
modules/print_logic.pyPrintLogic.configure_atlas_for_baufreigabe_layout483beabsichtigt
modules/print_logic.pyPrintLogic._store_druckrechteck631beabsichtigt
modules/print_logic.pyPrintLogic.activate_druckrechteck_capture680beabsichtigt
modules/print_logic.pyPrintLogic._resolve_selection_layer811beabsichtigt
modules/print_logic.pyPrintLogic._get_selected_extent825beabsichtigt
modules/print_logic.pyPrintLogic._get_plot_dimensions_mm1078beabsichtigt
modules/print_logic.pyPrintLogic._get_required_map_dimensions_mm1088beabsichtigt
ui/tabs/print_tab.pyPrintTab._build_ui115beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_kartenname_changed335beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_massstab_changed349beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_zielgroesse_changed361beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_formfaktor_changed367beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_druckbereich_changed374beabsichtigt
ui/tabs/print_tab.pyPrintTab._format_druckpuffer_label432beabsichtigt
diff --git a/docs/tests/testkatalog.md b/docs/tests/testkatalog.md index eeaf1f6..e451fb4 100644 --- a/docs/tests/testkatalog.md +++ b/docs/tests/testkatalog.md @@ -10,19 +10,19 @@ 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 `68b590c8feef`) -Gesamt: 3 Pakete, 49 Testdateien, 569 Testfälle – 526 grün, 35 rot (Baseline), 8 übersprungen. -Mit Beschreibung (Docstring): 424 von 569 (75 %). -Fachlich geprüft: 55 von 569 (10 %) aktuell, 0 veraltet seit Codeänderung, 514 nie geprüft. -Strukturelle Lücken (heuristisch, Namensabgleich): 149 von 413 (36 %) Funktionen/Methoden ohne erkennbaren Testbezug – Abschnitt „Ungetestete Funktionen“. +Gesamt: 3 Pakete, 49 Testdateien, 580 Testfälle – 537 grün, 35 rot (Baseline), 8 übersprungen. +Mit Beschreibung (Docstring): 435 von 580 (75 %). +Fachlich geprüft: 55 von 580 (9 %) aktuell, 0 veraltet seit Codeänderung, 525 nie geprüft. +Strukturelle Lücken (heuristisch, Namensabgleich): 145 von 413 (35 %) 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 | 317 | 317 | 0 | 0 | 317 von 317 (100 %) | 55 von 317 (17 %) | 76 von 229 (33 %) | +| `sn_basis` | 32 | 328 | 328 | 0 | 0 | 328 von 328 (100 %) | 55 von 328 (17 %) | 72 von 229 (31 %) | | `sn_verfahrensgebiet` | 12 | 208 | 166 | 34 | 8 | 106 von 208 (51 %) | 0 von 208 (0 %) | 34 von 104 (33 %) | | `sn_plan41` | 5 | 44 | 43 | 1 | 0 | 1 von 44 (2 %) | 0 von 44 (0 %) | 39 von 80 (49 %) | -| **Summe** | **49** | **569** | **526** | **35** | **8** | **424 von 569 (75 %)** | **55 von 569 (10 %)** | **149 von 413 (36 %)** | +| **Summe** | **49** | **580** | **537** | **35** | **8** | **435 von 580 (75 %)** | **55 von 580 (9 %)** | **145 von 413 (35 %)** | ### Legende @@ -36,7 +36,7 @@ Strukturelle Lücken (heuristisch, Namensabgleich): 149 von 413 (36 %) Funktione ## Paket `sn_basis` -Plattform-Plugin, Ordner `Plugin_SN_Basis` – 32 Testdateien mit 317 Testfällen (317 grün, 0 rot, 0 übersprungen). +Plattform-Plugin, Ordner `Plugin_SN_Basis` – 32 Testdateien mit 328 Testfällen (328 grün, 0 rot, 0 übersprungen). ### `Plugin_SN_Basis/tests/test_base_dockwidget.py` @@ -85,7 +85,7 @@ Worum es in der Datei geht: — (Docstring fehlt) Testgruppen: -- `TestDateipruefer` (12 Testfälle): — (Docstring fehlt) +- `TestDateipruefer` (17 Testfälle): — (Docstring fehlt) | Testfall | prüft | Status | geprüft | | --- | --- | --- | --- | @@ -101,6 +101,11 @@ Testgruppen: | `TestDateipruefer.test_ist_gueltiger_gpkg_pfad_akzeptiert_vorhandenes_verzeichnis` | Prüft, dass ein .gpkg-Pfad mit vorhandenem Zielverzeichnis als gültig gilt. | grün | nie geprüft | | `TestDateipruefer.test_ist_gueltiger_gpkg_pfad_lehnt_falsche_endung_ab` | Prüft, dass ein Pfad ohne .gpkg-Endung als ungültig gilt, auch bei vorhandenem Verzeichnis. | grün | nie geprüft | | `TestDateipruefer.test_ist_gueltiger_gpkg_pfad_lehnt_fehlendes_verzeichnis_ab` | Prüft, dass ein .gpkg-Pfad in einem nicht vorhandenen Verzeichnis als ungültig gilt. | grün | nie geprüft | +| `TestDateipruefer.test_ist_leer_erkennt_none_und_nicht_string_als_leer` | Prüft, dass _ist_leer sowohl None als auch einen Nicht-String-Wert als leer meldet. | grün | nie geprüft | +| `TestDateipruefer.test_ist_leer_erkennt_reinen_whitespace_als_leer` | Prüft, dass _ist_leer eine Eingabe aus reinen Leerzeichen als leer meldet. | grün | nie geprüft | +| `TestDateipruefer.test_ist_leer_meldet_pfad_mit_sichtbaren_zeichen_nicht_als_leer` | Prüft, dass _ist_leer einen Pfad mit sichtbaren Zeichen nicht als leer meldet. | grün | nie geprüft | +| `TestDateipruefer.test_leere_eingabe_bevorzugt_leereingabe_erlaubt_vor_standarddatei` | Prüft, dass bei leerer Eingabe leereingabe_erlaubt Vorrang vor einer gesetzten Standarddatei hat. | grün | nie geprüft | +| `TestDateipruefer.test_leere_eingabe_bevorzugt_standarddatei_vor_temporaer_erlaubt` | Prüft, dass bei leerer Eingabe eine gesetzte Standarddatei Vorrang vor temporaer_erlaubt hat. | grün | nie geprüft | ### `Plugin_SN_Basis/tests/test_datenabruf.py` @@ -151,6 +156,7 @@ Testgruppen: - `SchreibeDatenTests` (4 Testfälle): — (Docstring fehlt) - `LadeLayerTests` (3 Testfälle): — (Docstring fehlt) - `SchreibeLogTests` (2 Testfälle): — (Docstring fehlt) +- `StoreStyleInGpkgTests` (4 Testfälle): Tests für Datenschreiber._store_style_in_gpkg (Issue #70, nachgezogen aus #63). | Testfall | prüft | Status | geprüft | | --- | --- | --- | --- | @@ -168,6 +174,10 @@ Testgruppen: | `LadeLayerTests.test_ungueltiger_layer_meldet_layer_nicht_gefunden` | Prüft, dass ein ungültig ladbarer Layer als 'layer_nicht_gefunden' gemeldet wird. | grün | nie geprüft | | `SchreibeLogTests.test_ohne_speicherort_wirft_valueerror` | Prüft, dass schreibe_log ohne Speicherort einen ValueError wirft. | grün | nie geprüft | | `SchreibeLogTests.test_schreibt_json_datei_mit_ergebnissen_und_gibt_pfad_zurueck` | Prüft, dass schreibe_log eine lesbare JSON-Log-Datei erzeugt und deren Pfad zurückgibt. | grün | nie geprüft | +| `StoreStyleInGpkgTests.test_legt_tabelle_an_und_speichert_stil_als_default` | Prüft, dass _store_style_in_gpkg die layer_styles-Tabelle anlegt und den Stil als Default speichert. | grün | nie geprüft | +| `StoreStyleInGpkgTests.test_setzt_bisherigen_default_stil_desselben_layers_zurueck` | Prüft, dass _store_style_in_gpkg den useAsDefault-Wert vorhandener Stile desselben Layers zurücksetzt. | grün | nie geprüft | +| `StoreStyleInGpkgTests.test_liest_geometriespalte_ueber_geometrycolumn_aus` | Prüft, dass _store_style_in_gpkg die Geometriespalte eines Layers mit geometryColumn() übernimmt. | grün | nie geprüft | +| `StoreStyleInGpkgTests.test_fehlender_stilpfad_meldet_fehler_ueber_pruefmanager_statt_absturz` | Prüft, dass ein nicht lesbarer Stilpfad über den Pruefmanager gemeldet wird statt eine Exception zu werfen. | grün | nie geprüft | ### `Plugin_SN_Basis/tests/test_dockmanager.py` @@ -536,7 +546,7 @@ Worum es in der Datei geht: — (Docstring fehlt) Testgruppen: -- `TestPruefmanager` (24 Testfälle): — (Docstring fehlt) +- `TestPruefmanager` (26 Testfälle): — (Docstring fehlt) | Testfall | prüft | Status | geprüft | | --- | --- | --- | --- | @@ -556,6 +566,8 @@ Testgruppen: | `TestPruefmanager.test_datei_existiert_in_non_qgis_mode_returns_input` | Prüft, dass außerhalb des QGIS-Modus bei bestehender Datei keine Rückfrage erfolgt, sondern die ursprüngliche Aktion unentschieden zurückgegeben wird. | grün | geprüft am 2026-09-17 | | `TestPruefmanager.test_verfahrensgebiet_layer_existiert_ergaenzen` | Prüft, dass die Nutzerwahl 'ergänzen' bei bestehendem Verfahrensgebiet zur Aktion 'verfahrensgebiet_ergaenzen' führt. | grün | nie geprüft | | `TestPruefmanager.test_verfahrensgebiet_layer_existiert_abbrechen` | Prüft, dass die Nutzerwahl 'abbrechen' bei bestehendem Verfahrensgebiet ok=False mit Aktion 'verfahrensgebiet_abbrechen' liefert. | grün | nie geprüft | +| `TestPruefmanager.test_verfahrensgebiet_layer_existiert_entfernen` | Prüft, dass die Nutzerwahl 'entfernen' bei bestehendem Verfahrensgebiet zur Aktion 'verfahrensgebiet_entfernen' führt. | grün | nie geprüft | +| `TestPruefmanager.test_verfahrensgebiet_layer_existiert_ersetzen` | Prüft, dass die Nutzerwahl 'ersetzen' bei bestehendem Verfahrensgebiet zur Aktion 'verfahrensgebiet_ersetzen' führt. | grün | nie geprüft | | `TestPruefmanager.test_verfahrensgebiet_layer_existiert_in_non_qgis_mode_returns_input` | Prüft, dass außerhalb des QGIS-Modus bei bestehendem Verfahrensgebiet keine Rückfrage erfolgt. | grün | nie geprüft | | `TestPruefmanager.test_report_error_kritische_aktion_ruft_error_auf` | Prüft, dass eine kritische Aktion (z. B. 'netzwerkfehler') über error() gemeldet wird, nicht über warning(). | grün | nie geprüft | | `TestPruefmanager.test_report_error_warn_aktion_ruft_warning_auf` | Prüft, dass eine Warn-Aktion (z. B. 'datei_nicht_gefunden') über warning() gemeldet wird, nicht über error(). | grün | nie geprüft | @@ -1236,7 +1248,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 317 Testfällen ohne Beschreibung +### `sn_basis` – 0 von 328 Testfällen ohne Beschreibung Keine Lücken. @@ -1442,7 +1454,7 @@ Keine Lücken. Heuristik, kein Beweis: Diese Funktionen und Methoden kommen unter ihrem Namen in keiner Testdatei des Pakets vor. Das schließt nicht aus, dass sie indirekt über eine andere, getestete Funktion mitlaufen – umgekehrt gilt: Taucht der Name irgendwo in einer Testdatei auf, gilt die Funktion schon als referenziert, auch bei zufälliger Namensgleichheit mit etwas anderem. `main.py`/`__init__.py` (QGIS-Einstiegspunkte wie `classFactory`, `initGui`, `unload`) und Dunder-Methoden sind ausgenommen. Diese Liste ersetzt keine fachliche Prüfung, ob ein Test sinnvoll wäre – dafür braucht es einen Menschen, der die Funktion kennt. „beabsichtigt“ liest den Docstring der Funktion: Enthält er einen Vermerk wie „von Test abgesehen, weil …“ oder „Test ausgesetzt, zunächst Refactor“, gilt der fehlende Test als bewusste Entscheidung. Alles andere ist „ungeklärt“ – die eigentliche Arbeitsliste. -### `sn_basis` – 76 von 229 (33 %) ohne Testbezug (9 ungeklärt, 67 beabsichtigt) +### `sn_basis` – 72 von 229 (31 %) ohne Testbezug (0 ungeklärt, 72 beabsichtigt) #### `functions/dialog_wrapper.py` (9) @@ -1484,15 +1496,6 @@ Heuristik, kein Beweis: Diese Funktionen und Methoden kommen unter ihrem Namen i - `DataGrabber._process_database_source` (Zeile 312) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026 - `DataGrabber._process_service_source` (Zeile 324) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026 -#### `modules/Dateipruefer.py` (2) - -- `Dateipruefer._ist_leer` (Zeile 98) — ungeklärt -- `Dateipruefer._handle_leere_eingabe` (Zeile 227) — ungeklärt - -#### `modules/Datenschreiber.py` (1) - -- `Datenschreiber._store_style_in_gpkg` (Zeile 77) — ungeklärt - #### `modules/LayerLoader.py` (2) - `LayerLoader._was_canceled` (Zeile 42) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026 @@ -1500,9 +1503,9 @@ Heuristik, kein Beweis: Diese Funktionen und Methoden kommen unter ihrem Namen i #### `modules/linkpruefer.py` (3) -- `Linkpruefer._ist_url` (Zeile 41) — ungeklärt -- `Linkpruefer._pruefe_url` (Zeile 81) — ungeklärt -- `Linkpruefer._pruefe_dateipfad` (Zeile 115) — ungeklärt +- `Linkpruefer._ist_url` (Zeile 41) — **beabsichtigt:** von Test abgesehen, weil bereits über pruefe() in test_linkpruefer.py indirekt +- `Linkpruefer._pruefe_url` (Zeile 84) — **beabsichtigt:** von Test abgesehen, weil bereits über pruefe() in test_linkpruefer.py vollständig +- `Linkpruefer._pruefe_dateipfad` (Zeile 121) — **beabsichtigt:** von Test abgesehen, weil bereits über pruefe() in test_linkpruefer.py vollständig #### `modules/print_layout.py` (11) @@ -1547,13 +1550,12 @@ Heuristik, kein Beweis: Diese Funktionen und Methoden kommen unter ihrem Namen i - `PrintLogic._get_plot_dimensions_mm` (Zeile 1078) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor - `PrintLogic._get_required_map_dimensions_mm` (Zeile 1088) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor -#### `modules/Pruefmanager.py` (5) +#### `modules/Pruefmanager.py` (4) - `Pruefmanager.report_summary` (Zeile 45) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026 - `Pruefmanager.zeige_hinweis` (Zeile 63) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026 -- `Pruefmanager._handle_datei_existiert` (Zeile 87) — ungeklärt -- `Pruefmanager._handle_verfahrensgebiet_layer_existiert` (Zeile 234) — ungeklärt -- `Pruefmanager._ask_use_or_replace_pufferlayer` (Zeile 277) — ungeklärt +- `Pruefmanager._handle_datei_existiert` (Zeile 87) — **beabsichtigt:** von Test abgesehen, weil bereits über verarbeite() in test_pruefmanager.py vollständig +- `Pruefmanager._ask_use_or_replace_pufferlayer` (Zeile 280) — **beabsichtigt:** von Test abgesehen, weil toter Code: referenziert self.pruefmanager, das auf #### `ui/tabs/print_tab.py` (7) diff --git a/docs/wissen/fallstricke.md b/docs/wissen/fallstricke.md index 6f69896..a859a69 100644 --- a/docs/wissen/fallstricke.md +++ b/docs/wissen/fallstricke.md @@ -8,6 +8,13 @@ Kurz, konkret, mit Datum und Quelle. Neue Einträge oben in der passenden Rubrik - **QGIS 3.40 ist seit Januar 2026 End of Life.** Aktueller LTR ist 3.44, Stable 4.2 (wird 25.09.2026 LTR). `workspace.toml` und alle `metadata.template` stehen noch auf `3.40` – offene Produktentscheidung, siehe `docs/konzept/07_qgis_tests_plan.md` Abschnitt 2. (04.09.2026, QGIS-Release-Fahrplan) - **Zwei Qt-Welten.** QGIS 3.40/3.44 laufen mit Qt5/PyQt5, QGIS 4 mit Qt6/PyQt6. `qt_wrapper` lädt PyQt6 zuerst, dann PyQt5, sonst Mock. Enum-Zugriffe unterscheiden sich (`Qt.AlignmentFlag.AlignTop` statt `Qt.AlignTop`), deshalb nur Wrapper-Aliase verwenden. (09/2026, Code) - **Mock-Modus ist kein QGIS.** `python scripts/run_tests.py` läuft in Sekunden, prüft aber nur Logik gegen Mock-Klassen. Geometrieoperationen, WFS, Layouts und Signale müssen in QGIS geprüft werden (`tests/test_qgis.bat` unter Windows). Manuelle QGIS-Tests im PR dokumentieren. (09/2026) +- **`sqlite3.connect()` in einem `with`-Block schließt die Verbindung nicht.** Das `with`-Statement committet + bzw. rollt nur zurück, `conn` bleibt offen (siehe `Datenschreiber._store_style_in_gpkg`). Unter Windows + sperrt das die Datei, bis die Verbindung per Garbage Collection oder explizitem `close()` freigegeben wird – + ein Test, der danach dasselbe `tempfile.TemporaryDirectory()` verlassen will, bricht mit + `PermissionError: [WinError 32]` ab. Betroffene Produktionsfunktion nicht nebenbei umschreiben (kein + Refactoring im Testticket); stattdessen im Test `tempfile.mkdtemp()` + `try/finally` mit `gc.collect()` + vor `shutil.rmtree(..., ignore_errors=True)` verwenden. (21.09.2026, Issue Basis #70) - **`_MockQgsProject` war unvollständig:** `transformContext()` und `addMapLayer()` fehlten, wodurch `Datenschreiber._write_layer_to_gpkg` und `LayerLoader.add_to_project` im Mock-Modus für **jeden** gültigen Layer eine Ausnahme geworfen bzw. eine Fehlermeldung erzeugt hätten – nicht durch einen Fehler in diesen