Merge origin/main in feature/16-test-audit

Konflikte aufgelöst:
- docs/status/STATUS.md: Baustellen aus main (Basemap #88 ff., #93, #99, #100, #104) und aus dem
  Audit-Branch zusammengeführt und neu nummeriert; Punkt Test-Audit auf den Endstand für sn_basis
  (#76, PR #117) und den nächsten Schritt sn_verfahrensgebiet (#60) umgeschrieben; Stand 26.10.2026.
- docs/tests/testkatalog.md/.html: nicht von Hand zusammengeführt, sondern mit
  scripts/testkatalog.py neu erzeugt (sn_basis auf unstable nach PR #117,
  sn_verfahrensgebiet auf unstable).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-26 21:00:37 +01:00
co-authored by Claude Opus 5.5
15 changed files with 1779 additions and 98 deletions
File diff suppressed because one or more lines are too long
+453 -52
View File
@@ -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 `2d7704ddcd6e`)
Gesamt: 3 Pakete, 55 Testdateien, 698 Testfälle – 655 grün, 35 rot (Baseline), 8 übersprungen.
Mit Beschreibung (Docstring): 553 von 698 (79 %).
Fachlich geprüft: 304 von 698 (44 %) aktuell, 0 veraltet seit Codeänderung, 394 nie geprüft.
Strukturelle Lücken (heuristisch, Namensabgleich): 160 von 470 (34 %) Funktionen/Methoden ohne erkennbaren Testbezug – Abschnitt „Ungetestete Funktionen“.
Gesamt: 3 Pakete, 66 Testdateien, 859 Testfälle – 816 grün, 35 rot (Baseline), 8 übersprungen.
Mit Beschreibung (Docstring): 714 von 859 (83 %).
Fachlich geprüft: 304 von 859 (35 %) aktuell, 0 veraltet seit Codeänderung, 555 nie geprüft.
Strukturelle Lücken (heuristisch, Namensabgleich): 216 von 634 (34 %) Funktionen/Methoden ohne erkennbaren Testbezug – Abschnitt „Ungetestete Funktionen“.
## Zusammenfassung
| Paket | Testdateien | Testfälle | grün | rot (Baseline) | übersprungen | mit Beschreibung | fachlich geprüft | ohne Testbezug |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| `sn_basis` | 32 | 365 | 365 | 0 | 0 | 365 von 365 (100 %) | 304 von 365 (83 %) | 70 von 229 (31 %) |
| `sn_basis` | 43 | 526 | 526 | 0 | 0 | 526 von 526 (100 %) | 304 von 526 (58 %) | 126 von 393 (32 %) |
| `sn_verfahrensgebiet` | 18 | 289 | 247 | 34 | 8 | 187 von 289 (65 %) | 0 von 289 (0 %) | 51 von 161 (32 %) |
| `sn_plan41` | 5 | 44 | 43 | 1 | 0 | 1 von 44 (2 %) | 0 von 44 (0 %) | 39 von 80 (49 %) |
| **Summe** | **55** | **698** | **655** | **35** | **8** | **553 von 698 (79 %)** | **304 von 698 (44 %)** | **160 von 470 (34 %)** |
| **Summe** | **66** | **859** | **816** | **35** | **8** | **714 von 859 (83 %)** | **304 von 859 (35 %)** | **216 von 634 (34 %)** |
### Legende
@@ -36,15 +36,16 @@ Strukturelle Lücken (heuristisch, Namensabgleich): 160 von 470 (34 %) Funktione
## Paket `sn_basis`
Plattform-Plugin, Ordner `Plugin_SN_Basis` – 32 Testdateien mit 365 Testfällen (365 grün, 0 rot, 0 übersprungen).
Plattform-Plugin, Ordner `Plugin_SN_Basis` – 43 Testdateien mit 526 Testfällen (526 grün, 0 rot, 0 übersprungen).
### `Plugin_SN_Basis/tests/test_base_dockwidget.py`
Worum es in der Datei geht: Tests für sn_basis/ui/base_dockwidget.py::closeEvent (Issue #65).
Worum es in der Datei geht: Tests für sn_basis/ui/base_dockwidget.py: closeEvent (Issue #65) und Scroll-Bereich je Tab (Basis #104).
Testgruppen:
- `CloseEventTests` (5 Testfälle): — (Docstring fehlt)
- `ScrollbereichTests` (5 Testfälle): Lange Tabs dürfen das QGIS-Fenster nicht über den Bildschirmrand schieben (Basis #104).
| Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- |
@@ -53,6 +54,263 @@ Testgruppen:
| `CloseEventTests.test_fehler_in_cleanup_wird_abgefangen_und_andere_tabs_laufen_weiter` | Prüft, dass ein Fehler in cleanup() eines Tabs nicht die übrigen Tabs verhindert. | grün | geprüft am 2026-09-21 |
| `CloseEventTests.test_setzt_toolbar_action_zurueck` | Prüft, dass closeEvent die verknüpfte Toolbar-Action auf 'nicht gedrückt' zurücksetzt. | grün | geprüft am 2026-09-21 |
| `CloseEventTests.test_ohne_action_wird_nichts_zurueckgesetzt` | Prüft, dass closeEvent ohne verknüpfte Toolbar-Action keine Ausnahme wirft. | grün | geprüft am 2026-09-21 |
| `ScrollbereichTests.test_jeder_tab_liegt_in_einem_scrollbereich` | Prüft, dass BaseDockWidget jeden Tab in einen mitwachsenden Scroll-Bereich packt, damit ein langer Tab scrollt, statt das Fenster zu verlängern. | grün | nie geprüft |
| `ScrollbereichTests.test_fachplugin_mit_eigenem_tabaufbau_bekommt_scrollbereich` | Prüft, dass auch ein Fachplugin, das seine Tabs selbst aufbaut und per setWidget einsetzt (wie Plan41, Verfahrensgebiet), Scroll-Bereiche bekommt. | grün | nie geprüft |
| `ScrollbereichTests.test_scrollbereich_wird_nicht_doppelt_angelegt` | Prüft, dass ein Tab, der schon in einem Scroll-Bereich liegt, beim erneuten Einsetzen nicht ein zweites Mal verpackt wird. | grün | nie geprüft |
| `ScrollbereichTests.test_setwidget_none_und_andere_widgets_bleiben_unveraendert` | Prüft, dass setWidget(None) und Widgets ohne Tabs ohne Fehler und unverändert eingesetzt werden. | grün | nie geprüft |
| `ScrollbereichTests.test_cleanup_erreicht_tabs_im_scrollbereich` | Prüft, dass closeEvent cleanup() auch für Tabs aufruft, die in einem Scroll-Bereich liegen. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_basemap_anbindung.py`
Worum es in der Datei geht: Tests für die Anbindung der Basemap-Legende an Druckablauf, Dialog und Druck-Tab (Basis #88):
Testgruppen:
- `TestMehrfachauswahl` (1 Testfälle): — (Docstring fehlt)
- `TestDruckanbindung` (4 Testfälle): — (Docstring fehlt)
- `TestBasemapBereich` (11 Testfälle): — (Docstring fehlt)
- `TestStilvorlagenAustausch` (5 Testfälle): — (Docstring fehlt)
| Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- |
| `TestMehrfachauswahl.test_mock_modus_liefert_vorauswahl_in_listenreihenfolge` | Prüft, dass der Mehrfachauswahl-Dialog im Mock-Modus die vorausgewählten Schlüssel in Listenreihenfolge liefert. | grün | nie geprüft |
| `TestDruckanbindung.test_basemap_legende_nur_fuer_38_und_41_und_bei_eingeschaltetem_schalter` | Prüft, dass nur §-38- und §-41-Vorlagen eine Basemap-Legende bekommen und nur, wenn der Schalter im Druck-Tab an ist. | grün | nie geprüft |
| `TestDruckanbindung.test_layout_wird_markiert_und_legende_erzeugt` | Prüft, dass PrintLayout das Layout als Basemap-Nutzer kennzeichnet und die Basemap-Legende erzeugen lässt. | grün | nie geprüft |
| `TestDruckanbindung.test_fehler_der_basemap_legende_verhindert_die_vorlage_nicht` | Prüft, dass ein Fehler beim Erzeugen der Basemap-Legende nur als Warnung gemeldet wird und keine Ausnahme durchreicht. | grün | nie geprüft |
| `TestDruckanbindung.test_druck_tab_aktualisiert_basemap_bereich_falls_vorhanden` | Prüft, dass der Druck-Tab den Basemap-Bereich neu einliest und ohne Bereich nichts tut. | grün | nie geprüft |
| `TestBasemapBereich.test_auswertebereich_wird_gespeichert` | Prüft, dass die Wahl des Auswertebereichs in der Projektvariable landet. | grün | nie geprüft |
| `TestBasemapBereich.test_aktualisieren_ohne_vorlage_warnt` | Prüft, dass „Basemap-Legende aktualisieren“ ohne vorhandene Vorlage warnt und nichts auswertet. | grün | nie geprüft |
| `TestBasemapBereich.test_aktualisieren_wertet_gewaehlte_vorlage_aus` | Prüft, dass „Basemap-Legende aktualisieren“ die gewählte Vorlage auswertet und den Erfolg meldet. | grün | nie geprüft |
| `TestBasemapBereich.test_stil_laden_uebernimmt_legendenauswahl` | Prüft, dass das Laden einer Stilvorlage den Layerstil ersetzt und ihre Legendenauswahl in das Projekt übernimmt. | grün | nie geprüft |
| `TestBasemapBereich.test_stil_laden_bricht_bei_fremder_vorlage_ab` | Prüft, dass eine Vorlage mit unbekannten Styles nur nach Bestätigung geladen wird. | grün | nie geprüft |
| `TestBasemapBereich.test_vorhandene_vorlage_wird_nur_nach_rueckfrage_ersetzt` | Prüft, dass eine gleichnamige Stilvorlage ohne Bestätigung nicht überschrieben wird. | grün | nie geprüft |
| `TestBasemapBereich.test_speichern_mit_aktueller_legendenauswahl` | Prüft, dass eine neue Stilvorlage zusammen mit der aktuellen Legendenauswahl gespeichert wird. | grün | nie geprüft |
| `TestBasemapBereich.test_punktlinien_korrigieren_meldet_anzahl` | Prüft, dass „Punktlinien korrigieren“ den Basemap-Layer korrigiert und die Anzahl korrigierter Styles meldet. | grün | nie geprüft |
| `TestBasemapBereich.test_punktlinien_ohne_basemap_layer_warnt` | Prüft, dass ohne Basemap-Layer nichts korrigiert, sondern gewarnt wird. | grün | nie geprüft |
| `TestBasemapBereich.test_stil_speichern_ohne_basemap_layer_warnt` | Prüft, dass ohne Basemap-Layer keine Stilvorlage gespeichert, sondern gewarnt wird. | grün | nie geprüft |
| `TestBasemapBereich.test_stil_laden_bricht_bei_fremdem_thema_ab` | Prüft, dass eine Vorlage eines anderen Themas (Grau auf Farbe) nur nach Bestätigung geladen wird. | grün | nie geprüft |
| `TestStilvorlagenAustausch.test_export_schreibt_gewaehlte_vorlage` | Prüft, dass „Exportieren …“ die gewählte Vorlage in die im Dateidialog gewählte Datei schreibt und den Pfad meldet. | grün | nie geprüft |
| `TestStilvorlagenAustausch.test_export_abgebrochen_oder_ohne_vorlage` | Prüft, dass ohne gewählte Vorlage oder bei abgebrochenem Dateidialog nichts exportiert wird. | grün | nie geprüft |
| `TestStilvorlagenAustausch.test_import_uebernimmt_datei_unter_gewaehltem_namen` | Prüft, dass „Importieren …“ den Namen aus der Datei vorschlägt, unter dem gewählten Namen importiert und die neue Vorlage auswählt. | grün | nie geprüft |
| `TestStilvorlagenAustausch.test_import_ersetzt_vorhandene_nur_nach_rueckfrage` | Prüft, dass ein Import eine gleichnamige Vorlage ohne Bestätigung nicht überschreibt. | grün | nie geprüft |
| `TestStilvorlagenAustausch.test_import_ungeeigneter_datei_warnt` | Prüft, dass eine ungeeignete Importdatei gemeldet wird, ohne nach einem Namen zu fragen oder etwas zu importieren. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_basemap_kacheln.py`
Worum es in der Datei geht: Tests für modules/basemap_kacheln.py – kachelweise Auswertung des Basemap-Layers (Basis #88).
Testgruppen:
- `TestSammleObjekte` (4 Testfälle): — (Docstring fehlt)
- `TestZoomUndStile` (2 Testfälle): — (Docstring fehlt)
| Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- |
| `TestSammleObjekte.test_gleiche_objekte_aus_mehreren_kacheln_werden_entdoppelt` | Prüft, dass Objekte mit gleichem Quell-Layer, Geometrietyp und Attributen über Kachelgrenzen hinweg nur einmal gezählt werden. | grün | nie geprüft |
| `TestSammleObjekte.test_kacheln_ausserhalb_der_geometrie_werden_uebersprungen` | Prüft, dass Kacheln ohne Schnitt mit dem Auswertebereich nicht abgefragt werden. | grün | nie geprüft |
| `TestSammleObjekte.test_abbruch_liefert_none_und_hebt_auswahl_auf` | Prüft, dass ein Abbruch über den Fortschritt None liefert und die Auswahl auf dem Basemap-Layer trotzdem aufgehoben wird. | grün | nie geprüft |
| `TestSammleObjekte.test_anzahl_kacheln_aus_kachelbereich` | Prüft, dass die Kachelzahl aus dem Kachelbereich der Geometrie berechnet wird. | grün | nie geprüft |
| `TestZoomUndStile.test_zoomstufen_wie_im_qgis_renderer` | Prüft, dass Kachelzoom begrenzt, Darstellungszoom unbegrenzt und der gebrochene Zoom aus dem Maßstab bestimmt werden. | grün | nie geprüft |
| `TestZoomUndStile.test_stile_aus_layer_liest_renderer_styles` | Prüft, dass Name, Quell-Layer, Geometrietyp, Zoombereich, Schalter und Filter der Renderer-Styles übernommen werden. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_basemap_katalog.py`
Worum es in der Datei geht: Tests für modules/basemap_katalog.py – Legendenkatalog aus der basemap.de-Style-JSON (Basis #88).
Testgruppen:
- `TestRendererStil` (3 Testfälle): — (Docstring fehlt)
- `TestErzeugeKatalog` (6 Testfälle): — (Docstring fehlt)
- `TestSymbolwahlUndPruefung` (3 Testfälle): — (Docstring fehlt)
| Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- |
| `TestRendererStil.test_beschriftung_und_3d_sind_keine_renderer_stile` | Prüft, dass reine Beschriftungen und 3D-Gebäude nicht als Renderer-Style gelten, Icon-Symbole und Flächen schon. | grün | nie geprüft |
| `TestRendererStil.test_ausschluss_ueber_liste_und_praefix` | Prüft, dass Style-IDs über die Ausschlussliste und über Präfixe (Nummernschilder) ausgeschlossen werden. | grün | nie geprüft |
| `TestRendererStil.test_normalisierung_entfernt_variantenkennungen` | Prüft, dass Variantenkennungen wie Kontur, Brücke oder Breitenangaben beim Normalisieren einer Style-ID entfallen. | grün | nie geprüft |
| `TestErzeugeKatalog.test_kontur_decker_und_bruecke_bilden_einen_eintrag` | Prüft, dass Kontur-, Decker-, Fahrbahn- und Brückenvarianten derselben Straßenklasse genau einen Legendeneintrag bilden. | grün | nie geprüft |
| `TestErzeugeKatalog.test_zustand_im_bau_wird_eigener_eintrag` | Prüft, dass „im Bau“ einen eigenen Legendeneintrag mit Zustandsangabe in der Bezeichnung bekommt. | grün | nie geprüft |
| `TestErzeugeKatalog.test_punkt_und_flaeche_derselben_objektart_werden_zusammengefasst` | Prüft, dass das Kran-Symbol aus Bauwerkspunkt und Bauwerksfläche in einem Eintrag landet. | grün | nie geprüft |
| `TestErzeugeKatalog.test_ausgeschlossene_stile_fehlen_im_katalog` | Prüft, dass Hintergrund, Beschriftungen, Nummernschilder und 3D-Gebäude keinem Eintrag zugeordnet werden. | grün | nie geprüft |
| `TestErzeugeKatalog.test_fachliche_nachbearbeitung_bleibt_beim_erneuten_lauf_erhalten` | Prüft, dass Bezeichnung, Gruppe, Zusammenführung und Symbolwahl eines bestehenden Katalogs bei einem erneuten Lauf erhalten bleiben. | grün | nie geprüft |
| `TestErzeugeKatalog.test_entfallene_style_ids_werden_gemeldet` | Prüft, dass eine Style-ID, die in der neuen Style-JSON fehlt, als entfallen gemeldet und aus dem Katalog entfernt wird. | grün | nie geprüft |
| `TestSymbolwahlUndPruefung.test_symbol_stile_je_rolle_nur_grundvariante` | Prüft, dass für das Legendensymbol je Rolle (Kontur, Decker) nur die erste Grundvariante gewählt wird. | grün | nie geprüft |
| `TestSymbolwahlUndPruefung.test_pruefung_findet_doppelte_zuordnung_und_unbekannte_symbole` | Prüft, dass die Katalogprüfung doppelt zugeordnete Style-IDs und Symbol-Styles außerhalb des Katalogs meldet. | grün | nie geprüft |
| `TestSymbolwahlUndPruefung.test_ausgelieferter_katalog_ist_konsistent` | Prüft, dass der ausgelieferte Katalog data/basemap_legende.json ohne Fehler geprüft wird und Kreisstraße mit Kontur und Decker enthält. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_basemap_legende.py`
Worum es in der Datei geht: Tests für modules/basemap_legende.py – Zuordnung, Auswahl und Ablauf der Basemap-Legende (Basis #88).
Testgruppen:
- `TestStileUndEintraege` (4 Testfälle): — (Docstring fehlt)
- `TestAuswahlUndEinstellungen` (6 Testfälle): — (Docstring fehlt)
- `TestLayerErkennung` (2 Testfälle): — (Docstring fehlt)
- `TestAblauf` (6 Testfälle): — (Docstring fehlt)
| Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- |
| `TestStileUndEintraege.test_stil_aktiv_nur_eingeschaltet_und_im_zoombereich` | Prüft, dass ein Style nur aktiv ist, wenn er eingeschaltet ist und die Zoomstufe im Bereich liegt (-1 = unbegrenzt). | grün | nie geprüft |
| `TestStileUndEintraege.test_getroffene_stile_pruefen_layer_geometrie_zoom_und_filter` | Prüft, dass ein Style nur Objekte seines Quell-Layers und Geometrietyps zählt, deren Filter zutrifft, und nur bei passender Zoomstufe. | grün | nie geprüft |
| `TestStileUndEintraege.test_eintraege_fassen_styles_zusammen_und_sortieren_nach_gruppe` | Prüft, dass mehrere Styles eines Katalogeintrags einen Eintrag ergeben und die Einträge nach Gruppen- und Katalogreihenfolge sortiert sind. | grün | nie geprüft |
| `TestStileUndEintraege.test_ausgeschlossene_und_unbekannte_styles` | Prüft, dass ausgeschlossene Styles entfallen und unbekannte Styles als nicht bekannter Eintrag in „Sonstiges“ landen. | grün | nie geprüft |
| `TestAuswahlUndEinstellungen.test_vorauswahl_bekannte_an_unbekannte_aus` | Prüft, dass ohne gespeicherte Auswahl Katalogeinträge vorausgewählt und unbekannte Styles abgewählt sind. | grün | nie geprüft |
| `TestAuswahlUndEinstellungen.test_auswahl_wird_gemerkt_und_vorbelegt` | Prüft, dass ab- und angewählte Einträge in der Projektvariable gespeichert und beim nächsten Mal so vorbelegt werden. | grün | nie geprüft |
| `TestAuswahlUndEinstellungen.test_merken_ergaenzt_die_bisherige_auswahl` | Prüft, dass das Merken die Auswahl nicht angezeigter Einträge aus früheren Läufen behält. | grün | nie geprüft |
| `TestAuswahlUndEinstellungen.test_kaputte_projektvariable_ergibt_leere_auswahl` | Prüft, dass eine nicht lesbare Projektvariable als leere Auswahl gilt. | grün | nie geprüft |
| `TestAuswahlUndEinstellungen.test_auswertebereich_standard_und_umstellung` | Prüft, dass der Auswertebereich standardmäßig das Verfahrensgebiet ist, umgestellt werden kann und unbekannte Werte abgewiesen werden. | grün | nie geprüft |
| `TestAuswahlUndEinstellungen.test_legende_erzeugen_standard_an` | Prüft, dass das Erzeugen der Basemap-Legende standardmäßig eingeschaltet ist und abgeschaltet werden kann. | grün | nie geprüft |
| `TestLayerErkennung.test_erkennung_ueber_quelle_und_namen` | Prüft, dass der Basemap-Layer an Vektorkacheln mit basemap.de-Quelle erkannt wird, der Name nur als Rückfall dient und andere Layertypen nicht zählen. | grün | nie geprüft |
| `TestLayerErkennung.test_sichtbare_layer_aus_thema_feste_liste_oder_layerbaum` | Prüft, dass die Layer der Karte aus dem Kartenthema, sonst aus der festen Layerliste, sonst aus dem sichtbaren Layerbaum kommen. | grün | nie geprüft |
| `TestAblauf.test_ohne_basemap_layer_passiert_nichts` | Prüft, dass ohne sichtbaren Basemap-Layer weder Dialog noch Legende entstehen. | grün | nie geprüft |
| `TestAblauf.test_gewaehlte_eintraege_werden_geschrieben_und_gemerkt` | Prüft, dass nur die im Dialog gewählten Einträge in die Legende geschrieben und die Auswahl gespeichert wird. | grün | nie geprüft |
| `TestAblauf.test_abbruch_im_dialog_aendert_nichts` | Prüft, dass ein Abbruch im Auswahldialog die Legende nicht verändert und keine Auswahl speichert. | grün | nie geprüft |
| `TestAblauf.test_rueckfall_auf_druckbereich_wird_gemeldet` | Prüft, dass ohne Verfahrensgebiet auf den Druckbereich zurückgefallen und das gemeldet wird. | grün | nie geprüft |
| `TestAblauf.test_ohne_objekte_keine_legende` | Prüft, dass ohne Basemap-Objekte im Auswertebereich weder Dialog noch Legende entstehen. | grün | nie geprüft |
| `TestAblauf.test_viele_kacheln_werden_vorher_bestaetigt` | Prüft, dass vor einer Auswertung mit sehr vielen Kacheln nachgefragt wird und eine Ablehnung die Auswertung abbricht. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_basemap_legende_layout.py`
Worum es in der Datei geht: Tests für modules/basemap_legende_layout.py – Basemap-Legende im Drucklayout (Basis #88).
Testgruppen:
- `TestKennzeichenUndKarte` (2 Testfälle): — (Docstring fehlt)
- `TestSymbolwahl` (2 Testfälle): — (Docstring fehlt)
- `TestAutobahnSymbol` (3 Testfälle): Autobahn-Symbol aus dem ausgelieferten Katalog (Basis #98).
- `TestHilfslayer` (3 Testfälle): — (Docstring fehlt)
- `TestPlatzierung` (7 Testfälle): — (Docstring fehlt)
| Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- |
| `TestKennzeichenUndKarte.test_layout_kennzeichen_setzen_und_erkennen` | Prüft, dass ein markiertes Layout als Nutzer der Basemap-Legende erkannt und in der Projektliste geführt wird. | grün | nie geprüft |
| `TestKennzeichenUndKarte.test_hauptkarte_ueber_id` | Prüft, dass die Karte mit der ID „Hauptkarte“ gefunden wird. | grün | nie geprüft |
| `TestSymbolwahl.test_symbolnamen_aus_aktiven_symbol_stilen_in_renderer_reihenfolge` | Prüft, dass die Symbol-Styles des Katalogs in Zeichenreihenfolge genommen und inaktive übergangen werden. | grün | nie geprüft |
| `TestSymbolwahl.test_ohne_aktive_symbol_stile_erster_getroffener_style` | Prüft, dass ohne aktiven Symbol-Style der erste tatsächlich getroffene Style das Legendensymbol liefert. | grün | nie geprüft |
| `TestAutobahnSymbol.test_druckmassstab_ab_zoom_14_blauer_decker_auf_grauer_kontur` | Prüft, dass das Autobahn-Symbol ab Zoom 14 aus grauer Kontur und blauem Decker der Fahrbahnachse besteht statt nur aus einem grauen Style. | grün | nie geprüft |
| `TestAutobahnSymbol.test_zoom_11_bis_13_bisherige_kontur_und_decker` | Prüft, dass das Autobahn-Symbol bei Zoom 11 bis 13 weiterhin aus Kontur und Decker der getrennten Fahrbahn besteht. | grün | nie geprüft |
| `TestAutobahnSymbol.test_unter_zoom_11_blauer_decker` | Prüft, dass das Autobahn-Symbol unter Zoom 11 den blauen Decker der Übersichtsdarstellung nutzt. | grün | nie geprüft |
| `TestHilfslayer.test_je_gruppe_und_geometrietyp_ein_leerer_hilfslayer` | Prüft, dass je Gruppe und Geometrietyp ein Hilfslayer außerhalb des Layerbaums entsteht, Flächen vor Linien, ohne Rückfrage beim Schließen. | grün | nie geprüft |
| `TestHilfslayer.test_alte_hilfslayer_werden_entfernt` | Prüft, dass die Hilfslayer einer früheren Basemap-Legende des Layouts aus dem Projekt entfernt werden. | grün | nie geprüft |
| `TestHilfslayer.test_ohne_eintraege_wird_vorhandene_basemap_legende_entfernt` | Prüft, dass ohne gewählte Einträge eine vorhandene Basemap-Legende entfernt und die Auswahl am Layout vermerkt wird. | grün | nie geprüft |
| `TestPlatzierung.test_einspaltig_ueber_der_quellenangabe` | Prüft, dass die Basemap-Legende einspaltig unten an der Quellenangabe verankert wird, wenn der Platz reicht. | grün | nie geprüft |
| `TestPlatzierung.test_mehrspaltig_wenn_hoehe_nicht_reicht` | Prüft, dass die Legende zwei- oder dreispaltig wird, wenn sie einspaltig nicht zwischen Hauptlegende und Quellenangabe passt. | grün | nie geprüft |
| `TestPlatzierung.test_spalten_ungleich_breit` | Prüft, dass die Basemap-Legende ungleich breite Spalten bekommt (#96). | grün | nie geprüft |
| `TestPlatzierung.test_mindestgroesse_mit_ungleichen_spalten_und_umbruch` | Prüft, dass der Platzbedarf mit ungleich breiten Spalten und Textumbruch berechnet wird (#96). | grün | nie geprüft |
| `TestPlatzierung.test_neue_basemap_legende_mindestens_so_breit_wie_kartenschild` | Prüft, dass eine neu angelegte Basemap-Legende die Breite des Kartenschilds als Mindestbreite bekommt. | grün | nie geprüft |
| `TestPlatzierung.test_titel_zweizeilig` | Prüft, dass der Titel der Basemap-Legende zweizeilig ist, damit er die Mindestbreite nicht bestimmt (#96). | grün | nie geprüft |
| `TestPlatzierung.test_nie_breiter_als_der_seitenrand_mit_hinweis` | Prüft, dass keine Spaltenzahl gewählt wird, die über den Seitenrand ragt, und dann ein Hinweis kommt. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_basemap_legende_rand.py`
Worum es in der Datei geht: Tests für den Legendenrand weißer Basemap-Flächen (Basis #92).
Testgruppen:
- `TestBrauchtLegendenrand` (4 Testfälle): — (Docstring fehlt)
- `TestErgaenzeLegendenrand` (2 Testfälle): — (Docstring fehlt)
| Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- |
| `TestBrauchtLegendenrand.test_weisse_flaeche_ohne_rand` | Prüft, dass eine weiße Fläche ohne Umrandung einen Legendenrand braucht. | grün | nie geprüft |
| `TestBrauchtLegendenrand.test_farbige_flaeche_oder_flaeche_mit_kontur` | Prüft, dass farbige Flächen und weiße Flächen mit dunkler Kontur oder eigener Konturlinie keinen Rand bekommen. | grün | nie geprüft |
| `TestBrauchtLegendenrand.test_heller_rand_und_fast_weiss_zaehlen_als_unsichtbar` | Prüft, dass fast weiße Füllungen und helle oder durchsichtige Ränder als unsichtbar gelten. | grün | nie geprüft |
| `TestBrauchtLegendenrand.test_andere_ebenen_und_leeres_symbol` | Prüft, dass Symbole mit anderen Ebenen (Muster, Punkte) und leere Symbole keinen Rand bekommen. | grün | nie geprüft |
| `TestErgaenzeLegendenrand.test_weisse_flaeche_bekommt_grauen_rand` | Prüft, dass eine weiße Fläche ohne Kontur eine graue Randlinie als oberste Ebene bekommt. | grün | nie geprüft |
| `TestErgaenzeLegendenrand.test_farbige_flaeche_und_linien_bleiben_unveraendert` | Prüft, dass farbige Flächen, Flächen mit Kontur und Liniensymbole keinen Rand bekommen. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_basemap_stilkorrektur.py`
Worum es in der Datei geht: Tests für modules/basemap_stilkorrektur.py – Punktlinien des Basemap-Layers sichtbar machen (Basis #90).
Testgruppen:
- `TestMusterUndAusdruck` (2 Testfälle): — (Docstring fehlt)
- `TestLayerkorrektur` (4 Testfälle): — (Docstring fehlt)
| Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- |
| `TestMusterUndAusdruck.test_strichlaenge_null_im_festen_muster` | Prüft, dass Strichlängen 0 (gerade Positionen) im Strichmuster ersetzt und Lücken der Länge 0 nicht verändert werden. | grün | nie geprüft |
| `TestMusterUndAusdruck.test_strichlaenge_null_im_zoomabhaengigen_ausdruck` | Prüft, dass jede Strichlänge 0 in den array(...)-Mustern des Konverter-Ausdrucks ersetzt wird und der übrige Ausdruck gleich bleibt. | grün | nie geprüft |
| `TestLayerkorrektur.test_punktlinien_werden_korrigiert_andere_styles_nicht` | Prüft, dass nur Styles mit Strichlänge 0 korrigiert werden – Muster und Ausdruck – und die Anzahl zurückkommt. | grün | nie geprüft |
| `TestLayerkorrektur.test_zweiter_lauf_korrigiert_nichts` | Prüft, dass ein zweiter Lauf keine Styles mehr korrigiert und nicht neu zeichnen lässt. | grün | nie geprüft |
| `TestLayerkorrektur.test_nur_ausdruck_ohne_festes_muster` | Prüft, dass auch ein Style korrigiert wird, dessen Strichlänge 0 nur im zoomabhängigen Ausdruck steht. | grün | nie geprüft |
| `TestLayerkorrektur.test_layer_ohne_renderer` | Prüft, dass ein Layer ohne Renderer 0 korrigierte Styles liefert. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_basemap_stilvorlagen.py`
Worum es in der Datei geht: Tests für modules/basemap_stilvorlagen.py – lokale Stilvorlagen des Basemap-Layers (Basis #88),
Testgruppen:
- `TestStilvorlagen` (8 Testfälle): — (Docstring fehlt)
- `TestExportImport` (6 Testfälle): — (Docstring fehlt)
| Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- |
| `TestStilvorlagen.test_speichern_und_auflisten` | Prüft, dass eine gespeicherte Vorlage mit Anzeigenamen, QML-Datei und Begleitdatei aufgelistet wird. | grün | nie geprüft |
| `TestStilvorlagen.test_mehrere_varianten_alphabetisch` | Prüft, dass mehrere Varianten nebeneinander bestehen und alphabetisch nach Anzeigename sortiert werden. | grün | nie geprüft |
| `TestStilvorlagen.test_leerer_name_oder_fehler_beim_schreiben` | Prüft, dass ein leerer Name und ein Schreibfehler von QGIS als ValueError gemeldet werden. | grün | nie geprüft |
| `TestStilvorlagen.test_laden_setzt_stil_und_zeichnet_neu` | Prüft, dass das Laden die QML-Datei der Vorlage in den Layer lädt und neu zeichnen lässt. | grün | nie geprüft |
| `TestStilvorlagen.test_passung_meldet_fremde_styles` | Prüft, dass Style-Namen der Vorlage gemeldet werden, die der Ziel-Layer nicht kennt. | grün | nie geprüft |
| `TestStilvorlagen.test_standard_setzen_und_beim_loeschen_entfernen` | Prüft, dass eine Vorlage als Standard markiert wird und die Markierung beim Löschen der Vorlage entfällt. | grün | nie geprüft |
| `TestStilvorlagen.test_fehlende_begleitdatei_wird_toleriert` | Prüft, dass eine QML-Datei ohne Begleitdatei mit ihrem Dateinamen aufgelistet wird. | grün | nie geprüft |
| `TestStilvorlagen.test_ohne_ordner_leere_liste` | Prüft, dass ohne angelegten Vorlagenordner eine leere Liste zurückkommt. | grün | nie geprüft |
| `TestExportImport.test_export_und_import_uebertragen_vorlage_mit_begleitdaten` | Prüft, dass eine exportierte Vorlage auf einem anderen Rechner mit Anzeigename, Thema, Style-Namen und Legendenauswahl ankommt. | grün | nie geprüft |
| `TestExportImport.test_export_einer_fehlenden_vorlage` | Prüft, dass der Export einer nicht vorhandenen Vorlage als ValueError gemeldet wird und keine Datei entsteht. | grün | nie geprüft |
| `TestExportImport.test_import_einer_reinen_qml_datei` | Prüft, dass eine QML-Datei ohne Begleitdatei mit dem Dateinamen als Namensvorschlag und ohne Thema übernommen wird. | grün | nie geprüft |
| `TestExportImport.test_import_lehnt_ungeeignete_dateien_ab` | Prüft, dass Dateien ohne QGIS-Stil und ZIP-Dateien ohne genau eine QML-Datei abgelehnt werden, ohne etwas anzulegen. | grün | nie geprüft |
| `TestExportImport.test_import_uebernimmt_nur_bekannte_begleitdaten` | Prüft, dass ein Import unbekannte oder falsch typisierte Angaben der Begleitdatei verwirft und den gewählten Namen nutzt. | grün | nie geprüft |
| `TestExportImport.test_thema_der_vorlage_passt_nicht_zum_layer` | Prüft, dass ein abweichendes Thema der Vorlage gemeldet wird und ohne Thema in Vorlage oder Layer keine Meldung kommt. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_basemap_themen.py`
Worum es in der Datei geht: Tests für modules/basemap_themen.py und den Abschnitt „Basemap-Layer“ im Basemap-Bereich (Basis #100):
Testgruppen:
- `TestQuelleUndThema` (4 Testfälle): Layerquelle der Themen, Thema eines Layers und Erkennung über die Kachel-URL.
- `TestPruefwert` (3 Testfälle): Prüfwert der Darstellung und Änderungsstand für ungespeicherte Änderungen.
- `TestLayerUndThemenwechsel` (7 Testfälle): Basemap-Layer anlegen, in den Layerbaum einfügen und Thema wechseln.
- `TestStilvorlageMitThema` (1 Testfälle): Stilvorlagen vermerken das Thema des Layers.
- `TestAuswahlDialog` (1 Testfälle): Rückfrage mit frei benannten Knöpfen.
- `TestBasemapHinzufuegen` (5 Testfälle): Knopf „Basemap hinzufügen“ mit Rückfrage bei vorhandenem Layer gleicher Quelle.
- `TestThemaWechseln` (8 Testfälle): Themenauswahl mit Rückfrage bei geänderter oder unbekannter Darstellung.
- `TestZielLayer` (1 Testfälle): Auswahl des Basemap-Layers, auf den Thema und Stil wirken.
| Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- |
| `TestQuelleUndThema.test_quelle_enthaelt_kachel_url_und_style_des_themas` | Prüft, dass die Layerquelle eines Themas die gemeinsame Kachel-URL und die Style-JSON des Themas enthält. | grün | nie geprüft |
| `TestQuelleUndThema.test_unbekannte_style_json_ergibt_kein_thema` | Prüft, dass ein Layer mit fremder oder fehlender Style-JSON keinem Thema zugeordnet wird. | grün | nie geprüft |
| `TestQuelleUndThema.test_unbekannter_schluessel_faellt_auf_farbe_zurueck` | Prüft, dass ein unbekannter Themenschlüssel auf das Standardthema „Farbe“ zurückfällt. | grün | nie geprüft |
| `TestQuelleUndThema.test_vorhandener_layer_wird_an_der_quell_url_erkannt` | Prüft, dass ein vorhandener Basemap-Layer an der Kachel-URL erkannt wird – unabhängig von Name, Thema und URL-Kodierung. | grün | nie geprüft |
| `TestPruefwert.test_gleiche_darstellung_gleicher_pruefwert_auch_bei_anderer_qgis_version` | Prüft, dass dieselbe Darstellung denselben Prüfwert ergibt, auch wenn die QGIS-Version in der QML abweicht. | grün | nie geprüft |
| `TestPruefwert.test_ohne_ausgabe_der_darstellung_kein_pruefwert` | Prüft, dass kein Prüfwert entsteht, wenn der Layer seine Darstellung nicht ausgeben kann. | grün | nie geprüft |
| `TestPruefwert.test_aenderungsstand_unbekannt_unveraendert_geaendert` | Prüft, dass der Änderungsstand ohne gemerkten Prüfwert „unbekannt“ ist, nach dem Merken „unverändert“ und nach einer Änderung „geändert“. | grün | nie geprüft |
| `TestLayerUndThemenwechsel.test_neuer_layer_hat_thema_namen_und_gemerkten_stand` | Prüft, dass ein neuer Basemap-Layer im gewählten Thema entsteht, den Themenstil lädt und als unverändert gilt. | grün | nie geprüft |
| `TestLayerUndThemenwechsel.test_ungueltiger_layer_oder_fehlender_themenstil_meldet_fehler` | Prüft, dass ein ungültiger Layer oder ein nicht ladbarer Themenstil als ValueError gemeldet wird. | grün | nie geprüft |
| `TestLayerUndThemenwechsel.test_ohne_vektorkacheln_kein_layer` | Prüft, dass ohne Vektorkachel-Unterstützung (Mock-Modus) kein Layer erzeugt, sondern ein Fehler gemeldet wird. | grün | nie geprüft |
| `TestLayerUndThemenwechsel.test_layer_kommt_ganz_unten_in_den_layerbaum` | Prüft, dass der Basemap-Layer ohne automatische Einordnung ins Projekt kommt und unten an den Layerbaum angehängt wird. | grün | nie geprüft |
| `TestLayerUndThemenwechsel.test_themenwechsel_stellt_quelle_um_und_merkt_neuen_stand` | Prüft, dass der Themenwechsel die Style-JSON der Quelle umstellt, den Themenstil lädt, den automatischen Namen anpasst und den neuen Stand merkt. | grün | nie geprüft |
| `TestLayerUndThemenwechsel.test_themenwechsel_behaelt_eigenen_layernamen` | Prüft, dass ein vom Nutzer vergebener Layername beim Themenwechsel erhalten bleibt. | grün | nie geprüft |
| `TestLayerUndThemenwechsel.test_themenwechsel_ohne_umstellbare_quelle_meldet_fehler` | Prüft, dass ein Layer ohne setDataSource den Themenwechsel mit einem ValueError ablehnt. | grün | nie geprüft |
| `TestStilvorlageMitThema.test_stilvorlage_vermerkt_das_thema` | Prüft, dass eine gespeicherte Stilvorlage das Thema des Layers in ihrer Begleitdatei und in der Liste vermerkt. | grün | nie geprüft |
| `TestAuswahlDialog.test_mock_modus_liefert_vorbelegung` | Prüft, dass die Rückfrage mit frei benannten Knöpfen im Mock-Modus den vorbelegten Schlüssel liefert. | grün | nie geprüft |
| `TestBasemapHinzufuegen.test_ohne_vorhandenen_layer_wird_ohne_rueckfrage_hinzugefuegt` | Prüft, dass ohne Basemap-Layer gleicher Quelle sofort ein Layer im gewählten Thema hinzugefügt wird. | grün | nie geprüft |
| `TestBasemapHinzufuegen.test_vorhandener_layer_wird_in_der_rueckfrage_genannt_abbrechen` | Prüft, dass ein vorhandener Layer gleicher Quelle in der Rückfrage genannt wird und „Abbrechen“ nichts verändert. | grün | nie geprüft |
| `TestBasemapHinzufuegen.test_zusaetzlich_laden_fuegt_zweiten_layer_hinzu` | Prüft, dass „Zusätzlich laden“ einen weiteren Basemap-Layer neben dem vorhandenen hinzufügt. | grün | nie geprüft |
| `TestBasemapHinzufuegen.test_ersetzen_laedt_vorhandenen_layer_im_gewaehlten_thema` | Prüft, dass „Ersetzen“ keinen neuen Layer anlegt, sondern den vorhandenen im gewählten Thema neu lädt. | grün | nie geprüft |
| `TestBasemapHinzufuegen.test_fehler_beim_anlegen_wird_gemeldet` | Prüft, dass ein nicht erreichbarer Dienst als Warnung gemeldet und kein Layer hinzugefügt wird. | grün | nie geprüft |
| `TestThemaWechseln.test_unveraenderter_layer_wechselt_ohne_rueckfrage` | Prüft, dass ein unveränderter Basemap-Layer ohne Rückfrage auf das gewählte Thema wechselt. | grün | nie geprüft |
| `TestThemaWechseln.test_gleiches_thema_aendert_nichts` | Prüft, dass die Wahl des Themas, das der Layer schon hat, nichts neu lädt. | grün | nie geprüft |
| `TestThemaWechseln.test_geaenderte_darstellung_abbrechen_behaelt_thema` | Prüft, dass bei geänderter Darstellung nachgefragt wird und „Abbrechen“ Thema und Darstellung unverändert lässt. | grün | nie geprüft |
| `TestThemaWechseln.test_geaenderte_darstellung_verwerfen_wechselt` | Prüft, dass „Verwerfen“ die geänderte Darstellung aufgibt und das Thema wechselt. | grün | nie geprüft |
| `TestThemaWechseln.test_als_stil_speichern_sichert_vor_dem_wechsel` | Prüft, dass „Als Stil speichern“ die Darstellung vor dem Themenwechsel als Stilvorlage sichert. | grün | nie geprüft |
| `TestThemaWechseln.test_abgebrochenes_speichern_verhindert_den_wechsel` | Prüft, dass das Thema nicht wechselt, wenn „Als Stil speichern“ gewählt, die Namensabfrage aber abgebrochen wird. | grün | nie geprüft |
| `TestThemaWechseln.test_unbekannter_stand_fragt_nach` | Prüft, dass bei einem Layer ohne gemerkten Prüfwert (vor dieser Funktion geladen) vorsichtshalber nachgefragt wird. | grün | nie geprüft |
| `TestThemaWechseln.test_ohne_basemap_layer_nur_vorauswahl` | Prüft, dass die Themenwahl ohne Basemap-Layer nur als Vorauswahl für „Basemap hinzufügen“ dient und nichts meldet. | grün | nie geprüft |
| `TestZielLayer.test_ausgewaehlter_basemap_layer_hat_vorrang` | Prüft, dass der im Layerbaum ausgewählte Basemap-Layer Ziel des Themenwechsels ist, sonst der erste Basemap-Layer. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_bootstrap.py`
@@ -196,6 +454,31 @@ Testgruppen:
| `DockManagerShowTests.test_fehler_beim_entfernen_wird_als_warnung_gemeldet` | Prüft, dass ein Fehler beim Entfernen alter Docks nur gewarnt und das neue Dock trotzdem angezeigt wird. | grün | geprüft am 2026-09-21 |
| `DockManagerShowTests.test_fehler_beim_anzeigen_wird_gemeldet` | Prüft, dass ein Fehler beim Anzeigen des Docks als Fehler gemeldet wird. | grün | geprüft am 2026-09-21 |
### `Plugin_SN_Basis/tests/test_druck_kbs.py`
Worum es in der Datei geht: Tests zu Basis #99: Ist das Projekt-KBS ein anderes als das KBS des Verfahrensgebiets, müssen
Testgruppen:
- `TestTransformiereRechteck` (3 Testfälle): Umrechnung eines Rechtecks zwischen zwei KBS.
- `TestZoomAufLayer` (2 Testfälle): Zoom der Kartenansicht auf einen Layer in einem anderen KBS.
- `TestDruckKbs` (5 Testfälle): KBS der Layoutkarte und Umrechnung der Druckbereiche.
- `TestLayoutkarteImDruckKbs` (1 Testfälle): Die Layoutkarte bekommt das Druck-KBS, bevor die Ausdehnung gesetzt wird.
| Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- |
| `TestTransformiereRechteck.test_verschiedene_kbs_werden_umgerechnet` | Prüft, dass ein Rechteck bei verschiedenen KBS mit QgsCoordinateTransform von Quell- nach Ziel-KBS umgerechnet wird. | grün | nie geprüft |
| `TestTransformiereRechteck.test_gleiches_fehlendes_oder_ungueltiges_kbs_laesst_rechteck_unveraendert` | Prüft, dass bei gleichem, fehlendem oder ungültigem KBS nicht umgerechnet und das Rechteck unverändert geliefert wird. | grün | nie geprüft |
| `TestTransformiereRechteck.test_fehler_bei_der_umrechnung_liefert_das_rechteck` | Prüft, dass ein Fehler bei der Umrechnung nicht durchschlägt, sondern das ursprüngliche Rechteck zurückkommt. | grün | nie geprüft |
| `TestZoomAufLayer.test_ausdehnung_wird_ins_kbs_der_kartenansicht_umgerechnet` | Prüft, dass zoom_auf_layer die Layer-Ausdehnung vom Layer-KBS in das KBS der Kartenansicht umrechnet, bevor gezoomt wird. | grün | nie geprüft |
| `TestZoomAufLayer.test_ohne_layer_oder_kartenansicht_kein_zoom` | Prüft, dass zoom_auf_layer ohne Layer oder ohne Kartenansicht nichts tut und False liefert. | grün | nie geprüft |
| `TestDruckKbs.test_druck_kbs_ist_das_kbs_des_verfahrensgebiets` | Prüft, dass die Layoutkarte im KBS des Verfahrensgebiet-Layers steht und ohne Verfahrensgebiet das Projekt-KBS gilt. | grün | nie geprüft |
| `TestDruckKbs.test_kartenfenster_wird_vom_kbs_der_kartenansicht_umgerechnet` | Prüft, dass der Druckbereich „wie Kartenfenster“ vom KBS der Kartenansicht in das Druck-KBS umgerechnet wird. | grün | nie geprüft |
| `TestDruckKbs.test_auswahl_wird_vor_dem_puffern_vom_layer_kbs_umgerechnet` | Prüft, dass der Druckbereich „Auswahl“ aus dem KBS des Auswahl-Layers umgerechnet und erst danach gepuffert wird. | grün | nie geprüft |
| `TestDruckKbs.test_ohne_druck_kbs_wird_nicht_umgerechnet` | Prüft, dass _resolve_extent ohne Druck-KBS wie bisher nicht umrechnet (Aufrufe ohne den neuen Parameter). | grün | nie geprüft |
| `TestDruckKbs.test_druckrechteck_wird_ins_kbs_seines_layers_umgerechnet` | Prüft, dass ein in der Kartenansicht gezeichnetes Druckrechteck vor dem Speichern in das KBS des Druckrechteck-Layers umgerechnet wird. | grün | nie geprüft |
| `TestLayoutkarteImDruckKbs.test_hauptkarte_bekommt_das_kbs_vor_der_ausdehnung` | Prüft, dass die Hauptkarte eines neuen Layouts das Druck-KBS erhält, bevor ihre Ausdehnung gesetzt wird. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_excel_importer.py`
Worum es in der Datei geht: Tests für sn_basis/modules/excel_importer.py (Excel-Import für Linklisten, Issue #63).
@@ -438,6 +721,35 @@ Testgruppen:
| `IsCaseSensitiveFsTests.test_macos_ist_nicht_case_sensitiv` | Prüft, dass macOS als nicht case-sensitives Dateisystem gilt. | grün | geprüft am 2026-09-29 |
| `IsCaseSensitiveFsTests.test_linux_ist_case_sensitiv` | Prüft, dass Linux als case-sensitives Dateisystem gilt. | grün | geprüft am 2026-09-29 |
### `Plugin_SN_Basis/tests/test_print_kartenrand.py`
Worum es in der Datei geht: Tests für modules/print_kartenrand.py – Anordnung des Kartenrands neben der Karte (Basis #93).
Testgruppen:
- `TestBerechneAnordnung` (5 Testfälle): — (Docstring fehlt)
- `TestOrdneKartenrandAn` (5 Testfälle): — (Docstring fehlt)
- `TestMindestbreiteBeimLaden` (3 Testfälle): — (Docstring fehlt)
- `TestAnbindungPrintLayout` (2 Testfälle): — (Docstring fehlt)
| Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- |
| `TestBerechneAnordnung.test_passt_einspaltig_nichts_aendert_sich` | Prüft, dass bei genug Platz neben der Karte einspaltig angeordnet wird und Seite und Kartenschild bleiben. | grün | nie geprüft |
| `TestBerechneAnordnung.test_mehr_spalten_und_breiterer_rand` | Prüft, dass bei zu hohen Legenden die kleinste passende Spaltenzahl gewählt und der Kartenrand dafür verbreitert wird. | grün | nie geprüft |
| `TestBerechneAnordnung.test_seite_wird_hoeher_wenn_auch_drei_spalten_nicht_reichen` | Prüft, dass die Seite höher wird und Quellenangabe und Kartenschild nach unten rutschen, wenn auch drei Spalten nicht reichen. | grün | nie geprüft |
| `TestBerechneAnordnung.test_seite_wird_nie_kleiner` | Prüft, dass Seitenbreite und -höhe nie unter die ursprüngliche Seitengröße fallen. | grün | nie geprüft |
| `TestBerechneAnordnung.test_ohne_legenden_nur_kartenschild` | Prüft, dass ohne Legenden nur Quellenangabe und Kartenschild zählen und die Seite bei zu niedriger Karte höher wird. | grün | nie geprüft |
| `TestOrdneKartenrandAn.test_seite_hoeher_und_kartenschild_verschoben` | Prüft, dass bei zu niedriger Karte die Legende dreispaltig wird, die Seite wächst und Quellenangabe und Kartenschild um denselben Betrag nach unten rutschen. | grün | nie geprüft |
| `TestOrdneKartenrandAn.test_spalten_ungleich_breit_und_text_umgebrochen` | Prüft, dass die Legenden ungleich breite Spalten und einen automatischen Textumbruch bekommen, damit mehrspaltige Legenden nicht unnötig breit werden (#96). | grün | nie geprüft |
| `TestOrdneKartenrandAn.test_legenden_mindestens_so_breit_wie_kartenschild` | Prüft, dass die Legenden die Breite des Kartenschilds als Mindestbreite bekommen und das Layout sie für das Neuladen vermerkt. | grün | nie geprüft |
| `TestOrdneKartenrandAn.test_passt_nichts_wird_verschoben` | Prüft, dass bei ausreichend hoher Karte weder Seite noch Kartenschild verändert werden. | grün | nie geprüft |
| `TestOrdneKartenrandAn.test_ohne_karte_keine_anordnung` | Prüft, dass ein Layout ohne Hauptkarte unverändert bleibt. | grün | nie geprüft |
| `TestMindestbreiteBeimLaden.test_mindestbreite_nur_fuer_vermerkte_layouts` | Prüft, dass beim Laden die Mindestbreite nur an Layouts mit Vermerk wieder gesetzt wird. | grün | nie geprüft |
| `TestMindestbreiteBeimLaden.test_listener_verbinden_und_trennen` | Prüft, dass der Listener readProject einmal verbindet, beim Trennen wieder löst und beides mehrfach aufgerufen werden darf. | grün | nie geprüft |
| `TestMindestbreiteBeimLaden.test_ohne_qgis_kein_listener` | Prüft, dass im Mock-Modus kein Listener verbunden wird. | grün | nie geprüft |
| `TestAnbindungPrintLayout.test_vorlage_ordnet_kartenrand_an` | Prüft, dass PrintLayout beim Anlegen einer Vorlage den Kartenrand anordnen lässt. | grün | nie geprüft |
| `TestAnbindungPrintLayout.test_fehler_bei_der_anordnung_verhindert_die_vorlage_nicht` | Prüft, dass ein Fehler bei der Anordnung nur als Warnung gemeldet wird und keine Ausnahme durchreicht. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_print_layout.py`
Worum es in der Datei geht: — (Docstring fehlt)
@@ -1451,7 +1763,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 365 Testfällen ohne Beschreibung
### `sn_basis` – 0 von 526 Testfällen ohne Beschreibung
Keine Lücken.
@@ -1657,36 +1969,98 @@ 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` – 70 von 229 (31 %) ohne Testbezug (0 ungeklärt, 70 beabsichtigt)
### `sn_basis` – 126 von 393 (32 %) ohne Testbezug (61 ungeklärt, 65 beabsichtigt)
#### `functions/dialog_wrapper.py` (9)
- `show_info_dialog` (Zeile 42) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `ask_detailpruefung_oder_vg_laden` (Zeile 192) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `ask_detailpruefung_oder_abbrechen` (Zeile 244) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `ProgressDialog.set_total` (Zeile 339) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `ProgressDialog.set_value` (Zeile 348) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `ProgressDialog.set_label` (Zeile 361) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `ProgressDialog.is_canceled` (Zeile 371) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `ProgressDialog.raise_to_front` (Zeile 389) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `create_progress_dialog` (Zeile 408) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `ask_detailpruefung_oder_vg_laden` (Zeile 241) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `ask_detailpruefung_oder_abbrechen` (Zeile 293) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `ProgressDialog.set_total` (Zeile 388) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `ProgressDialog.set_value` (Zeile 397) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `ProgressDialog.set_label` (Zeile 410) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `ProgressDialog.is_canceled` (Zeile 420) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `ProgressDialog.raise_to_front` (Zeile 438) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `create_progress_dialog` (Zeile 457) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
#### `functions/os_wrapper.py` (5)
#### `functions/os_wrapper.py` (4)
- `normalize_path` (Zeile 43) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `get_home_dir` (Zeile 55) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `is_absolute_path` (Zeile 64) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `basename` (Zeile 75) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `path_suffix` (Zeile 106) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
#### `functions/qgiscore_wrapper.py` (2)
- `_crs_kennung` (Zeile 1259) — ungeklärt
- `_crs_gueltig` (Zeile 1267) — ungeklärt
#### `functions/qgisui_wrapper.py` (1)
- `add_toolbar` (Zeile 204) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
#### `functions/qt_wrapper.py` (2)
- `exec_dialog` (Zeile 60) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `debug_qt_status` (Zeile 67) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `exec_dialog` (Zeile 64) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `debug_qt_status` (Zeile 71) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
#### `modules/basemap_kacheln.py` (4)
- `_aufruf` (Zeile 28) — ungeklärt
- `_enum_int` (Zeile 61) — ungeklärt
- `qgis_filterpruefer` (Zeile 101) — ungeklärt
- `_objekt_schluessel` (Zeile 122) — ungeklärt
#### `modules/basemap_katalog.py` (6)
- `_sammle_bedingungen` (Zeile 138) — ungeklärt
- `_slug` (Zeile 177) — ungeklärt
- `_bezeichnung_aus_id` (Zeile 184) — ungeklärt
- `_bezeichnung` (Zeile 202) — ungeklärt
- `eintrags_schluessel` (Zeile 216) — ungeklärt
- `_ist_grundvariante` (Zeile 235) — ungeklärt
#### `modules/basemap_legende.py` (4)
- `Katalog.eintrag_fuer` (Zeile 112) — ungeklärt
- `Katalog.sortierschluessel` (Zeile 115) — ungeklärt
- `_aufruf` (Zeile 267) — ungeklärt
- `finde_basemap_layer` (Zeile 311) — ungeklärt
#### `modules/basemap_legende_layout.py` (10)
- `_enum_int` (Zeile 79) — ungeklärt
- `_aufruf` (Zeile 86) — ungeklärt
- `friere_zoom_ein` (Zeile 131) — ungeklärt
- `baue_symbole` (Zeile 176) — ungeklärt
- `_ist_unsichtbar` (Zeile 199) — ungeklärt
- `_rgba` (Zeile 222) — ungeklärt
- `_ebenen_beschreiben` (Zeile 226) — ungeklärt
- `vorschau_icon` (Zeile 259) — ungeklärt
- `_rechteck_mm` (Zeile 316) — ungeklärt
- `_layout_messung` (Zeile 341) — ungeklärt
#### `modules/basemap_stilkorrektur.py` (2)
- `_ist_null` (Zeile 28) — ungeklärt
- `_korrigiere_symbol` (Zeile 50) — ungeklärt
#### `modules/basemap_stilvorlagen.py` (6)
- `standard_ordner` (Zeile 47) — ungeklärt
- `_stilnamen` (Zeile 58) — ungeklärt
- `lies_importdatei` (Zeile 65) — ungeklärt
- `BasemapStilvorlagen._pfade` (Zeile 113) — ungeklärt
- `BasemapStilvorlagen._metadaten` (Zeile 117) — ungeklärt
- `BasemapStilvorlagen.dateiname` (Zeile 127) — ungeklärt
#### `modules/basemap_themen.py` (5)
- `_aufruf` (Zeile 62) — ungeklärt
- `_erfolg` (Zeile 72) — ungeklärt
- `_parameter` (Zeile 101) — ungeklärt
- `_normiert` (Zeile 106) — ungeklärt
- `_lade_themenstil` (Zeile 183) — ungeklärt
#### `modules/DataGrabber.py` (3)
@@ -1705,6 +2079,16 @@ Heuristik, kein Beweis: Diese Funktionen und Methoden kommen unter ihrem Namen i
- `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_kartenrand.py` (7)
- `_aufruf` (Zeile 119) — ungeklärt
- `_rechteck` (Zeile 134) — ungeklärt
- `_legende_groesse` (Zeile 139) — ungeklärt
- `_rendere_legenden` (Zeile 149) — ungeklärt
- `setze_legenden_mindestbreite` (Zeile 156) — ungeklärt
- `_on_projekt_gelesen` (Zeile 203) — ungeklärt
- `_verschiebe` (Zeile 234) — ungeklärt
#### `modules/print_layout.py` (11)
- `PrintLayout._create_map_item` (Zeile 98) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
@@ -1722,31 +2106,27 @@ Heuristik, kein Beweis: Diese Funktionen und Methoden kommen unter ihrem Namen i
#### `modules/print_layout_baufreigabe.py` (3)
- `PrintLayoutBaufreigabe.create_baufreigabe_layout` (Zeile 90) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLayoutBaufreigabe._setup_layout_objects_baufreigabe` (Zeile 264) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLayoutBaufreigabe._calc_atlas_margin_percent` (Zeile 398) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLayoutBaufreigabe._setup_layout_objects_baufreigabe` (Zeile 274) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLayoutBaufreigabe._calc_atlas_margin_percent` (Zeile 408) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
#### `modules/print_logic.py` (20)
#### `modules/print_logic.py` (16)
- `PrintLogic._failed_result` (Zeile 123) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._show_target_size_too_small` (Zeile 127) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._is_enabled_flag` (Zeile 135) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._resolve_layer_from_project` (Zeile 141) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._resolve_active_layer` (Zeile 162) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._get_druckpuffer_cm` (Zeile 172) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._get_druckpuffer_m` (Zeile 181) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._import_qgis_symbol` (Zeile 185) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._build_rectangle` (Zeile 193) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._clone_extent` (Zeile 203) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._get_existing_layer_by_name` (Zeile 270) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._create_druckrechteck_layer` (Zeile 284) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._clear_layer_features` (Zeile 313) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic.configure_atlas_for_baufreigabe_layout` (Zeile 483) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._store_druckrechteck` (Zeile 631) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic.activate_druckrechteck_capture` (Zeile 680) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._resolve_selection_layer` (Zeile 811) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._get_selected_extent` (Zeile 825) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `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
- `PrintLogic._failed_result` (Zeile 125) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._show_target_size_too_small` (Zeile 129) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._is_enabled_flag` (Zeile 137) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._resolve_layer_from_project` (Zeile 143) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._resolve_active_layer` (Zeile 164) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._get_druckpuffer_cm` (Zeile 174) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._get_druckpuffer_m` (Zeile 183) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._build_rectangle` (Zeile 195) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._clone_extent` (Zeile 205) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._get_existing_layer_by_name` (Zeile 272) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._create_druckrechteck_layer` (Zeile 286) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic.configure_atlas_for_baufreigabe_layout` (Zeile 485) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic.activate_druckrechteck_capture` (Zeile 689) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._layer_crs` (Zeile 943) — ungeklärt
- `PrintLogic._get_plot_dimensions_mm` (Zeile 1134) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
- `PrintLogic._get_required_map_dimensions_mm` (Zeile 1144) — **beabsichtigt:** Test ausgesetzt, zunächst Refactor
#### `modules/Pruefmanager.py` (4)
@@ -1755,15 +2135,36 @@ Heuristik, kein Beweis: Diese Funktionen und Methoden kommen unter ihrem Namen i
- `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/base_dockwidget.py` (2)
- `_inhalt` (Zeile 23) — ungeklärt
- `tabs_mit_scrollbereich` (Zeile 30) — ungeklärt
#### `ui/tabs/print_tab.py` (7)
- `PrintTab._build_ui` (Zeile 115) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `PrintTab._on_kartenname_changed` (Zeile 335) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `PrintTab._on_massstab_changed` (Zeile 349) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `PrintTab._on_zielgroesse_changed` (Zeile 361) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `PrintTab._on_formfaktor_changed` (Zeile 367) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `PrintTab._on_druckbereich_changed` (Zeile 374) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `PrintTab._format_druckpuffer_label` (Zeile 432) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `PrintTab._build_ui` (Zeile 116) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `PrintTab._on_kartenname_changed` (Zeile 340) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `PrintTab._on_massstab_changed` (Zeile 354) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `PrintTab._on_zielgroesse_changed` (Zeile 366) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `PrintTab._on_formfaktor_changed` (Zeile 372) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `PrintTab._on_druckbereich_changed` (Zeile 379) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
- `PrintTab._format_druckpuffer_label` (Zeile 437) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026
#### `ui/widgets/basemap_bereich.py` (13)
- `BasemapBereich._build_ui` (Zeile 61) — **beabsichtigt:** von Test abgesehen, weil reiner Widget-Aufbau; im QGIS-Test geprüft
- `BasemapBereich._ueberschrift` (Zeile 164) — ungeklärt
- `BasemapBereich._vorlagen` (Zeile 174) — ungeklärt
- `BasemapBereich._gewaehltes_thema` (Zeile 195) — ungeklärt
- `BasemapBereich._zeige_thema` (Zeile 198) — ungeklärt
- `BasemapBereich._umschalten` (Zeile 207) — ungeklärt
- `BasemapBereich._aenderungen_klaeren` (Zeile 241) — ungeklärt
- `BasemapBereich._ersetzen` (Zeile 298) — ungeklärt
- `BasemapBereich._on_erzeugen_geaendert` (Zeile 336) — ungeklärt
- `BasemapBereich._gewaehlte_vorlage` (Zeile 370) — ungeklärt
- `BasemapBereich._on_stil_standard` (Zeile 435) — ungeklärt
- `BasemapBereich._on_stil_loeschen` (Zeile 446) — ungeklärt
- `_thema_text` (Zeile 500) — ungeklärt
### `sn_verfahrensgebiet` – 51 von 161 (32 %) ohne Testbezug (51 ungeklärt, 0 beabsichtigt)
@@ -0,0 +1,93 @@
# Testkonzept: Anzeige für den Eigentümer und Korrekturen
Plugin: `sn_verfahrensgebiet` · Stand: 06.10.2026 · Pflege: bei jeder Änderung an diesem Ablauf
## Worum es fachlich geht
Im Termin sitzt der Eigentümer vor einem zweiten Bildschirm. Dort sieht er nur seine eigenen gespeicherten Daten:
Name, Anschrift und E-Mail. Den QGIS-Bildschirm mit Trefferliste, Konten und anderen Personen sieht er nicht.
Die Sachbearbeitung beginnt zu Beginn der Termine eine Sitzung und schiebt das Anzeigefenster auf den Bildschirm des Eigentümers; beim nächsten Mal erscheint es wieder dort. Für jeden Eigentümer wählt sie in der Trefferliste
die passenden Einträge und zeigt sie an. Stimmt etwas nicht, korrigiert sie es im Plugin. Der Eigentümer sieht die
Korrektur sofort. Vor dem nächsten Eigentümer leert sie die Anzeige, ohne das Fenster zu schließen. Am Ende beendet
sie die Sitzung.
Die Eigentümerdatei selbst wird nie verändert. Jede Korrektur landet als eigene Zeile in einer Korrektur-CSV neben
der Eigentümerdatei und kann später in das Fachverfahren übernommen werden.
Die Suche bis zur Trefferliste beschreibt [`verfahrensgebiet-eigentuemersuche.md`](verfahrensgebiet-eigentuemersuche.md).
## Der Ablauf
```mermaid
flowchart TD
A["1 Sitzung beginnen"] --> B["2 Anzeigefenster öffnet leer, mit Rahmen;<br/>Bearbeiter schiebt es auf den zweiten Bildschirm"]
T["Trefferliste: Einträge wählen,<br/>„Daten anzeigen“"] --> C{"Sitzung läuft?"}
C -->|nein| A
C -->|ja| D["3 Eigentümer sieht Name,<br/>Anschrift, E-Mail"]
B --> D
D --> E{"4 Daten richtig?"}
E -->|nein| F["5 Korrigieren: Änderung<br/>in Korrektur-CSV, sofort angezeigt"]
F --> E
E -->|ja| G["6 Anzeige leeren<br/>(Fenster bleibt offen)"]
G --> T
G --> H["7 Sitzung beenden:<br/>Fenster schließt"]
style G fill:#e9f5e9,stroke:#2b8a3e
```
## Was geprüft wird
Die Tests liegen in `Plugin_SN_Verfahrensgebiet/tests/test_eigentuemer_anzeige.py` (Anzeigetext, Fenster öffnen),
`tests/test_eigentuemer_korrektur.py` (Korrekturlogik, Korrektur-CSV) und `tests/test_eigentuemer_tab.py`
(Sitzung, Korrektur im Tab).
| # | Schritt | Wird geprüft durch | Ebene |
|---|---|---|---|
| 2 | Sitzung beginnen: leeres Fenster mit Rahmen, nie Vollbild | `test_sitzung_beginnen_oeffnet_leeres_fenster_mit_rahmen`, `test_normales_fenster_in_standardgroesse` | Mock |
| 2 | Lage des Fensters gilt für die nächste Sitzung | `test_lage_gilt_fuer_naechste_sitzung`, `test_gemerkte_lage_wird_wiederhergestellt`, `test_unbrauchbare_lage_ergibt_standardgroesse` | Mock |
| 3 | „Daten anzeigen“ beginnt bei Bedarf die Sitzung | `test_daten_anzeigen_beginnt_sitzung_bei_bedarf`, `test_daten_anzeigen_gibt_auswahl_weiter` | Mock |
| 3 | Ohne Auswahl nur ein Hinweis | `test_daten_anzeigen_ohne_auswahl` | Mock |
| 3 | Inhalt: Name, Anschrift, E-Mail; mehrere Einträge | `test_name_anschrift_email`, `test_mehrere_eintraege_getrennt` | Mock |
| 3 | Keine internen Angaben für den Eigentümer | `test_keine_internen_angaben` | Mock |
| 3 | Fehlende E-Mail ausdrücklich nennen | `test_fehlende_email_wird_genannt` | Mock |
| 5 | Nur echte Änderungen, Leeren zählt | `test_nur_echte_aenderungen`, `test_feld_leeren_ist_aenderung`, `test_feldwerte` | Mock |
| 5 | Korrektur festhalten und sofort anzeigen | `test_korrektur_wird_festgehalten_und_angezeigt`, `test_wende_an` | Mock |
| 5 | Unverändert oder abgebrochen: nichts schreiben | `test_ohne_aenderung_nichts_schreiben`, `test_abbruch_nichts_schreiben` | Mock |
| 5 | Korrektur-CSV: Kopfzeile, BOM, anhängen | `test_neue_datei_mit_kopfzeile_und_bom`, `test_anhaengen_ohne_zweite_kopfzeile`, `test_ohne_aenderung_keine_datei` | Mock |
| 5 | Pfad neben der Eigentümerdatei, sonst Rückfrage | `test_textdatei_provider`, `test_ogr_provider`, `test_keine_csv`, `test_vorschlag_neben_der_eigentuemerdatei`, `test_ohne_csv_quelle_wird_gefragt` | Mock |
| 5 | Schreibfehler | `test_schreibfehler_wird_weitergereicht`, `test_schreibfehler_warnung_und_anzeige_unveraendert` | Mock |
| 5 | Ohne Anzeige keine Korrektur | `test_ohne_anzeige_keine_korrektur` | Mock |
| 5 | Pfad der Korrektur-Datei unter den Knöpfen | `test_ohne_eigentuemerdatei`, `test_pfad_neben_der_eigentuemerdatei`, `test_ohne_csv_quelle_wird_abgefragt`, `test_gewaehlter_pfad_wird_angezeigt` | Mock |
| 6 | Anzeige leeren, Fenster bleibt offen | `test_anzeige_leeren_laesst_fenster_offen`, `test_leer_nur_platzhalter` | Mock |
| 7 | Sitzung beenden bzw. Fenster von außen geschlossen | `test_sitzung_beenden_schliesst_fenster`, `test_von_aussen_geschlossen_beendet_sitzung` | Mock |
| — | Keine Personendaten auf der Konsole | `test_schreibt_nichts_auf_die_konsole` | Mock |
| — | Sieht das in QGIS richtig aus, auf zwei Bildschirmen? | manueller Test | manuell |
Ebene: `Mock` (ohne QGIS, Sekunden) · `QGIS` (gegen echtes QGIS) · `manuell` (Mensch in QGIS).
## Fachliche Sonderfälle
| Sonderfall | Kommt vor bei | Wird geprüft durch |
|---|---|---|
| Nur ein Bildschirm (Notebook) | Termin ohne zweiten Monitor, Ausprobieren | `test_normales_fenster_in_standardgroesse` (immer mit Rahmen, verdeckt QGIS nie ausweglos) |
| Eheleute oder Miteigentümer erscheinen gemeinsam | mehrere Einträge auf einmal anzeigen und einzeln korrigieren | `test_mehrere_eintraege_getrennt`, `test_korrektur_wird_festgehalten_und_angezeigt` |
| Eigentümer hat keine E-Mail hinterlegt | häufig; soll beim Termin ergänzt werden | `test_fehlende_email_wird_genannt` |
| Neue Anschrift mit Komma („Am Anger 3, Haus B“) | Zusatz zur Hausnummer | `test_neue_datei_mit_kopfzeile_und_bom` |
| Eigentümerdatei liegt in einem schreibgeschützten Ordner | Export auf einem Netzlaufwerk ohne Schreibrecht | `test_ohne_csv_quelle_wird_gefragt` (Rückfrage), `test_schreibfehler_warnung_und_anzeige_unveraendert` |
| Sonderzeichen oder spitze Klammern in den Daten | Firmennamen | `test_werte_werden_maskiert` |
## Bewusst nicht getestet
| Was | Warum | Wie stattdessen abgesichert |
|---|---|---|
| Wiederherstellen der Lage auf dem zweiten Bildschirm | braucht echte Bildschirme; im Mock-Modus gibt es keine | Aufruf mit Attrappe geprüft, manueller Test mit zwei Bildschirmen |
| Korrekturdialog mit echten Eingabefeldern | im Mock-Modus gibt es keine Widgets; die Vorbelegung (`feldwerte`) und die Auswertung sind als reine Funktionen getestet | manueller Test |
| Schriftgröße und Lesbarkeit der Anzeige | Geschmack und Bildschirmgröße | manueller Test im Termin |
## Bekannte Lücken
| Lücke | Auswirkung | Issue |
|---|---|---|
| Wiederherstellen der Lage in der nächsten Sitzung ist in QGIS noch nicht bestätigt | Das Fenster erscheint dann wieder auf dem Hauptbildschirm und muss erneut verschoben werden – lästig, aber gefahrlos | Verfahrensgebiet #56 |
| Die Lage wird nur bis zum Neustart von QGIS gemerkt | nach jedem Start einmal verschieben | bei Bedarf eigenes Issue (QSettings) |
| Eine neue Suche leert die Anzeige nicht von selbst | Wer „Anzeige leeren“ vergisst, zeigt dem nächsten Eigentümer noch die vorherigen Daten | bewusst so (Bearbeiter entscheidet); bei Bedarf eigenes Issue |
@@ -0,0 +1,88 @@
# Testkonzept: Eigentümersuche im Tab „Eigentümer“
Plugin: `sn_verfahrensgebiet` · Stand: 06.10.2026 · Pflege: bei jeder Änderung an diesem Ablauf
## Worum es fachlich geht
Im Termin mit Eigentümern gleicht die Sachbearbeitung die gespeicherten Personendaten ab: Name, Anschrift und
E-Mail. Grundlage ist der Serienbriefexport als CSV-Datei, den die Sachbearbeitung von Hand ins Projekt lädt.
Sie sucht nach Name und/oder Vorname. Die Trefferliste fasst Einträge derselben Person mit derselben Anschrift
zusammen, denn im Export steht eine Person für jedes Eigentumskonto einmal. Dieselbe Person mit einer anderen
Anschrift bleibt ein eigener Eintrag. Damit fällt eine abweichende Anschrift sofort auf. Verstorbene und
Rechtspersonen sind in der Liste gekennzeichnet:
verstorben als Hinweis (`PER_VERSTORBEN` = 1), die Art der Person als Rohwert von `PER_RECHTSPERSON`
(0, 1, 5 oder 9; die Bedeutung der Werte wird später entschlüsselt).
Die Trefferliste sieht nur die Sachbearbeitung. Wie die gewählten Einträge dem Eigentümer angezeigt und korrigiert
werden, beschreibt [`verfahrensgebiet-eigentuemer-anzeige.md`](verfahrensgebiet-eigentuemer-anzeige.md).
## Der Ablauf
```mermaid
flowchart TD
A["1 Anwender lädt den Serienbriefexport<br/>als CSV-Layer ins Projekt"] --> B["2 Eigentümerdatei wählen<br/>(nur Layer mit Nachname und Vorname)"]
B --> C{"3 Eigentümerdatei<br/>gewählt?"}
C -->|nein| D["Hinweis: CSV laden und wählen"]
C -->|ja| E{"4 Name oder Vorname<br/>eingegeben?"}
E -->|nein| F["Hinweis: Namen eingeben"]
E -->|ja| G["5 Einträge suchen<br/>(Teilwort, Groß-/Kleinschreibung<br/>und Umlaute egal)"]
G --> H["6 Gleiche Person mit gleicher<br/>Anschrift zusammenfassen"]
H --> I{"7 Treffer?"}
I -->|nein| J["Hinweis: keine Einträge<br/>(ohne den Namen zu wiederholen)"]
I -->|ja| K["8 Trefferliste mit Anschrift, E-Mail,<br/>Rechtsperson-Wert, verstorben;<br/>Mehrfachauswahl"]
style D fill:#fff4e6,stroke:#d9822b
style F fill:#fff4e6,stroke:#d9822b
```
## Was geprüft wird
Die Tests liegen in `Plugin_SN_Verfahrensgebiet/tests/test_eigentuemer_suche.py` (Suchlogik),
`tests/test_eigentuemer_tab.py` (Bedienung, Trefferliste) und `tests/test_verfahrensgebiet_dialoge.py`
(gemeinsame Auswahltabelle).
| # | Schritt | Wird geprüft durch | Ebene |
|---|---|---|---|
| 2 | Nur Layer mit Nachname und Vorname, auch mit BOM oder anderer Schreibweise | `test_layer_mit_name_und_vorname_ist_eigentuemerlayer`, `test_eigentuemerlayer_im_projekt` | Mock |
| 3 | Keine Eigentümerdatei gewählt | `test_ohne_eigentuemerdatei_warnung` | Mock |
| 3 | Layer ohne die nötigen Spalten | `test_layer_ohne_pflichtspalten` | Mock |
| 4 | Ohne Eingabe keine Komplettliste | `test_ohne_eingabe_fehler`, `test_suchfehler_als_warnung` | Mock |
| 5 | Teilwort, Groß-/Kleinschreibung | `test_teilstring_ohne_gross_kleinschreibung` | Mock |
| 5 | Umlaute und ß | `test_umlaute_und_eszett` | Mock |
| 6 | Zusammenfassen, Konten und E-Mails sammeln | `test_gleiche_person_gleiche_anschrift_zusammengefasst` | Mock |
| 6 | Andere Anschrift bleibt eigener Eintrag | `test_andere_anschrift_eigener_treffer` | Mock |
| 7 | Kein Treffer, Meldung ohne Namen | `test_kein_treffer_ohne_namen_in_meldung` | Mock |
| 8 | Trefferliste öffnen, alte ersetzen | `test_treffer_oeffnen_trefferliste_und_ersetzen_die_alte` | Mock |
| 8 | Spalten der Trefferliste, Kennzeichen | `test_trefferzeile_mit_hinweis`, `test_kennzeichen_verstorben`, `test_rechtsperson_als_rohwert` | Mock |
| 8 | Ausgewählte Einträge, auch nach Umsortieren | `test_ausgewaehlte_eigentuemer`, `test_auswahl_nach_umsortieren` | Mock |
| 8 | Suchfeld in der Trefferliste | `test_suchfilter_ueber_alle_spalten` | Mock |
| — | Keine Personendaten auf der Konsole | `test_suche_gibt_nichts_aus` | Mock |
| — | Sieht das in QGIS richtig aus? | manueller Test | manuell |
Ebene: `Mock` (ohne QGIS, Sekunden) · `QGIS` (gegen echtes QGIS) · `manuell` (Mensch in QGIS).
## Fachliche Sonderfälle
| Sonderfall | Kommt vor bei | Wird geprüft durch |
|---|---|---|
| Eine Person mit mehreren Eigentumskonten | Regelfall im Serienbriefexport | `test_gleiche_person_gleiche_anschrift_zusammengefasst` |
| Schreibweise weicht ab (Groß-/Kleinschreibung, Leerzeichen) | Handeingaben über Jahre | `test_gleiche_person_gleiche_anschrift_zusammengefasst` |
| `Müller` gesucht, `Mueller` gespeichert | ältere Datenbestände | `test_umlaute_und_eszett` |
| PLZ ohne führende Null (`1067`) | QGIS erkennt beim CSV-Laden die Spalte als Zahl | `test_plz_mit_fuehrender_null` |
| `PER_VERSTORBEN` als Text oder als Zahl gelesen | QGIS erkennt beim CSV-Laden die Spalte als Zahl | `test_kennzeichen_verstorben` |
| Eine Person mit verschiedenen `PER_RECHTSPERSON`-Werten | mehrere Konten mit unterschiedlicher Erfassung | `test_rechtsperson_als_rohwert` (Werte werden gesammelt) |
| Leere Felder bzw. QGIS-NULL | unvollständige Datensätze | `test_kennzeichen_verstorben`, `test_rechtsperson_als_rohwert` |
| Rechtsperson ohne Vornamen (z. B. Gemeinde) | Körperschaften als Eigentümer | `test_name_und_anschrift`, `test_rechtsperson_als_rohwert` |
## Bewusst nicht getestet
| Was | Warum | Wie stattdessen abgesichert |
|---|---|---|
| Aufbau von Trefferfenster und Auswahltabelle mit echten Qt-Widgets | im Mock-Modus gibt es keine Widgets; die Filter- und Zuordnungslogik ist als reine Funktion getestet | manueller Test in QGIS |
| Echter Serienbriefexport | personenbezogen, gehört nicht ins Repository | erfundene Testzeilen mit der Kopfzeile der Blanko-Vorlage aus dem Issue |
## Bekannte Lücken
| Lücke | Auswirkung | Issue |
|---|---|---|
| Der manuelle QGIS-Test steht aus, auch für den Landkreis-Dialog, dessen Tabelle jetzt aus der gemeinsamen Funktion kommt | Ein Fehler beim Herauslösen der Tabelle bliebe in beiden Dialogen unbemerkt | Verfahrensgebiet #56 |
@@ -0,0 +1,84 @@
# Testkonzept: Flurstückssuche im Tab „Eigentümer“
Plugin: `sn_verfahrensgebiet` · Stand: 06.10.2026 · Pflege: bei jeder Änderung an diesem Ablauf
## Worum es fachlich geht
Im Termin mit einem Eigentümer soll die Sachbearbeitung ein Flurstück schnell auf der Karte zeigen können.
Sie gibt Gemarkung und Flurstücksnummer ein, das Plugin wählt das Flurstück im geladenen Flurstückslayer aus
und springt dorthin. Gesucht wird nur in den Flurstücken, die vorher mit dem Verfahrensgebiet aus ALKIS geladen
wurden. So muss im Tab keine Gemarkung aus ganz Sachsen ausgewählt werden.
Die Eigentümersuche im selben Tab beschreibt [`verfahrensgebiet-eigentuemersuche.md`](verfahrensgebiet-eigentuemersuche.md).
## Der Ablauf
```mermaid
flowchart TD
A["1 Anwender gibt Gemarkung<br/>und Flurstücksnummer ein"] --> B{"2 Flurstückslayer<br/>im Projekt?"}
B -->|nein| C["Hinweis: zuerst Verfahrensgebiet<br/>und Flurstücke aus ALKIS laden"]
B -->|ja| D{"3 Flurstücksnummer lesbar?<br/>z. B. 562 oder 12/3"}
D -->|nein| E["Hinweis zur Schreibweise"]
D -->|ja| F{"4 Gemarkung als Nummer<br/>oder als Name?"}
F -->|Nummer| H["5 Flurstücke vergleichen"]
F -->|Name| G{"Gemarkungslayer geladen<br/>und Name darin?"}
G -->|nein| E2["Hinweis: Nummer eingeben<br/>oder Gemarkungen laden"]
G -->|ja| H
H --> I{"6 Treffer?"}
I -->|nein| J["Hinweis: nicht gefunden"]
I -->|ja| K["7 Treffer auswählen,<br/>hinzoomen, aufblinken"]
style C fill:#fff4e6,stroke:#d9822b
style E fill:#fff4e6,stroke:#d9822b
style E2 fill:#fff4e6,stroke:#d9822b
```
## Was geprüft wird
Die Tests liegen in `Plugin_SN_Verfahrensgebiet/tests/test_flurstueck_suche.py` (Suchlogik) und
`tests/test_eigentuemer_tab.py` (Bedienung im Tab).
| # | Schritt | Wird geprüft durch | Ebene |
|---|---|---|---|
| — | Tab erscheint nach „Bearbeitung“ | `test_tab_ist_im_dockwidget_eingetragen` | Mock |
| 2 | Kein Flurstückslayer: Suche bricht ab | `test_fehlender_flurstueckslayer_bricht_ab` | Mock |
| 2 | … und der Hinweis kommt als Dialog | `test_ohne_flurstueckslayer_erscheint_hinweisdialog` | Mock |
| 3 | Zähler und Nenner lesen, führende Nullen | `test_flurstuecksnummer_mit_und_ohne_nenner` | Mock |
| 3 | Unlesbare Nummer abweisen | `test_ungueltige_flurstuecksnummer`, `test_eingabefehler_als_warnung` | Mock |
| 4 | Gemarkungsnummer, auch ohne Nullen oder als langer Schlüssel | `test_gemarkungsnummer_aus_ziffern` | Mock |
| 4 | Gemarkungsname, auch mehrfach vorkommend | `test_gemarkungsname_ueber_gemarkungslayer` | Mock |
| 4 | Name ohne Gemarkungslayer oder unbekannt | `test_gemarkungsname_ohne_layer_oder_unbekannt` | Mock |
| 5 | Flurstückskennzeichen zerlegen | `test_kennzeichen_zerlegen` | Mock |
| 5 | Layer ohne Kennzeichenfeld | `test_layer_ohne_kennzeichenfeld` | Mock |
| 6 | Mit Nenner genau ein Treffer | `test_mit_nenner_genau_ein_treffer` | Mock |
| 6 | Ohne Nenner alle mit diesem Zähler, nur in der Gemarkung | `test_ohne_nenner_alle_mit_diesem_zaehler` | Mock |
| 6 | Kein Treffer | `test_kein_treffer` (Logik), `test_kein_treffer` (Tab) | Mock |
| 7 | Auswahl, Zoom, Aufblinken | `test_treffer_werden_ausgewaehlt_und_angezoomt` | Mock |
| 7 | Auswahl auch ohne Kartenansicht | `test_ohne_kartenansicht_bleibt_auswahl` | Mock |
| — | Sieht das in QGIS richtig aus? | manueller Test | manuell |
Ebene: `Mock` (ohne QGIS, Sekunden) · `QGIS` (gegen echtes QGIS) · `manuell` (Mensch in QGIS).
## Fachliche Sonderfälle
| Sonderfall | Kommt vor bei | Wird geprüft durch |
|---|---|---|
| Buchstaben-Nenner (`12/a`) | ältere Flurstücke | `test_mit_nenner_genau_ein_treffer`, `test_kennzeichen_zerlegen` |
| Gleichnamige Gemarkungen | verbreitete Ortsnamen in mehreren Landkreisen | `test_gemarkungsname_ueber_gemarkungslayer` |
| Gemarkungsschlüssel mit Landesnummer (`140268`) | kopiert aus anderen Programmen | `test_gemarkungsnummer_aus_ziffern` |
| Flurstücke mit leerem Kennzeichen | unvollständige Daten | `test_ohne_nenner_alle_mit_diesem_zaehler` (Feature ohne Kennzeichen wird übersprungen) |
| Im Flurstückslayer ist schon etwas ausgewählt | Verfahrensgebiet aus der Flurstücksauswahl bilden | `test_treffer_werden_ausgewaehlt_und_angezoomt`: Die Suche ersetzt die Auswahl, wie die Suchen in QGIS selbst |
## Bewusst nicht getestet
| Was | Warum | Wie stattdessen abgesichert |
|---|---|---|
| Zoomen und Aufblinken in der Kartenansicht | QGIS-Funktionen (`zoomToSelected`, `flashFeatureIds`), im Mock-Modus gibt es keine Karte | manueller Test in QGIS |
| Aussehen des Tabs | nicht sinnvoll automatisiert prüfbar | manueller Test |
| Echter Flurstückslayer aus dem ALKIS-WFS | kein Netzwerk in Tests | Aufbau des Kennzeichens in `../wissen/alkis_objektarten.md`, manueller Test |
## Bekannte Lücken
| Lücke | Auswirkung | Issue |
|---|---|---|
| Der manuelle Test in QGIS steht aus | Zoom auf sehr kleine Flurstücke und das Aufblinken sind nicht gesehen | Verfahrensgebiet #56 |