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
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 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.
Mit Beschreibung (Docstring): 356 von 501 (71 %).
Fachlich geprüft: 55 von 501 (11 %) aktuell, 0 veraltet seit Codeänderung, 446 nie geprüft.
Strukturelle Lücken (heuristisch, Namensabgleich): 188 von 413 (46 %) Funktionen/Methoden ohne erkennbaren Testbezug – Abschnitt „Ungetestete Funktionen“.
Gesamt: 3 Pakete, 49 Testdateien, 569 Testfälle – 526 grün, 35 rot (Baseline), 8 übersprungen.
Mit Beschreibung (Docstring): 424 von 569 (75 %).
Fachlich geprüft: 55 von 569 (10 %) aktuell, 0 veraltet seit Codeänderung, 514 nie geprüft.
Strukturelle Lücken (heuristisch, Namensabgleich): 149 von 413 (36 %) 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` | 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_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
@@ -36,7 +36,7 @@ Strukturelle Lücken (heuristisch, Namensabgleich): 188 von 413 (46 %) Funktione
## 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`
@@ -66,7 +66,7 @@ Worum es in der Datei geht: — (Docstring fehlt)
Testgruppen:
- `TestDataGrabber` (6 Testfälle): — (Docstring fehlt)
- `TestDataGrabber` (8 Testfälle): — (Docstring fehlt)
| 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_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_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`
@@ -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_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`
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_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`
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:
- `IstVerfahrensDbAktionTests` (2 Testfälle): — (Docstring fehlt)
- `ErlaubtePersistierungTests` (2 Testfälle): — (Docstring fehlt)
- `DateipfadTests` (2 Testfälle): — (Docstring fehlt)
| 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 |
| `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 |
| `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`
@@ -459,12 +567,13 @@ Testgruppen:
### `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:
- `PolygonZuLinieTests` (7 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 |
| --- | --- | --- | --- |
@@ -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_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 |
| `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`
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:
- `AddLayerToProjectTests` (4 Testfälle): — (Docstring fehlt)
- `FindDockWidgetsTests` (3 Testfälle): — (Docstring fehlt)
- `AddRemoveMenuTests` (5 Testfälle): — (Docstring fehlt)
| 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_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 |
| `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`
@@ -512,12 +634,13 @@ Testgruppen:
### `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:
- `SaveDataTests` (2 Testfälle): — (Docstring fehlt)
- `LoadDataTests` (4 Testfälle): — (Docstring fehlt)
- `BuildInputTests` (2 Testfälle): — (Docstring fehlt)
| 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_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 |
| `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`
@@ -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,
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.
@@ -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.
### `sn_basis` – 115 von 229 (50 %) ohne Testbezug
### `sn_basis` – 76 von 229 (33 %) ohne Testbezug
#### `functions/dialog_wrapper.py` (9)
- `show_info_dialog` (Zeile 42)
- `ask_detailpruefung_oder_vg_laden` (Zeile 185)
- `ask_detailpruefung_oder_abbrechen` (Zeile 235)
- `ProgressDialog.set_total` (Zeile 328)
- `ProgressDialog.set_value` (Zeile 336)
- `ProgressDialog.set_label` (Zeile 348)
- `ProgressDialog.is_canceled` (Zeile 357)
- `ProgressDialog.raise_to_front` (Zeile 373)
- `create_progress_dialog` (Zeile 390)
- `ask_detailpruefung_oder_vg_laden` (Zeile 192)
- `ask_detailpruefung_oder_abbrechen` (Zeile 244)
- `ProgressDialog.set_total` (Zeile 339)
- `ProgressDialog.set_value` (Zeile 348)
- `ProgressDialog.set_label` (Zeile 361)
- `ProgressDialog.is_canceled` (Zeile 371)
- `ProgressDialog.raise_to_front` (Zeile 389)
- `create_progress_dialog` (Zeile 408)
#### `functions/message_wrapper.py` (2)
- `info` (Zeile 67)
- `success` (Zeile 82)
- `success` (Zeile 84)
#### `functions/os_wrapper.py` (6)
#### `functions/os_wrapper.py` (5)
- `normalize_path` (Zeile 43)
- `get_home_dir` (Zeile 53)
- `is_absolute_path` (Zeile 60)
- `basename` (Zeile 68)
- `is_case_sensitive_fs` (Zeile 80)
- `path_suffix` (Zeile 96)
- `get_home_dir` (Zeile 55)
- `is_absolute_path` (Zeile 64)
- `basename` (Zeile 75)
- `path_suffix` (Zeile 106)
#### `functions/qgisui_wrapper.py` (5)
#### `functions/qgisui_wrapper.py` (1)
- `get_main_window` (Zeile 131)
- `add_menu` (Zeile 178)
- `remove_menu` (Zeile 188)
- `add_toolbar` (Zeile 201)
- `remove_toolbar` (Zeile 208)
- `add_toolbar` (Zeile 204)
#### `functions/qt_wrapper.py` (2)
- `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._process_database_source` (Zeile 309)
- `DataGrabber._process_service_source` (Zeile 320)
- `DataGrabber._aggregate_results` (Zeile 330)
- `DataGrabber._process_database_source` (Zeile 312)
- `DataGrabber._process_service_source` (Zeile 324)
#### `modules/Dateipruefer.py` (2)
@@ -1376,7 +1495,7 @@ Heuristik, kein Beweis: Diese Funktionen und Methoden kommen unter ihrem Namen i
#### `modules/LayerLoader.py` (2)
- `LayerLoader._was_canceled` (Zeile 42)
- `LayerLoader._process_events` (Zeile 50)
- `LayerLoader._process_events` (Zeile 51)
#### `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)
- `PrintLayout._create_map_item` (Zeile 98)
- `PrintLayout._set_item_frame_stroke_width` (Zeile 119)
- `PrintLayout._fit_extent_to_map_item` (Zeile 154)
- `PrintLayout.add_text_label` (Zeile 211)
- `PrintLayout._setup_layout_objects` (Zeile 242)
- `PrintLayout._create_label_item` (Zeile 373)
- `PrintLayout._resolve_visible_map_layers` (Zeile 470)
- `PrintLayout._apply_grid_common_settings` (Zeile 791)
- `PrintLayout._safe_grid_call` (Zeile 797)
- `PrintLayout._apply_grid_annotation_text_style` (Zeile 808)
- `PrintLayout._create_rectangle_box_item` (Zeile 908)
- `PrintLayout._set_item_frame_stroke_width` (Zeile 120)
- `PrintLayout._fit_extent_to_map_item` (Zeile 156)
- `PrintLayout.add_text_label` (Zeile 214)
- `PrintLayout._setup_layout_objects` (Zeile 246)
- `PrintLayout._create_label_item` (Zeile 378)
- `PrintLayout._resolve_visible_map_layers` (Zeile 476)
- `PrintLayout._apply_grid_common_settings` (Zeile 798)
- `PrintLayout._safe_grid_call` (Zeile 805)
- `PrintLayout._apply_grid_annotation_text_style` (Zeile 817)
- `PrintLayout._create_rectangle_box_item` (Zeile 918)
#### `modules/print_layout_baufreigabe.py` (3)
- `PrintLayoutBaufreigabe.create_baufreigabe_layout` (Zeile 90)
- `PrintLayoutBaufreigabe._setup_layout_objects_baufreigabe` (Zeile 262)
- `PrintLayoutBaufreigabe._calc_atlas_margin_percent` (Zeile 394)
- `PrintLayoutBaufreigabe._setup_layout_objects_baufreigabe` (Zeile 264)
- `PrintLayoutBaufreigabe._calc_atlas_margin_percent` (Zeile 398)
#### `modules/print_logic.py` (27)
#### `modules/print_logic.py` (20)
- `PrintLogic._failed_result` (Zeile 123)
- `PrintLogic._show_target_size_too_small` (Zeile 126)
- `PrintLogic._is_enabled_flag` (Zeile 133)
- `PrintLogic._resolve_layer_from_project` (Zeile 138)
- `PrintLogic._resolve_active_layer` (Zeile 158)
- `PrintLogic._get_druckpuffer_cm` (Zeile 167)
- `PrintLogic._get_druckpuffer_m` (Zeile 175)
- `PrintLogic._import_qgis_symbol` (Zeile 178)
- `PrintLogic._build_rectangle` (Zeile 185)
- `PrintLogic._clone_extent` (Zeile 194)
- `PrintLogic._get_existing_layer_by_name` (Zeile 260)
- `PrintLogic._create_druckrechteck_layer` (Zeile 273)
- `PrintLogic._clear_layer_features` (Zeile 301)
- `PrintLogic.create_atlas_layer_from_selection` (Zeile 325)
- `PrintLogic.configure_atlas_for_baufreigabe_layout` (Zeile 468)
- `PrintLogic._store_druckrechteck` (Zeile 614)
- `PrintLogic.activate_druckrechteck_capture` (Zeile 662)
- `PrintLogic._resolve_selection_layer` (Zeile 792)
- `PrintLogic._get_selected_extent` (Zeile 805)
- `PrintLogic.set_kartenname_for_auswahl` (Zeile 961)
- `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)
- `PrintLogic._show_target_size_too_small` (Zeile 127)
- `PrintLogic._is_enabled_flag` (Zeile 135)
- `PrintLogic._resolve_layer_from_project` (Zeile 141)
- `PrintLogic._resolve_active_layer` (Zeile 162)
- `PrintLogic._get_druckpuffer_cm` (Zeile 172)
- `PrintLogic._get_druckpuffer_m` (Zeile 181)
- `PrintLogic._import_qgis_symbol` (Zeile 185)
- `PrintLogic._build_rectangle` (Zeile 193)
- `PrintLogic._clone_extent` (Zeile 203)
- `PrintLogic._get_existing_layer_by_name` (Zeile 270)
- `PrintLogic._create_druckrechteck_layer` (Zeile 284)
- `PrintLogic._clear_layer_features` (Zeile 313)
- `PrintLogic.configure_atlas_for_baufreigabe_layout` (Zeile 483)
- `PrintLogic._store_druckrechteck` (Zeile 631)
- `PrintLogic.activate_druckrechteck_capture` (Zeile 680)
- `PrintLogic._resolve_selection_layer` (Zeile 811)
- `PrintLogic._get_selected_extent` (Zeile 825)
- `PrintLogic._get_plot_dimensions_mm` (Zeile 1078)
- `PrintLogic._get_required_map_dimensions_mm` (Zeile 1088)
#### `modules/Pruefmanager.py` (5)
- `Pruefmanager.report_summary` (Zeile 45)
- `Pruefmanager.zeige_hinweis` (Zeile 62)
- `Pruefmanager._handle_datei_existiert` (Zeile 83)
- `Pruefmanager._handle_verfahrensgebiet_layer_existiert` (Zeile 230)
- `Pruefmanager._ask_use_or_replace_pufferlayer` (Zeile 273)
- `Pruefmanager.zeige_hinweis` (Zeile 63)
- `Pruefmanager._handle_datei_existiert` (Zeile 87)
- `Pruefmanager._handle_verfahrensgebiet_layer_existiert` (Zeile 234)
- `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._restore_state` (Zeile 267)
- `PrintTab._on_kartenname_changed` (Zeile 334)
- `PrintTab._on_massstab_changed` (Zeile 347)
- `PrintTab._on_thema_changed` (Zeile 352)
- `PrintTab._on_zielgroesse_changed` (Zeile 357)
- `PrintTab._on_formfaktor_changed` (Zeile 362)
- `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)
- `PrintTab._on_kartenname_changed` (Zeile 335)
- `PrintTab._on_massstab_changed` (Zeile 349)
- `PrintTab._on_zielgroesse_changed` (Zeile 361)
- `PrintTab._on_formfaktor_changed` (Zeile 367)
- `PrintTab._on_druckbereich_changed` (Zeile 374)
- `PrintTab._format_druckpuffer_label` (Zeile 432)
### `sn_verfahrensgebiet` – 34 von 104 (33 %) ohne Testbezug