Nach #63 (die vier testlosen Kernmodule) bekommen die übrigen als „testen" eingestuften Funktionen von
sn_basis Mock-Modus-Tests: zentrale Zustandsverwaltung, Nutzerentscheidungs-Gates im Pruefmanager, das
Dateipruefer-Fundament und die restlichen reinen Fundament-Wrapper.
Betroffen
Plugin: sn_basis
Module/Dateien:
functions/verfahrensgebiet_manager.py (zentrale Verfolgung des Verfahrensgebiet-Layers)
Berührt Schnittstellen (docs/architektur/schnittstellen.md)? ja: verfahrensgebiet_manager.py ist die
einzige Quelle der Wahrheit für den Verfahrensgebiet-Layer und wird von allen Fachplugins über get_verfahrensgebiet_layer_id/set_verfahrensgebiet_layer_id genutzt.
Fachlicher Hintergrund
Der Testkatalog-Abschnitt „Ungetestete Funktionen" (docs/tests/testkatalog.md, Paket sn_basis) und die
fachliche Analyse dazu (Chat vom 18.09.2026) haben 66 Funktionen als „testen" eingestuft; 19 davon sind mit #63 erledigt. Die restlichen 46, priorisiert:
Zustandsverwaltung, projektweit wirksam:setup_verfahrensgebiet_listener, teardown_verfahrensgebiet_listener, _on_layers_added, _on_layer_removed, _on_project_changed
(verfahrensgebiet_manager.py); DockManager.show (erzwingt „nur ein Dock sichtbar"); BaseDockWidget.closeEvent (einziger Auslöser für cleanup() aller Tabs)
UI mit echter Mapping-Logik:settings_tab.save_data/load_data
Muster für den Zuschnitt: sn_basis/tests/test_datenabruf.py, test_layerloader.py, test_datenschreiber.py
(aus #63) und die bestehenden test_dateipruefer.py, test_pruefmanager.py.
Abnahmekriterien
sn_basis/tests/test_verfahrensgebiet_manager.py (neu) mit Tests für setup_/teardown_..._listener
und die drei _on_*-Handler
sn_basis/tests/test_dockmanager.py (neu) mit Test für DockManager.show
sn_basis/tests/test_base_dockwidget.py (neu) mit Test für BaseDockWidget.closeEvent
sn_basis/tests/test_pruef_ergebnis.py (neu) mit Tests für erlaubte_persistierung, ist_verfahrens_db_aktion
sn_basis/tests/test_pruefmanager.py (bestehend, erweitert) um _handle_verfahrensgebiet_layer_existiert, _ask_use_or_replace_pufferlayer, report_error, frage_ja_nein, frage_text
sn_basis/tests/test_dateipruefer.py (bestehend, erweitert) um erkenne_dateityp, _pfad, _ist_gueltiger_gpkg_pfad
Je ein Test für die genannten Fundament-Wrapper-Funktionen (neue oder erweiterte Testdateien je Wrapper)
sn_basis/tests/test_settings_tab.py (neu oder erweitert) mit Tests für save_data/load_data
Jeder neue Test hat einen deutschen Docstring nach dem Muster """Prüft, dass …""" (ADR 0009)
python scripts/testkatalog.py neu erzeugt und mitcommittet
Mock-Test vorhanden, run_tests.py sn_basis --baseline ohne NEU ROT
QGIS-Test: nicht nötig für die gelisteten Funktionen (reine Logik/Berechnung/Zustandsverwaltung,
keine QGIS-Layout- oder Renderpfade)
Nicht Teil dieses Issues
LayerLoader.apply_style und ly_style_wrapper.apply_style bleiben ausgeklammert: beide hardcodieren einen
Fachplugin-Namen (sn_plan41 bzw. sn_verfahrensgebiet) in platformneutralem sn_basis-Code – zusammen mit Datenschreiber._resolve_style_path (bereits in #63 gefunden) jetzt drei Stellen mit demselben
mutmaßlichen Kopierfehler. Gehört in ein eigenes Bug-Issue, nicht in eine Testlücken-PR.
Vollständige Abdeckung aller 46 Funktionen in einer einzigen PR ist kein Muss – die Gruppen oben sind
fachlich unabhängig und können auf mehrere kleinere PRs verteilt werden.
## Ziel
Nach #63 (die vier testlosen Kernmodule) bekommen die übrigen als „testen" eingestuften Funktionen von
sn_basis Mock-Modus-Tests: zentrale Zustandsverwaltung, Nutzerentscheidungs-Gates im Pruefmanager, das
Dateipruefer-Fundament und die restlichen reinen Fundament-Wrapper.
## Betroffen
Plugin: sn_basis
Module/Dateien:
- `functions/verfahrensgebiet_manager.py` (zentrale Verfolgung des Verfahrensgebiet-Layers)
- `ui/dockmanager.py`, `ui/base_dockwidget.py` (Dock-Verwaltung, `cleanup()`-Auslöser)
- `modules/pruef_ergebnis.py`, `modules/Pruefmanager.py` (Persistenz-/Nutzerentscheidungs-Gates)
- `modules/Dateipruefer.py` (Zweige, die die bestehenden 6 Tests nicht erreichen)
- Fundament-Wrapper: `functions/sys_wrapper.py`, `functions/ly_existence_wrapper.py`,
`functions/ly_style_wrapper.py` (nur `apply_style_from_path`, siehe Abgrenzung), `functions/landkreise.py`,
`functions/message_wrapper.py`, `functions/qgiscore_wrapper.py`, `functions/qgisui_wrapper.py`
- `ui/tabs/settings_tab.py`
Berührt Schnittstellen (`docs/architektur/schnittstellen.md`)? ja: `verfahrensgebiet_manager.py` ist die
einzige Quelle der Wahrheit für den Verfahrensgebiet-Layer und wird von allen Fachplugins über
`get_verfahrensgebiet_layer_id`/`set_verfahrensgebiet_layer_id` genutzt.
## Fachlicher Hintergrund
Der Testkatalog-Abschnitt „Ungetestete Funktionen" (`docs/tests/testkatalog.md`, Paket `sn_basis`) und die
fachliche Analyse dazu (Chat vom 18.09.2026) haben 66 Funktionen als „testen" eingestuft; 19 davon sind mit
#63 erledigt. Die restlichen 46, priorisiert:
- **Zustandsverwaltung, projektweit wirksam:** `setup_verfahrensgebiet_listener`,
`teardown_verfahrensgebiet_listener`, `_on_layers_added`, `_on_layer_removed`, `_on_project_changed`
(`verfahrensgebiet_manager.py`); `DockManager.show` (erzwingt „nur ein Dock sichtbar");
`BaseDockWidget.closeEvent` (einziger Auslöser für `cleanup()` aller Tabs)
- **Persistenz-/Entscheidungs-Gates:** `pruef_ergebnis.erlaubte_persistierung`,
`pruef_ergebnis.ist_verfahrens_db_aktion`, `Pruefmanager._handle_verfahrensgebiet_layer_existiert`,
`_ask_use_or_replace_pufferlayer`, `report_error`, `frage_ja_nein`, `frage_text`
- **Dateipruefer-Zweige ohne bestehenden Test:** `erkenne_dateityp`, `_pfad`, `_ist_gueltiger_gpkg_pfad`
- **Fundament-Wrapper:** `sys_wrapper.join_path/ensure_dir/getattr_safe`,
`ly_existence_wrapper.layer_is_valid/layer_is_usable`, `ly_style_wrapper.apply_style_from_path`,
`landkreise._lade_landkreise`, `message_wrapper.push_message/_get_message_bar`,
`qgiscore_wrapper.polygon_zu_linie/layer_exists_in_gpkg`, `qgisui_wrapper.add_layer_to_project`
- **UI mit echter Mapping-Logik:** `settings_tab.save_data/load_data`
Muster für den Zuschnitt: `sn_basis/tests/test_datenabruf.py`, `test_layerloader.py`, `test_datenschreiber.py`
(aus #63) und die bestehenden `test_dateipruefer.py`, `test_pruefmanager.py`.
## Abnahmekriterien
- [ ] `sn_basis/tests/test_verfahrensgebiet_manager.py` (neu) mit Tests für `setup_/teardown_..._listener`
und die drei `_on_*`-Handler
- [ ] `sn_basis/tests/test_dockmanager.py` (neu) mit Test für `DockManager.show`
- [ ] `sn_basis/tests/test_base_dockwidget.py` (neu) mit Test für `BaseDockWidget.closeEvent`
- [ ] `sn_basis/tests/test_pruef_ergebnis.py` (neu) mit Tests für `erlaubte_persistierung`,
`ist_verfahrens_db_aktion`
- [ ] `sn_basis/tests/test_pruefmanager.py` (bestehend, erweitert) um `_handle_verfahrensgebiet_layer_existiert`,
`_ask_use_or_replace_pufferlayer`, `report_error`, `frage_ja_nein`, `frage_text`
- [ ] `sn_basis/tests/test_dateipruefer.py` (bestehend, erweitert) um `erkenne_dateityp`, `_pfad`,
`_ist_gueltiger_gpkg_pfad`
- [ ] Je ein Test für die genannten Fundament-Wrapper-Funktionen (neue oder erweiterte Testdateien je Wrapper)
- [ ] `sn_basis/tests/test_settings_tab.py` (neu oder erweitert) mit Tests für `save_data`/`load_data`
- [ ] Jeder neue Test hat einen deutschen Docstring nach dem Muster `"""Prüft, dass …"""` (ADR 0009)
- [ ] `python scripts/testkatalog.py` neu erzeugt und mitcommittet
- [ ] Mock-Test vorhanden, `run_tests.py sn_basis --baseline` ohne NEU ROT
- [ ] QGIS-Test: nicht nötig für die gelisteten Funktionen (reine Logik/Berechnung/Zustandsverwaltung,
keine QGIS-Layout- oder Renderpfade)
## Nicht Teil dieses Issues
- `LayerLoader.apply_style` und `ly_style_wrapper.apply_style` bleiben ausgeklammert: beide hardcodieren einen
Fachplugin-Namen (`sn_plan41` bzw. `sn_verfahrensgebiet`) in platformneutralem sn_basis-Code – zusammen mit
`Datenschreiber._resolve_style_path` (bereits in #63 gefunden) jetzt **drei** Stellen mit demselben
mutmaßlichen Kopierfehler. Gehört in ein eigenes Bug-Issue, nicht in eine Testlücken-PR.
- Vollständige Abdeckung aller 46 Funktionen in einer einzigen PR ist kein Muss – die Gruppen oben sind
fachlich unabhängig und können auf mehrere kleinere PRs verteilt werden.
Daniel
added the Feature label 2026-09-18 08:46:17 +00:00
Daniel
self-assigned this 2026-09-18 08:46:17 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Ziel
Nach #63 (die vier testlosen Kernmodule) bekommen die übrigen als „testen" eingestuften Funktionen von
sn_basis Mock-Modus-Tests: zentrale Zustandsverwaltung, Nutzerentscheidungs-Gates im Pruefmanager, das
Dateipruefer-Fundament und die restlichen reinen Fundament-Wrapper.
Betroffen
Plugin: sn_basis
Module/Dateien:
functions/verfahrensgebiet_manager.py(zentrale Verfolgung des Verfahrensgebiet-Layers)ui/dockmanager.py,ui/base_dockwidget.py(Dock-Verwaltung,cleanup()-Auslöser)modules/pruef_ergebnis.py,modules/Pruefmanager.py(Persistenz-/Nutzerentscheidungs-Gates)modules/Dateipruefer.py(Zweige, die die bestehenden 6 Tests nicht erreichen)functions/sys_wrapper.py,functions/ly_existence_wrapper.py,functions/ly_style_wrapper.py(nurapply_style_from_path, siehe Abgrenzung),functions/landkreise.py,functions/message_wrapper.py,functions/qgiscore_wrapper.py,functions/qgisui_wrapper.pyui/tabs/settings_tab.pyBerührt Schnittstellen (
docs/architektur/schnittstellen.md)? ja:verfahrensgebiet_manager.pyist dieeinzige Quelle der Wahrheit für den Verfahrensgebiet-Layer und wird von allen Fachplugins über
get_verfahrensgebiet_layer_id/set_verfahrensgebiet_layer_idgenutzt.Fachlicher Hintergrund
Der Testkatalog-Abschnitt „Ungetestete Funktionen" (
docs/tests/testkatalog.md, Paketsn_basis) und diefachliche Analyse dazu (Chat vom 18.09.2026) haben 66 Funktionen als „testen" eingestuft; 19 davon sind mit
#63 erledigt. Die restlichen 46, priorisiert:
setup_verfahrensgebiet_listener,teardown_verfahrensgebiet_listener,_on_layers_added,_on_layer_removed,_on_project_changed(
verfahrensgebiet_manager.py);DockManager.show(erzwingt „nur ein Dock sichtbar");BaseDockWidget.closeEvent(einziger Auslöser fürcleanup()aller Tabs)pruef_ergebnis.erlaubte_persistierung,pruef_ergebnis.ist_verfahrens_db_aktion,Pruefmanager._handle_verfahrensgebiet_layer_existiert,_ask_use_or_replace_pufferlayer,report_error,frage_ja_nein,frage_texterkenne_dateityp,_pfad,_ist_gueltiger_gpkg_pfadsys_wrapper.join_path/ensure_dir/getattr_safe,ly_existence_wrapper.layer_is_valid/layer_is_usable,ly_style_wrapper.apply_style_from_path,landkreise._lade_landkreise,message_wrapper.push_message/_get_message_bar,qgiscore_wrapper.polygon_zu_linie/layer_exists_in_gpkg,qgisui_wrapper.add_layer_to_projectsettings_tab.save_data/load_dataMuster für den Zuschnitt:
sn_basis/tests/test_datenabruf.py,test_layerloader.py,test_datenschreiber.py(aus #63) und die bestehenden
test_dateipruefer.py,test_pruefmanager.py.Abnahmekriterien
sn_basis/tests/test_verfahrensgebiet_manager.py(neu) mit Tests fürsetup_/teardown_..._listenerund die drei
_on_*-Handlersn_basis/tests/test_dockmanager.py(neu) mit Test fürDockManager.showsn_basis/tests/test_base_dockwidget.py(neu) mit Test fürBaseDockWidget.closeEventsn_basis/tests/test_pruef_ergebnis.py(neu) mit Tests fürerlaubte_persistierung,ist_verfahrens_db_aktionsn_basis/tests/test_pruefmanager.py(bestehend, erweitert) um_handle_verfahrensgebiet_layer_existiert,_ask_use_or_replace_pufferlayer,report_error,frage_ja_nein,frage_textsn_basis/tests/test_dateipruefer.py(bestehend, erweitert) umerkenne_dateityp,_pfad,_ist_gueltiger_gpkg_pfadsn_basis/tests/test_settings_tab.py(neu oder erweitert) mit Tests fürsave_data/load_data"""Prüft, dass …"""(ADR 0009)python scripts/testkatalog.pyneu erzeugt und mitcommittetrun_tests.py sn_basis --baselineohne NEU ROTkeine QGIS-Layout- oder Renderpfade)
Nicht Teil dieses Issues
LayerLoader.apply_styleundly_style_wrapper.apply_stylebleiben ausgeklammert: beide hardcodieren einenFachplugin-Namen (
sn_plan41bzw.sn_verfahrensgebiet) in platformneutralem sn_basis-Code – zusammen mitDatenschreiber._resolve_style_path(bereits in #63 gefunden) jetzt drei Stellen mit demselbenmutmaßlichen Kopierfehler. Gehört in ein eigenes Bug-Issue, nicht in eine Testlücken-PR.
fachlich unabhängig und können auf mehrere kleinere PRs verteilt werden.