From 94ab55923d1a682b59152a95e906ad768062a226 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 22 Sep 2026 15:26:25 +0200 Subject: [PATCH] =?UTF-8?q?Test-Audit=20sn=5Fbasis=20fortgesetzt:=20landkr?= =?UTF-8?q?eise.py=20und=20LayerLoader.py=20fachlich=20gepr=C3=BCft=20(#76?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 38 Testfälle fachlich geprüft und markiert: test_landkreise.py komplett (6, inkl. 4 neuer Tests) und test_layerloader.py komplett (32, inkl. 7 neuer Tests). Dabei gefunden und in Plugin_SN_Basis als Issues vorbereitet (Absenden durch den Menschen): #80 (REST-Link ohne Layer-Index lädt still Layer 0), #81 (unbekannter Provider fällt still auf ogr zurück), #82 (Datenabruf und LayerLoader bauen aus demselben REST-Link widersprüchliche URLs), #83 (filter_by_extent/filter_by_layer reichen ungültige Layer still durch). Testkatalog neu erzeugt. Co-Authored-By: Claude Sonnet 5 --- docs/status/testpruefungen.json | 152 ++++++++++++++++++++++++++++++++ docs/tests/testkatalog.html | 94 +++++++++++++------- docs/tests/testkatalog.md | 91 +++++++++++-------- 3 files changed, 264 insertions(+), 73 deletions(-) diff --git a/docs/status/testpruefungen.json b/docs/status/testpruefungen.json index 2d771a9..24aefa2 100644 --- a/docs/status/testpruefungen.json +++ b/docs/status/testpruefungen.json @@ -331,6 +331,158 @@ "datum": "2026-09-17", "hash": "14f73fb0a974" }, + "sn_basis.tests.test_landkreise.AlleLandkreiseSentinelTests.test_alle_landkreise_sentinel_kollidiert_nicht_mit_echter_kennzahl": { + "datum": "2026-09-22", + "hash": "3904d6ac7626" + }, + "sn_basis.tests.test_landkreise.LadeLandkreiseTests.test_alle_kennzahlen_kommen_genau_einmal_vor": { + "datum": "2026-09-22", + "hash": "fca83f397af2" + }, + "sn_basis.tests.test_landkreise.LadeLandkreiseTests.test_fehlende_datei_liefert_leere_liste": { + "datum": "2026-09-22", + "hash": "247c9b9bc02e" + }, + "sn_basis.tests.test_landkreise.LadeLandkreiseTests.test_laedt_die_echte_landkreisliste_nicht_leer": { + "datum": "2026-09-22", + "hash": "5daef82a286e" + }, + "sn_basis.tests.test_landkreise.LadeLandkreiseTests.test_ungueltiges_json_liefert_leere_liste": { + "datum": "2026-09-22", + "hash": "29c14c5d2401" + }, + "sn_basis.tests.test_landkreise.LandkreislisteVollstaendigkeitTests.test_landkreisliste_enthaelt_alle_13_saechsischen_gebietskoerperschaften": { + "datum": "2026-09-22", + "hash": "6081fa0fbbd1" + }, + "sn_basis.tests.test_layerloader.AddToProjectTests.test_gueltiger_layer_wird_dem_projekt_hinzugefuegt": { + "datum": "2026-09-22", + "hash": "7c8ed62e7051" + }, + "sn_basis.tests.test_layerloader.AddToProjectTests.test_none_layer_wird_nicht_hinzugefuegt": { + "datum": "2026-09-22", + "hash": "db489f5f485f" + }, + "sn_basis.tests.test_layerloader.AddToProjectTests.test_ungueltiger_layer_wird_nicht_hinzugefuegt": { + "datum": "2026-09-22", + "hash": "1261f9711940" + }, + "sn_basis.tests.test_layerloader.CreateLayerTests.test_ausnahme_beim_erstellen_wird_abgefangen": { + "datum": "2026-09-22", + "hash": "12cd21f33e57" + }, + "sn_basis.tests.test_layerloader.CreateLayerTests.test_ogr_provider_nutzt_link_direkt": { + "datum": "2026-09-22", + "hash": "1910e68956dd" + }, + "sn_basis.tests.test_layerloader.CreateLayerTests.test_rest_featureserver_ergaenzt_layer_index": { + "datum": "2026-09-22", + "hash": "776f68881c59" + }, + "sn_basis.tests.test_layerloader.CreateLayerTests.test_rest_mit_url_praefix_wird_nicht_doppelt_gesetzt": { + "datum": "2026-09-22", + "hash": "25d8a8ad0d5a" + }, + "sn_basis.tests.test_layerloader.CreateLayerTests.test_rest_ohne_featureserver_endung_bleibt_unveraendert": { + "datum": "2026-09-22", + "hash": "fc7415b43710" + }, + "sn_basis.tests.test_layerloader.CreateLayerTests.test_unbekannter_provider_faellt_auf_ogr_zurueck": { + "datum": "2026-09-22", + "hash": "6bb5f7ab89e3" + }, + "sn_basis.tests.test_layerloader.CreateLayerTests.test_ungueltiger_layer_meldet_layer_nicht_verfuegbar": { + "datum": "2026-09-22", + "hash": "feabb435d115" + }, + "sn_basis.tests.test_layerloader.CreateLayerTests.test_wfs_baut_uri_ohne_getfeature_parameter": { + "datum": "2026-09-22", + "hash": "92bb8d53e711" + }, + "sn_basis.tests.test_layerloader.CreateLayerTests.test_wfs_ergaenzt_service_und_version_defaults": { + "datum": "2026-09-22", + "hash": "81ecbf43a140" + }, + "sn_basis.tests.test_layerloader.CreateLayerTests.test_wfs_erkennt_typename_in_grossschreibung": { + "datum": "2026-09-22", + "hash": "2898b56c4e1c" + }, + "sn_basis.tests.test_layerloader.CreateLayerTests.test_wfs_mit_url_praefix_wird_nicht_doppelt_gesetzt": { + "datum": "2026-09-22", + "hash": "5385bc25e511" + }, + "sn_basis.tests.test_layerloader.CreateLayerTests.test_wms_baut_url_praefix_und_nutzt_rasterlayer": { + "datum": "2026-09-22", + "hash": "407c1a9ba825" + }, + "sn_basis.tests.test_layerloader.FilterByExtentTests.test_abbruch_liefert_none_und_meldet_needs_user_action": { + "datum": "2026-09-22", + "hash": "839e5055e5eb" + }, + "sn_basis.tests.test_layerloader.FilterByExtentTests.test_erfolgreicher_filter_liefert_neuen_layer_mit_features": { + "datum": "2026-09-22", + "hash": "d42dbc209f8d" + }, + "sn_basis.tests.test_layerloader.FilterByExtentTests.test_falscher_layertyp_wird_unveraendert_zurueckgegeben": { + "datum": "2026-09-22", + "hash": "571bcc79cd34" + }, + "sn_basis.tests.test_layerloader.FilterByExtentTests.test_keine_treffer_liefert_none": { + "datum": "2026-09-22", + "hash": "ead34605a071" + }, + "sn_basis.tests.test_layerloader.FilterByExtentTests.test_ohne_extent_wird_layer_unveraendert_zurueckgegeben": { + "datum": "2026-09-22", + "hash": "6df5b38eda97" + }, + "sn_basis.tests.test_layerloader.FilterByExtentTests.test_ungueltiger_layer_wird_unveraendert_zurueckgegeben": { + "datum": "2026-09-22", + "hash": "f98f92c748d3" + }, + "sn_basis.tests.test_layerloader.FilterByLayerTests.test_erfolgreicher_geometriefilter_liefert_neuen_layer": { + "datum": "2026-09-22", + "hash": "8bc46d7cc336" + }, + "sn_basis.tests.test_layerloader.FilterByLayerTests.test_filterlayer_ohne_features_liefert_none": { + "datum": "2026-09-22", + "hash": "a8963f651828" + }, + "sn_basis.tests.test_layerloader.FilterByLayerTests.test_keine_ueberschneidung_liefert_none": { + "datum": "2026-09-22", + "hash": "4d033b3df276" + }, + "sn_basis.tests.test_layerloader.FilterByLayerTests.test_ungueltiger_layer_oder_filterlayer_wird_unveraendert_zurueckgegeben": { + "datum": "2026-09-22", + "hash": "29d5ae987f69" + }, + "sn_basis.tests.test_layerloader.TransformExtentTests.test_ausnahme_bei_der_extent_transformation_liefert_extent_unveraendert": { + "datum": "2026-09-22", + "hash": "f11e2c936436" + }, + "sn_basis.tests.test_layerloader.TransformExtentTests.test_gleiche_crs_liefert_extent_unveraendert": { + "datum": "2026-09-22", + "hash": "7f5d3da32cfc" + }, + "sn_basis.tests.test_layerloader.TransformExtentTests.test_unterschiedliche_crs_nutzt_coordinate_transform": { + "datum": "2026-09-22", + "hash": "1f99cdecd25a" + }, + "sn_basis.tests.test_layerloader.TransformGeometryTests.test_ausnahme_bei_der_transformation_liefert_geometrie_unveraendert": { + "datum": "2026-09-22", + "hash": "6cfb8b4dbd06" + }, + "sn_basis.tests.test_layerloader.TransformGeometryTests.test_fehlender_layer_liefert_geometrie_unveraendert": { + "datum": "2026-09-22", + "hash": "9577d78fb696" + }, + "sn_basis.tests.test_layerloader.TransformGeometryTests.test_gleiche_crs_liefert_geometrie_unveraendert": { + "datum": "2026-09-22", + "hash": "31d753a90fb5" + }, + "sn_basis.tests.test_layerloader.TransformGeometryTests.test_unterschiedliche_crs_klont_und_transformiert_geometrie": { + "datum": "2026-09-22", + "hash": "ec11affdda72" + }, "sn_basis.tests.test_layerpruefer.TestLayerpruefer.test_datenquelle_unerwartet": { "datum": "2026-09-17", "hash": "4b838528f751" diff --git a/docs/tests/testkatalog.html b/docs/tests/testkatalog.html index 12b41cc..3316343 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 ab63e2f916cd)
+
Quelle: docs/tests/testkatalog.md
Baseline: docs/status/testbaseline.json (SHA-256 aeabc946a7f3)
Prüf-Audit: docs/status/testpruefungen.json (SHA-256 2f7e27c76ee7)
-
581Testfälle
-
538grün
+
592Testfälle
+
549grün
35rot (Baseline)
-
75%mit Docstring
-
21%aktuell geprüft
+
76%mit Docstring
+
27%aktuell geprüft
49Testdateien
35%ohne Testbezug
Verteilung je Paket
-
sn_basis32 Dateien · 329 Testfälle
+
sn_basis32 Dateien · 340 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
329Testfälle
329grün
0rot (Baseline)
100%mit Docstring
37%geprüft
72ohne Testbezug
+
32Testdateien
340Testfälle
340grün
0rot (Baseline)
100%mit Docstring
47%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
@@ -434,23 +434,35 @@
   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
TestGetLaenderkennung
test_bekannter_praefix_gibt_kennung_zurueck
Prüft, dass der Präfix 'sn' die ALKIS-Länderkennung '14' für Sachsen liefert.grüngeprüft am 2026-09-17
TestGetLaenderkennung
test_praefix_gross_klein_unabhaengig
Prüft, dass die Präfixsuche groß-/kleinschreibungsunabhängig ist.grüngeprüft am 2026-09-17
TestGetLaenderkennung
test_unbekannter_praefix_wirft_keyerror
Prüft, dass ein unbekannter Präfix einen KeyError auslöst.grüngeprüft am 2026-09-17
TestGetLaenderkennung
test_ohne_argument_wird_aus_aufrufendem_modul_abgeleitet
Prüft, dass ohne Argument der Präfix aus dem Modulnamen des Aufrufers abgeleitet wird.grüngeprüft am 2026-09-17
TestGetLaenderkennung
test_mapping_enthaelt_sachsen
Prüft, dass die Mapping-Tabelle LAENDERKENNUNGEN einen Eintrag für Sachsen ('sn' -> '14') enthält.grüngeprüft am 2026-09-17

Tests für sn_basis/functions/landkreise.py::_lade_landkreise (Issue #65).

LadeLandkreiseTests 2
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
TestGetLaenderkennung
test_bekannter_praefix_gibt_kennung_zurueck
Prüft, dass der Präfix 'sn' die ALKIS-Länderkennung '14' für Sachsen liefert.grüngeprüft am 2026-09-17
TestGetLaenderkennung
test_praefix_gross_klein_unabhaengig
Prüft, dass die Präfixsuche groß-/kleinschreibungsunabhängig ist.grüngeprüft am 2026-09-17
TestGetLaenderkennung
test_unbekannter_praefix_wirft_keyerror
Prüft, dass ein unbekannter Präfix einen KeyError auslöst.grüngeprüft am 2026-09-17
TestGetLaenderkennung
test_ohne_argument_wird_aus_aufrufendem_modul_abgeleitet
Prüft, dass ohne Argument der Präfix aus dem Modulnamen des Aufrufers abgeleitet wird.grüngeprüft am 2026-09-17
TestGetLaenderkennung
test_mapping_enthaelt_sachsen
Prüft, dass die Mapping-Tabelle LAENDERKENNUNGEN einen Eintrag für Sachsen ('sn' -> '14') enthält.grüngeprüft am 2026-09-17

Tests für sn_basis/functions/landkreise.py::_lade_landkreise (Issue #65).

LadeLandkreiseTests 4LandkreislisteVollstaendigkeitTests 1AlleLandkreiseSentinelTests 1
flowchart TD
   root(["test_landkreise.py"])
   class root rootnode
-  root --> g1["LadeLandkreiseTests (2)"]
+  root --> g1["LadeLandkreiseTests (4)"]
   class g1 groupnode
   g1 --> t1("laedt_die_echte_landkreisliste_nicht_leer")
   g1 --> t2("fehlende_datei_liefert_leere_liste")
+  g1 --> t3("ungueltiges_json_liefert_leere_liste")
+  g1 --> t4("alle_kennzahlen_kommen_genau_einmal_vor")
+  root --> g2["LandkreislisteVollstaendigkeitTests (1)"]
+  class g2 groupnode
+  g2 --> t5("landkreisliste_enthaelt_alle_13_saechsischen_gebietskoerperschaften")
+  root --> g3["AlleLandkreiseSentinelTests (1)"]
+  class g3 groupnode
+  g3 --> t6("alle_landkreise_sentinel_kollidiert_nicht_mit_echter_kennzahl")
   class t1 ok
   class t2 ok
+  class t3 ok
+  class t4 ok
+  class t5 ok
+  class t6 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
LadeLandkreiseTests
test_laedt_die_echte_landkreisliste_nicht_leer
Prüft, dass _lade_landkreise die echte landkreise.json als nicht-leere Liste von (Kennzahl, Name)-Tupeln liefert.grünnie geprüft
LadeLandkreiseTests
test_fehlende_datei_liefert_leere_liste
Prüft, dass eine nicht lesbare Datenquelle eine leere Liste liefert, statt eine Ausnahme zu werfen.grünnie geprüft

Tests für sn_basis/modules/LayerLoader.py (Layer erzeugen/filtern/laden, Issue #63).

CreateLayerTests 7TransformGeometryTests 3TransformExtentTests 2FilterByExtentTests 6FilterByLayerTests 4AddToProjectTests 3
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
LadeLandkreiseTests
test_laedt_die_echte_landkreisliste_nicht_leer
Prüft, dass _lade_landkreise die echte landkreise.json als nicht-leere Liste von (Kennzahl, Name)-Tupeln liefert.grüngeprüft am 2026-09-22
LadeLandkreiseTests
test_fehlende_datei_liefert_leere_liste
Prüft, dass eine nicht lesbare Datenquelle eine leere Liste liefert, statt eine Ausnahme zu werfen.grüngeprüft am 2026-09-22
LadeLandkreiseTests
test_ungueltiges_json_liefert_leere_liste
Prüft, dass eine Datei mit syntaktisch ungültigem JSON eine leere Liste liefert, statt eine Ausnahme zu werfen.grüngeprüft am 2026-09-22
LadeLandkreiseTests
test_alle_kennzahlen_kommen_genau_einmal_vor
Prüft, dass jede Landkreiskennzahl in der geladenen Landkreisliste genau einmal vorkommt.grüngeprüft am 2026-09-22
LandkreislisteVollstaendigkeitTests
test_landkreisliste_enthaelt_alle_13_saechsischen_gebietskoerperschaften
Prüft, dass die geladene Landkreisliste genau die 13 amtlichen sächsischen Kreisschlüssel und Namen enthält.grüngeprüft am 2026-09-22
AlleLandkreiseSentinelTests
test_alle_landkreise_sentinel_kollidiert_nicht_mit_echter_kennzahl
Prüft, dass die Sentinel-Kennzahl ALLE_LANDKREISE mit keiner echten Landkreiskennzahl übereinstimmt.grüngeprüft am 2026-09-22

Tests für sn_basis/modules/LayerLoader.py (Layer erzeugen/filtern/laden, Issue #63).

CreateLayerTests 12TransformGeometryTests 4TransformExtentTests 3FilterByExtentTests 6FilterByLayerTests 4AddToProjectTests 3
flowchart TD
   root(["test_layerloader.py"])
   class root rootnode
-  root --> g1["CreateLayerTests (7)"]
+  root --> g1["CreateLayerTests (12)"]
   class g1 groupnode
   g1 --> t1("wfs_baut_uri_ohne_getfeature_parameter")
   g1 --> t2("wfs_mit_url_praefix_wird_nicht_doppelt_gesetzt")
@@ -459,34 +471,41 @@
   g1 --> t5("ogr_provider_nutzt_link_direkt")
   g1 --> t6("ungueltiger_layer_meldet_layer_nicht_verfuegbar")
   g1 --> t7("ausnahme_beim_erstellen_wird_abgefangen")
-  root --> g2["TransformGeometryTests (3)"]
+  g1 --> t8("unbekannter_provider_faellt_auf_ogr_zurueck")
+  g1 --> t9("rest_ohne_featureserver_endung_bleibt_unveraendert")
+  g1 --> t10("rest_mit_url_praefix_wird_nicht_doppelt_gesetzt")
+  g1 --> t11("wfs_erkennt_typename_in_grossschreibung")
+  g1 --> t12("wfs_ergaenzt_service_und_version_defaults")
+  root --> g2["TransformGeometryTests (4)"]
   class g2 groupnode
-  g2 --> t8("fehlender_layer_liefert_geometrie_unveraendert")
-  g2 --> t9("gleiche_crs_liefert_geometrie_unveraendert")
-  g2 --> t10("unterschiedliche_crs_klont_und_transformiert_geometrie")
-  root --> g3["TransformExtentTests (2)"]
+  g2 --> t13("fehlender_layer_liefert_geometrie_unveraendert")
+  g2 --> t14("gleiche_crs_liefert_geometrie_unveraendert")
+  g2 --> t15("unterschiedliche_crs_klont_und_transformiert_geometrie")
+  g2 --> t16("ausnahme_bei_der_transformation_liefert_geometrie_unveraendert")
+  root --> g3["TransformExtentTests (3)"]
   class g3 groupnode
-  g3 --> t11("gleiche_crs_liefert_extent_unveraendert")
-  g3 --> t12("unterschiedliche_crs_nutzt_coordinate_transform")
+  g3 --> t17("gleiche_crs_liefert_extent_unveraendert")
+  g3 --> t18("unterschiedliche_crs_nutzt_coordinate_transform")
+  g3 --> t19("ausnahme_bei_der_extent_transformation_liefert_extent_unveraendert")
   root --> g4["FilterByExtentTests (6)"]
   class g4 groupnode
-  g4 --> t13("ungueltiger_layer_wird_unveraendert_zurueckgegeben")
-  g4 --> t14("ohne_extent_wird_layer_unveraendert_zurueckgegeben")
-  g4 --> t15("falscher_layertyp_wird_unveraendert_zurueckgegeben")
-  g4 --> t16("keine_treffer_liefert_none")
-  g4 --> t17("abbruch_liefert_none_und_meldet_needs_user_action")
-  g4 --> t18("erfolgreicher_filter_liefert_neuen_layer_mit_features")
+  g4 --> t20("ungueltiger_layer_wird_unveraendert_zurueckgegeben")
+  g4 --> t21("ohne_extent_wird_layer_unveraendert_zurueckgegeben")
+  g4 --> t22("falscher_layertyp_wird_unveraendert_zurueckgegeben")
+  g4 --> t23("keine_treffer_liefert_none")
+  g4 --> t24("abbruch_liefert_none_und_meldet_needs_user_action")
+  g4 --> t25("erfolgreicher_filter_liefert_neuen_layer_mit_features")
   root --> g5["FilterByLayerTests (4)"]
   class g5 groupnode
-  g5 --> t19("ungueltiger_layer_oder_filterlayer_wird_unveraendert_zurueckgegeben")
-  g5 --> t20("filterlayer_ohne_features_liefert_none")
-  g5 --> t21("erfolgreicher_geometriefilter_liefert_neuen_layer")
-  g5 --> t22("keine_ueberschneidung_liefert_none")
+  g5 --> t26("ungueltiger_layer_oder_filterlayer_wird_unveraendert_zurueckgegeben")
+  g5 --> t27("filterlayer_ohne_features_liefert_none")
+  g5 --> t28("erfolgreicher_geometriefilter_liefert_neuen_layer")
+  g5 --> t29("keine_ueberschneidung_liefert_none")
   root --> g6["AddToProjectTests (3)"]
   class g6 groupnode
-  g6 --> t23("gueltiger_layer_wird_dem_projekt_hinzugefuegt")
-  g6 --> t24("ungueltiger_layer_wird_nicht_hinzugefuegt")
-  g6 --> t25("none_layer_wird_nicht_hinzugefuegt")
+  g6 --> t30("gueltiger_layer_wird_dem_projekt_hinzugefuegt")
+  g6 --> t31("ungueltiger_layer_wird_nicht_hinzugefuegt")
+  g6 --> t32("none_layer_wird_nicht_hinzugefuegt")
   class t1 ok
   class t2 ok
   class t3 ok
@@ -512,11 +531,18 @@
   class t23 ok
   class t24 ok
   class t25 ok
+  class t26 ok
+  class t27 ok
+  class t28 ok
+  class t29 ok
+  class t30 ok
+  class t31 ok
+  class t32 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
CreateLayerTests
test_wfs_baut_uri_ohne_getfeature_parameter
Prüft, dass für WFS die GetFeature-spezifischen Parameter aus der URI entfernt werden.grünnie geprüft
CreateLayerTests
test_wfs_mit_url_praefix_wird_nicht_doppelt_gesetzt
Prüft, dass ein bereits vorhandenes 'url='-Präfix im WFS-Link nicht verdoppelt wird.grünnie geprüft
CreateLayerTests
test_wms_baut_url_praefix_und_nutzt_rasterlayer
Prüft, dass WMS-Layer über QgsRasterLayer mit 'url='-Präfix erzeugt werden.grünnie geprüft
CreateLayerTests
test_rest_featureserver_ergaenzt_layer_index
Prüft, dass ein REST-Link auf '.../FeatureServer' automatisch um '/0' ergänzt wird.grünnie geprüft
CreateLayerTests
test_ogr_provider_nutzt_link_direkt
Prüft, dass ein OGR-Provider den Link unverändert an QgsVectorLayer übergibt.grünnie geprüft
CreateLayerTests
test_ungueltiger_layer_meldet_layer_nicht_verfuegbar
Prüft, dass ein ungültig erzeugter Layer als 'layer_nicht_verfuegbar' gemeldet wird und None liefert.grünnie geprüft
CreateLayerTests
test_ausnahme_beim_erstellen_wird_abgefangen
Prüft, dass eine Ausnahme beim Layer-Erstellen abgefangen und als Fehlerergebnis gemeldet wird.grünnie geprüft
TransformGeometryTests
test_fehlender_layer_liefert_geometrie_unveraendert
Prüft, dass ohne Quell- oder Ziel-Layer die Geometrie unverändert zurückgegeben wird.grünnie geprüft
TransformGeometryTests
test_gleiche_crs_liefert_geometrie_unveraendert
Prüft, dass bei identischem CRS von Quelle und Ziel keine Transformation stattfindet.grünnie geprüft
TransformGeometryTests
test_unterschiedliche_crs_klont_und_transformiert_geometrie
Prüft, dass bei unterschiedlichem CRS eine geklonte, transformierte Geometrie geliefert wird.grünnie geprüft
TransformExtentTests
test_gleiche_crs_liefert_extent_unveraendert
Prüft, dass bei identischem CRS von Quelle und Ziel der Extent unverändert bleibt.grünnie geprüft
TransformExtentTests
test_unterschiedliche_crs_nutzt_coordinate_transform
Prüft, dass bei unterschiedlichem CRS der Extent über QgsCoordinateTransform umgerechnet wird.grünnie geprüft
FilterByExtentTests
test_ungueltiger_layer_wird_unveraendert_zurueckgegeben
Prüft, dass ein ungültiger Layer von filter_by_extent unverändert zurückgegeben wird.grünnie geprüft
FilterByExtentTests
test_ohne_extent_wird_layer_unveraendert_zurueckgegeben
Prüft, dass ohne Extent (None) der Layer unverändert zurückgegeben wird.grünnie geprüft
FilterByExtentTests
test_falscher_layertyp_wird_unveraendert_zurueckgegeben
Prüft, dass ein Nicht-Vektor-Layer (z. B. Rasterlayer) unverändert zurückgegeben wird.grünnie geprüft
FilterByExtentTests
test_keine_treffer_liefert_none
Prüft, dass ein Raumfilter ohne Treffer None statt eines leeren Layers liefert.grünnie geprüft
FilterByExtentTests
test_abbruch_liefert_none_und_meldet_needs_user_action
Prüft, dass ein Abbruch während des Raumfilters None liefert und gemeldet wird.grünnie geprüft
FilterByExtentTests
test_erfolgreicher_filter_liefert_neuen_layer_mit_features
Prüft, dass ein erfolgreicher BBOX-Filter einen neuen Speicherlayer mit den gefundenen Features liefert.grünnie geprüft
FilterByLayerTests
test_ungueltiger_layer_oder_filterlayer_wird_unveraendert_zurueckgegeben
Prüft, dass ein ungültiger Haupt- oder Filter-Layer unverändert zurückgegeben wird.grünnie geprüft
FilterByLayerTests
test_filterlayer_ohne_features_liefert_none
Prüft, dass ein Filter-Layer ohne Features (leere Vereinigungsgeometrie) None liefert.grünnie geprüft
FilterByLayerTests
test_erfolgreicher_geometriefilter_liefert_neuen_layer
Prüft, dass ein erfolgreicher Geometriefilter einen neuen Speicherlayer mit den passenden Features liefert.grünnie geprüft
FilterByLayerTests
test_keine_ueberschneidung_liefert_none
Prüft, dass ohne überschneidende Features None statt eines leeren Layers geliefert wird.grünnie geprüft
AddToProjectTests
test_gueltiger_layer_wird_dem_projekt_hinzugefuegt
Prüft, dass ein gültiger Layer über QgsProject.instance().addMapLayer hinzugefügt wird.grünnie geprüft
AddToProjectTests
test_ungueltiger_layer_wird_nicht_hinzugefuegt
Prüft, dass ein ungültiger Layer nicht ans Projekt übergeben wird.grünnie geprüft
AddToProjectTests
test_none_layer_wird_nicht_hinzugefuegt
Prüft, dass ein fehlender Layer (None) nicht ans Projekt übergeben wird.grünnie geprüft

— (Docstring fehlt)

TestLayerpruefer 10
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
CreateLayerTests
test_wfs_baut_uri_ohne_getfeature_parameter
Prüft, dass für WFS die GetFeature-spezifischen Parameter aus der URI entfernt werden.grüngeprüft am 2026-09-22
CreateLayerTests
test_wfs_mit_url_praefix_wird_nicht_doppelt_gesetzt
Prüft, dass ein bereits vorhandenes 'url='-Präfix im WFS-Link nicht verdoppelt wird.grüngeprüft am 2026-09-22
CreateLayerTests
test_wms_baut_url_praefix_und_nutzt_rasterlayer
Prüft, dass WMS-Layer über QgsRasterLayer mit 'url='-Präfix erzeugt werden.grüngeprüft am 2026-09-22
CreateLayerTests
test_rest_featureserver_ergaenzt_layer_index
Prüft, dass ein REST-Link auf '.../FeatureServer' automatisch um '/0' ergänzt wird.grüngeprüft am 2026-09-22
CreateLayerTests
test_ogr_provider_nutzt_link_direkt
Prüft, dass ein OGR-Provider den Link unverändert an QgsVectorLayer übergibt.grüngeprüft am 2026-09-22
CreateLayerTests
test_ungueltiger_layer_meldet_layer_nicht_verfuegbar
Prüft, dass ein ungültig erzeugter Layer als 'layer_nicht_verfuegbar' gemeldet wird und None liefert.grüngeprüft am 2026-09-22
CreateLayerTests
test_ausnahme_beim_erstellen_wird_abgefangen
Prüft, dass eine Ausnahme beim Layer-Erstellen abgefangen und als Fehlerergebnis gemeldet wird.grüngeprüft am 2026-09-22
CreateLayerTests
test_unbekannter_provider_faellt_auf_ogr_zurueck
Prüft, dass ein unbekannter Provider wie 'ogr' behandelt wird und den Link unverändert übergibt.grüngeprüft am 2026-09-22
CreateLayerTests
test_rest_ohne_featureserver_endung_bleibt_unveraendert
Prüft, dass ein REST-Link ohne 'FeatureServer'-Endung nicht um '/0' ergänzt wird.grüngeprüft am 2026-09-22
CreateLayerTests
test_rest_mit_url_praefix_wird_nicht_doppelt_gesetzt
Prüft, dass ein bereits vorhandenes 'url='-Präfix im REST-Link nicht verdoppelt wird.grüngeprüft am 2026-09-22
CreateLayerTests
test_wfs_erkennt_typename_in_grossschreibung
Prüft, dass für WFS auch der Parameter 'TYPENAME' (Großschreibung) als Layername erkannt wird.grüngeprüft am 2026-09-22
CreateLayerTests
test_wfs_ergaenzt_service_und_version_defaults
Prüft, dass für WFS ohne 'service'/'version'-Parameter die Defaults 'WFS'/'2.0.0' ergänzt werden.grüngeprüft am 2026-09-22
TransformGeometryTests
test_fehlender_layer_liefert_geometrie_unveraendert
Prüft, dass ohne Quell- oder Ziel-Layer die Geometrie unverändert zurückgegeben wird.grüngeprüft am 2026-09-22
TransformGeometryTests
test_gleiche_crs_liefert_geometrie_unveraendert
Prüft, dass bei identischem CRS von Quelle und Ziel keine Transformation stattfindet.grüngeprüft am 2026-09-22
TransformGeometryTests
test_unterschiedliche_crs_klont_und_transformiert_geometrie
Prüft, dass bei unterschiedlichem CRS eine geklonte, transformierte Geometrie geliefert wird.grüngeprüft am 2026-09-22
TransformGeometryTests
test_ausnahme_bei_der_transformation_liefert_geometrie_unveraendert
Prüft, dass eine Ausnahme während der CRS-Transformation abgefangen wird und die ursprüngliche Geometrie unverändert liefert.grüngeprüft am 2026-09-22
TransformExtentTests
test_gleiche_crs_liefert_extent_unveraendert
Prüft, dass bei identischem CRS von Quelle und Ziel der Extent unverändert bleibt.grüngeprüft am 2026-09-22
TransformExtentTests
test_unterschiedliche_crs_nutzt_coordinate_transform
Prüft, dass bei unterschiedlichem CRS der Extent über QgsCoordinateTransform umgerechnet wird.grüngeprüft am 2026-09-22
TransformExtentTests
test_ausnahme_bei_der_extent_transformation_liefert_extent_unveraendert
Prüft, dass eine Ausnahme während der Extent-Transformation abgefangen wird und den ursprünglichen Extent unverändert liefert.grüngeprüft am 2026-09-22
FilterByExtentTests
test_ungueltiger_layer_wird_unveraendert_zurueckgegeben
Prüft, dass ein ungültiger Layer von filter_by_extent unverändert zurückgegeben wird.grüngeprüft am 2026-09-22
FilterByExtentTests
test_ohne_extent_wird_layer_unveraendert_zurueckgegeben
Prüft, dass ohne Extent (None) der Layer unverändert zurückgegeben wird.grüngeprüft am 2026-09-22
FilterByExtentTests
test_falscher_layertyp_wird_unveraendert_zurueckgegeben
Prüft, dass ein Nicht-Vektor-Layer (z. B. Rasterlayer) unverändert zurückgegeben wird.grüngeprüft am 2026-09-22
FilterByExtentTests
test_keine_treffer_liefert_none
Prüft, dass ein Raumfilter ohne Treffer None statt eines leeren Layers liefert.grüngeprüft am 2026-09-22
FilterByExtentTests
test_abbruch_liefert_none_und_meldet_needs_user_action
Prüft, dass ein Abbruch während des Raumfilters None liefert und gemeldet wird.grüngeprüft am 2026-09-22
FilterByExtentTests
test_erfolgreicher_filter_liefert_neuen_layer_mit_features
Prüft, dass ein erfolgreicher BBOX-Filter einen neuen Speicherlayer mit den gefundenen Features liefert.grüngeprüft am 2026-09-22
FilterByLayerTests
test_ungueltiger_layer_oder_filterlayer_wird_unveraendert_zurueckgegeben
Prüft, dass ein ungültiger Haupt- oder Filter-Layer unverändert zurückgegeben wird.grüngeprüft am 2026-09-22
FilterByLayerTests
test_filterlayer_ohne_features_liefert_none
Prüft, dass ein Filter-Layer ohne Features (leere Vereinigungsgeometrie) None liefert.grüngeprüft am 2026-09-22
FilterByLayerTests
test_erfolgreicher_geometriefilter_liefert_neuen_layer
Prüft, dass ein erfolgreicher Geometriefilter einen neuen Speicherlayer mit den passenden Features liefert.grüngeprüft am 2026-09-22
FilterByLayerTests
test_keine_ueberschneidung_liefert_none
Prüft, dass ohne überschneidende Features None statt eines leeren Layers geliefert wird.grüngeprüft am 2026-09-22
AddToProjectTests
test_gueltiger_layer_wird_dem_projekt_hinzugefuegt
Prüft, dass ein gültiger Layer über QgsProject.instance().addMapLayer hinzugefügt wird.grüngeprüft am 2026-09-22
AddToProjectTests
test_ungueltiger_layer_wird_nicht_hinzugefuegt
Prüft, dass ein ungültiger Layer nicht ans Projekt übergeben wird.grüngeprüft am 2026-09-22
AddToProjectTests
test_none_layer_wird_nicht_hinzugefuegt
Prüft, dass ein fehlender Layer (None) nicht ans Projekt übergeben wird.grüngeprüft am 2026-09-22

— (Docstring fehlt)

TestLayerpruefer 10
flowchart TD
   root(["test_layerpruefer.py"])
   class root rootnode
   root --> g1["TestLayerpruefer (10)"]
diff --git a/docs/tests/testkatalog.md b/docs/tests/testkatalog.md
index 274889d..29b3256 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 `ab63e2f916cd`)
+Stand des Prüf-Audits: `docs/status/testpruefungen.json` (SHA-256 `2f7e27c76ee7`)
 
-Gesamt: 3 Pakete, 49 Testdateien, 581 Testfälle – 538 grün, 35 rot (Baseline), 8 übersprungen.
-Mit Beschreibung (Docstring): 436 von 581 (75 %).
-Fachlich geprüft: 122 von 581 (21 %) aktuell, 0 veraltet seit Codeänderung, 459 nie geprüft.
+Gesamt: 3 Pakete, 49 Testdateien, 592 Testfälle – 549 grün, 35 rot (Baseline), 8 übersprungen.
+Mit Beschreibung (Docstring): 447 von 592 (76 %).
+Fachlich geprüft: 160 von 592 (27 %) aktuell, 0 veraltet seit Codeänderung, 432 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 | 329 | 329 | 0 | 0 | 329 von 329 (100 %) | 122 von 329 (37 %) | 72 von 229 (31 %) |
+| `sn_basis` | 32 | 340 | 340 | 0 | 0 | 340 von 340 (100 %) | 160 von 340 (47 %) | 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** | **581** | **538** | **35** | **8** | **436 von 581 (75 %)** | **122 von 581 (21 %)** | **145 von 413 (35 %)** |
+| **Summe** | **49** | **592** | **549** | **35** | **8** | **447 von 592 (76 %)** | **160 von 592 (27 %)** | **145 von 413 (35 %)** |
 
 ### Legende
 
@@ -36,7 +36,7 @@ Strukturelle Lücken (heuristisch, Namensabgleich): 145 von 413 (35 %) Funktione
 
 ## Paket `sn_basis`
 
-Plattform-Plugin, Ordner `Plugin_SN_Basis` – 32 Testdateien mit 329 Testfällen (329 grün, 0 rot, 0 übersprungen).
+Plattform-Plugin, Ordner `Plugin_SN_Basis` – 32 Testdateien mit 340 Testfällen (340 grün, 0 rot, 0 übersprungen).
 
 ### `Plugin_SN_Basis/tests/test_base_dockwidget.py`
 
@@ -237,12 +237,18 @@ Worum es in der Datei geht: Tests für sn_basis/functions/landkreise.py::_lade_l
 
 Testgruppen:
 
-- `LadeLandkreiseTests` (2 Testfälle): — (Docstring fehlt)
+- `LadeLandkreiseTests` (4 Testfälle): — (Docstring fehlt)
+- `LandkreislisteVollstaendigkeitTests` (1 Testfälle): — (Docstring fehlt)
+- `AlleLandkreiseSentinelTests` (1 Testfälle): — (Docstring fehlt)
 
 | Testfall | prüft | Status | geprüft |
 | --- | --- | --- | --- |
-| `LadeLandkreiseTests.test_laedt_die_echte_landkreisliste_nicht_leer` | Prüft, dass _lade_landkreise die echte landkreise.json als nicht-leere Liste von (Kennzahl, Name)-Tupeln liefert. | grün | nie geprüft |
-| `LadeLandkreiseTests.test_fehlende_datei_liefert_leere_liste` | Prüft, dass eine nicht lesbare Datenquelle eine leere Liste liefert, statt eine Ausnahme zu werfen. | grün | nie geprüft |
+| `LadeLandkreiseTests.test_laedt_die_echte_landkreisliste_nicht_leer` | Prüft, dass _lade_landkreise die echte landkreise.json als nicht-leere Liste von (Kennzahl, Name)-Tupeln liefert. | grün | geprüft am 2026-09-22 |
+| `LadeLandkreiseTests.test_fehlende_datei_liefert_leere_liste` | Prüft, dass eine nicht lesbare Datenquelle eine leere Liste liefert, statt eine Ausnahme zu werfen. | grün | geprüft am 2026-09-22 |
+| `LadeLandkreiseTests.test_ungueltiges_json_liefert_leere_liste` | Prüft, dass eine Datei mit syntaktisch ungültigem JSON eine leere Liste liefert, statt eine Ausnahme zu werfen. | grün | geprüft am 2026-09-22 |
+| `LadeLandkreiseTests.test_alle_kennzahlen_kommen_genau_einmal_vor` | Prüft, dass jede Landkreiskennzahl in der geladenen Landkreisliste genau einmal vorkommt. | grün | geprüft am 2026-09-22 |
+| `LandkreislisteVollstaendigkeitTests.test_landkreisliste_enthaelt_alle_13_saechsischen_gebietskoerperschaften` | Prüft, dass die geladene Landkreisliste genau die 13 amtlichen sächsischen Kreisschlüssel und Namen enthält. | grün | geprüft am 2026-09-22 |
+| `AlleLandkreiseSentinelTests.test_alle_landkreise_sentinel_kollidiert_nicht_mit_echter_kennzahl` | Prüft, dass die Sentinel-Kennzahl ALLE_LANDKREISE mit keiner echten Landkreiskennzahl übereinstimmt. | grün | geprüft am 2026-09-22 |
 
 ### `Plugin_SN_Basis/tests/test_layerloader.py`
 
@@ -250,40 +256,47 @@ Worum es in der Datei geht: Tests für sn_basis/modules/LayerLoader.py (Layer er
 
 Testgruppen:
 
-- `CreateLayerTests` (7 Testfälle): — (Docstring fehlt)
-- `TransformGeometryTests` (3 Testfälle): — (Docstring fehlt)
-- `TransformExtentTests` (2 Testfälle): — (Docstring fehlt)
+- `CreateLayerTests` (12 Testfälle): — (Docstring fehlt)
+- `TransformGeometryTests` (4 Testfälle): — (Docstring fehlt)
+- `TransformExtentTests` (3 Testfälle): — (Docstring fehlt)
 - `FilterByExtentTests` (6 Testfälle): — (Docstring fehlt)
 - `FilterByLayerTests` (4 Testfälle): — (Docstring fehlt)
 - `AddToProjectTests` (3 Testfälle): — (Docstring fehlt)
 
 | Testfall | prüft | Status | geprüft |
 | --- | --- | --- | --- |
-| `CreateLayerTests.test_wfs_baut_uri_ohne_getfeature_parameter` | Prüft, dass für WFS die GetFeature-spezifischen Parameter aus der URI entfernt werden. | grün | nie geprüft |
-| `CreateLayerTests.test_wfs_mit_url_praefix_wird_nicht_doppelt_gesetzt` | Prüft, dass ein bereits vorhandenes 'url='-Präfix im WFS-Link nicht verdoppelt wird. | grün | nie geprüft |
-| `CreateLayerTests.test_wms_baut_url_praefix_und_nutzt_rasterlayer` | Prüft, dass WMS-Layer über QgsRasterLayer mit 'url='-Präfix erzeugt werden. | grün | nie geprüft |
-| `CreateLayerTests.test_rest_featureserver_ergaenzt_layer_index` | Prüft, dass ein REST-Link auf '.../FeatureServer' automatisch um '/0' ergänzt wird. | grün | nie geprüft |
-| `CreateLayerTests.test_ogr_provider_nutzt_link_direkt` | Prüft, dass ein OGR-Provider den Link unverändert an QgsVectorLayer übergibt. | grün | nie geprüft |
-| `CreateLayerTests.test_ungueltiger_layer_meldet_layer_nicht_verfuegbar` | Prüft, dass ein ungültig erzeugter Layer als 'layer_nicht_verfuegbar' gemeldet wird und None liefert. | grün | nie geprüft |
-| `CreateLayerTests.test_ausnahme_beim_erstellen_wird_abgefangen` | Prüft, dass eine Ausnahme beim Layer-Erstellen abgefangen und als Fehlerergebnis gemeldet wird. | grün | nie geprüft |
-| `TransformGeometryTests.test_fehlender_layer_liefert_geometrie_unveraendert` | Prüft, dass ohne Quell- oder Ziel-Layer die Geometrie unverändert zurückgegeben wird. | grün | nie geprüft |
-| `TransformGeometryTests.test_gleiche_crs_liefert_geometrie_unveraendert` | Prüft, dass bei identischem CRS von Quelle und Ziel keine Transformation stattfindet. | grün | nie geprüft |
-| `TransformGeometryTests.test_unterschiedliche_crs_klont_und_transformiert_geometrie` | Prüft, dass bei unterschiedlichem CRS eine geklonte, transformierte Geometrie geliefert wird. | grün | nie geprüft |
-| `TransformExtentTests.test_gleiche_crs_liefert_extent_unveraendert` | Prüft, dass bei identischem CRS von Quelle und Ziel der Extent unverändert bleibt. | grün | nie geprüft |
-| `TransformExtentTests.test_unterschiedliche_crs_nutzt_coordinate_transform` | Prüft, dass bei unterschiedlichem CRS der Extent über QgsCoordinateTransform umgerechnet wird. | grün | nie geprüft |
-| `FilterByExtentTests.test_ungueltiger_layer_wird_unveraendert_zurueckgegeben` | Prüft, dass ein ungültiger Layer von filter_by_extent unverändert zurückgegeben wird. | grün | nie geprüft |
-| `FilterByExtentTests.test_ohne_extent_wird_layer_unveraendert_zurueckgegeben` | Prüft, dass ohne Extent (None) der Layer unverändert zurückgegeben wird. | grün | nie geprüft |
-| `FilterByExtentTests.test_falscher_layertyp_wird_unveraendert_zurueckgegeben` | Prüft, dass ein Nicht-Vektor-Layer (z. B. Rasterlayer) unverändert zurückgegeben wird. | grün | nie geprüft |
-| `FilterByExtentTests.test_keine_treffer_liefert_none` | Prüft, dass ein Raumfilter ohne Treffer None statt eines leeren Layers liefert. | grün | nie geprüft |
-| `FilterByExtentTests.test_abbruch_liefert_none_und_meldet_needs_user_action` | Prüft, dass ein Abbruch während des Raumfilters None liefert und gemeldet wird. | grün | nie geprüft |
-| `FilterByExtentTests.test_erfolgreicher_filter_liefert_neuen_layer_mit_features` | Prüft, dass ein erfolgreicher BBOX-Filter einen neuen Speicherlayer mit den gefundenen Features liefert. | grün | nie geprüft |
-| `FilterByLayerTests.test_ungueltiger_layer_oder_filterlayer_wird_unveraendert_zurueckgegeben` | Prüft, dass ein ungültiger Haupt- oder Filter-Layer unverändert zurückgegeben wird. | grün | nie geprüft |
-| `FilterByLayerTests.test_filterlayer_ohne_features_liefert_none` | Prüft, dass ein Filter-Layer ohne Features (leere Vereinigungsgeometrie) None liefert. | grün | nie geprüft |
-| `FilterByLayerTests.test_erfolgreicher_geometriefilter_liefert_neuen_layer` | Prüft, dass ein erfolgreicher Geometriefilter einen neuen Speicherlayer mit den passenden Features liefert. | grün | nie geprüft |
-| `FilterByLayerTests.test_keine_ueberschneidung_liefert_none` | Prüft, dass ohne überschneidende Features None statt eines leeren Layers geliefert wird. | grün | nie geprüft |
-| `AddToProjectTests.test_gueltiger_layer_wird_dem_projekt_hinzugefuegt` | Prüft, dass ein gültiger Layer über QgsProject.instance().addMapLayer hinzugefügt wird. | grün | nie geprüft |
-| `AddToProjectTests.test_ungueltiger_layer_wird_nicht_hinzugefuegt` | Prüft, dass ein ungültiger Layer nicht ans Projekt übergeben wird. | grün | nie geprüft |
-| `AddToProjectTests.test_none_layer_wird_nicht_hinzugefuegt` | Prüft, dass ein fehlender Layer (None) nicht ans Projekt übergeben wird. | grün | nie geprüft |
+| `CreateLayerTests.test_wfs_baut_uri_ohne_getfeature_parameter` | Prüft, dass für WFS die GetFeature-spezifischen Parameter aus der URI entfernt werden. | grün | geprüft am 2026-09-22 |
+| `CreateLayerTests.test_wfs_mit_url_praefix_wird_nicht_doppelt_gesetzt` | Prüft, dass ein bereits vorhandenes 'url='-Präfix im WFS-Link nicht verdoppelt wird. | grün | geprüft am 2026-09-22 |
+| `CreateLayerTests.test_wms_baut_url_praefix_und_nutzt_rasterlayer` | Prüft, dass WMS-Layer über QgsRasterLayer mit 'url='-Präfix erzeugt werden. | grün | geprüft am 2026-09-22 |
+| `CreateLayerTests.test_rest_featureserver_ergaenzt_layer_index` | Prüft, dass ein REST-Link auf '.../FeatureServer' automatisch um '/0' ergänzt wird. | grün | geprüft am 2026-09-22 |
+| `CreateLayerTests.test_ogr_provider_nutzt_link_direkt` | Prüft, dass ein OGR-Provider den Link unverändert an QgsVectorLayer übergibt. | grün | geprüft am 2026-09-22 |
+| `CreateLayerTests.test_ungueltiger_layer_meldet_layer_nicht_verfuegbar` | Prüft, dass ein ungültig erzeugter Layer als 'layer_nicht_verfuegbar' gemeldet wird und None liefert. | grün | geprüft am 2026-09-22 |
+| `CreateLayerTests.test_ausnahme_beim_erstellen_wird_abgefangen` | Prüft, dass eine Ausnahme beim Layer-Erstellen abgefangen und als Fehlerergebnis gemeldet wird. | grün | geprüft am 2026-09-22 |
+| `CreateLayerTests.test_unbekannter_provider_faellt_auf_ogr_zurueck` | Prüft, dass ein unbekannter Provider wie 'ogr' behandelt wird und den Link unverändert übergibt. | grün | geprüft am 2026-09-22 |
+| `CreateLayerTests.test_rest_ohne_featureserver_endung_bleibt_unveraendert` | Prüft, dass ein REST-Link ohne 'FeatureServer'-Endung nicht um '/0' ergänzt wird. | grün | geprüft am 2026-09-22 |
+| `CreateLayerTests.test_rest_mit_url_praefix_wird_nicht_doppelt_gesetzt` | Prüft, dass ein bereits vorhandenes 'url='-Präfix im REST-Link nicht verdoppelt wird. | grün | geprüft am 2026-09-22 |
+| `CreateLayerTests.test_wfs_erkennt_typename_in_grossschreibung` | Prüft, dass für WFS auch der Parameter 'TYPENAME' (Großschreibung) als Layername erkannt wird. | grün | geprüft am 2026-09-22 |
+| `CreateLayerTests.test_wfs_ergaenzt_service_und_version_defaults` | Prüft, dass für WFS ohne 'service'/'version'-Parameter die Defaults 'WFS'/'2.0.0' ergänzt werden. | grün | geprüft am 2026-09-22 |
+| `TransformGeometryTests.test_fehlender_layer_liefert_geometrie_unveraendert` | Prüft, dass ohne Quell- oder Ziel-Layer die Geometrie unverändert zurückgegeben wird. | grün | geprüft am 2026-09-22 |
+| `TransformGeometryTests.test_gleiche_crs_liefert_geometrie_unveraendert` | Prüft, dass bei identischem CRS von Quelle und Ziel keine Transformation stattfindet. | grün | geprüft am 2026-09-22 |
+| `TransformGeometryTests.test_unterschiedliche_crs_klont_und_transformiert_geometrie` | Prüft, dass bei unterschiedlichem CRS eine geklonte, transformierte Geometrie geliefert wird. | grün | geprüft am 2026-09-22 |
+| `TransformGeometryTests.test_ausnahme_bei_der_transformation_liefert_geometrie_unveraendert` | Prüft, dass eine Ausnahme während der CRS-Transformation abgefangen wird und die ursprüngliche Geometrie unverändert liefert. | grün | geprüft am 2026-09-22 |
+| `TransformExtentTests.test_gleiche_crs_liefert_extent_unveraendert` | Prüft, dass bei identischem CRS von Quelle und Ziel der Extent unverändert bleibt. | grün | geprüft am 2026-09-22 |
+| `TransformExtentTests.test_unterschiedliche_crs_nutzt_coordinate_transform` | Prüft, dass bei unterschiedlichem CRS der Extent über QgsCoordinateTransform umgerechnet wird. | grün | geprüft am 2026-09-22 |
+| `TransformExtentTests.test_ausnahme_bei_der_extent_transformation_liefert_extent_unveraendert` | Prüft, dass eine Ausnahme während der Extent-Transformation abgefangen wird und den ursprünglichen Extent unverändert liefert. | grün | geprüft am 2026-09-22 |
+| `FilterByExtentTests.test_ungueltiger_layer_wird_unveraendert_zurueckgegeben` | Prüft, dass ein ungültiger Layer von filter_by_extent unverändert zurückgegeben wird. | grün | geprüft am 2026-09-22 |
+| `FilterByExtentTests.test_ohne_extent_wird_layer_unveraendert_zurueckgegeben` | Prüft, dass ohne Extent (None) der Layer unverändert zurückgegeben wird. | grün | geprüft am 2026-09-22 |
+| `FilterByExtentTests.test_falscher_layertyp_wird_unveraendert_zurueckgegeben` | Prüft, dass ein Nicht-Vektor-Layer (z. B. Rasterlayer) unverändert zurückgegeben wird. | grün | geprüft am 2026-09-22 |
+| `FilterByExtentTests.test_keine_treffer_liefert_none` | Prüft, dass ein Raumfilter ohne Treffer None statt eines leeren Layers liefert. | grün | geprüft am 2026-09-22 |
+| `FilterByExtentTests.test_abbruch_liefert_none_und_meldet_needs_user_action` | Prüft, dass ein Abbruch während des Raumfilters None liefert und gemeldet wird. | grün | geprüft am 2026-09-22 |
+| `FilterByExtentTests.test_erfolgreicher_filter_liefert_neuen_layer_mit_features` | Prüft, dass ein erfolgreicher BBOX-Filter einen neuen Speicherlayer mit den gefundenen Features liefert. | grün | geprüft am 2026-09-22 |
+| `FilterByLayerTests.test_ungueltiger_layer_oder_filterlayer_wird_unveraendert_zurueckgegeben` | Prüft, dass ein ungültiger Haupt- oder Filter-Layer unverändert zurückgegeben wird. | grün | geprüft am 2026-09-22 |
+| `FilterByLayerTests.test_filterlayer_ohne_features_liefert_none` | Prüft, dass ein Filter-Layer ohne Features (leere Vereinigungsgeometrie) None liefert. | grün | geprüft am 2026-09-22 |
+| `FilterByLayerTests.test_erfolgreicher_geometriefilter_liefert_neuen_layer` | Prüft, dass ein erfolgreicher Geometriefilter einen neuen Speicherlayer mit den passenden Features liefert. | grün | geprüft am 2026-09-22 |
+| `FilterByLayerTests.test_keine_ueberschneidung_liefert_none` | Prüft, dass ohne überschneidende Features None statt eines leeren Layers geliefert wird. | grün | geprüft am 2026-09-22 |
+| `AddToProjectTests.test_gueltiger_layer_wird_dem_projekt_hinzugefuegt` | Prüft, dass ein gültiger Layer über QgsProject.instance().addMapLayer hinzugefügt wird. | grün | geprüft am 2026-09-22 |
+| `AddToProjectTests.test_ungueltiger_layer_wird_nicht_hinzugefuegt` | Prüft, dass ein ungültiger Layer nicht ans Projekt übergeben wird. | grün | geprüft am 2026-09-22 |
+| `AddToProjectTests.test_none_layer_wird_nicht_hinzugefuegt` | Prüft, dass ein fehlender Layer (None) nicht ans Projekt übergeben wird. | grün | geprüft am 2026-09-22 |
 
 ### `Plugin_SN_Basis/tests/test_layerpruefer.py`
 
@@ -1249,7 +1262,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 329 Testfällen ohne Beschreibung
+### `sn_basis` – 0 von 340 Testfällen ohne Beschreibung
 
 Keine Lücken.