Testkatalog neu erzeugt für Basis #67

sn_basis: 317 Testfälle (32 Testdateien), Kategorie "vielleicht testen"
abgeschlossen. modulkarte.md an aktuelle Testdateizahl angepasst.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-18 13:07:20 +02:00
co-authored by Claude Sonnet 5
parent 3f985ce209
commit cb29620f6e
3 changed files with 496 additions and 247 deletions
+1 -1
View File
@@ -63,7 +63,7 @@ Legende: ⚠ = über 600 Zeilen, nie komplett laden, per `grep -n "def "` navigi
| Pfad | Zweck | | Pfad | Zweck |
|---|---| |---|---|
| `tests/` | 29 Testdateien, `unittest`, Mock-Modus; `run_tests.py` (farbiger Runner), `test_qgis.bat` (Coverage in OSGeo4W) | | `tests/` | 32 Testdateien, `unittest`, Mock-Modus; `run_tests.py` (farbiger Runner), `test_qgis.bat` (Coverage in OSGeo4W) |
| `styles/` | QML-Stile (Verfahrensgebiet, LSG, Denkmalschutz, Flurstücksbeschriftung) | | `styles/` | QML-Stile (Verfahrensgebiet, LSG, Denkmalschutz, Flurstücksbeschriftung) |
| `data/landkreise.json` | Landkreise mit Kennzahl | | `data/landkreise.json` | Landkreise mit Kennzahl |
| `assets/plan-qgis340ExitCrashFix.prompt.md` | KI-Planungsnotiz zum Exit-Crash (historisch) | | `assets/plan-qgis340ExitCrashFix.prompt.md` | KI-Planungsnotiz zum Exit-Crash (historisch) |
File diff suppressed because one or more lines are too long
+203 -126
View File
@@ -10,19 +10,19 @@ selbst (Docstrings) und aus der Testbaseline.
Stand der Baseline: `docs/status/testbaseline.json` (SHA-256 `aeabc946a7f3`) Stand der Baseline: `docs/status/testbaseline.json` (SHA-256 `aeabc946a7f3`)
Stand des Prüf-Audits: `docs/status/testpruefungen.json` (SHA-256 `68b590c8feef`) Stand des Prüf-Audits: `docs/status/testpruefungen.json` (SHA-256 `68b590c8feef`)
Gesamt: 3 Pakete, 46 Testdateien, 501 Testfälle – 458 grün, 35 rot (Baseline), 8 übersprungen. Gesamt: 3 Pakete, 49 Testdateien, 569 Testfälle – 526 grün, 35 rot (Baseline), 8 übersprungen.
Mit Beschreibung (Docstring): 356 von 501 (71 %). Mit Beschreibung (Docstring): 424 von 569 (75 %).
Fachlich geprüft: 55 von 501 (11 %) aktuell, 0 veraltet seit Codeänderung, 446 nie geprüft. Fachlich geprüft: 55 von 569 (10 %) aktuell, 0 veraltet seit Codeänderung, 514 nie geprüft.
Strukturelle Lücken (heuristisch, Namensabgleich): 188 von 413 (46 %) Funktionen/Methoden ohne erkennbaren Testbezug – Abschnitt „Ungetestete Funktionen“. Strukturelle Lücken (heuristisch, Namensabgleich): 149 von 413 (36 %) Funktionen/Methoden ohne erkennbaren Testbezug – Abschnitt „Ungetestete Funktionen“.
## Zusammenfassung ## Zusammenfassung
| Paket | Testdateien | Testfälle | grün | rot (Baseline) | übersprungen | mit Beschreibung | fachlich geprüft | ohne Testbezug | | Paket | Testdateien | Testfälle | grün | rot (Baseline) | übersprungen | mit Beschreibung | fachlich geprüft | ohne Testbezug |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| `sn_basis` | 29 | 249 | 249 | 0 | 0 | 249 von 249 (100 %) | 55 von 249 (22 %) | 115 von 229 (50 %) | | `sn_basis` | 32 | 317 | 317 | 0 | 0 | 317 von 317 (100 %) | 55 von 317 (17 %) | 76 von 229 (33 %) |
| `sn_verfahrensgebiet` | 12 | 208 | 166 | 34 | 8 | 106 von 208 (51 %) | 0 von 208 (0 %) | 34 von 104 (33 %) | | `sn_verfahrensgebiet` | 12 | 208 | 166 | 34 | 8 | 106 von 208 (51 %) | 0 von 208 (0 %) | 34 von 104 (33 %) |
| `sn_plan41` | 5 | 44 | 43 | 1 | 0 | 1 von 44 (2 %) | 0 von 44 (0 %) | 39 von 80 (49 %) | | `sn_plan41` | 5 | 44 | 43 | 1 | 0 | 1 von 44 (2 %) | 0 von 44 (0 %) | 39 von 80 (49 %) |
| **Summe** | **46** | **501** | **458** | **35** | **8** | **356 von 501 (71 %)** | **55 von 501 (11 %)** | **188 von 413 (46 %)** | | **Summe** | **49** | **569** | **526** | **35** | **8** | **424 von 569 (75 %)** | **55 von 569 (10 %)** | **149 von 413 (36 %)** |
### Legende ### Legende
@@ -36,7 +36,7 @@ Strukturelle Lücken (heuristisch, Namensabgleich): 188 von 413 (46 %) Funktione
## Paket `sn_basis` ## Paket `sn_basis`
Plattform-Plugin, Ordner `Plugin_SN_Basis` – 29 Testdateien mit 249 Testfällen (249 grün, 0 rot, 0 übersprungen). Plattform-Plugin, Ordner `Plugin_SN_Basis` – 32 Testdateien mit 317 Testfällen (317 grün, 0 rot, 0 übersprungen).
### `Plugin_SN_Basis/tests/test_base_dockwidget.py` ### `Plugin_SN_Basis/tests/test_base_dockwidget.py`
@@ -66,7 +66,7 @@ Worum es in der Datei geht: — (Docstring fehlt)
Testgruppen: Testgruppen:
- `TestDataGrabber` (6 Testfälle): — (Docstring fehlt) - `TestDataGrabber` (8 Testfälle): — (Docstring fehlt)
| Testfall | prüft | Status | geprüft | | Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- | | --- | --- | --- | --- |
@@ -76,6 +76,8 @@ Testgruppen:
| `TestDataGrabber.test_analyze_source_type_returns_unbekannte_quelle_on_full_failure` | Prüft, dass eine Quelle als 'unbekannte_quelle' eingestuft wird, wenn weder Datei- noch Linkprüfung erfolgreich sind. | grün | geprüft am 2026-09-16 | | `TestDataGrabber.test_analyze_source_type_returns_unbekannte_quelle_on_full_failure` | Prüft, dass eine Quelle als 'unbekannte_quelle' eingestuft wird, wenn weder Datei- noch Linkprüfung erfolgreich sind. | grün | geprüft am 2026-09-16 |
| `TestDataGrabber.test_run_returns_success_summary_with_valid_rows` | Prüft, dass run() bei erfolgreichem Excel-Import eine Erfolgsmeldung mit den geladenen Zeilen liefert. | grün | geprüft am 2026-09-16 | | `TestDataGrabber.test_run_returns_success_summary_with_valid_rows` | Prüft, dass run() bei erfolgreichem Excel-Import eine Erfolgsmeldung mit den geladenen Zeilen liefert. | grün | geprüft am 2026-09-16 |
| `TestDataGrabber.test_run_returns_failure_summary_without_rows` | Prüft, dass run() bei nicht erkennbarer Quelle eine Fehlermeldung ohne Zeilen liefert. | grün | geprüft am 2026-09-16 | | `TestDataGrabber.test_run_returns_failure_summary_without_rows` | Prüft, dass run() bei nicht erkennbarer Quelle eine Fehlermeldung ohne Zeilen liefert. | grün | geprüft am 2026-09-16 |
| `TestDataGrabber.test_aggregate_results_mit_zeilen_liefert_erfolgsergebnis` | Prüft, dass _aggregate_results bei vorhandenen Zeilen ein Erfolgsergebnis mit Zeilenzahl liefert. | grün | nie geprüft |
| `TestDataGrabber.test_aggregate_results_ohne_zeilen_liefert_keine_validen_eintraege` | Prüft, dass _aggregate_results ohne Zeilen ok=False mit Aktion 'keine_validen_eintraege' liefert. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_dateipruefer.py` ### `Plugin_SN_Basis/tests/test_dateipruefer.py`
@@ -362,6 +364,46 @@ Testgruppen:
| `PushMessageTests.test_liefert_dict_mit_titel_text_level_und_dauer` | Prüft, dass push_message im Mock-Modus ein Dict mit den übergebenen Werten liefert. | grün | nie geprüft | | `PushMessageTests.test_liefert_dict_mit_titel_text_level_und_dauer` | Prüft, dass push_message im Mock-Modus ein Dict mit den übergebenen Werten liefert. | grün | nie geprüft |
| `PushMessageTests.test_fehler_in_der_message_bar_wird_abgefangen` | Prüft, dass eine fehlschlagende MessageBar push_message nicht zum Absturz bringt, sondern None liefert. | grün | nie geprüft | | `PushMessageTests.test_fehler_in_der_message_bar_wird_abgefangen` | Prüft, dass eine fehlschlagende MessageBar push_message nicht zum Absturz bringt, sondern None liefert. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_navigation.py`
Worum es in der Datei geht: Tests für sn_basis/ui/navigation.py::Navigation (Issue #67, ohne init_ui – s. Docstring dort).
Testgruppen:
- `AddActionTests` (2 Testfälle): — (Docstring fehlt)
- `FinalizeMenuAndToolbarTests` (2 Testfälle): — (Docstring fehlt)
- `SetActivePluginTests` (2 Testfälle): — (Docstring fehlt)
- `RemoveActionTests` (3 Testfälle): — (Docstring fehlt)
- `RemoveAllTests` (2 Testfälle): — (Docstring fehlt)
| Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- |
| `AddActionTests.test_ohne_plugin_group_liefert_none` | Prüft, dass add_action ohne initialisierte Aktionsgruppe None liefert und nichts anlegt. | grün | nie geprüft |
| `AddActionTests.test_erzeugt_action_und_fuegt_sie_gruppe_und_liste_hinzu` | Prüft, dass add_action eine Action erzeugt, ihr die Gruppe zuweist und sie priorisiert in der Liste ablegt. | grün | nie geprüft |
| `FinalizeMenuAndToolbarTests.test_ohne_menu_oder_toolbar_tut_nichts` | Prüft, dass finalize_menu_and_toolbar ohne Menü oder Toolbar keine Ausnahme wirft. | grün | nie geprüft |
| `FinalizeMenuAndToolbarTests.test_sortiert_und_fuegt_aktionen_in_prioritaetsreihenfolge_hinzu` | Prüft, dass finalize_menu_and_toolbar Aktionen nach Priorität sortiert in Menü und Toolbar einträgt. | grün | nie geprüft |
| `SetActivePluginTests.test_setzt_nur_aktive_action_auf_checked` | Prüft, dass set_active_plugin nur die übergebene Action markiert, alle anderen abwählt. | grün | nie geprüft |
| `SetActivePluginTests.test_ohne_aktive_action_setzt_alle_auf_false` | Prüft, dass set_active_plugin ohne aktive Action alle bestehenden Actions abwählt. | grün | nie geprüft |
| `RemoveActionTests.test_none_action_tut_nichts` | Prüft, dass remove_action mit None keine Ausnahme wirft und die Liste unverändert lässt. | grün | nie geprüft |
| `RemoveActionTests.test_entfernt_action_aus_menu_toolbar_und_liste` | Prüft, dass remove_action die Action aus Menü, Toolbar und der internen Liste entfernt. | grün | nie geprüft |
| `RemoveActionTests.test_ohne_menu_oder_toolbar_entfernt_trotzdem_aus_liste` | Prüft, dass remove_action ohne Menü/Toolbar trotzdem aus der internen Liste entfernt. | grün | nie geprüft |
| `RemoveAllTests.test_entfernt_menu_toolbar_und_setzt_zustand_zurueck` | Prüft, dass remove_all Menü und Toolbar über die Wrapper entfernt und den Navigationszustand zurücksetzt. | grün | nie geprüft |
| `RemoveAllTests.test_ohne_menu_und_toolbar_ruft_wrapper_nicht_auf` | Prüft, dass remove_all ohne vorhandenes Menü/Toolbar die Wrapper nicht aufruft, aber die Liste leert. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_os_wrapper.py`
Worum es in der Datei geht: Tests für sn_basis/functions/os_wrapper.py::is_case_sensitive_fs (Issue #67).
Testgruppen:
- `IsCaseSensitiveFsTests` (3 Testfälle): — (Docstring fehlt)
| Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- |
| `IsCaseSensitiveFsTests.test_windows_ist_nicht_case_sensitiv` | Prüft, dass Windows als nicht case-sensitives Dateisystem gilt. | grün | nie geprüft |
| `IsCaseSensitiveFsTests.test_macos_ist_nicht_case_sensitiv` | Prüft, dass macOS als nicht case-sensitives Dateisystem gilt. | grün | nie geprüft |
| `IsCaseSensitiveFsTests.test_linux_ist_case_sensitiv` | Prüft, dass Linux als case-sensitives Dateisystem gilt. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_print_layout.py` ### `Plugin_SN_Basis/tests/test_print_layout.py`
Worum es in der Datei geht: — (Docstring fehlt) Worum es in der Datei geht: — (Docstring fehlt)
@@ -406,14 +448,78 @@ Testgruppen:
| `TestPrintLogic.test_resolve_extent_uses_canvas_extent_without_buffer` | Prüft, dass bei Druckbereich 'wie Kartenfenster' der Kartenausschnitt ohne Puffer und ohne verknüpften Layer übernommen wird. | grün | nie geprüft | | `TestPrintLogic.test_resolve_extent_uses_canvas_extent_without_buffer` | Prüft, dass bei Druckbereich 'wie Kartenfenster' der Kartenausschnitt ohne Puffer und ohne verknüpften Layer übernommen wird. | grün | nie geprüft |
| `TestPrintLogic.test_resolve_extent_uses_rectangle_extent_without_buffer` | Prüft, dass bei Druckbereich 'Rechteck' der gezeichnete Ausschnitt ohne Puffer und ohne verknüpften Layer übernommen wird. | grün | nie geprüft | | `TestPrintLogic.test_resolve_extent_uses_rectangle_extent_without_buffer` | Prüft, dass bei Druckbereich 'Rechteck' der gezeichnete Ausschnitt ohne Puffer und ohne verknüpften Layer übernommen wird. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_print_tab.py`
Worum es in der Datei geht: Tests für sn_basis/ui/tabs/print_tab.py::PrintTab (Issue #67).
Testgruppen:
- `SetServicesTests` (2 Testfälle): — (Docstring fehlt)
- `RestoreStateTests` (2 Testfälle): — (Docstring fehlt)
- `OnDruckpufferClickedTests` (3 Testfälle): — (Docstring fehlt)
- `OnVorlageErstellenTests` (2 Testfälle): — (Docstring fehlt)
- `ProjectSignalsTests` (3 Testfälle): — (Docstring fehlt)
- `CleanupTests` (1 Testfälle): — (Docstring fehlt)
- `ToggleAtlasTests` (2 Testfälle): — (Docstring fehlt)
- `RestoreAtlasLayerSelectionTests` (2 Testfälle): — (Docstring fehlt)
- `ThemeCollectionSignalsTests` (3 Testfälle): — (Docstring fehlt)
- `RefreshThemaComboLiveTests` (2 Testfälle): — (Docstring fehlt)
- `GetGespeicherteThemenTests` (2 Testfälle): — (Docstring fehlt)
- `GetCurrentCanvasScaleTests` (3 Testfälle): — (Docstring fehlt)
- `OnAtlasLayerChangedTests` (3 Testfälle): — (Docstring fehlt)
- `OnAuswahlAsAtlasClickedTests` (2 Testfälle): — (Docstring fehlt)
- `PopulateAtlasLayerComboTests` (2 Testfälle): — (Docstring fehlt)
- `OnAtlasErzeugenChangedTests` (3 Testfälle): — (Docstring fehlt)
| Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- |
| `SetServicesTests.test_ruft_alle_set_methoden_mit_combo_werten_auf` | Prüft, dass set_services alle set_*-Methoden von PrintLogic mit den aktuellen Combo-Werten aufruft. | grün | nie geprüft |
| `SetServicesTests.test_ohne_combos_ruft_keine_set_methode_auf` | Prüft, dass set_services ohne vorhandene Combos keine set_*-Methode von PrintLogic aufruft. | grün | nie geprüft |
| `RestoreStateTests.test_gueltige_gespeicherte_werte_werden_uebernommen` | Prüft, dass _restore_state gültige gespeicherte Werte in die jeweiligen Widgets übernimmt. | grün | nie geprüft |
| `RestoreStateTests.test_ungueltige_oder_fehlende_werte_fallen_auf_defaults_zurueck` | Prüft, dass _restore_state ohne (gültige) gespeicherte Werte auf die Default-Konstanten zurückfällt. | grün | nie geprüft |
| `OnDruckpufferClickedTests.test_gueltige_zahl_setzt_variable_und_button_text` | Prüft, dass eine bestätigte, gültige Zahl den Druckpuffer speichert und den Button-Text aktualisiert. | grün | nie geprüft |
| `OnDruckpufferClickedTests.test_abgebrochen_aendert_nichts` | Prüft, dass ein abgebrochener Dialog den Druckpuffer nicht verändert. | grün | nie geprüft |
| `OnDruckpufferClickedTests.test_ungueltige_zahl_zeigt_hinweis_und_setzt_nichts` | Prüft, dass eine nicht-numerische Eingabe einen Hinweis zeigt und den Druckpuffer nicht setzt. | grün | nie geprüft |
| `OnVorlageErstellenTests.test_ruft_druckvorlage_anlegen_mit_combo_werten_auf` | Prüft, dass _on_vorlage_erstellen druckvorlage_anlegen mit den aktuellen Combo-Werten aufruft. | grün | nie geprüft |
| `OnVorlageErstellenTests.test_ohne_logic_tut_nichts` | Prüft, dass _on_vorlage_erstellen ohne gesetzte PrintLogic keine Ausnahme wirft. | grün | nie geprüft |
| `ProjectSignalsTests.test_connect_verbindet_alle_drei_signale` | Prüft, dass _connect_project_signals alle drei Projektsignale mit _on_project_changed verbindet. | grün | nie geprüft |
| `ProjectSignalsTests.test_disconnect_trennt_alle_drei_signale` | Prüft, dass _disconnect_project_signals alle drei zuvor verbundenen Projektsignale trennt. | grün | nie geprüft |
| `ProjectSignalsTests.test_instance_wirft_ausnahme_wird_abgefangen` | Prüft, dass eine Ausnahme bei QgsProject.instance() in beiden Signalmethoden abgefangen wird. | grün | nie geprüft |
| `CleanupTests.test_ruft_beide_disconnect_methoden_auf` | Prüft, dass cleanup sowohl die Theme- als auch die Projektsignale trennt. | grün | nie geprüft |
| `ToggleAtlasTests.test_checked_true_setzt_arrow_down_und_zeigt_inhalt` | Prüft, dass _toggle_atlas bei checked=True den Pfeil nach unten dreht und den Inhalt einblendet. | grün | nie geprüft |
| `ToggleAtlasTests.test_checked_false_setzt_arrow_right_und_versteckt_inhalt` | Prüft, dass _toggle_atlas bei checked=False den Pfeil nach rechts dreht und den Inhalt ausblendet. | grün | nie geprüft |
| `RestoreAtlasLayerSelectionTests.test_vorhandene_layer_id_setzt_layer_in_combo` | Prüft, dass eine gespeicherte Layer-ID den zugehörigen Layer im Atlas-Dropdown auswählt. | grün | nie geprüft |
| `RestoreAtlasLayerSelectionTests.test_leere_gespeicherte_layer_id_tut_nichts` | Prüft, dass eine leere gespeicherte Layer-ID das Projekt gar nicht erst anfragt. | grün | nie geprüft |
| `ThemeCollectionSignalsTests.test_connect_verbindet_alle_signale` | Prüft, dass _connect_theme_collection_signals alle Signale der Theme-Collection verbindet. | grün | nie geprüft |
| `ThemeCollectionSignalsTests.test_connect_ist_idempotent_wenn_schon_verbunden` | Prüft, dass _connect_theme_collection_signals bei bereits verbundenem Signal nichts erneut tut. | grün | nie geprüft |
| `ThemeCollectionSignalsTests.test_disconnect_trennt_alle_signale` | Prüft, dass _disconnect_theme_collection_signals alle verbundenen Theme-Signale trennt und zurücksetzt. | grün | nie geprüft |
| `RefreshThemaComboLiveTests.test_erhaelt_vorherige_auswahl_wenn_noch_vorhanden` | Prüft, dass _refresh_thema_combo_live die vorherige Auswahl beibehält, wenn sie noch existiert. | grün | nie geprüft |
| `RefreshThemaComboLiveTests.test_faellt_auf_wie_kartenfenster_zurueck_wenn_auswahl_verschwunden` | Prüft, dass _refresh_thema_combo_live auf 'wie Kartenfenster' zurückfällt, wenn die Auswahl verschwunden ist. | grün | nie geprüft |
| `GetGespeicherteThemenTests.test_dedupliziert_und_filtert_leere_eintraege` | Prüft, dass _get_gespeicherte_themen Duplikate und leere/None-Einträge entfernt. | grün | nie geprüft |
| `GetGespeicherteThemenTests.test_fehler_liefert_leere_liste` | Prüft, dass ein Fehler beim Zugriff auf die Theme-Collection eine leere Liste liefert. | grün | nie geprüft |
| `GetCurrentCanvasScaleTests.test_liefert_skalierung_als_float` | Prüft, dass _get_current_canvas_scale die Canvas-Skalierung als float liefert. | grün | nie geprüft |
| `GetCurrentCanvasScaleTests.test_ohne_canvas_liefert_none` | Prüft, dass _get_current_canvas_scale ohne verfügbares Kartenfenster None liefert. | grün | nie geprüft |
| `GetCurrentCanvasScaleTests.test_skalierung_null_liefert_none` | Prüft, dass eine Skalierung von 0 als None statt als 0.0 gilt. | grün | nie geprüft |
| `OnAtlasLayerChangedTests.test_none_oder_leer_setzt_variable_leer` | Prüft, dass None oder ein leerer Wert die Abdeckungslayer-Variable leeren. | grün | nie geprüft |
| `OnAtlasLayerChangedTests.test_layer_objekt_mit_id_methode_setzt_dessen_id` | Prüft, dass ein echtes Layer-Objekt (mit id()-Methode) dessen ID speichert. | grün | nie geprüft |
| `OnAtlasLayerChangedTests.test_string_fallback_sucht_layer_ueber_namen` | Prüft, dass ohne id()-Methode über den Layernamen im Projekt gesucht und dessen ID gespeichert wird. | grün | nie geprüft |
| `OnAuswahlAsAtlasClickedTests.test_erfolgreicher_layer_aktualisiert_atlas_ui` | Prüft, dass ein erfolgreich erzeugter Atlas-Layer den Atlas-Bereich öffnet und ins Dropdown übernimmt. | grün | nie geprüft |
| `OnAuswahlAsAtlasClickedTests.test_ohne_erzeugten_layer_tut_nichts_weiter` | Prüft, dass ohne erzeugten Atlas-Layer keine UI-Aktualisierung stattfindet. | grün | nie geprüft |
| `PopulateAtlasLayerComboTests.test_befuellt_combo_ohne_druckrechteck_und_leere_namen` | Prüft, dass _populate_atlas_layer_combo alle Layernamen außer 'Druckrechteck' und leeren Namen einträgt. | grün | nie geprüft |
| `PopulateAtlasLayerComboTests.test_ohne_atlas_layer_combo_tut_nichts` | Prüft, dass _populate_atlas_layer_combo ohne Atlas-Dropdown keine Ausnahme wirft. | grün | nie geprüft |
| `OnAtlasErzeugenChangedTests.test_aktiviert_speichert_variable_und_aktiviert_widgets` | Prüft, dass ein aktivierter Atlas-Schalter die Variable setzt und Layer-Combo/Button aktiviert. | grün | nie geprüft |
| `OnAtlasErzeugenChangedTests.test_deaktiviert_speichert_variable_und_deaktiviert_widgets` | Prüft, dass ein deaktivierter Atlas-Schalter die Variable setzt und Layer-Combo/Button deaktiviert. | grün | nie geprüft |
| `OnAtlasErzeugenChangedTests.test_ohne_widgets_wirft_keine_ausnahme` | Prüft, dass _on_atlas_erzeugen_changed ohne Atlas-Combo/-Button keine Ausnahme wirft. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_pruef_ergebnis.py` ### `Plugin_SN_Basis/tests/test_pruef_ergebnis.py`
Worum es in der Datei geht: Tests für sn_basis/modules/pruef_ergebnis.py::ist_verfahrens_db_aktion/erlaubte_persistierung (Issue #65). Worum es in der Datei geht: Tests für sn_basis/modules/pruef_ergebnis.py::ist_verfahrens_db_aktion/erlaubte_persistierung/dateipfad (Issue #65/#67).
Testgruppen: Testgruppen:
- `IstVerfahrensDbAktionTests` (2 Testfälle): — (Docstring fehlt) - `IstVerfahrensDbAktionTests` (2 Testfälle): — (Docstring fehlt)
- `ErlaubtePersistierungTests` (2 Testfälle): — (Docstring fehlt) - `ErlaubtePersistierungTests` (2 Testfälle): — (Docstring fehlt)
- `DateipfadTests` (2 Testfälle): — (Docstring fehlt)
| Testfall | prüft | Status | geprüft | | Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- | | --- | --- | --- | --- |
@@ -421,6 +527,8 @@ Testgruppen:
| `IstVerfahrensDbAktionTests.test_liefert_false_fuer_andere_aktionen` | Prüft, dass ist_verfahrens_db_aktion für Nicht-Verfahrens-DB-Aktionen und ohne Aktion False liefert. | grün | nie geprüft | | `IstVerfahrensDbAktionTests.test_liefert_false_fuer_andere_aktionen` | Prüft, dass ist_verfahrens_db_aktion für Nicht-Verfahrens-DB-Aktionen und ohne Aktion False liefert. | grün | nie geprüft |
| `ErlaubtePersistierungTests.test_liefert_true_fuer_erzeugen_ueberschreiben_anhaengen` | Prüft, dass erlaubte_persistierung für Erzeugen/Überschreiben/Anhängen True liefert. | grün | nie geprüft | | `ErlaubtePersistierungTests.test_liefert_true_fuer_erzeugen_ueberschreiben_anhaengen` | Prüft, dass erlaubte_persistierung für Erzeugen/Überschreiben/Anhängen True liefert. | grün | nie geprüft |
| `ErlaubtePersistierungTests.test_liefert_false_fuer_ueberspringen_und_reines_existieren` | Prüft, dass erlaubte_persistierung bei Überspringen und reinem 'datei_existiert' False liefert. | grün | nie geprüft | | `ErlaubtePersistierungTests.test_liefert_false_fuer_ueberspringen_und_reines_existieren` | Prüft, dass erlaubte_persistierung bei Überspringen und reinem 'datei_existiert' False liefert. | grün | nie geprüft |
| `DateipfadTests.test_liefert_path_wenn_kontext_ein_path_ist` | Prüft, dass dateipfad den Kontext liefert, wenn dieser bereits ein Path-Objekt ist. | grün | nie geprüft |
| `DateipfadTests.test_liefert_none_wenn_kontext_kein_path_ist` | Prüft, dass dateipfad None liefert, wenn der Kontext kein Path-Objekt ist (z. B. String oder Layer). | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_pruefmanager.py` ### `Plugin_SN_Basis/tests/test_pruefmanager.py`
@@ -459,12 +567,13 @@ Testgruppen:
### `Plugin_SN_Basis/tests/test_qgiscore_wrapper_helpers.py` ### `Plugin_SN_Basis/tests/test_qgiscore_wrapper_helpers.py`
Worum es in der Datei geht: Tests für sn_basis/functions/qgiscore_wrapper.py::polygon_zu_linie/layer_exists_in_gpkg (Issue #65). Worum es in der Datei geht: Tests für sn_basis/functions/qgiscore_wrapper.py::polygon_zu_linie/layer_exists_in_gpkg/create_buffer_layer (Issue #65/#67).
Testgruppen: Testgruppen:
- `PolygonZuLinieTests` (7 Testfälle): — (Docstring fehlt) - `PolygonZuLinieTests` (7 Testfälle): — (Docstring fehlt)
- `LayerExistsInGpkgTests` (4 Testfälle): — (Docstring fehlt) - `LayerExistsInGpkgTests` (4 Testfälle): — (Docstring fehlt)
- `CreateBufferLayerTests` (3 Testfälle): Deckt nur die Wächter ab: die eigentliche Pufferbildung importiert `qgis.core.QgsFeature`
| Testfall | prüft | Status | geprüft | | Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- | | --- | --- | --- | --- |
@@ -479,14 +588,19 @@ Testgruppen:
| `LayerExistsInGpkgTests.test_leerer_pfad_oder_layername_liefert_false` | Prüft, dass ein leerer Pfad oder Layername False liefert. | grün | nie geprüft | | `LayerExistsInGpkgTests.test_leerer_pfad_oder_layername_liefert_false` | Prüft, dass ein leerer Pfad oder Layername False liefert. | grün | nie geprüft |
| `LayerExistsInGpkgTests.test_vorhandener_layer_liefert_true` | Prüft, dass ein in gpkg_contents eingetragener Layername als vorhanden erkannt wird. | grün | nie geprüft | | `LayerExistsInGpkgTests.test_vorhandener_layer_liefert_true` | Prüft, dass ein in gpkg_contents eingetragener Layername als vorhanden erkannt wird. | grün | nie geprüft |
| `LayerExistsInGpkgTests.test_fehlender_layer_liefert_false` | Prüft, dass ein nicht in gpkg_contents eingetragener Layername als nicht vorhanden gilt. | grün | nie geprüft | | `LayerExistsInGpkgTests.test_fehlender_layer_liefert_false` | Prüft, dass ein nicht in gpkg_contents eingetragener Layername als nicht vorhanden gilt. | grün | nie geprüft |
| `CreateBufferLayerTests.test_ohne_qgis_liefert_none` | Prüft, dass create_buffer_layer ohne verfügbares QGIS None liefert. | grün | nie geprüft |
| `CreateBufferLayerTests.test_fehlender_source_layer_liefert_none` | Prüft, dass ein fehlender Quelllayer (None) None liefert, auch wenn QGIS verfügbar wäre. | grün | nie geprüft |
| `CreateBufferLayerTests.test_source_layer_ohne_getfeatures_liefert_none` | Prüft, dass ein Quelllayer ohne getFeatures()-Methode None liefert. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_qgisui_wrapper_helpers.py` ### `Plugin_SN_Basis/tests/test_qgisui_wrapper_helpers.py`
Worum es in der Datei geht: Tests für sn_basis/functions/qgisui_wrapper.py::add_layer_to_project (Issue #65). Worum es in der Datei geht: Tests für sn_basis/functions/qgisui_wrapper.py::add_layer_to_project/find_dock_widgets/add_menu/remove_menu (Issue #65/#67).
Testgruppen: Testgruppen:
- `AddLayerToProjectTests` (4 Testfälle): — (Docstring fehlt) - `AddLayerToProjectTests` (4 Testfälle): — (Docstring fehlt)
- `FindDockWidgetsTests` (3 Testfälle): — (Docstring fehlt)
- `AddRemoveMenuTests` (5 Testfälle): — (Docstring fehlt)
| Testfall | prüft | Status | geprüft | | Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- | | --- | --- | --- | --- |
@@ -494,6 +608,14 @@ Testgruppen:
| `AddLayerToProjectTests.test_mock_modus_liefert_true_ohne_projektzugriff` | Prüft, dass im Mock-Modus (ohne QGIS) ein gültiger Layer True liefert, ohne das Projekt anzufassen. | grün | nie geprüft | | `AddLayerToProjectTests.test_mock_modus_liefert_true_ohne_projektzugriff` | Prüft, dass im Mock-Modus (ohne QGIS) ein gültiger Layer True liefert, ohne das Projekt anzufassen. | grün | nie geprüft |
| `AddLayerToProjectTests.test_mit_qgis_fuegt_layer_dem_projekt_hinzu` | Prüft, dass bei verfügbarem QGIS der Layer über QgsProject.instance().addMapLayer hinzugefügt wird. | grün | nie geprüft | | `AddLayerToProjectTests.test_mit_qgis_fuegt_layer_dem_projekt_hinzu` | Prüft, dass bei verfügbarem QGIS der Layer über QgsProject.instance().addMapLayer hinzugefügt wird. | grün | nie geprüft |
| `AddLayerToProjectTests.test_mit_qgis_fehler_liefert_false` | Prüft, dass ein Fehler beim Hinzufügen zum Projekt abgefangen wird und False liefert. | grün | nie geprüft | | `AddLayerToProjectTests.test_mit_qgis_fehler_liefert_false` | Prüft, dass ein Fehler beim Hinzufügen zum Projekt abgefangen wird und False liefert. | grün | nie geprüft |
| `FindDockWidgetsTests.test_ohne_main_window_liefert_leere_liste` | Prüft, dass find_dock_widgets ohne verfügbares Hauptfenster eine leere Liste liefert. | grün | nie geprüft |
| `FindDockWidgetsTests.test_liefert_dock_widgets_des_main_window` | Prüft, dass find_dock_widgets die vom Hauptfenster gefundenen Dock-Widgets durchreicht. | grün | nie geprüft |
| `FindDockWidgetsTests.test_fehler_beim_suchen_liefert_leere_liste` | Prüft, dass ein Fehler beim Suchen der Dock-Widgets abgefangen wird und eine leere Liste liefert. | grün | nie geprüft |
| `AddRemoveMenuTests.test_add_menu_ohne_main_window_tut_nichts` | Prüft, dass add_menu ohne Hauptfenster keine Ausnahme wirft. | grün | nie geprüft |
| `AddRemoveMenuTests.test_add_menu_mit_echtem_qt_menu_fuegt_es_der_menubar_hinzu` | Prüft, dass ein echtes Qt-Menü (mit menuAction) der Menüleiste hinzugefügt wird. | grün | nie geprüft |
| `AddRemoveMenuTests.test_add_menu_ohne_menuaction_wird_ignoriert` | Prüft, dass ein Objekt ohne menuAction nicht an die Menüleiste übergeben wird. | grün | nie geprüft |
| `AddRemoveMenuTests.test_remove_menu_entfernt_ueber_menuaction` | Prüft, dass remove_menu das Menü über dessen menuAction() aus der Menüleiste entfernt. | grün | nie geprüft |
| `AddRemoveMenuTests.test_remove_menu_ohne_main_window_tut_nichts` | Prüft, dass remove_menu ohne Hauptfenster keine Ausnahme wirft. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_settings_logic.py` ### `Plugin_SN_Basis/tests/test_settings_logic.py`
@@ -512,12 +634,13 @@ Testgruppen:
### `Plugin_SN_Basis/tests/test_settings_tab.py` ### `Plugin_SN_Basis/tests/test_settings_tab.py`
Worum es in der Datei geht: Tests für sn_basis/ui/tabs/settings_tab.py::save_data/load_data (Issue #65). Worum es in der Datei geht: Tests für sn_basis/ui/tabs/settings_tab.py::save_data/load_data/_build_input (Issue #65/#67).
Testgruppen: Testgruppen:
- `SaveDataTests` (2 Testfälle): — (Docstring fehlt) - `SaveDataTests` (2 Testfälle): — (Docstring fehlt)
- `LoadDataTests` (4 Testfälle): — (Docstring fehlt) - `LoadDataTests` (4 Testfälle): — (Docstring fehlt)
- `BuildInputTests` (2 Testfälle): — (Docstring fehlt)
| Testfall | prüft | Status | geprüft | | Testfall | prüft | Status | geprüft |
| --- | --- | --- | --- | | --- | --- | --- | --- |
@@ -527,6 +650,8 @@ Testgruppen:
| `LoadDataTests.test_ohne_gespeicherten_wert_bleibt_textfeld_leer` | Prüft, dass load_data ohne gespeicherten Wert das Textfeld auf einen leeren Text setzt. | grün | nie geprüft | | `LoadDataTests.test_ohne_gespeicherten_wert_bleibt_textfeld_leer` | Prüft, dass load_data ohne gespeicherten Wert das Textfeld auf einen leeren Text setzt. | grün | nie geprüft |
| `LoadDataTests.test_waehlt_combobox_eintrag_bei_bekanntem_namen` | Prüft, dass load_data im Landkreis-Dropdown den gespeicherten Landkreisnamen auswählt. | grün | nie geprüft | | `LoadDataTests.test_waehlt_combobox_eintrag_bei_bekanntem_namen` | Prüft, dass load_data im Landkreis-Dropdown den gespeicherten Landkreisnamen auswählt. | grün | nie geprüft |
| `LoadDataTests.test_unbekannter_gespeicherter_name_waehlt_ersten_eintrag` | Prüft, dass load_data bei einem nicht mehr vorhandenen Landkreisnamen auf den ersten Eintrag zurückfällt. | grün | nie geprüft | | `LoadDataTests.test_unbekannter_gespeicherter_name_waehlt_ersten_eintrag` | Prüft, dass load_data bei einem nicht mehr vorhandenen Landkreisnamen auf den ersten Eintrag zurückfällt. | grün | nie geprüft |
| `BuildInputTests.test_landkreis_feld_liefert_combobox_mit_allen_landkreisen` | Prüft, dass _build_input für das Landkreis-Feld eine ComboBox mit Platzhalter und allen Landkreisen liefert. | grün | nie geprüft |
| `BuildInputTests.test_anderes_feld_liefert_lineedit` | Prüft, dass _build_input für ein normales Feld ein leeres Textfeld liefert. | grün | nie geprüft |
### `Plugin_SN_Basis/tests/test_stilpruefer.py` ### `Plugin_SN_Basis/tests/test_stilpruefer.py`
@@ -1111,7 +1236,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, aus dem Quelltext erschließen. Jeder Eintrag braucht eine einzeilige Beschreibung im Testfall,
dann verschwindet er hier von selbst. dann verschwindet er hier von selbst.
### `sn_basis` – 0 von 249 Testfällen ohne Beschreibung ### `sn_basis` – 0 von 317 Testfällen ohne Beschreibung
Keine Lücken. Keine Lücken.
@@ -1316,53 +1441,47 @@ 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. 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.
### `sn_basis` – 115 von 229 (50 %) ohne Testbezug ### `sn_basis` – 76 von 229 (33 %) ohne Testbezug
#### `functions/dialog_wrapper.py` (9) #### `functions/dialog_wrapper.py` (9)
- `show_info_dialog` (Zeile 42) - `show_info_dialog` (Zeile 42)
- `ask_detailpruefung_oder_vg_laden` (Zeile 185) - `ask_detailpruefung_oder_vg_laden` (Zeile 192)
- `ask_detailpruefung_oder_abbrechen` (Zeile 235) - `ask_detailpruefung_oder_abbrechen` (Zeile 244)
- `ProgressDialog.set_total` (Zeile 328) - `ProgressDialog.set_total` (Zeile 339)
- `ProgressDialog.set_value` (Zeile 336) - `ProgressDialog.set_value` (Zeile 348)
- `ProgressDialog.set_label` (Zeile 348) - `ProgressDialog.set_label` (Zeile 361)
- `ProgressDialog.is_canceled` (Zeile 357) - `ProgressDialog.is_canceled` (Zeile 371)
- `ProgressDialog.raise_to_front` (Zeile 373) - `ProgressDialog.raise_to_front` (Zeile 389)
- `create_progress_dialog` (Zeile 390) - `create_progress_dialog` (Zeile 408)
#### `functions/message_wrapper.py` (2) #### `functions/message_wrapper.py` (2)
- `info` (Zeile 67) - `info` (Zeile 67)
- `success` (Zeile 82) - `success` (Zeile 84)
#### `functions/os_wrapper.py` (6) #### `functions/os_wrapper.py` (5)
- `normalize_path` (Zeile 43) - `normalize_path` (Zeile 43)
- `get_home_dir` (Zeile 53) - `get_home_dir` (Zeile 55)
- `is_absolute_path` (Zeile 60) - `is_absolute_path` (Zeile 64)
- `basename` (Zeile 68) - `basename` (Zeile 75)
- `is_case_sensitive_fs` (Zeile 80) - `path_suffix` (Zeile 106)
- `path_suffix` (Zeile 96)
#### `functions/qgisui_wrapper.py` (5) #### `functions/qgisui_wrapper.py` (1)
- `get_main_window` (Zeile 131) - `add_toolbar` (Zeile 204)
- `add_menu` (Zeile 178)
- `remove_menu` (Zeile 188)
- `add_toolbar` (Zeile 201)
- `remove_toolbar` (Zeile 208)
#### `functions/qt_wrapper.py` (2) #### `functions/qt_wrapper.py` (2)
- `exec_dialog` (Zeile 60) - `exec_dialog` (Zeile 60)
- `debug_qt_status` (Zeile 64) - `debug_qt_status` (Zeile 67)
#### `modules/DataGrabber.py` (4) #### `modules/DataGrabber.py` (3)
- `DataGrabber.set_source` (Zeile 68) - `DataGrabber.set_source` (Zeile 68)
- `DataGrabber._process_database_source` (Zeile 309) - `DataGrabber._process_database_source` (Zeile 312)
- `DataGrabber._process_service_source` (Zeile 320) - `DataGrabber._process_service_source` (Zeile 324)
- `DataGrabber._aggregate_results` (Zeile 330)
#### `modules/Dateipruefer.py` (2) #### `modules/Dateipruefer.py` (2)
@@ -1376,7 +1495,7 @@ Heuristik, kein Beweis: Diese Funktionen und Methoden kommen unter ihrem Namen i
#### `modules/LayerLoader.py` (2) #### `modules/LayerLoader.py` (2)
- `LayerLoader._was_canceled` (Zeile 42) - `LayerLoader._was_canceled` (Zeile 42)
- `LayerLoader._process_events` (Zeile 50) - `LayerLoader._process_events` (Zeile 51)
#### `modules/linkpruefer.py` (3) #### `modules/linkpruefer.py` (3)
@@ -1387,105 +1506,63 @@ Heuristik, kein Beweis: Diese Funktionen und Methoden kommen unter ihrem Namen i
#### `modules/print_layout.py` (11) #### `modules/print_layout.py` (11)
- `PrintLayout._create_map_item` (Zeile 98) - `PrintLayout._create_map_item` (Zeile 98)
- `PrintLayout._set_item_frame_stroke_width` (Zeile 119) - `PrintLayout._set_item_frame_stroke_width` (Zeile 120)
- `PrintLayout._fit_extent_to_map_item` (Zeile 154) - `PrintLayout._fit_extent_to_map_item` (Zeile 156)
- `PrintLayout.add_text_label` (Zeile 211) - `PrintLayout.add_text_label` (Zeile 214)
- `PrintLayout._setup_layout_objects` (Zeile 242) - `PrintLayout._setup_layout_objects` (Zeile 246)
- `PrintLayout._create_label_item` (Zeile 373) - `PrintLayout._create_label_item` (Zeile 378)
- `PrintLayout._resolve_visible_map_layers` (Zeile 470) - `PrintLayout._resolve_visible_map_layers` (Zeile 476)
- `PrintLayout._apply_grid_common_settings` (Zeile 791) - `PrintLayout._apply_grid_common_settings` (Zeile 798)
- `PrintLayout._safe_grid_call` (Zeile 797) - `PrintLayout._safe_grid_call` (Zeile 805)
- `PrintLayout._apply_grid_annotation_text_style` (Zeile 808) - `PrintLayout._apply_grid_annotation_text_style` (Zeile 817)
- `PrintLayout._create_rectangle_box_item` (Zeile 908) - `PrintLayout._create_rectangle_box_item` (Zeile 918)
#### `modules/print_layout_baufreigabe.py` (3) #### `modules/print_layout_baufreigabe.py` (3)
- `PrintLayoutBaufreigabe.create_baufreigabe_layout` (Zeile 90) - `PrintLayoutBaufreigabe.create_baufreigabe_layout` (Zeile 90)
- `PrintLayoutBaufreigabe._setup_layout_objects_baufreigabe` (Zeile 262) - `PrintLayoutBaufreigabe._setup_layout_objects_baufreigabe` (Zeile 264)
- `PrintLayoutBaufreigabe._calc_atlas_margin_percent` (Zeile 394) - `PrintLayoutBaufreigabe._calc_atlas_margin_percent` (Zeile 398)
#### `modules/print_logic.py` (27) #### `modules/print_logic.py` (20)
- `PrintLogic._failed_result` (Zeile 123) - `PrintLogic._failed_result` (Zeile 123)
- `PrintLogic._show_target_size_too_small` (Zeile 126) - `PrintLogic._show_target_size_too_small` (Zeile 127)
- `PrintLogic._is_enabled_flag` (Zeile 133) - `PrintLogic._is_enabled_flag` (Zeile 135)
- `PrintLogic._resolve_layer_from_project` (Zeile 138) - `PrintLogic._resolve_layer_from_project` (Zeile 141)
- `PrintLogic._resolve_active_layer` (Zeile 158) - `PrintLogic._resolve_active_layer` (Zeile 162)
- `PrintLogic._get_druckpuffer_cm` (Zeile 167) - `PrintLogic._get_druckpuffer_cm` (Zeile 172)
- `PrintLogic._get_druckpuffer_m` (Zeile 175) - `PrintLogic._get_druckpuffer_m` (Zeile 181)
- `PrintLogic._import_qgis_symbol` (Zeile 178) - `PrintLogic._import_qgis_symbol` (Zeile 185)
- `PrintLogic._build_rectangle` (Zeile 185) - `PrintLogic._build_rectangle` (Zeile 193)
- `PrintLogic._clone_extent` (Zeile 194) - `PrintLogic._clone_extent` (Zeile 203)
- `PrintLogic._get_existing_layer_by_name` (Zeile 260) - `PrintLogic._get_existing_layer_by_name` (Zeile 270)
- `PrintLogic._create_druckrechteck_layer` (Zeile 273) - `PrintLogic._create_druckrechteck_layer` (Zeile 284)
- `PrintLogic._clear_layer_features` (Zeile 301) - `PrintLogic._clear_layer_features` (Zeile 313)
- `PrintLogic.create_atlas_layer_from_selection` (Zeile 325) - `PrintLogic.configure_atlas_for_baufreigabe_layout` (Zeile 483)
- `PrintLogic.configure_atlas_for_baufreigabe_layout` (Zeile 468) - `PrintLogic._store_druckrechteck` (Zeile 631)
- `PrintLogic._store_druckrechteck` (Zeile 614) - `PrintLogic.activate_druckrechteck_capture` (Zeile 680)
- `PrintLogic.activate_druckrechteck_capture` (Zeile 662) - `PrintLogic._resolve_selection_layer` (Zeile 811)
- `PrintLogic._resolve_selection_layer` (Zeile 792) - `PrintLogic._get_selected_extent` (Zeile 825)
- `PrintLogic._get_selected_extent` (Zeile 805) - `PrintLogic._get_plot_dimensions_mm` (Zeile 1078)
- `PrintLogic.set_kartenname_for_auswahl` (Zeile 961) - `PrintLogic._get_required_map_dimensions_mm` (Zeile 1088)
- `PrintLogic.set_plotmassstab_for_auswahl` (Zeile 965)
- `PrintLogic.set_view_for_auswahl` (Zeile 976)
- `PrintLogic.set_zielgroesse_for_auswahl` (Zeile 982)
- `PrintLogic.set_formfaktor` (Zeile 985)
- `PrintLogic._get_plot_dimensions_mm` (Zeile 1052)
- `PrintLogic._get_required_map_dimensions_mm` (Zeile 1061)
- `PrintLogic.druckvorlage_anlegen` (Zeile 1161)
#### `modules/pruef_ergebnis.py` (1)
- `pruef_ergebnis.dateipfad` (Zeile 167)
#### `modules/Pruefmanager.py` (5) #### `modules/Pruefmanager.py` (5)
- `Pruefmanager.report_summary` (Zeile 45) - `Pruefmanager.report_summary` (Zeile 45)
- `Pruefmanager.zeige_hinweis` (Zeile 62) - `Pruefmanager.zeige_hinweis` (Zeile 63)
- `Pruefmanager._handle_datei_existiert` (Zeile 83) - `Pruefmanager._handle_datei_existiert` (Zeile 87)
- `Pruefmanager._handle_verfahrensgebiet_layer_existiert` (Zeile 230) - `Pruefmanager._handle_verfahrensgebiet_layer_existiert` (Zeile 234)
- `Pruefmanager._ask_use_or_replace_pufferlayer` (Zeile 273) - `Pruefmanager._ask_use_or_replace_pufferlayer` (Zeile 277)
#### `ui/navigation.py` (6) #### `ui/tabs/print_tab.py` (7)
- `Navigation.init_ui` (Zeile 33)
- `Navigation.add_action` (Zeile 68)
- `Navigation.finalize_menu_and_toolbar` (Zeile 81)
- `Navigation.set_active_plugin` (Zeile 94)
- `Navigation.remove_action` (Zeile 104)
- `Navigation.remove_all` (Zeile 115)
#### `ui/tabs/print_tab.py` (25)
- `PrintTab.set_services` (Zeile 94)
- `PrintTab._build_ui` (Zeile 115) - `PrintTab._build_ui` (Zeile 115)
- `PrintTab._restore_state` (Zeile 267) - `PrintTab._on_kartenname_changed` (Zeile 335)
- `PrintTab._on_kartenname_changed` (Zeile 334) - `PrintTab._on_massstab_changed` (Zeile 349)
- `PrintTab._on_massstab_changed` (Zeile 347) - `PrintTab._on_zielgroesse_changed` (Zeile 361)
- `PrintTab._on_thema_changed` (Zeile 352) - `PrintTab._on_formfaktor_changed` (Zeile 367)
- `PrintTab._on_zielgroesse_changed` (Zeile 357) - `PrintTab._on_druckbereich_changed` (Zeile 374)
- `PrintTab._on_formfaktor_changed` (Zeile 362) - `PrintTab._format_druckpuffer_label` (Zeile 432)
- `PrintTab._on_druckbereich_changed` (Zeile 368)
- `PrintTab._on_atlas_erzeugen_changed` (Zeile 377)
- `PrintTab._on_druckpuffer_clicked` (Zeile 392)
- `PrintTab._format_druckpuffer_label` (Zeile 425)
- `PrintTab._on_vorlage_erstellen` (Zeile 428)
- `PrintTab._disconnect_project_signals` (Zeile 441)
- `PrintTab._connect_project_signals` (Zeile 464)
- `PrintTab._toggle_atlas` (Zeile 489)
- `PrintTab._restore_atlas_layer_selection` (Zeile 495)
- `PrintTab._disconnect_theme_collection_signals` (Zeile 519)
- `PrintTab._connect_theme_collection_signals` (Zeile 538)
- `PrintTab._refresh_thema_combo_live` (Zeile 565)
- `PrintTab._get_gespeicherte_themen` (Zeile 585)
- `PrintTab._get_current_canvas_scale` (Zeile 602)
- `PrintTab._on_atlas_layer_changed` (Zeile 612)
- `PrintTab._on_auswahl_as_atlas_clicked` (Zeile 641)
- `PrintTab._populate_atlas_layer_combo` (Zeile 679)
#### `ui/tabs/settings_tab.py` (1)
- `SettingsTab._build_input` (Zeile 118)
### `sn_verfahrensgebiet` – 34 von 104 (33 %) ohne Testbezug ### `sn_verfahrensgebiet` – 34 von 104 (33 %) ohne Testbezug