Die 32 verbleibenden, als „vielleicht testen" eingestuften sn_basis-Funktionen (außerhalb des zur
Überarbeitung zurückgestellten Print-Bereichs) werden einzeln entschieden: entweder mit einem
Mock-Modus-Test versehen, wo das sinnvoll möglich ist, oder mit einer kurzen Begründung im Docstring als
bewusst nicht getestet markiert. Am Ende ist die Kategorie „vielleicht" für sn_basis aufgelöst — jede
Funktion steht dann in „getestet" oder „vernachlässigbar/zurückgestellt", keine offene Frage mehr.
Aus der fachlichen Analyse zu #63 (Chat vom 18.09.2026) stammt die Kategorie „vielleicht testen": Funktionen
mit etwas Logik, die aber entweder eng an echtes Qt-Widget-/Signal-Verhalten gekoppelt sind (nur mit echtem
QGIS oder aufwendig gebauten Fake-Widgets sinnvoll prüfbar) oder eine so geringe Änderungshäufigkeit bzw.
so geringen Schaden bei stillem Bruch haben, dass ein Test fraglich ist. Von den ursprünglich 57
„vielleicht"-Funktionen sind 25 bereits mit „Test ausgesetzt, zunächst Refactor" markiert (print_logic.py, print_layout.py, print_layout_baufreigabe.py — eigenes Thema, siehe „Nicht Teil dieses Issues"). Die
restlichen 32, mit dem Grund für die Einstufung als „vielleicht":
functions/os_wrapper.py: is_case_sensitive_fs — echte Verzweigung, aber aktuell nur unter Windows im
Einsatz
functions/qgiscore_wrapper.py: create_buffer_layer — im Mock-Modus nur der Guard erreichbar, die
eigentliche Pufferlogik bräuchte echtes QGIS
functions/qgisui_wrapper.py: find_dock_widgets, add_menu, remove_menu — dünne iface-Hüllen mit
einem Guard
modules/DataGrabber.py: _aggregate_results — vermutlich schon indirekt über die bestehenden run()-Tests mitgeprüft, aber nie gezielt
ui/navigation.py: add_action, finalize_menu_and_toolbar, set_active_plugin, remove_action, remove_all — echte Zustandslogik (Priorität, Exklusivität der Aktionen), aber eng an echte QAction/QMenu-Objekte gekoppelt
ui/tabs/settings_tab.py: _build_input — Widget-Aufbau mit einer Verzweigung (Landkreis-Dropdown vs.
Textfeld)
ui/tabs/print_tab.py (19 Funktionen): set_services, _build_ui, _restore_state, _restore_atlas_layer_selection, _populate_atlas_layer_combo, _get_gespeicherte_themen, _connect_project_signals, _disconnect_project_signals, _connect_theme_collection_signals, _disconnect_theme_collection_signals, _refresh_thema_combo_live, _get_current_canvas_scale, _on_druckpuffer_clicked, _on_auswahl_as_atlas_clicked, _on_atlas_layer_changed, _toggle_atlas, _on_atlas_erzeugen_changed, _on_vorlage_erstellen, cleanup — Qt-Widget- und Signal-lastig, das dürfte
der schwierigste Block sein
Muster für Tests, die sich lohnen: tests/test_dockmanager.py, tests/test_verfahrensgebiet_manager.py
(Signal-Handler mit Fake-Objekten statt echtem Qt), tests/test_settings_tab.py
(Klasse.__new__(Klasse) statt echtem __init__, siehe docs/wissen/fallstricke.md). Muster für einen
begründeten Verzicht: die 43 bereits mit „von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"
markierten sn_basis-Funktionen (#65).
Abnahmekriterien
Für jede der 32 genannten Funktionen liegt eine von zwei Entscheidungen vor:
(a) ein Mock-Modus-Test mit deutschem Docstring nach dem Muster """Prüft, dass …""" (ADR 0009), oder
(b) ein kurzer Docstring-Vermerk, warum kein Test sinnvoll ist (Muster: „von Test abgesehen, weil
…; Kürzel Datum")
Keine der 32 Funktionen bleibt ohne Test und ohne Vermerk
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 Entscheidung (b); bei Entscheidung (a) im PR vermerken, falls eine Funktion
trotzdem einen manuellen QGIS-Test nahelegt
Nicht Teil dieses Issues
modules/print_logic.py, modules/print_layout.py, modules/print_layout_baufreigabe.py — bereits mit
„Test ausgesetzt, zunächst Refactor" markiert, wird erst nach der geplanten Grundüberarbeitung des
Print-Bereichs angegangen.
Die Kategorie „testen" ist mit #63/#65 abgeschlossen (bis auf den separat zu klärenden Fund Datenschreiber._store_style_in_gpkg, das war „testen"-Kategorie und ist versehentlich in #63 nicht
getestet worden — eigenes kleines Ticket, nicht Teil dieses Issues).
Pruefmanager._ask_use_or_replace_pufferlayer — bereits als Bug in #60 erfasst (toter Code).
## Ziel
Die 32 verbleibenden, als „vielleicht testen" eingestuften sn_basis-Funktionen (außerhalb des zur
Überarbeitung zurückgestellten Print-Bereichs) werden einzeln entschieden: entweder mit einem
Mock-Modus-Test versehen, wo das sinnvoll möglich ist, oder mit einer kurzen Begründung im Docstring als
bewusst nicht getestet markiert. Am Ende ist die Kategorie „vielleicht" für sn_basis aufgelöst — jede
Funktion steht dann in „getestet" oder „vernachlässigbar/zurückgestellt", keine offene Frage mehr.
## Betroffen
Plugin: sn_basis
Module/Dateien:
- `functions/os_wrapper.py`
- `functions/qgiscore_wrapper.py`
- `functions/qgisui_wrapper.py`
- `modules/DataGrabber.py`
- `modules/pruef_ergebnis.py`
- `ui/navigation.py`
- `ui/tabs/settings_tab.py`
- `ui/tabs/print_tab.py`
Berührt Schnittstellen (`docs/architektur/schnittstellen.md`)? nein
## Fachlicher Hintergrund
Aus der fachlichen Analyse zu #63 (Chat vom 18.09.2026) stammt die Kategorie „vielleicht testen": Funktionen
mit etwas Logik, die aber entweder eng an echtes Qt-Widget-/Signal-Verhalten gekoppelt sind (nur mit echtem
QGIS oder aufwendig gebauten Fake-Widgets sinnvoll prüfbar) oder eine so geringe Änderungshäufigkeit bzw.
so geringen Schaden bei stillem Bruch haben, dass ein Test fraglich ist. Von den ursprünglich 57
„vielleicht"-Funktionen sind 25 bereits mit „Test ausgesetzt, zunächst Refactor" markiert (`print_logic.py`,
`print_layout.py`, `print_layout_baufreigabe.py` — eigenes Thema, siehe „Nicht Teil dieses Issues"). Die
restlichen 32, mit dem Grund für die Einstufung als „vielleicht":
- `functions/os_wrapper.py`: `is_case_sensitive_fs` — echte Verzweigung, aber aktuell nur unter Windows im
Einsatz
- `functions/qgiscore_wrapper.py`: `create_buffer_layer` — im Mock-Modus nur der Guard erreichbar, die
eigentliche Pufferlogik bräuchte echtes QGIS
- `functions/qgisui_wrapper.py`: `find_dock_widgets`, `add_menu`, `remove_menu` — dünne `iface`-Hüllen mit
einem Guard
- `modules/DataGrabber.py`: `_aggregate_results` — vermutlich schon indirekt über die bestehenden
`run()`-Tests mitgeprüft, aber nie gezielt
- `modules/pruef_ergebnis.py`: `dateipfad` — einfacher Typ-Check-Getter
- `ui/navigation.py`: `add_action`, `finalize_menu_and_toolbar`, `set_active_plugin`, `remove_action`,
`remove_all` — echte Zustandslogik (Priorität, Exklusivität der Aktionen), aber eng an echte
`QAction`/`QMenu`-Objekte gekoppelt
- `ui/tabs/settings_tab.py`: `_build_input` — Widget-Aufbau mit einer Verzweigung (Landkreis-Dropdown vs.
Textfeld)
- `ui/tabs/print_tab.py` (19 Funktionen): `set_services`, `_build_ui`, `_restore_state`,
`_restore_atlas_layer_selection`, `_populate_atlas_layer_combo`, `_get_gespeicherte_themen`,
`_connect_project_signals`, `_disconnect_project_signals`, `_connect_theme_collection_signals`,
`_disconnect_theme_collection_signals`, `_refresh_thema_combo_live`, `_get_current_canvas_scale`,
`_on_druckpuffer_clicked`, `_on_auswahl_as_atlas_clicked`, `_on_atlas_layer_changed`, `_toggle_atlas`,
`_on_atlas_erzeugen_changed`, `_on_vorlage_erstellen`, `cleanup` — Qt-Widget- und Signal-lastig, das dürfte
der schwierigste Block sein
Muster für Tests, die sich lohnen: `tests/test_dockmanager.py`, `tests/test_verfahrensgebiet_manager.py`
(Signal-Handler mit Fake-Objekten statt echtem Qt), `tests/test_settings_tab.py`
(`Klasse.__new__(Klasse)` statt echtem `__init__`, siehe `docs/wissen/fallstricke.md`). Muster für einen
begründeten Verzicht: die 43 bereits mit „von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"
markierten sn_basis-Funktionen (#65).
## Abnahmekriterien
- [ ] Für jede der 32 genannten Funktionen liegt eine von zwei Entscheidungen vor:
(a) ein Mock-Modus-Test mit deutschem Docstring nach dem Muster `"""Prüft, dass …"""` (ADR 0009), oder
(b) ein kurzer Docstring-Vermerk, warum kein Test sinnvoll ist (Muster: „von Test abgesehen, weil
…; Kürzel Datum")
- [ ] Keine der 32 Funktionen bleibt ohne Test und ohne Vermerk
- [ ] `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 Entscheidung (b); bei Entscheidung (a) im PR vermerken, falls eine Funktion
trotzdem einen manuellen QGIS-Test nahelegt
## Nicht Teil dieses Issues
- `modules/print_logic.py`, `modules/print_layout.py`, `modules/print_layout_baufreigabe.py` — bereits mit
„Test ausgesetzt, zunächst Refactor" markiert, wird erst nach der geplanten Grundüberarbeitung des
Print-Bereichs angegangen.
- Die Kategorie „testen" ist mit #63/#65 abgeschlossen (bis auf den separat zu klärenden Fund
`Datenschreiber._store_style_in_gpkg`, das war „testen"-Kategorie und ist versehentlich in #63 nicht
getestet worden — eigenes kleines Ticket, nicht Teil dieses Issues).
- Der vermutete Bug hartkodierter Fachplugin-Pfade (`LayerLoader.apply_style`,
`functions/ly_style_wrapper.py::apply_style`, `Datenschreiber._resolve_style_path`) — eigenes Bug-Issue.
- `Pruefmanager._ask_use_or_replace_pufferlayer` — bereits als Bug in #60 erfasst (toter Code).
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
Die 32 verbleibenden, als „vielleicht testen" eingestuften sn_basis-Funktionen (außerhalb des zur
Überarbeitung zurückgestellten Print-Bereichs) werden einzeln entschieden: entweder mit einem
Mock-Modus-Test versehen, wo das sinnvoll möglich ist, oder mit einer kurzen Begründung im Docstring als
bewusst nicht getestet markiert. Am Ende ist die Kategorie „vielleicht" für sn_basis aufgelöst — jede
Funktion steht dann in „getestet" oder „vernachlässigbar/zurückgestellt", keine offene Frage mehr.
Betroffen
Plugin: sn_basis
Module/Dateien:
functions/os_wrapper.pyfunctions/qgiscore_wrapper.pyfunctions/qgisui_wrapper.pymodules/DataGrabber.pymodules/pruef_ergebnis.pyui/navigation.pyui/tabs/settings_tab.pyui/tabs/print_tab.pyBerührt Schnittstellen (
docs/architektur/schnittstellen.md)? neinFachlicher Hintergrund
Aus der fachlichen Analyse zu #63 (Chat vom 18.09.2026) stammt die Kategorie „vielleicht testen": Funktionen
mit etwas Logik, die aber entweder eng an echtes Qt-Widget-/Signal-Verhalten gekoppelt sind (nur mit echtem
QGIS oder aufwendig gebauten Fake-Widgets sinnvoll prüfbar) oder eine so geringe Änderungshäufigkeit bzw.
so geringen Schaden bei stillem Bruch haben, dass ein Test fraglich ist. Von den ursprünglich 57
„vielleicht"-Funktionen sind 25 bereits mit „Test ausgesetzt, zunächst Refactor" markiert (
print_logic.py,print_layout.py,print_layout_baufreigabe.py— eigenes Thema, siehe „Nicht Teil dieses Issues"). Dierestlichen 32, mit dem Grund für die Einstufung als „vielleicht":
functions/os_wrapper.py:is_case_sensitive_fs— echte Verzweigung, aber aktuell nur unter Windows imEinsatz
functions/qgiscore_wrapper.py:create_buffer_layer— im Mock-Modus nur der Guard erreichbar, dieeigentliche Pufferlogik bräuchte echtes QGIS
functions/qgisui_wrapper.py:find_dock_widgets,add_menu,remove_menu— dünneiface-Hüllen miteinem Guard
modules/DataGrabber.py:_aggregate_results— vermutlich schon indirekt über die bestehendenrun()-Tests mitgeprüft, aber nie gezieltmodules/pruef_ergebnis.py:dateipfad— einfacher Typ-Check-Getterui/navigation.py:add_action,finalize_menu_and_toolbar,set_active_plugin,remove_action,remove_all— echte Zustandslogik (Priorität, Exklusivität der Aktionen), aber eng an echteQAction/QMenu-Objekte gekoppeltui/tabs/settings_tab.py:_build_input— Widget-Aufbau mit einer Verzweigung (Landkreis-Dropdown vs.Textfeld)
ui/tabs/print_tab.py(19 Funktionen):set_services,_build_ui,_restore_state,_restore_atlas_layer_selection,_populate_atlas_layer_combo,_get_gespeicherte_themen,_connect_project_signals,_disconnect_project_signals,_connect_theme_collection_signals,_disconnect_theme_collection_signals,_refresh_thema_combo_live,_get_current_canvas_scale,_on_druckpuffer_clicked,_on_auswahl_as_atlas_clicked,_on_atlas_layer_changed,_toggle_atlas,_on_atlas_erzeugen_changed,_on_vorlage_erstellen,cleanup— Qt-Widget- und Signal-lastig, das dürfteder schwierigste Block sein
Muster für Tests, die sich lohnen:
tests/test_dockmanager.py,tests/test_verfahrensgebiet_manager.py(Signal-Handler mit Fake-Objekten statt echtem Qt),
tests/test_settings_tab.py(
Klasse.__new__(Klasse)statt echtem__init__, siehedocs/wissen/fallstricke.md). Muster für einenbegründeten Verzicht: die 43 bereits mit „von Test abgesehen, weil vernachlässigbar; HD 18.09.2026"
markierten sn_basis-Funktionen (#65).
Abnahmekriterien
(a) ein Mock-Modus-Test mit deutschem Docstring nach dem Muster
"""Prüft, dass …"""(ADR 0009), oder(b) ein kurzer Docstring-Vermerk, warum kein Test sinnvoll ist (Muster: „von Test abgesehen, weil
…; Kürzel Datum")
python scripts/testkatalog.pyneu erzeugt und mitcommittetrun_tests.py sn_basis --baselineohne NEU ROTtrotzdem einen manuellen QGIS-Test nahelegt
Nicht Teil dieses Issues
modules/print_logic.py,modules/print_layout.py,modules/print_layout_baufreigabe.py— bereits mit„Test ausgesetzt, zunächst Refactor" markiert, wird erst nach der geplanten Grundüberarbeitung des
Print-Bereichs angegangen.
Datenschreiber._store_style_in_gpkg, das war „testen"-Kategorie und ist versehentlich in #63 nichtgetestet worden — eigenes kleines Ticket, nicht Teil dieses Issues).
LayerLoader.apply_style,functions/ly_style_wrapper.py::apply_style,Datenschreiber._resolve_style_path) — eigenes Bug-Issue.Pruefmanager._ask_use_or_replace_pufferlayer— bereits als Bug in #60 erfasst (toter Code).