Tests für die restlichen priorisierten sn_basis-Funktionen (Kategorie „testen", Folge-Issue zu #63) #65

Closed
opened 2026-09-18 08:46:17 +00:00 by Daniel · 0 comments
Member

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.
## 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
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: AG_QGIS/Plugin_SN_Basis#65