From cb29620f6e13ebb588c00b70f8efbfcd269bede6 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 18 Sep 2026 13:07:20 +0200 Subject: [PATCH] =?UTF-8?q?Testkatalog=20neu=20erzeugt=20f=C3=BCr=20Basis?= =?UTF-8?q?=20#67?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit sn_basis: 317 Testfälle (32 Testdateien), Kategorie "vielleicht testen" abgeschlossen. modulkarte.md an aktuelle Testdateizahl angepasst. Co-Authored-By: Claude Sonnet 5 --- docs/architektur/modulkarte.md | 2 +- docs/tests/testkatalog.html | 412 +++++++++++++++++++++++---------- docs/tests/testkatalog.md | 329 ++++++++++++++++---------- 3 files changed, 496 insertions(+), 247 deletions(-) diff --git a/docs/architektur/modulkarte.md b/docs/architektur/modulkarte.md index 58f69d4..203f972 100644 --- a/docs/architektur/modulkarte.md +++ b/docs/architektur/modulkarte.md @@ -63,7 +63,7 @@ Legende: ⚠ = über 600 Zeilen, nie komplett laden, per `grep -n "def "` navigi | 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) | | `data/landkreise.json` | Landkreise mit Kennzahl | | `assets/plan-qgis340ExitCrashFix.prompt.md` | KI-Planungsnotiz zum Exit-Crash (historisch) | diff --git a/docs/tests/testkatalog.html b/docs/tests/testkatalog.html index 6c22c40..a81b2f3 100644 --- a/docs/tests/testkatalog.html +++ b/docs/tests/testkatalog.html @@ -121,22 +121,22 @@ Testkatalog der sn_*-Plugins — was die Suite heute prüft, auf einen Blick.
Quelle: docs/tests/testkatalog.md
Baseline: docs/status/testbaseline.json (SHA-256 aeabc946a7f3)
Prüf-Audit: docs/status/testpruefungen.json (SHA-256 68b590c8feef)
-
501Testfälle
-
458grün
+
569Testfälle
+
526grün
35rot (Baseline)
-
71%mit Docstring
-
11%aktuell geprüft
-
46Testdateien
-
46%ohne Testbezug
+
75%mit Docstring
+
10%aktuell geprüft
+
49Testdateien
+
36%ohne Testbezug
Verteilung je Paket
-
sn_basis29 Dateien · 249 Testfälle
+
sn_basis32 Dateien · 317 Testfälle
sn_verfahrensgebiet12 Dateien · 208 Testfälle
sn_plan415 Dateien · 44 Testfälle
@@ -153,9 +153,9 @@

sn_basis

-

Plattform-Plugin · Ordner Plugin_SN_Basis · 29 Testdateien · 249 Testfälle

+

Plattform-Plugin · Ordner Plugin_SN_Basis · 32 Testdateien · 317 Testfälle

- @@ -178,10 +178,10 @@ classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420; classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20; classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08; - classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
CloseEventTests
test_ruft_cleanup_aller_tabs_auf
Prüft, dass closeEvent cleanup() auf allen Tabs des Dock-Widgets aufruft.grünnie geprüft
CloseEventTests
test_ignoriert_tabs_ohne_cleanup
Prüft, dass ein Tab ohne cleanup()-Methode nicht zu einem Fehler führt.grünnie geprüft
CloseEventTests
test_fehler_in_cleanup_wird_abgefangen_und_andere_tabs_laufen_weiter
Prüft, dass ein Fehler in cleanup() eines Tabs nicht die übrigen Tabs verhindert.grünnie geprüft
CloseEventTests
test_setzt_toolbar_action_zurueck
Prüft, dass closeEvent die verknüpfte Toolbar-Action auf 'nicht gedrückt' zurücksetzt.grünnie geprüft
CloseEventTests
test_ohne_action_wird_nichts_zurueckgesetzt
Prüft, dass closeEvent ohne verknüpfte Toolbar-Action keine Ausnahme wirft.grünnie geprüft

— (Docstring fehlt)

Keine Testfälle: Die Datei enthält keine unittest.TestCase-Klasse – sie ist eine reine Hilfsdatei, die beim Testlauf nur importiert wird.

— (Docstring fehlt)

TestDataGrabber 6
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
CloseEventTests
test_ruft_cleanup_aller_tabs_auf
Prüft, dass closeEvent cleanup() auf allen Tabs des Dock-Widgets aufruft.grünnie geprüft
CloseEventTests
test_ignoriert_tabs_ohne_cleanup
Prüft, dass ein Tab ohne cleanup()-Methode nicht zu einem Fehler führt.grünnie geprüft
CloseEventTests
test_fehler_in_cleanup_wird_abgefangen_und_andere_tabs_laufen_weiter
Prüft, dass ein Fehler in cleanup() eines Tabs nicht die übrigen Tabs verhindert.grünnie geprüft
CloseEventTests
test_setzt_toolbar_action_zurueck
Prüft, dass closeEvent die verknüpfte Toolbar-Action auf 'nicht gedrückt' zurücksetzt.grünnie geprüft
CloseEventTests
test_ohne_action_wird_nichts_zurueckgesetzt
Prüft, dass closeEvent ohne verknüpfte Toolbar-Action keine Ausnahme wirft.grünnie geprüft

— (Docstring fehlt)

Keine Testfälle: Die Datei enthält keine unittest.TestCase-Klasse – sie ist eine reine Hilfsdatei, die beim Testlauf nur importiert wird.

— (Docstring fehlt)

TestDataGrabber 8
flowchart TD
   root(["test_datagrabber.py"])
   class root rootnode
-  root --> g1["TestDataGrabber (6)"]
+  root --> g1["TestDataGrabber (8)"]
   class g1 groupnode
   g1 --> t1("analyze_source_type_detects_excel")
   g1 --> t2("analyze_source_type_returns_unknown_filetype")
@@ -189,17 +189,21 @@
   g1 --> t4("analyze_source_type_returns_unbekannte_quelle_on_full_failure")
   g1 --> t5("run_returns_success_summary_with_valid_rows")
   g1 --> t6("run_returns_failure_summary_without_rows")
+  g1 --> t7("aggregate_results_mit_zeilen_liefert_erfolgsergebnis")
+  g1 --> t8("aggregate_results_ohne_zeilen_liefert_keine_validen_eintraege")
   class t1 ok
   class t2 ok
   class t3 ok
   class t4 ok
   class t5 ok
   class t6 ok
+  class t7 ok
+  class t8 ok
   classDef rootnode fill:#1f4038,stroke:#16302a,stroke-width:1px,color:#f4f1e8,font-weight:600;
   classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
-  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
TestDataGrabber
test_analyze_source_type_detects_excel
Prüft, dass eine erreichbare .xlsx-Datei als Quelltyp 'excel' erkannt wird.grüngeprüft am 2026-09-16
TestDataGrabber
test_analyze_source_type_returns_unknown_filetype
Prüft, dass eine erreichbare Datei mit unbekannter Endung als 'unbekannter_dateityp' eingestuft wird.grüngeprüft am 2026-09-16
TestDataGrabber
test_analyze_source_type_detects_service_when_file_check_fails
Prüft, dass eine Quelle als 'dienst' erkannt wird, wenn die Dateiprüfung fehlschlägt, die URL aber erreichbar ist.grüngeprü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üngeprü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üngeprü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üngeprüft am 2026-09-16

— (Docstring fehlt)

TestDateipruefer 12
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
TestDataGrabber
test_analyze_source_type_detects_excel
Prüft, dass eine erreichbare .xlsx-Datei als Quelltyp 'excel' erkannt wird.grüngeprüft am 2026-09-16
TestDataGrabber
test_analyze_source_type_returns_unknown_filetype
Prüft, dass eine erreichbare Datei mit unbekannter Endung als 'unbekannter_dateityp' eingestuft wird.grüngeprüft am 2026-09-16
TestDataGrabber
test_analyze_source_type_detects_service_when_file_check_fails
Prüft, dass eine Quelle als 'dienst' erkannt wird, wenn die Dateiprüfung fehlschlägt, die URL aber erreichbar ist.grüngeprü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üngeprü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üngeprü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üngeprü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ünnie 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ünnie geprüft

— (Docstring fehlt)

TestDateipruefer 12
flowchart TD
   root(["test_dateipruefer.py"])
   class root rootnode
   root --> g1["TestDateipruefer (12)"]
@@ -600,7 +604,61 @@
   classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
-  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
GetMessageBarTests
test_liefert_objekt_mit_pushmessage_methode
Prüft, dass _get_message_bar ein Objekt mit aufrufbarer pushMessage()-Methode liefert.grünnie geprüft
GetMessageBarTests
test_faellt_bei_fehlerhaftem_iface_auf_mock_bar_zurueck
Prüft, dass ein Fehler beim Zugriff auf iface.messageBar() auf eine funktionierende Mock-MessageBar zurückfällt.grünnie 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ünnie 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ünnie geprüft

— (Docstring fehlt)

TestPrintLayout 5
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
GetMessageBarTests
test_liefert_objekt_mit_pushmessage_methode
Prüft, dass _get_message_bar ein Objekt mit aufrufbarer pushMessage()-Methode liefert.grünnie geprüft
GetMessageBarTests
test_faellt_bei_fehlerhaftem_iface_auf_mock_bar_zurueck
Prüft, dass ein Fehler beim Zugriff auf iface.messageBar() auf eine funktionierende Mock-MessageBar zurückfällt.grünnie 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ünnie 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ünnie geprüft

Tests für sn_basis/ui/navigation.py::Navigation (Issue #67, ohne init_ui – s. Docstring dort).

AddActionTests 2FinalizeMenuAndToolbarTests 2SetActivePluginTests 2RemoveActionTests 3RemoveAllTests 2
flowchart TD
+  root(["test_navigation.py"])
+  class root rootnode
+  root --> g1["AddActionTests (2)"]
+  class g1 groupnode
+  g1 --> t1("ohne_plugin_group_liefert_none")
+  g1 --> t2("erzeugt_action_und_fuegt_sie_gruppe_und_liste_hinzu")
+  root --> g2["FinalizeMenuAndToolbarTests (2)"]
+  class g2 groupnode
+  g2 --> t3("ohne_menu_oder_toolbar_tut_nichts")
+  g2 --> t4("sortiert_und_fuegt_aktionen_in_prioritaetsreihenfolge_hinzu")
+  root --> g3["SetActivePluginTests (2)"]
+  class g3 groupnode
+  g3 --> t5("setzt_nur_aktive_action_auf_checked")
+  g3 --> t6("ohne_aktive_action_setzt_alle_auf_false")
+  root --> g4["RemoveActionTests (3)"]
+  class g4 groupnode
+  g4 --> t7("none_action_tut_nichts")
+  g4 --> t8("entfernt_action_aus_menu_toolbar_und_liste")
+  g4 --> t9("ohne_menu_oder_toolbar_entfernt_trotzdem_aus_liste")
+  root --> g5["RemoveAllTests (2)"]
+  class g5 groupnode
+  g5 --> t10("entfernt_menu_toolbar_und_setzt_zustand_zurueck")
+  g5 --> t11("ohne_menu_und_toolbar_ruft_wrapper_nicht_auf")
+  class t1 ok
+  class t2 ok
+  class t3 ok
+  class t4 ok
+  class t5 ok
+  class t6 ok
+  class t7 ok
+  class t8 ok
+  class t9 ok
+  class t10 ok
+  class t11 ok
+  classDef rootnode fill:#1f4038,stroke:#16302a,stroke-width:1px,color:#f4f1e8,font-weight:600;
+  classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
+  classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
+  classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
AddActionTests
test_ohne_plugin_group_liefert_none
Prüft, dass add_action ohne initialisierte Aktionsgruppe None liefert und nichts anlegt.grünnie 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ünnie 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ünnie 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ünnie 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ünnie 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ünnie 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ünnie 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ünnie 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ünnie 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ünnie 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ünnie geprüft

Tests für sn_basis/functions/os_wrapper.py::is_case_sensitive_fs (Issue #67).

IsCaseSensitiveFsTests 3
flowchart TD
+  root(["test_os_wrapper.py"])
+  class root rootnode
+  root --> g1["IsCaseSensitiveFsTests (3)"]
+  class g1 groupnode
+  g1 --> t1("windows_ist_nicht_case_sensitiv")
+  g1 --> t2("macos_ist_nicht_case_sensitiv")
+  g1 --> t3("linux_ist_case_sensitiv")
+  class t1 ok
+  class t2 ok
+  class t3 ok
+  classDef rootnode fill:#1f4038,stroke:#16302a,stroke-width:1px,color:#f4f1e8,font-weight:600;
+  classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
+  classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
+  classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
IsCaseSensitiveFsTests
test_windows_ist_nicht_case_sensitiv
Prüft, dass Windows als nicht case-sensitives Dateisystem gilt.grünnie geprüft
IsCaseSensitiveFsTests
test_macos_ist_nicht_case_sensitiv
Prüft, dass macOS als nicht case-sensitives Dateisystem gilt.grünnie geprüft
IsCaseSensitiveFsTests
test_linux_ist_case_sensitiv
Prüft, dass Linux als case-sensitives Dateisystem gilt.grünnie geprüft

— (Docstring fehlt)

TestPrintLayout 5
flowchart TD
   root(["test_print_layout.py"])
   class root rootnode
   root --> g1["TestPrintLayout (5)"]
@@ -662,7 +720,120 @@
   classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
-  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
TestPrintLogic
test_get_baufreigabe_page_dimensions_prefers_a4_for_small_extent
Prüft, dass für einen kleinen Kartenausschnitt (Baufreigabe) das Format DIN A4 ohne Fallback gewählt wird.grünnie geprüft
TestPrintLogic
test_get_baufreigabe_page_dimensions_escalates_to_a3
Prüft, dass ein größerer Kartenausschnitt (Baufreigabe) auf DIN A3 eskaliert wird.grünnie geprüft
TestPrintLogic
test_get_baufreigabe_page_dimensions_respects_a4_as_maximum_with_fallback
Prüft, dass bei auf DIN A4 begrenztem Höchstformat ein eigentlich A3-großer Ausschnitt mit Fallback-Kennzeichnung auf A4 reduziert wird.grünnie geprüft
TestPrintLogic
test_get_baufreigabe_page_dimensions_falls_back_to_a3_for_oversize_extent
Prüft, dass ein Ausschnitt, der auch DIN A3 übersteigt, mit Fallback-Kennzeichnung auf DIN A3 begrenzt wird.grünnie geprüft
TestPrintLogic
test_select_standard_page_layout_uses_a4_as_minimum_sheet
Prüft, dass für einen kleinen Ausschnitt trotz Höchstgrenze DIN A3 mindestens DIN A4 als Blattgröße gewählt wird.grünnie geprüft
TestPrintLogic
test_select_standard_page_layout_limits_hauptkarte_to_a3
Prüft, dass ein die Fläche voll ausnutzender Ausschnitt auf DIN A3 als größtes zulässiges Format begrenzt wird.grünnie geprüft
TestPrintLogic
test_select_standard_page_layout_returns_none_if_a3_is_too_small
Prüft, dass kein Layout gewählt wird (None), wenn der Ausschnitt selbst DIN A3 als Höchstformat übersteigt.grünnie geprüft
TestPrintLogic
test_get_standard_layout_dimensions_uses_a4_and_forces_fit_for_small_extent
Prüft, dass für einen kleinen Ausschnitt DIN A4 gewählt und das Einpassen (force_fit) erzwungen wird.grünnie geprüft
TestPrintLogic
test_get_standard_layout_dimensions_caps_endlosrolle_width_at_2000_mm
Prüft, dass bei aktiviertem Formfaktor (Endlosrolle) die Seitenbreite auf die maximale Rollenbreite (2000 mm) begrenzt wird.grünnie geprüft
TestPrintLogic
test_apply_standard_minimum_a4_fallback_for_small_page
Prüft, dass eine zu kleine Seite auf die A4-Mindestgröße angehoben und als erzwungen (forced) markiert wird.grünnie geprüft
TestPrintLogic
test_apply_standard_minimum_a4_fallback_keeps_large_page
Prüft, dass eine bereits ausreichend große Seite (A3) unverändert bleibt und nicht als erzwungen markiert wird.grünnie geprüft
TestPrintLogic
test_does_plot_fit_page_true_for_standard_a4
Prüft, dass ein Kartenobjekt, das in eine DIN A4-Seite passt, als passend erkannt wird.grünnie geprüft
TestPrintLogic
test_does_plot_fit_page_false_if_objects_exceed_page
Prüft, dass ein Kartenobjekt, das die Seitenbreite überschreitet, als nicht passend erkannt wird.grünnie geprüft
TestPrintLogic
test_set_druckbereich_accepts_wie_kartenfenster
Prüft, dass die Auswahl 'wie Kartenfenster' als Projektvariable 'druckbereich' gespeichert wird.grünnie geprüft
TestPrintLogic
test_get_canvas_extent_returns_valid_extent
Prüft, dass der aktuelle Kartenausschnitt des Kartenfensters unverändert zurückgegeben wird.grünnie 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ünnie 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ünnie geprüft

Tests für sn_basis/modules/pruef_ergebnis.py::ist_verfahrens_db_aktion/erlaubte_persistierung (Issue #65).

IstVerfahrensDbAktionTests 2ErlaubtePersistierungTests 2
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
TestPrintLogic
test_get_baufreigabe_page_dimensions_prefers_a4_for_small_extent
Prüft, dass für einen kleinen Kartenausschnitt (Baufreigabe) das Format DIN A4 ohne Fallback gewählt wird.grünnie geprüft
TestPrintLogic
test_get_baufreigabe_page_dimensions_escalates_to_a3
Prüft, dass ein größerer Kartenausschnitt (Baufreigabe) auf DIN A3 eskaliert wird.grünnie geprüft
TestPrintLogic
test_get_baufreigabe_page_dimensions_respects_a4_as_maximum_with_fallback
Prüft, dass bei auf DIN A4 begrenztem Höchstformat ein eigentlich A3-großer Ausschnitt mit Fallback-Kennzeichnung auf A4 reduziert wird.grünnie geprüft
TestPrintLogic
test_get_baufreigabe_page_dimensions_falls_back_to_a3_for_oversize_extent
Prüft, dass ein Ausschnitt, der auch DIN A3 übersteigt, mit Fallback-Kennzeichnung auf DIN A3 begrenzt wird.grünnie geprüft
TestPrintLogic
test_select_standard_page_layout_uses_a4_as_minimum_sheet
Prüft, dass für einen kleinen Ausschnitt trotz Höchstgrenze DIN A3 mindestens DIN A4 als Blattgröße gewählt wird.grünnie geprüft
TestPrintLogic
test_select_standard_page_layout_limits_hauptkarte_to_a3
Prüft, dass ein die Fläche voll ausnutzender Ausschnitt auf DIN A3 als größtes zulässiges Format begrenzt wird.grünnie geprüft
TestPrintLogic
test_select_standard_page_layout_returns_none_if_a3_is_too_small
Prüft, dass kein Layout gewählt wird (None), wenn der Ausschnitt selbst DIN A3 als Höchstformat übersteigt.grünnie geprüft
TestPrintLogic
test_get_standard_layout_dimensions_uses_a4_and_forces_fit_for_small_extent
Prüft, dass für einen kleinen Ausschnitt DIN A4 gewählt und das Einpassen (force_fit) erzwungen wird.grünnie geprüft
TestPrintLogic
test_get_standard_layout_dimensions_caps_endlosrolle_width_at_2000_mm
Prüft, dass bei aktiviertem Formfaktor (Endlosrolle) die Seitenbreite auf die maximale Rollenbreite (2000 mm) begrenzt wird.grünnie geprüft
TestPrintLogic
test_apply_standard_minimum_a4_fallback_for_small_page
Prüft, dass eine zu kleine Seite auf die A4-Mindestgröße angehoben und als erzwungen (forced) markiert wird.grünnie geprüft
TestPrintLogic
test_apply_standard_minimum_a4_fallback_keeps_large_page
Prüft, dass eine bereits ausreichend große Seite (A3) unverändert bleibt und nicht als erzwungen markiert wird.grünnie geprüft
TestPrintLogic
test_does_plot_fit_page_true_for_standard_a4
Prüft, dass ein Kartenobjekt, das in eine DIN A4-Seite passt, als passend erkannt wird.grünnie geprüft
TestPrintLogic
test_does_plot_fit_page_false_if_objects_exceed_page
Prüft, dass ein Kartenobjekt, das die Seitenbreite überschreitet, als nicht passend erkannt wird.grünnie geprüft
TestPrintLogic
test_set_druckbereich_accepts_wie_kartenfenster
Prüft, dass die Auswahl 'wie Kartenfenster' als Projektvariable 'druckbereich' gespeichert wird.grünnie geprüft
TestPrintLogic
test_get_canvas_extent_returns_valid_extent
Prüft, dass der aktuelle Kartenausschnitt des Kartenfensters unverändert zurückgegeben wird.grünnie 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ünnie 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ünnie geprüft

Tests für sn_basis/ui/tabs/print_tab.py::PrintTab (Issue #67).

SetServicesTests 2RestoreStateTests 2OnDruckpufferClickedTests 3OnVorlageErstellenTests 2ProjectSignalsTests 3CleanupTests 1ToggleAtlasTests 2RestoreAtlasLayerSelectionTests 2ThemeCollectionSignalsTests 3RefreshThemaComboLiveTests 2GetGespeicherteThemenTests 2GetCurrentCanvasScaleTests 3OnAtlasLayerChangedTests 3OnAuswahlAsAtlasClickedTests 2PopulateAtlasLayerComboTests 2OnAtlasErzeugenChangedTests 3
flowchart TD
+  root(["test_print_tab.py"])
+  class root rootnode
+  root --> g1["SetServicesTests (2)"]
+  class g1 groupnode
+  g1 --> t1("ruft_alle_set_methoden_mit_combo_werten_auf")
+  g1 --> t2("ohne_combos_ruft_keine_set_methode_auf")
+  root --> g2["RestoreStateTests (2)"]
+  class g2 groupnode
+  g2 --> t3("gueltige_gespeicherte_werte_werden_uebernommen")
+  g2 --> t4("ungueltige_oder_fehlende_werte_fallen_auf_defaults_zurueck")
+  root --> g3["OnDruckpufferClickedTests (3)"]
+  class g3 groupnode
+  g3 --> t5("gueltige_zahl_setzt_variable_und_button_text")
+  g3 --> t6("abgebrochen_aendert_nichts")
+  g3 --> t7("ungueltige_zahl_zeigt_hinweis_und_setzt_nichts")
+  root --> g4["OnVorlageErstellenTests (2)"]
+  class g4 groupnode
+  g4 --> t8("ruft_druckvorlage_anlegen_mit_combo_werten_auf")
+  g4 --> t9("ohne_logic_tut_nichts")
+  root --> g5["ProjectSignalsTests (3)"]
+  class g5 groupnode
+  g5 --> t10("connect_verbindet_alle_drei_signale")
+  g5 --> t11("disconnect_trennt_alle_drei_signale")
+  g5 --> t12("instance_wirft_ausnahme_wird_abgefangen")
+  root --> g6["CleanupTests (1)"]
+  class g6 groupnode
+  g6 --> t13("ruft_beide_disconnect_methoden_auf")
+  root --> g7["ToggleAtlasTests (2)"]
+  class g7 groupnode
+  g7 --> t14("checked_true_setzt_arrow_down_und_zeigt_inhalt")
+  g7 --> t15("checked_false_setzt_arrow_right_und_versteckt_inhalt")
+  root --> g8["RestoreAtlasLayerSelectionTests (2)"]
+  class g8 groupnode
+  g8 --> t16("vorhandene_layer_id_setzt_layer_in_combo")
+  g8 --> t17("leere_gespeicherte_layer_id_tut_nichts")
+  root --> g9["ThemeCollectionSignalsTests (3)"]
+  class g9 groupnode
+  g9 --> t18("connect_verbindet_alle_signale")
+  g9 --> t19("connect_ist_idempotent_wenn_schon_verbunden")
+  g9 --> t20("disconnect_trennt_alle_signale")
+  root --> g10["RefreshThemaComboLiveTests (2)"]
+  class g10 groupnode
+  g10 --> t21("erhaelt_vorherige_auswahl_wenn_noch_vorhanden")
+  g10 --> t22("faellt_auf_wie_kartenfenster_zurueck_wenn_auswahl_verschwunden")
+  root --> g11["GetGespeicherteThemenTests (2)"]
+  class g11 groupnode
+  g11 --> t23("dedupliziert_und_filtert_leere_eintraege")
+  g11 --> t24("fehler_liefert_leere_liste")
+  root --> g12["GetCurrentCanvasScaleTests (3)"]
+  class g12 groupnode
+  g12 --> t25("liefert_skalierung_als_float")
+  g12 --> t26("ohne_canvas_liefert_none")
+  g12 --> t27("skalierung_null_liefert_none")
+  root --> g13["OnAtlasLayerChangedTests (3)"]
+  class g13 groupnode
+  g13 --> t28("none_oder_leer_setzt_variable_leer")
+  g13 --> t29("layer_objekt_mit_id_methode_setzt_dessen_id")
+  g13 --> t30("string_fallback_sucht_layer_ueber_namen")
+  root --> g14["OnAuswahlAsAtlasClickedTests (2)"]
+  class g14 groupnode
+  g14 --> t31("erfolgreicher_layer_aktualisiert_atlas_ui")
+  g14 --> t32("ohne_erzeugten_layer_tut_nichts_weiter")
+  root --> g15["PopulateAtlasLayerComboTests (2)"]
+  class g15 groupnode
+  g15 --> t33("befuellt_combo_ohne_druckrechteck_und_leere_namen")
+  g15 --> t34("ohne_atlas_layer_combo_tut_nichts")
+  root --> g16["OnAtlasErzeugenChangedTests (3)"]
+  class g16 groupnode
+  g16 --> t35("aktiviert_speichert_variable_und_aktiviert_widgets")
+  g16 --> t36("deaktiviert_speichert_variable_und_deaktiviert_widgets")
+  g16 --> t37("ohne_widgets_wirft_keine_ausnahme")
+  class t1 ok
+  class t2 ok
+  class t3 ok
+  class t4 ok
+  class t5 ok
+  class t6 ok
+  class t7 ok
+  class t8 ok
+  class t9 ok
+  class t10 ok
+  class t11 ok
+  class t12 ok
+  class t13 ok
+  class t14 ok
+  class t15 ok
+  class t16 ok
+  class t17 ok
+  class t18 ok
+  class t19 ok
+  class t20 ok
+  class t21 ok
+  class t22 ok
+  class t23 ok
+  class t24 ok
+  class t25 ok
+  class t26 ok
+  class t27 ok
+  class t28 ok
+  class t29 ok
+  class t30 ok
+  class t31 ok
+  class t32 ok
+  class t33 ok
+  class t34 ok
+  class t35 ok
+  class t36 ok
+  class t37 ok
+  classDef rootnode fill:#1f4038,stroke:#16302a,stroke-width:1px,color:#f4f1e8,font-weight:600;
+  classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
+  classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
+  classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprü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ünnie 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ünnie geprüft
RestoreStateTests
test_gueltige_gespeicherte_werte_werden_uebernommen
Prüft, dass _restore_state gültige gespeicherte Werte in die jeweiligen Widgets übernimmt.grünnie 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ünnie 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ünnie geprüft
OnDruckpufferClickedTests
test_abgebrochen_aendert_nichts
Prüft, dass ein abgebrochener Dialog den Druckpuffer nicht verändert.grünnie 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ünnie 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ünnie geprüft
OnVorlageErstellenTests
test_ohne_logic_tut_nichts
Prüft, dass _on_vorlage_erstellen ohne gesetzte PrintLogic keine Ausnahme wirft.grünnie geprüft
ProjectSignalsTests
test_connect_verbindet_alle_drei_signale
Prüft, dass _connect_project_signals alle drei Projektsignale mit _on_project_changed verbindet.grünnie geprüft
ProjectSignalsTests
test_disconnect_trennt_alle_drei_signale
Prüft, dass _disconnect_project_signals alle drei zuvor verbundenen Projektsignale trennt.grünnie geprüft
ProjectSignalsTests
test_instance_wirft_ausnahme_wird_abgefangen
Prüft, dass eine Ausnahme bei QgsProject.instance() in beiden Signalmethoden abgefangen wird.grünnie geprüft
CleanupTests
test_ruft_beide_disconnect_methoden_auf
Prüft, dass cleanup sowohl die Theme- als auch die Projektsignale trennt.grünnie 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ünnie 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ünnie 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ünnie 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ünnie geprüft
ThemeCollectionSignalsTests
test_connect_verbindet_alle_signale
Prüft, dass _connect_theme_collection_signals alle Signale der Theme-Collection verbindet.grünnie 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ünnie geprüft
ThemeCollectionSignalsTests
test_disconnect_trennt_alle_signale
Prüft, dass _disconnect_theme_collection_signals alle verbundenen Theme-Signale trennt und zurücksetzt.grünnie 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ünnie 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ünnie geprüft
GetGespeicherteThemenTests
test_dedupliziert_und_filtert_leere_eintraege
Prüft, dass _get_gespeicherte_themen Duplikate und leere/None-Einträge entfernt.grünnie geprüft
GetGespeicherteThemenTests
test_fehler_liefert_leere_liste
Prüft, dass ein Fehler beim Zugriff auf die Theme-Collection eine leere Liste liefert.grünnie geprüft
GetCurrentCanvasScaleTests
test_liefert_skalierung_als_float
Prüft, dass _get_current_canvas_scale die Canvas-Skalierung als float liefert.grünnie geprüft
GetCurrentCanvasScaleTests
test_ohne_canvas_liefert_none
Prüft, dass _get_current_canvas_scale ohne verfügbares Kartenfenster None liefert.grünnie geprüft
GetCurrentCanvasScaleTests
test_skalierung_null_liefert_none
Prüft, dass eine Skalierung von 0 als None statt als 0.0 gilt.grünnie geprüft
OnAtlasLayerChangedTests
test_none_oder_leer_setzt_variable_leer
Prüft, dass None oder ein leerer Wert die Abdeckungslayer-Variable leeren.grünnie 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ünnie 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ünnie 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ünnie geprüft
OnAuswahlAsAtlasClickedTests
test_ohne_erzeugten_layer_tut_nichts_weiter
Prüft, dass ohne erzeugten Atlas-Layer keine UI-Aktualisierung stattfindet.grünnie 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ünnie geprüft
PopulateAtlasLayerComboTests
test_ohne_atlas_layer_combo_tut_nichts
Prüft, dass _populate_atlas_layer_combo ohne Atlas-Dropdown keine Ausnahme wirft.grünnie 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ünnie 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ünnie geprüft
OnAtlasErzeugenChangedTests
test_ohne_widgets_wirft_keine_ausnahme
Prüft, dass _on_atlas_erzeugen_changed ohne Atlas-Combo/-Button keine Ausnahme wirft.grünnie geprüft

Tests für sn_basis/modules/pruef_ergebnis.py::ist_verfahrens_db_aktion/erlaubte_persistierung/dateipfad (Issue #65/#67).

IstVerfahrensDbAktionTests 2ErlaubtePersistierungTests 2DateipfadTests 2
flowchart TD
   root(["test_pruef_ergebnis.py"])
   class root rootnode
   root --> g1["IstVerfahrensDbAktionTests (2)"]
@@ -673,15 +844,21 @@
   class g2 groupnode
   g2 --> t3("liefert_true_fuer_erzeugen_ueberschreiben_anhaengen")
   g2 --> t4("liefert_false_fuer_ueberspringen_und_reines_existieren")
+  root --> g3["DateipfadTests (2)"]
+  class g3 groupnode
+  g3 --> t5("liefert_path_wenn_kontext_ein_path_ist")
+  g3 --> t6("liefert_none_wenn_kontext_kein_path_ist")
   class t1 ok
   class t2 ok
   class t3 ok
   class t4 ok
+  class t5 ok
+  class t6 ok
   classDef rootnode fill:#1f4038,stroke:#16302a,stroke-width:1px,color:#f4f1e8,font-weight:600;
   classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
-  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
IstVerfahrensDbAktionTests
test_liefert_true_fuer_alle_verfahrens_db_aktionen
Prüft, dass ist_verfahrens_db_aktion für alle vier Verfahrens-DB-Aktionscodes True liefert.grünnie 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ünnie geprüft
ErlaubtePersistierungTests
test_liefert_true_fuer_erzeugen_ueberschreiben_anhaengen
Prüft, dass erlaubte_persistierung für Erzeugen/Überschreiben/Anhängen True liefert.grünnie 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ünnie geprüft

— (Docstring fehlt)

TestPruefmanager 24
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
IstVerfahrensDbAktionTests
test_liefert_true_fuer_alle_verfahrens_db_aktionen
Prüft, dass ist_verfahrens_db_aktion für alle vier Verfahrens-DB-Aktionscodes True liefert.grünnie 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ünnie geprüft
ErlaubtePersistierungTests
test_liefert_true_fuer_erzeugen_ueberschreiben_anhaengen
Prüft, dass erlaubte_persistierung für Erzeugen/Überschreiben/Anhängen True liefert.grünnie 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ünnie 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ünnie 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ünnie geprüft

— (Docstring fehlt)

TestPruefmanager 24
flowchart TD
   root(["test_pruefmanager.py"])
   class root rootnode
   root --> g1["TestPruefmanager (24)"]
@@ -738,7 +915,7 @@
   classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
-  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
TestPruefmanager
test_ok
Prüft, dass ein bereits erfolgreiches Prüfergebnis ohne Nutzerinteraktion als 'ok' durchgereicht wird.grüngeprüft am 2026-09-17
TestPruefmanager
test_leereingabe_erlaubt_ja
Prüft, dass bei erlaubter leerer Eingabe eine Ja-Antwort des Nutzers die Entscheidung 'ok' liefert.grüngeprüft am 2026-09-17
TestPruefmanager
test_leereingabe_erlaubt_nein
Prüft, dass bei erlaubter leerer Eingabe eine Nein-Antwort die Aktion 'leereingabe_erlaubt' als abgelehnt bestehen lässt.grüngeprüft am 2026-09-17
TestPruefmanager
test_standarddatei_vorschlagen_ja
Prüft, dass eine Ja-Antwort auf den Vorschlag der Standarddatei die Entscheidung 'ok' mit dem Standardpfad als Kontext liefert.grüngeprüft am 2026-09-17
TestPruefmanager
test_standarddatei_vorschlagen_nein
Prüft, dass eine Nein-Antwort auf den Vorschlag der Standarddatei die Aktion 'standarddatei_vorschlagen' als abgelehnt bestehen lässt.grüngeprüft am 2026-09-17
TestPruefmanager
test_temporaer_erlaubt_ja
Prüft, dass eine Ja-Antwort auf die Rückfrage nach einer temporären Datei die Aktion 'temporaer_erzeugen' auslöst.grüngeprüft am 2026-09-17
TestPruefmanager
test_temporaer_erlaubt_nein
Prüft, dass eine Nein-Antwort auf die Rückfrage nach einer temporären Datei die Aktion 'temporaer_erlaubt' als abgelehnt bestehen lässt.grüngeprüft am 2026-09-17
TestPruefmanager
test_layer_unsichtbar_ja
Prüft, dass eine Ja-Antwort bei unsichtbarem Layer den Layer sichtbar schaltet und die Entscheidung 'ok' liefert.grüngeprüft am 2026-09-17
TestPruefmanager
test_layer_unsichtbar_nein
Prüft, dass eine Nein-Antwort bei unsichtbarem Layer die Aktion 'layer_unsichtbar' als abgelehnt bestehen lässt.grüngeprüft am 2026-09-17
TestPruefmanager
test_unbekannte_aktion
Prüft, dass eine unbekannte Aktion eine Warnung auslöst und unverarbeitet als Fehlschlag zurückgegeben wird.grüngeprüft am 2026-09-17
TestPruefmanager
test_datei_existiert_overwrite
Prüft, dass die Nutzerwahl 'überschreiben' bei bestehender Datei zur Aktion 'datei_existiert_ueberschreiben' führt.grüngeprüft am 2026-09-17
TestPruefmanager
test_datei_existiert_append
Prüft, dass die Nutzerwahl 'anhängen' bei bestehender Datei zur Aktion 'datei_existiert_anhaengen' führt.grüngeprüft am 2026-09-17
TestPruefmanager
test_datei_existiert_cancel
Prüft, dass die Nutzerwahl 'abbrechen' bei bestehender Datei zur Aktion 'datei_existiert_ueberspringen' führt.grüngeprüft am 2026-09-17
TestPruefmanager
test_datei_existiert_in_non_qgis_mode_returns_input
Prüft, dass außerhalb des QGIS-Modus bei bestehender Datei keine Rückfrage erfolgt, sondern die ursprüngliche Aktion unentschieden zurückgegeben wird.grüngeprüft am 2026-09-17
TestPruefmanager
test_verfahrensgebiet_layer_existiert_ergaenzen
Prüft, dass die Nutzerwahl 'ergänzen' bei bestehendem Verfahrensgebiet zur Aktion 'verfahrensgebiet_ergaenzen' führt.grünnie geprüft
TestPruefmanager
test_verfahrensgebiet_layer_existiert_abbrechen
Prüft, dass die Nutzerwahl 'abbrechen' bei bestehendem Verfahrensgebiet ok=False mit Aktion 'verfahrensgebiet_abbrechen' liefert.grünnie geprüft
TestPruefmanager
test_verfahrensgebiet_layer_existiert_in_non_qgis_mode_returns_input
Prüft, dass außerhalb des QGIS-Modus bei bestehendem Verfahrensgebiet keine Rückfrage erfolgt.grünnie geprüft
TestPruefmanager
test_report_error_kritische_aktion_ruft_error_auf
Prüft, dass eine kritische Aktion (z. B. 'netzwerkfehler') über error() gemeldet wird, nicht über warning().grünnie geprüft
TestPruefmanager
test_report_error_warn_aktion_ruft_warning_auf
Prüft, dass eine Warn-Aktion (z. B. 'datei_nicht_gefunden') über warning() gemeldet wird, nicht über error().grünnie geprüft
TestPruefmanager
test_report_error_unbekannte_aktion_faellt_auf_warning_zurueck
Prüft, dass eine nicht eingestufte Aktion als Fallback über warning() gemeldet wird.grünnie geprüft
TestPruefmanager
test_frage_ja_nein_im_qgis_modus_fragt_nutzer
Prüft, dass frage_ja_nein im QGIS-Modus den Nutzer fragt und dessen Antwort liefert.grünnie geprüft
TestPruefmanager
test_frage_ja_nein_ausserhalb_qgis_liefert_default_ohne_rueckfrage
Prüft, dass frage_ja_nein außerhalb des QGIS-Modus den Default-Wert liefert, ohne den Nutzer zu fragen.grünnie geprüft
TestPruefmanager
test_frage_text_im_qgis_modus_fragt_nutzer
Prüft, dass frage_text im QGIS-Modus den Nutzer fragt und Text plus OK-Status liefert.grünnie geprüft
TestPruefmanager
test_frage_text_ausserhalb_qgis_liefert_default_ohne_rueckfrage
Prüft, dass frage_text außerhalb des QGIS-Modus den Standardtext mit OK=True liefert, ohne den Nutzer zu fragen.grünnie geprüft

Tests für sn_basis/functions/qgiscore_wrapper.py::polygon_zu_linie/layer_exists_in_gpkg (Issue #65).

PolygonZuLinieTests 7LayerExistsInGpkgTests 4
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
TestPruefmanager
test_ok
Prüft, dass ein bereits erfolgreiches Prüfergebnis ohne Nutzerinteraktion als 'ok' durchgereicht wird.grüngeprüft am 2026-09-17
TestPruefmanager
test_leereingabe_erlaubt_ja
Prüft, dass bei erlaubter leerer Eingabe eine Ja-Antwort des Nutzers die Entscheidung 'ok' liefert.grüngeprüft am 2026-09-17
TestPruefmanager
test_leereingabe_erlaubt_nein
Prüft, dass bei erlaubter leerer Eingabe eine Nein-Antwort die Aktion 'leereingabe_erlaubt' als abgelehnt bestehen lässt.grüngeprüft am 2026-09-17
TestPruefmanager
test_standarddatei_vorschlagen_ja
Prüft, dass eine Ja-Antwort auf den Vorschlag der Standarddatei die Entscheidung 'ok' mit dem Standardpfad als Kontext liefert.grüngeprüft am 2026-09-17
TestPruefmanager
test_standarddatei_vorschlagen_nein
Prüft, dass eine Nein-Antwort auf den Vorschlag der Standarddatei die Aktion 'standarddatei_vorschlagen' als abgelehnt bestehen lässt.grüngeprüft am 2026-09-17
TestPruefmanager
test_temporaer_erlaubt_ja
Prüft, dass eine Ja-Antwort auf die Rückfrage nach einer temporären Datei die Aktion 'temporaer_erzeugen' auslöst.grüngeprüft am 2026-09-17
TestPruefmanager
test_temporaer_erlaubt_nein
Prüft, dass eine Nein-Antwort auf die Rückfrage nach einer temporären Datei die Aktion 'temporaer_erlaubt' als abgelehnt bestehen lässt.grüngeprüft am 2026-09-17
TestPruefmanager
test_layer_unsichtbar_ja
Prüft, dass eine Ja-Antwort bei unsichtbarem Layer den Layer sichtbar schaltet und die Entscheidung 'ok' liefert.grüngeprüft am 2026-09-17
TestPruefmanager
test_layer_unsichtbar_nein
Prüft, dass eine Nein-Antwort bei unsichtbarem Layer die Aktion 'layer_unsichtbar' als abgelehnt bestehen lässt.grüngeprüft am 2026-09-17
TestPruefmanager
test_unbekannte_aktion
Prüft, dass eine unbekannte Aktion eine Warnung auslöst und unverarbeitet als Fehlschlag zurückgegeben wird.grüngeprüft am 2026-09-17
TestPruefmanager
test_datei_existiert_overwrite
Prüft, dass die Nutzerwahl 'überschreiben' bei bestehender Datei zur Aktion 'datei_existiert_ueberschreiben' führt.grüngeprüft am 2026-09-17
TestPruefmanager
test_datei_existiert_append
Prüft, dass die Nutzerwahl 'anhängen' bei bestehender Datei zur Aktion 'datei_existiert_anhaengen' führt.grüngeprüft am 2026-09-17
TestPruefmanager
test_datei_existiert_cancel
Prüft, dass die Nutzerwahl 'abbrechen' bei bestehender Datei zur Aktion 'datei_existiert_ueberspringen' führt.grüngeprüft am 2026-09-17
TestPruefmanager
test_datei_existiert_in_non_qgis_mode_returns_input
Prüft, dass außerhalb des QGIS-Modus bei bestehender Datei keine Rückfrage erfolgt, sondern die ursprüngliche Aktion unentschieden zurückgegeben wird.grüngeprüft am 2026-09-17
TestPruefmanager
test_verfahrensgebiet_layer_existiert_ergaenzen
Prüft, dass die Nutzerwahl 'ergänzen' bei bestehendem Verfahrensgebiet zur Aktion 'verfahrensgebiet_ergaenzen' führt.grünnie geprüft
TestPruefmanager
test_verfahrensgebiet_layer_existiert_abbrechen
Prüft, dass die Nutzerwahl 'abbrechen' bei bestehendem Verfahrensgebiet ok=False mit Aktion 'verfahrensgebiet_abbrechen' liefert.grünnie geprüft
TestPruefmanager
test_verfahrensgebiet_layer_existiert_in_non_qgis_mode_returns_input
Prüft, dass außerhalb des QGIS-Modus bei bestehendem Verfahrensgebiet keine Rückfrage erfolgt.grünnie geprüft
TestPruefmanager
test_report_error_kritische_aktion_ruft_error_auf
Prüft, dass eine kritische Aktion (z. B. 'netzwerkfehler') über error() gemeldet wird, nicht über warning().grünnie geprüft
TestPruefmanager
test_report_error_warn_aktion_ruft_warning_auf
Prüft, dass eine Warn-Aktion (z. B. 'datei_nicht_gefunden') über warning() gemeldet wird, nicht über error().grünnie geprüft
TestPruefmanager
test_report_error_unbekannte_aktion_faellt_auf_warning_zurueck
Prüft, dass eine nicht eingestufte Aktion als Fallback über warning() gemeldet wird.grünnie geprüft
TestPruefmanager
test_frage_ja_nein_im_qgis_modus_fragt_nutzer
Prüft, dass frage_ja_nein im QGIS-Modus den Nutzer fragt und dessen Antwort liefert.grünnie geprüft
TestPruefmanager
test_frage_ja_nein_ausserhalb_qgis_liefert_default_ohne_rueckfrage
Prüft, dass frage_ja_nein außerhalb des QGIS-Modus den Default-Wert liefert, ohne den Nutzer zu fragen.grünnie geprüft
TestPruefmanager
test_frage_text_im_qgis_modus_fragt_nutzer
Prüft, dass frage_text im QGIS-Modus den Nutzer fragt und Text plus OK-Status liefert.grünnie geprüft
TestPruefmanager
test_frage_text_ausserhalb_qgis_liefert_default_ohne_rueckfrage
Prüft, dass frage_text außerhalb des QGIS-Modus den Standardtext mit OK=True liefert, ohne den Nutzer zu fragen.grünnie geprüft

Tests für sn_basis/functions/qgiscore_wrapper.py::polygon_zu_linie/layer_exists_in_gpkg/create_buffer_layer (Issue #65/#67).

PolygonZuLinieTests 7LayerExistsInGpkgTests 4CreateBufferLayerTests 3
flowchart TD
   root(["test_qgiscore_wrapper_helpers.py"])
   class root rootnode
   root --> g1["PolygonZuLinieTests (7)"]
@@ -756,6 +933,11 @@
   g2 --> t9("leerer_pfad_oder_layername_liefert_false")
   g2 --> t10("vorhandener_layer_liefert_true")
   g2 --> t11("fehlender_layer_liefert_false")
+  root --> g3["CreateBufferLayerTests (3)"]
+  class g3 groupnode
+  g3 --> t12("ohne_qgis_liefert_none")
+  g3 --> t13("fehlender_source_layer_liefert_none")
+  g3 --> t14("source_layer_ohne_getfeatures_liefert_none")
   class t1 ok
   class t2 ok
   class t3 ok
@@ -767,11 +949,14 @@
   class t9 ok
   class t10 ok
   class t11 ok
+  class t12 ok
+  class t13 ok
+  class t14 ok
   classDef rootnode fill:#1f4038,stroke:#16302a,stroke-width:1px,color:#f4f1e8,font-weight:600;
   classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
-  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
PolygonZuLinieTests
test_none_liefert_none
Prüft, dass polygon_zu_linie für None-Eingabe None liefert.grünnie geprüft
PolygonZuLinieTests
test_leere_geometrie_liefert_none
Prüft, dass eine leere Geometrie None liefert.grünnie geprüft
PolygonZuLinieTests
test_stufe1_nutzt_boundary_wenn_vorhanden
Prüft, dass eine Geometrie mit boundary() (QGIS 3.x-Pfad) deren Ergebnis direkt liefert.grünnie geprüft
PolygonZuLinieTests
test_stufe2_extrahiert_ringe_bei_einfachem_polygon
Prüft, dass ohne boundary() die Ringe eines einfachen Polygons manuell extrahiert werden.grünnie geprüft
PolygonZuLinieTests
test_stufe2_extrahiert_alle_ringe_bei_multipolygon
Prüft, dass bei einem MultiPolygon die Ringe aller Teilpolygone extrahiert werden.grünnie geprüft
PolygonZuLinieTests
test_stufe3_fallback_wenn_keine_ringe_extrahierbar
Prüft, dass bei fehlgeschlagener Ringextraktion auf convertToType zurückgefallen wird.grünnie geprüft
PolygonZuLinieTests
test_alle_stufen_scheitern_liefert_none
Prüft, dass polygon_zu_linie None liefert, wenn Ringextraktion und convertToType beide scheitern.grünnie geprüft
LayerExistsInGpkgTests
test_fehlende_datei_liefert_false
Prüft, dass eine nicht vorhandene GPKG-Datei False liefert.grünnie geprüft
LayerExistsInGpkgTests
test_leerer_pfad_oder_layername_liefert_false
Prüft, dass ein leerer Pfad oder Layername False liefert.grünnie geprüft
LayerExistsInGpkgTests
test_vorhandener_layer_liefert_true
Prüft, dass ein in gpkg_contents eingetragener Layername als vorhanden erkannt wird.grünnie geprüft
LayerExistsInGpkgTests
test_fehlender_layer_liefert_false
Prüft, dass ein nicht in gpkg_contents eingetragener Layername als nicht vorhanden gilt.grünnie geprüft

Tests für sn_basis/functions/qgisui_wrapper.py::add_layer_to_project (Issue #65).

AddLayerToProjectTests 4
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
PolygonZuLinieTests
test_none_liefert_none
Prüft, dass polygon_zu_linie für None-Eingabe None liefert.grünnie geprüft
PolygonZuLinieTests
test_leere_geometrie_liefert_none
Prüft, dass eine leere Geometrie None liefert.grünnie geprüft
PolygonZuLinieTests
test_stufe1_nutzt_boundary_wenn_vorhanden
Prüft, dass eine Geometrie mit boundary() (QGIS 3.x-Pfad) deren Ergebnis direkt liefert.grünnie geprüft
PolygonZuLinieTests
test_stufe2_extrahiert_ringe_bei_einfachem_polygon
Prüft, dass ohne boundary() die Ringe eines einfachen Polygons manuell extrahiert werden.grünnie geprüft
PolygonZuLinieTests
test_stufe2_extrahiert_alle_ringe_bei_multipolygon
Prüft, dass bei einem MultiPolygon die Ringe aller Teilpolygone extrahiert werden.grünnie geprüft
PolygonZuLinieTests
test_stufe3_fallback_wenn_keine_ringe_extrahierbar
Prüft, dass bei fehlgeschlagener Ringextraktion auf convertToType zurückgefallen wird.grünnie geprüft
PolygonZuLinieTests
test_alle_stufen_scheitern_liefert_none
Prüft, dass polygon_zu_linie None liefert, wenn Ringextraktion und convertToType beide scheitern.grünnie geprüft
LayerExistsInGpkgTests
test_fehlende_datei_liefert_false
Prüft, dass eine nicht vorhandene GPKG-Datei False liefert.grünnie geprüft
LayerExistsInGpkgTests
test_leerer_pfad_oder_layername_liefert_false
Prüft, dass ein leerer Pfad oder Layername False liefert.grünnie geprüft
LayerExistsInGpkgTests
test_vorhandener_layer_liefert_true
Prüft, dass ein in gpkg_contents eingetragener Layername als vorhanden erkannt wird.grünnie geprüft
LayerExistsInGpkgTests
test_fehlender_layer_liefert_false
Prüft, dass ein nicht in gpkg_contents eingetragener Layername als nicht vorhanden gilt.grünnie geprüft
CreateBufferLayerTests
test_ohne_qgis_liefert_none
Prüft, dass create_buffer_layer ohne verfügbares QGIS None liefert.grünnie 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ünnie geprüft
CreateBufferLayerTests
test_source_layer_ohne_getfeatures_liefert_none
Prüft, dass ein Quelllayer ohne getFeatures()-Methode None liefert.grünnie geprüft

Tests für sn_basis/functions/qgisui_wrapper.py::add_layer_to_project/find_dock_widgets/add_menu/remove_menu (Issue #65/#67).

AddLayerToProjectTests 4FindDockWidgetsTests 3AddRemoveMenuTests 5
flowchart TD
   root(["test_qgisui_wrapper_helpers.py"])
   class root rootnode
   root --> g1["AddLayerToProjectTests (4)"]
@@ -780,15 +965,35 @@
   g1 --> t2("mock_modus_liefert_true_ohne_projektzugriff")
   g1 --> t3("mit_qgis_fuegt_layer_dem_projekt_hinzu")
   g1 --> t4("mit_qgis_fehler_liefert_false")
+  root --> g2["FindDockWidgetsTests (3)"]
+  class g2 groupnode
+  g2 --> t5("ohne_main_window_liefert_leere_liste")
+  g2 --> t6("liefert_dock_widgets_des_main_window")
+  g2 --> t7("fehler_beim_suchen_liefert_leere_liste")
+  root --> g3["AddRemoveMenuTests (5)"]
+  class g3 groupnode
+  g3 --> t8("add_menu_ohne_main_window_tut_nichts")
+  g3 --> t9("add_menu_mit_echtem_qt_menu_fuegt_es_der_menubar_hinzu")
+  g3 --> t10("add_menu_ohne_menuaction_wird_ignoriert")
+  g3 --> t11("remove_menu_entfernt_ueber_menuaction")
+  g3 --> t12("remove_menu_ohne_main_window_tut_nichts")
   class t1 ok
   class t2 ok
   class t3 ok
   class t4 ok
+  class t5 ok
+  class t6 ok
+  class t7 ok
+  class t8 ok
+  class t9 ok
+  class t10 ok
+  class t11 ok
+  class t12 ok
   classDef rootnode fill:#1f4038,stroke:#16302a,stroke-width:1px,color:#f4f1e8,font-weight:600;
   classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
-  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
AddLayerToProjectTests
test_none_layer_liefert_false
Prüft, dass add_layer_to_project für einen fehlenden Layer (None) False liefert.grünnie 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ünnie 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ünnie 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ünnie geprüft

— (Docstring fehlt)

TestSettingsLogic 4
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
AddLayerToProjectTests
test_none_layer_liefert_false
Prüft, dass add_layer_to_project für einen fehlenden Layer (None) False liefert.grünnie 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ünnie 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ünnie 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ünnie 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ünnie geprüft
FindDockWidgetsTests
test_liefert_dock_widgets_des_main_window
Prüft, dass find_dock_widgets die vom Hauptfenster gefundenen Dock-Widgets durchreicht.grünnie 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ünnie geprüft
AddRemoveMenuTests
test_add_menu_ohne_main_window_tut_nichts
Prüft, dass add_menu ohne Hauptfenster keine Ausnahme wirft.grünnie 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ünnie 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ünnie 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ünnie geprüft
AddRemoveMenuTests
test_remove_menu_ohne_main_window_tut_nichts
Prüft, dass remove_menu ohne Hauptfenster keine Ausnahme wirft.grünnie geprüft

— (Docstring fehlt)

TestSettingsLogic 4
flowchart TD
   root(["test_settings_logic.py"])
   class root rootnode
   root --> g1["TestSettingsLogic (4)"]
@@ -805,7 +1010,7 @@
   classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
-  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
TestSettingsLogic
test_load
Prüft, dass load() jede bekannte Projektvariable genau einmal über get_variable() liest.grüngeprüft am 2026-09-17
TestSettingsLogic
test_save
Prüft, dass save() nur bekannte Variablen-Keys speichert und unbekannte Keys ignoriert.grüngeprüft am 2026-09-17
TestSettingsLogic
test_load_handles_partial_values_with_empty_fallback
Prüft, dass load() für jede Variable den (auch leeren) Wert von get_variable() unverändert übernimmt, selbst wenn nicht alle Variablen im Mock konfiguriert sind.grüngeprüft am 2026-09-17
TestSettingsLogic
test_save_empty_string_value_is_persisted
Prüft, dass save() einen leeren String als gültigen Wert speichert, statt ihn wie einen fehlenden Key zu behandeln.grüngeprüft am 2026-09-17

Tests für sn_basis/ui/tabs/settings_tab.py::save_data/load_data (Issue #65).

SaveDataTests 2LoadDataTests 4
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
TestSettingsLogic
test_load
Prüft, dass load() jede bekannte Projektvariable genau einmal über get_variable() liest.grüngeprüft am 2026-09-17
TestSettingsLogic
test_save
Prüft, dass save() nur bekannte Variablen-Keys speichert und unbekannte Keys ignoriert.grüngeprüft am 2026-09-17
TestSettingsLogic
test_load_handles_partial_values_with_empty_fallback
Prüft, dass load() für jede Variable den (auch leeren) Wert von get_variable() unverändert übernimmt, selbst wenn nicht alle Variablen im Mock konfiguriert sind.grüngeprüft am 2026-09-17
TestSettingsLogic
test_save_empty_string_value_is_persisted
Prüft, dass save() einen leeren String als gültigen Wert speichert, statt ihn wie einen fehlenden Key zu behandeln.grüngeprüft am 2026-09-17

Tests für sn_basis/ui/tabs/settings_tab.py::save_data/load_data/_build_input (Issue #65/#67).

SaveDataTests 2LoadDataTests 4BuildInputTests 2
flowchart TD
   root(["test_settings_tab.py"])
   class root rootnode
   root --> g1["SaveDataTests (2)"]
@@ -818,17 +1023,23 @@
   g2 --> t4("ohne_gespeicherten_wert_bleibt_textfeld_leer")
   g2 --> t5("waehlt_combobox_eintrag_bei_bekanntem_namen")
   g2 --> t6("unbekannter_gespeicherter_name_waehlt_ersten_eintrag")
+  root --> g3["BuildInputTests (2)"]
+  class g3 groupnode
+  g3 --> t7("landkreis_feld_liefert_combobox_mit_allen_landkreisen")
+  g3 --> t8("anderes_feld_liefert_lineedit")
   class t1 ok
   class t2 ok
   class t3 ok
   class t4 ok
   class t5 ok
   class t6 ok
+  class t7 ok
+  class t8 ok
   classDef rootnode fill:#1f4038,stroke:#16302a,stroke-width:1px,color:#f4f1e8,font-weight:600;
   classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
-  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
SaveDataTests
test_sammelt_text_und_combobox_werte_inklusive_landkreiskennzahl
Prüft, dass save_data Text- und Dropdown-Werte sammelt und die Landkreiskennzahl separat ergänzt.grünnie geprüft
SaveDataTests
test_ohne_landkreis_dropdown_wird_keine_kennzahl_ergaenzt
Prüft, dass ohne Landkreis-Dropdown im Formular keine 'landkreis_kennzahl' ergänzt wird.grünnie geprüft
LoadDataTests
test_befuellt_textfelder_aus_gespeicherten_daten
Prüft, dass load_data ein Textfeld mit dem gespeicherten Wert befüllt.grünnie 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ünnie geprüft
LoadDataTests
test_waehlt_combobox_eintrag_bei_bekanntem_namen
Prüft, dass load_data im Landkreis-Dropdown den gespeicherten Landkreisnamen auswählt.grünnie 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ünnie geprüft

— (Docstring fehlt)

TestStilpruefer 4
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
SaveDataTests
test_sammelt_text_und_combobox_werte_inklusive_landkreiskennzahl
Prüft, dass save_data Text- und Dropdown-Werte sammelt und die Landkreiskennzahl separat ergänzt.grünnie geprüft
SaveDataTests
test_ohne_landkreis_dropdown_wird_keine_kennzahl_ergaenzt
Prüft, dass ohne Landkreis-Dropdown im Formular keine 'landkreis_kennzahl' ergänzt wird.grünnie geprüft
LoadDataTests
test_befuellt_textfelder_aus_gespeicherten_daten
Prüft, dass load_data ein Textfeld mit dem gespeicherten Wert befüllt.grünnie 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ünnie geprüft
LoadDataTests
test_waehlt_combobox_eintrag_bei_bekanntem_namen
Prüft, dass load_data im Landkreis-Dropdown den gespeicherten Landkreisnamen auswählt.grünnie 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ünnie 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ünnie geprüft
BuildInputTests
test_anderes_feld_liefert_lineedit
Prüft, dass _build_input für ein normales Feld ein leeres Textfeld liefert.grünnie geprüft

— (Docstring fehlt)

TestStilpruefer 4
flowchart TD
   root(["test_stilpruefer.py"])
   class root rootnode
   root --> g1["TestStilpruefer (4)"]
@@ -958,123 +1169,84 @@
   classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
TestVerfahrensgebietManager
test_get_verfahrensgebiet_layer_id_returns_value
Prüft, dass get_verfahrensgebiet_layer_id() die in der Projektvariable gespeicherte Layer-ID liefert.grünnie geprüft
TestVerfahrensgebietManager
test_get_verfahrensgebiet_layer_id_returns_none_for_empty_value
Prüft, dass get_verfahrensgebiet_layer_id() bei leerer Projektvariable None statt eines leeren Strings liefert.grünnie geprüft
TestVerfahrensgebietManager
test_set_verfahrensgebiet_layer_id_writes_project_variable
Prüft, dass set_verfahrensgebiet_layer_id() die Layer-ID als Projektvariable 'verfahrensgebiet_layer' speichert.grünnie geprüft
TestVerfahrensgebietManager
test_update_without_layer_does_not_write_when_already_empty
Prüft, dass ohne gefundenen Verfahrensgebiet-Layer keine Schreibaktion erfolgt, wenn die Variable bereits leer ist.grünnie geprüft
TestVerfahrensgebietManager
test_update_with_layer_writes_variable
Prüft, dass ein gefundener Verfahrensgebiet-Layer seine ID als Projektvariable speichert.grünnie geprüft
OnHandlerTests
test_on_project_changed_ohne_layer_setzt_variable_leer
Prüft, dass _on_project_changed die Variable leert, wenn kein Verfahrensgebiet-Layer existiert.grünnie geprüft
OnHandlerTests
test_on_project_changed_mit_layer_setzt_variable
Prüft, dass _on_project_changed die Layer-ID eines gefundenen Verfahrensgebiet-Layers übernimmt.grünnie geprüft
OnHandlerTests
test_on_layers_added_findet_neuen_layer
Prüft, dass _on_layers_added nach neu hinzugefügten Layern sucht und die Variable aktualisiert.grünnie geprüft
OnHandlerTests
test_on_layer_removed_bei_aktuellem_layer_sucht_neu
Prüft, dass das Entfernen des aktuell aktiven Verfahrensgebiet-Layers eine Neusuche auslöst.grünnie geprüft
OnHandlerTests
test_on_layer_removed_bei_anderem_layer_aendert_nichts
Prüft, dass das Entfernen eines anderen Layers keine Neusuche auslöst.grünnie geprüft
ListenerSetupTests
test_setup_ohne_qgis_tut_nichts
Prüft, dass setup_verfahrensgebiet_listener ohne QGIS keine Signale registriert.grünnie geprüft
ListenerSetupTests
test_setup_verbindet_signale_und_ist_idempotent
Prüft, dass setup_verfahrensgebiet_listener die Projektsignale verbindet und ein zweiter Aufruf nichts doppelt registriert.grünnie geprüft
ListenerSetupTests
test_teardown_trennt_alle_signale_und_ist_idempotent
Prüft, dass teardown_verfahrensgebiet_listener alle Signale trennt und mehrfacher Aufruf nicht fehlschlägt.grünnie geprüft
-

Ungetestete Funktionen (strukturell) – 115 von 229

+

Ungetestete Funktionen (strukturell) – 76 von 229

Heuristik: Name kommt in keiner Testdatei des Pakets vor. Details siehe docs/tests/testkatalog.md.

- - - - - - - - + + + + + + + + - + - - - - - - - - - - + + + + + - + - - - + + - + - - - - - - - - - - + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - -
DateiFunktion/MethodeZeile
functions/dialog_wrapper.pyshow_info_dialog42
functions/dialog_wrapper.pyask_detailpruefung_oder_vg_laden185
functions/dialog_wrapper.pyask_detailpruefung_oder_abbrechen235
functions/dialog_wrapper.pyProgressDialog.set_total328
functions/dialog_wrapper.pyProgressDialog.set_value336
functions/dialog_wrapper.pyProgressDialog.set_label348
functions/dialog_wrapper.pyProgressDialog.is_canceled357
functions/dialog_wrapper.pyProgressDialog.raise_to_front373
functions/dialog_wrapper.pycreate_progress_dialog390
functions/dialog_wrapper.pyask_detailpruefung_oder_vg_laden192
functions/dialog_wrapper.pyask_detailpruefung_oder_abbrechen244
functions/dialog_wrapper.pyProgressDialog.set_total339
functions/dialog_wrapper.pyProgressDialog.set_value348
functions/dialog_wrapper.pyProgressDialog.set_label361
functions/dialog_wrapper.pyProgressDialog.is_canceled371
functions/dialog_wrapper.pyProgressDialog.raise_to_front389
functions/dialog_wrapper.pycreate_progress_dialog408
functions/message_wrapper.pyinfo67
functions/message_wrapper.pysuccess82
functions/message_wrapper.pysuccess84
functions/os_wrapper.pynormalize_path43
functions/os_wrapper.pyget_home_dir53
functions/os_wrapper.pyis_absolute_path60
functions/os_wrapper.pybasename68
functions/os_wrapper.pyis_case_sensitive_fs80
functions/os_wrapper.pypath_suffix96
functions/qgisui_wrapper.pyget_main_window131
functions/qgisui_wrapper.pyadd_menu178
functions/qgisui_wrapper.pyremove_menu188
functions/qgisui_wrapper.pyadd_toolbar201
functions/qgisui_wrapper.pyremove_toolbar208
functions/os_wrapper.pyget_home_dir55
functions/os_wrapper.pyis_absolute_path64
functions/os_wrapper.pybasename75
functions/os_wrapper.pypath_suffix106
functions/qgisui_wrapper.pyadd_toolbar204
functions/qt_wrapper.pyexec_dialog60
functions/qt_wrapper.pydebug_qt_status64
functions/qt_wrapper.pydebug_qt_status67
modules/DataGrabber.pyDataGrabber.set_source68
modules/DataGrabber.pyDataGrabber._process_database_source309
modules/DataGrabber.pyDataGrabber._process_service_source320
modules/DataGrabber.pyDataGrabber._aggregate_results330
modules/DataGrabber.pyDataGrabber._process_database_source312
modules/DataGrabber.pyDataGrabber._process_service_source324
modules/Dateipruefer.pyDateipruefer._ist_leer98
modules/Dateipruefer.pyDateipruefer._handle_leere_eingabe227
modules/Datenschreiber.pyDatenschreiber._store_style_in_gpkg77
modules/LayerLoader.pyLayerLoader._was_canceled42
modules/LayerLoader.pyLayerLoader._process_events50
modules/LayerLoader.pyLayerLoader._process_events51
modules/linkpruefer.pyLinkpruefer._ist_url41
modules/linkpruefer.pyLinkpruefer._pruefe_url81
modules/linkpruefer.pyLinkpruefer._pruefe_dateipfad115
modules/print_layout.pyPrintLayout._create_map_item98
modules/print_layout.pyPrintLayout._set_item_frame_stroke_width119
modules/print_layout.pyPrintLayout._fit_extent_to_map_item154
modules/print_layout.pyPrintLayout.add_text_label211
modules/print_layout.pyPrintLayout._setup_layout_objects242
modules/print_layout.pyPrintLayout._create_label_item373
modules/print_layout.pyPrintLayout._resolve_visible_map_layers470
modules/print_layout.pyPrintLayout._apply_grid_common_settings791
modules/print_layout.pyPrintLayout._safe_grid_call797
modules/print_layout.pyPrintLayout._apply_grid_annotation_text_style808
modules/print_layout.pyPrintLayout._create_rectangle_box_item908
modules/print_layout.pyPrintLayout._set_item_frame_stroke_width120
modules/print_layout.pyPrintLayout._fit_extent_to_map_item156
modules/print_layout.pyPrintLayout.add_text_label214
modules/print_layout.pyPrintLayout._setup_layout_objects246
modules/print_layout.pyPrintLayout._create_label_item378
modules/print_layout.pyPrintLayout._resolve_visible_map_layers476
modules/print_layout.pyPrintLayout._apply_grid_common_settings798
modules/print_layout.pyPrintLayout._safe_grid_call805
modules/print_layout.pyPrintLayout._apply_grid_annotation_text_style817
modules/print_layout.pyPrintLayout._create_rectangle_box_item918
modules/print_layout_baufreigabe.pyPrintLayoutBaufreigabe.create_baufreigabe_layout90
modules/print_layout_baufreigabe.pyPrintLayoutBaufreigabe._setup_layout_objects_baufreigabe262
modules/print_layout_baufreigabe.pyPrintLayoutBaufreigabe._calc_atlas_margin_percent394
modules/print_layout_baufreigabe.pyPrintLayoutBaufreigabe._setup_layout_objects_baufreigabe264
modules/print_layout_baufreigabe.pyPrintLayoutBaufreigabe._calc_atlas_margin_percent398
modules/print_logic.pyPrintLogic._failed_result123
modules/print_logic.pyPrintLogic._show_target_size_too_small126
modules/print_logic.pyPrintLogic._is_enabled_flag133
modules/print_logic.pyPrintLogic._resolve_layer_from_project138
modules/print_logic.pyPrintLogic._resolve_active_layer158
modules/print_logic.pyPrintLogic._get_druckpuffer_cm167
modules/print_logic.pyPrintLogic._get_druckpuffer_m175
modules/print_logic.pyPrintLogic._import_qgis_symbol178
modules/print_logic.pyPrintLogic._build_rectangle185
modules/print_logic.pyPrintLogic._clone_extent194
modules/print_logic.pyPrintLogic._get_existing_layer_by_name260
modules/print_logic.pyPrintLogic._create_druckrechteck_layer273
modules/print_logic.pyPrintLogic._clear_layer_features301
modules/print_logic.pyPrintLogic.create_atlas_layer_from_selection325
modules/print_logic.pyPrintLogic.configure_atlas_for_baufreigabe_layout468
modules/print_logic.pyPrintLogic._store_druckrechteck614
modules/print_logic.pyPrintLogic.activate_druckrechteck_capture662
modules/print_logic.pyPrintLogic._resolve_selection_layer792
modules/print_logic.pyPrintLogic._get_selected_extent805
modules/print_logic.pyPrintLogic.set_kartenname_for_auswahl961
modules/print_logic.pyPrintLogic.set_plotmassstab_for_auswahl965
modules/print_logic.pyPrintLogic.set_view_for_auswahl976
modules/print_logic.pyPrintLogic.set_zielgroesse_for_auswahl982
modules/print_logic.pyPrintLogic.set_formfaktor985
modules/print_logic.pyPrintLogic._get_plot_dimensions_mm1052
modules/print_logic.pyPrintLogic._get_required_map_dimensions_mm1061
modules/print_logic.pyPrintLogic.druckvorlage_anlegen1161
modules/pruef_ergebnis.pypruef_ergebnis.dateipfad167
modules/print_logic.pyPrintLogic._show_target_size_too_small127
modules/print_logic.pyPrintLogic._is_enabled_flag135
modules/print_logic.pyPrintLogic._resolve_layer_from_project141
modules/print_logic.pyPrintLogic._resolve_active_layer162
modules/print_logic.pyPrintLogic._get_druckpuffer_cm172
modules/print_logic.pyPrintLogic._get_druckpuffer_m181
modules/print_logic.pyPrintLogic._import_qgis_symbol185
modules/print_logic.pyPrintLogic._build_rectangle193
modules/print_logic.pyPrintLogic._clone_extent203
modules/print_logic.pyPrintLogic._get_existing_layer_by_name270
modules/print_logic.pyPrintLogic._create_druckrechteck_layer284
modules/print_logic.pyPrintLogic._clear_layer_features313
modules/print_logic.pyPrintLogic.configure_atlas_for_baufreigabe_layout483
modules/print_logic.pyPrintLogic._store_druckrechteck631
modules/print_logic.pyPrintLogic.activate_druckrechteck_capture680
modules/print_logic.pyPrintLogic._resolve_selection_layer811
modules/print_logic.pyPrintLogic._get_selected_extent825
modules/print_logic.pyPrintLogic._get_plot_dimensions_mm1078
modules/print_logic.pyPrintLogic._get_required_map_dimensions_mm1088
modules/Pruefmanager.pyPruefmanager.report_summary45
modules/Pruefmanager.pyPruefmanager.zeige_hinweis62
modules/Pruefmanager.pyPruefmanager._handle_datei_existiert83
modules/Pruefmanager.pyPruefmanager._handle_verfahrensgebiet_layer_existiert230
modules/Pruefmanager.pyPruefmanager._ask_use_or_replace_pufferlayer273
ui/navigation.pyNavigation.init_ui33
ui/navigation.pyNavigation.add_action68
ui/navigation.pyNavigation.finalize_menu_and_toolbar81
ui/navigation.pyNavigation.set_active_plugin94
ui/navigation.pyNavigation.remove_action104
ui/navigation.pyNavigation.remove_all115
ui/tabs/print_tab.pyPrintTab.set_services94
modules/Pruefmanager.pyPruefmanager.zeige_hinweis63
modules/Pruefmanager.pyPruefmanager._handle_datei_existiert87
modules/Pruefmanager.pyPruefmanager._handle_verfahrensgebiet_layer_existiert234
modules/Pruefmanager.pyPruefmanager._ask_use_or_replace_pufferlayer277
ui/tabs/print_tab.pyPrintTab._build_ui115
ui/tabs/print_tab.pyPrintTab._restore_state267
ui/tabs/print_tab.pyPrintTab._on_kartenname_changed334
ui/tabs/print_tab.pyPrintTab._on_massstab_changed347
ui/tabs/print_tab.pyPrintTab._on_thema_changed352
ui/tabs/print_tab.pyPrintTab._on_zielgroesse_changed357
ui/tabs/print_tab.pyPrintTab._on_formfaktor_changed362
ui/tabs/print_tab.pyPrintTab._on_druckbereich_changed368
ui/tabs/print_tab.pyPrintTab._on_atlas_erzeugen_changed377
ui/tabs/print_tab.pyPrintTab._on_druckpuffer_clicked392
ui/tabs/print_tab.pyPrintTab._format_druckpuffer_label425
ui/tabs/print_tab.pyPrintTab._on_vorlage_erstellen428
ui/tabs/print_tab.pyPrintTab._disconnect_project_signals441
ui/tabs/print_tab.pyPrintTab._connect_project_signals464
ui/tabs/print_tab.pyPrintTab._toggle_atlas489
ui/tabs/print_tab.pyPrintTab._restore_atlas_layer_selection495
ui/tabs/print_tab.pyPrintTab._disconnect_theme_collection_signals519
ui/tabs/print_tab.pyPrintTab._connect_theme_collection_signals538
ui/tabs/print_tab.pyPrintTab._refresh_thema_combo_live565
ui/tabs/print_tab.pyPrintTab._get_gespeicherte_themen585
ui/tabs/print_tab.pyPrintTab._get_current_canvas_scale602
ui/tabs/print_tab.pyPrintTab._on_atlas_layer_changed612
ui/tabs/print_tab.pyPrintTab._on_auswahl_as_atlas_clicked641
ui/tabs/print_tab.pyPrintTab._populate_atlas_layer_combo679
ui/tabs/settings_tab.pySettingsTab._build_input118
+ui/tabs/print_tab.pyPrintTab._on_kartenname_changed335 +ui/tabs/print_tab.pyPrintTab._on_massstab_changed349 +ui/tabs/print_tab.pyPrintTab._on_zielgroesse_changed361 +ui/tabs/print_tab.pyPrintTab._on_formfaktor_changed367 +ui/tabs/print_tab.pyPrintTab._on_druckbereich_changed374 +ui/tabs/print_tab.pyPrintTab._format_druckpuffer_label432
diff --git a/docs/tests/testkatalog.md b/docs/tests/testkatalog.md index b38db6b..1be0c78 100644 --- a/docs/tests/testkatalog.md +++ b/docs/tests/testkatalog.md @@ -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