Prüfstand

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)
823Testfälle
780grün
35rot (Baseline)
82%mit Docstring
66Testdateien
Verteilung je Paket
sn_basis43 Dateien · 490 Testfälle
sn_verfahrensgebiet18 Dateien · 289 Testfälle
sn_plan415 Dateien · 44 Testfälle

sn_basis

Plattform-Plugin · Ordner Plugin_SN_Basis · 43 Testdateien · 490 Testfälle

Tests für sn_basis/ui/base_dockwidget.py: closeEvent (Issue #65) und Scroll-Bereich je Tab (Basis #104).

CloseEventTests 5ScrollbereichTests 5
flowchart TD
  root(["test_base_dockwidget.py"])
  class root rootnode
  root --> g1["CloseEventTests (5)"]
  class g1 groupnode
  g1 --> t1("ruft_cleanup_aller_tabs_auf")
  g1 --> t2("ignoriert_tabs_ohne_cleanup")
  g1 --> t3("fehler_in_cleanup_wird_abgefangen_und_andere_tabs_laufen_weiter")
  g1 --> t4("setzt_toolbar_action_zurueck")
  g1 --> t5("ohne_action_wird_nichts_zurueckgesetzt")
  root --> g2["ScrollbereichTests (5)"]
  class g2 groupnode
  g2 --> t6("jeder_tab_liegt_in_einem_scrollbereich")
  g2 --> t7("fachplugin_mit_eigenem_tabaufbau_bekommt_scrollbereich")
  g2 --> t8("scrollbereich_wird_nicht_doppelt_angelegt")
  g2 --> t9("setwidget_none_und_andere_widgets_bleiben_unveraendert")
  g2 --> t10("cleanup_erreicht_tabs_im_scrollbereich")
  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
  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üftStatus
CloseEventTests
test_ruft_cleanup_aller_tabs_auf
Prüft, dass closeEvent cleanup() auf allen Tabs des Dock-Widgets aufruft.grün
CloseEventTests
test_ignoriert_tabs_ohne_cleanup
Prüft, dass ein Tab ohne cleanup()-Methode nicht zu einem Fehler führt.grün
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ün
CloseEventTests
test_setzt_toolbar_action_zurueck
Prüft, dass closeEvent die verknüpfte Toolbar-Action auf 'nicht gedrückt' zurücksetzt.grün
CloseEventTests
test_ohne_action_wird_nichts_zurueckgesetzt
Prüft, dass closeEvent ohne verknüpfte Toolbar-Action keine Ausnahme wirft.grün
ScrollbereichTests
test_jeder_tab_liegt_in_einem_scrollbereich
Prüft, dass BaseDockWidget jeden Tab in einen mitwachsenden Scroll-Bereich packt, damit ein langer Tab scrollt, statt das Fenster zu verlängern.grün
ScrollbereichTests
test_fachplugin_mit_eigenem_tabaufbau_bekommt_scrollbereich
Prüft, dass auch ein Fachplugin, das seine Tabs selbst aufbaut und per setWidget einsetzt (wie Plan41, Verfahrensgebiet), Scroll-Bereiche bekommt.grün
ScrollbereichTests
test_scrollbereich_wird_nicht_doppelt_angelegt
Prüft, dass ein Tab, der schon in einem Scroll-Bereich liegt, beim erneuten Einsetzen nicht ein zweites Mal verpackt wird.grün
ScrollbereichTests
test_setwidget_none_und_andere_widgets_bleiben_unveraendert
Prüft, dass setWidget(None) und Widgets ohne Tabs ohne Fehler und unverändert eingesetzt werden.grün
ScrollbereichTests
test_cleanup_erreicht_tabs_im_scrollbereich
Prüft, dass closeEvent cleanup() auch für Tabs aufruft, die in einem Scroll-Bereich liegen.grün

Tests für die Anbindung der Basemap-Legende an Druckablauf, Dialog und Druck-Tab (Basis #88):

TestMehrfachauswahl 1TestDruckanbindung 4TestBasemapBereich 11TestStilvorlagenAustausch 5
flowchart TD
  root(["test_basemap_anbindung.py"])
  class root rootnode
  root --> g1["TestMehrfachauswahl (1)"]
  class g1 groupnode
  g1 --> t1("mock_modus_liefert_vorauswahl_in_listenreihenfolge")
  root --> g2["TestDruckanbindung (4)"]
  class g2 groupnode
  g2 --> t2("basemap_legende_nur_fuer_38_und_41_und_bei_eingeschaltetem_schalter")
  g2 --> t3("layout_wird_markiert_und_legende_erzeugt")
  g2 --> t4("fehler_der_basemap_legende_verhindert_die_vorlage_nicht")
  g2 --> t5("druck_tab_aktualisiert_basemap_bereich_falls_vorhanden")
  root --> g3["TestBasemapBereich (11)"]
  class g3 groupnode
  g3 --> t6("auswertebereich_wird_gespeichert")
  g3 --> t7("aktualisieren_ohne_vorlage_warnt")
  g3 --> t8("aktualisieren_wertet_gewaehlte_vorlage_aus")
  g3 --> t9("stil_laden_uebernimmt_legendenauswahl")
  g3 --> t10("stil_laden_bricht_bei_fremder_vorlage_ab")
  g3 --> t11("vorhandene_vorlage_wird_nur_nach_rueckfrage_ersetzt")
  g3 --> t12("speichern_mit_aktueller_legendenauswahl")
  g3 --> t13("punktlinien_korrigieren_meldet_anzahl")
  g3 --> t14("punktlinien_ohne_basemap_layer_warnt")
  g3 --> t15("stil_speichern_ohne_basemap_layer_warnt")
  g3 --> t16("stil_laden_bricht_bei_fremdem_thema_ab")
  root --> g4["TestStilvorlagenAustausch (5)"]
  class g4 groupnode
  g4 --> t17("export_schreibt_gewaehlte_vorlage")
  g4 --> t18("export_abgebrochen_oder_ohne_vorlage")
  g4 --> t19("import_uebernimmt_datei_unter_gewaehltem_namen")
  g4 --> t20("import_ersetzt_vorhandene_nur_nach_rueckfrage")
  g4 --> t21("import_ungeeigneter_datei_warnt")
  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
  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üftStatus
TestMehrfachauswahl
test_mock_modus_liefert_vorauswahl_in_listenreihenfolge
Prüft, dass der Mehrfachauswahl-Dialog im Mock-Modus die vorausgewählten Schlüssel in Listenreihenfolge liefert.grün
TestDruckanbindung
test_basemap_legende_nur_fuer_38_und_41_und_bei_eingeschaltetem_schalter
Prüft, dass nur §-38- und §-41-Vorlagen eine Basemap-Legende bekommen und nur, wenn der Schalter im Druck-Tab an ist.grün
TestDruckanbindung
test_layout_wird_markiert_und_legende_erzeugt
Prüft, dass PrintLayout das Layout als Basemap-Nutzer kennzeichnet und die Basemap-Legende erzeugen lässt.grün
TestDruckanbindung
test_fehler_der_basemap_legende_verhindert_die_vorlage_nicht
Prüft, dass ein Fehler beim Erzeugen der Basemap-Legende nur als Warnung gemeldet wird und keine Ausnahme durchreicht.grün
TestDruckanbindung
test_druck_tab_aktualisiert_basemap_bereich_falls_vorhanden
Prüft, dass der Druck-Tab den Basemap-Bereich neu einliest und ohne Bereich nichts tut.grün
TestBasemapBereich
test_auswertebereich_wird_gespeichert
Prüft, dass die Wahl des Auswertebereichs in der Projektvariable landet.grün
TestBasemapBereich
test_aktualisieren_ohne_vorlage_warnt
Prüft, dass „Basemap-Legende aktualisieren“ ohne vorhandene Vorlage warnt und nichts auswertet.grün
TestBasemapBereich
test_aktualisieren_wertet_gewaehlte_vorlage_aus
Prüft, dass „Basemap-Legende aktualisieren“ die gewählte Vorlage auswertet und den Erfolg meldet.grün
TestBasemapBereich
test_stil_laden_uebernimmt_legendenauswahl
Prüft, dass das Laden einer Stilvorlage den Layerstil ersetzt und ihre Legendenauswahl in das Projekt übernimmt.grün
TestBasemapBereich
test_stil_laden_bricht_bei_fremder_vorlage_ab
Prüft, dass eine Vorlage mit unbekannten Styles nur nach Bestätigung geladen wird.grün
TestBasemapBereich
test_vorhandene_vorlage_wird_nur_nach_rueckfrage_ersetzt
Prüft, dass eine gleichnamige Stilvorlage ohne Bestätigung nicht überschrieben wird.grün
TestBasemapBereich
test_speichern_mit_aktueller_legendenauswahl
Prüft, dass eine neue Stilvorlage zusammen mit der aktuellen Legendenauswahl gespeichert wird.grün
TestBasemapBereich
test_punktlinien_korrigieren_meldet_anzahl
Prüft, dass „Punktlinien korrigieren“ den Basemap-Layer korrigiert und die Anzahl korrigierter Styles meldet.grün
TestBasemapBereich
test_punktlinien_ohne_basemap_layer_warnt
Prüft, dass ohne Basemap-Layer nichts korrigiert, sondern gewarnt wird.grün
TestBasemapBereich
test_stil_speichern_ohne_basemap_layer_warnt
Prüft, dass ohne Basemap-Layer keine Stilvorlage gespeichert, sondern gewarnt wird.grün
TestBasemapBereich
test_stil_laden_bricht_bei_fremdem_thema_ab
Prüft, dass eine Vorlage eines anderen Themas (Grau auf Farbe) nur nach Bestätigung geladen wird.grün
TestStilvorlagenAustausch
test_export_schreibt_gewaehlte_vorlage
Prüft, dass „Exportieren …“ die gewählte Vorlage in die im Dateidialog gewählte Datei schreibt und den Pfad meldet.grün
TestStilvorlagenAustausch
test_export_abgebrochen_oder_ohne_vorlage
Prüft, dass ohne gewählte Vorlage oder bei abgebrochenem Dateidialog nichts exportiert wird.grün
TestStilvorlagenAustausch
test_import_uebernimmt_datei_unter_gewaehltem_namen
Prüft, dass „Importieren …“ den Namen aus der Datei vorschlägt, unter dem gewählten Namen importiert und die neue Vorlage auswählt.grün
TestStilvorlagenAustausch
test_import_ersetzt_vorhandene_nur_nach_rueckfrage
Prüft, dass ein Import eine gleichnamige Vorlage ohne Bestätigung nicht überschreibt.grün
TestStilvorlagenAustausch
test_import_ungeeigneter_datei_warnt
Prüft, dass eine ungeeignete Importdatei gemeldet wird, ohne nach einem Namen zu fragen oder etwas zu importieren.grün

Tests für modules/basemap_kacheln.py – kachelweise Auswertung des Basemap-Layers (Basis #88).

TestSammleObjekte 4TestZoomUndStile 2
flowchart TD
  root(["test_basemap_kacheln.py"])
  class root rootnode
  root --> g1["TestSammleObjekte (4)"]
  class g1 groupnode
  g1 --> t1("gleiche_objekte_aus_mehreren_kacheln_werden_entdoppelt")
  g1 --> t2("kacheln_ausserhalb_der_geometrie_werden_uebersprungen")
  g1 --> t3("abbruch_liefert_none_und_hebt_auswahl_auf")
  g1 --> t4("anzahl_kacheln_aus_kachelbereich")
  root --> g2["TestZoomUndStile (2)"]
  class g2 groupnode
  g2 --> t5("zoomstufen_wie_im_qgis_renderer")
  g2 --> t6("stile_aus_layer_liest_renderer_styles")
  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üftStatus
TestSammleObjekte
test_gleiche_objekte_aus_mehreren_kacheln_werden_entdoppelt
Prüft, dass Objekte mit gleichem Quell-Layer, Geometrietyp und Attributen über Kachelgrenzen hinweg nur einmal gezählt werden.grün
TestSammleObjekte
test_kacheln_ausserhalb_der_geometrie_werden_uebersprungen
Prüft, dass Kacheln ohne Schnitt mit dem Auswertebereich nicht abgefragt werden.grün
TestSammleObjekte
test_abbruch_liefert_none_und_hebt_auswahl_auf
Prüft, dass ein Abbruch über den Fortschritt None liefert und die Auswahl auf dem Basemap-Layer trotzdem aufgehoben wird.grün
TestSammleObjekte
test_anzahl_kacheln_aus_kachelbereich
Prüft, dass die Kachelzahl aus dem Kachelbereich der Geometrie berechnet wird.grün
TestZoomUndStile
test_zoomstufen_wie_im_qgis_renderer
Prüft, dass Kachelzoom begrenzt, Darstellungszoom unbegrenzt und der gebrochene Zoom aus dem Maßstab bestimmt werden.grün
TestZoomUndStile
test_stile_aus_layer_liest_renderer_styles
Prüft, dass Name, Quell-Layer, Geometrietyp, Zoombereich, Schalter und Filter der Renderer-Styles übernommen werden.grün

Tests für modules/basemap_katalog.py – Legendenkatalog aus der basemap.de-Style-JSON (Basis #88).

TestRendererStil 3TestErzeugeKatalog 6TestSymbolwahlUndPruefung 3
flowchart TD
  root(["test_basemap_katalog.py"])
  class root rootnode
  root --> g1["TestRendererStil (3)"]
  class g1 groupnode
  g1 --> t1("beschriftung_und_3d_sind_keine_renderer_stile")
  g1 --> t2("ausschluss_ueber_liste_und_praefix")
  g1 --> t3("normalisierung_entfernt_variantenkennungen")
  root --> g2["TestErzeugeKatalog (6)"]
  class g2 groupnode
  g2 --> t4("kontur_decker_und_bruecke_bilden_einen_eintrag")
  g2 --> t5("zustand_im_bau_wird_eigener_eintrag")
  g2 --> t6("punkt_und_flaeche_derselben_objektart_werden_zusammengefasst")
  g2 --> t7("ausgeschlossene_stile_fehlen_im_katalog")
  g2 --> t8("fachliche_nachbearbeitung_bleibt_beim_erneuten_lauf_erhalten")
  g2 --> t9("entfallene_style_ids_werden_gemeldet")
  root --> g3["TestSymbolwahlUndPruefung (3)"]
  class g3 groupnode
  g3 --> t10("symbol_stile_je_rolle_nur_grundvariante")
  g3 --> t11("pruefung_findet_doppelte_zuordnung_und_unbekannte_symbole")
  g3 --> t12("ausgelieferter_katalog_ist_konsistent")
  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üftStatus
TestRendererStil
test_beschriftung_und_3d_sind_keine_renderer_stile
Prüft, dass reine Beschriftungen und 3D-Gebäude nicht als Renderer-Style gelten, Icon-Symbole und Flächen schon.grün
TestRendererStil
test_ausschluss_ueber_liste_und_praefix
Prüft, dass Style-IDs über die Ausschlussliste und über Präfixe (Nummernschilder) ausgeschlossen werden.grün
TestRendererStil
test_normalisierung_entfernt_variantenkennungen
Prüft, dass Variantenkennungen wie Kontur, Brücke oder Breitenangaben beim Normalisieren einer Style-ID entfallen.grün
TestErzeugeKatalog
test_kontur_decker_und_bruecke_bilden_einen_eintrag
Prüft, dass Kontur-, Decker-, Fahrbahn- und Brückenvarianten derselben Straßenklasse genau einen Legendeneintrag bilden.grün
TestErzeugeKatalog
test_zustand_im_bau_wird_eigener_eintrag
Prüft, dass „im Bau“ einen eigenen Legendeneintrag mit Zustandsangabe in der Bezeichnung bekommt.grün
TestErzeugeKatalog
test_punkt_und_flaeche_derselben_objektart_werden_zusammengefasst
Prüft, dass das Kran-Symbol aus Bauwerkspunkt und Bauwerksfläche in einem Eintrag landet.grün
TestErzeugeKatalog
test_ausgeschlossene_stile_fehlen_im_katalog
Prüft, dass Hintergrund, Beschriftungen, Nummernschilder und 3D-Gebäude keinem Eintrag zugeordnet werden.grün
TestErzeugeKatalog
test_fachliche_nachbearbeitung_bleibt_beim_erneuten_lauf_erhalten
Prüft, dass Bezeichnung, Gruppe, Zusammenführung und Symbolwahl eines bestehenden Katalogs bei einem erneuten Lauf erhalten bleiben.grün
TestErzeugeKatalog
test_entfallene_style_ids_werden_gemeldet
Prüft, dass eine Style-ID, die in der neuen Style-JSON fehlt, als entfallen gemeldet und aus dem Katalog entfernt wird.grün
TestSymbolwahlUndPruefung
test_symbol_stile_je_rolle_nur_grundvariante
Prüft, dass für das Legendensymbol je Rolle (Kontur, Decker) nur die erste Grundvariante gewählt wird.grün
TestSymbolwahlUndPruefung
test_pruefung_findet_doppelte_zuordnung_und_unbekannte_symbole
Prüft, dass die Katalogprüfung doppelt zugeordnete Style-IDs und Symbol-Styles außerhalb des Katalogs meldet.grün
TestSymbolwahlUndPruefung
test_ausgelieferter_katalog_ist_konsistent
Prüft, dass der ausgelieferte Katalog data/basemap_legende.json ohne Fehler geprüft wird und Kreisstraße mit Kontur und Decker enthält.grün

Tests für modules/basemap_legende.py – Zuordnung, Auswahl und Ablauf der Basemap-Legende (Basis #88).

TestStileUndEintraege 4TestAuswahlUndEinstellungen 6TestLayerErkennung 2TestAblauf 6
flowchart TD
  root(["test_basemap_legende.py"])
  class root rootnode
  root --> g1["TestStileUndEintraege (4)"]
  class g1 groupnode
  g1 --> t1("stil_aktiv_nur_eingeschaltet_und_im_zoombereich")
  g1 --> t2("getroffene_stile_pruefen_layer_geometrie_zoom_und_filter")
  g1 --> t3("eintraege_fassen_styles_zusammen_und_sortieren_nach_gruppe")
  g1 --> t4("ausgeschlossene_und_unbekannte_styles")
  root --> g2["TestAuswahlUndEinstellungen (6)"]
  class g2 groupnode
  g2 --> t5("vorauswahl_bekannte_an_unbekannte_aus")
  g2 --> t6("auswahl_wird_gemerkt_und_vorbelegt")
  g2 --> t7("merken_ergaenzt_die_bisherige_auswahl")
  g2 --> t8("kaputte_projektvariable_ergibt_leere_auswahl")
  g2 --> t9("auswertebereich_standard_und_umstellung")
  g2 --> t10("legende_erzeugen_standard_an")
  root --> g3["TestLayerErkennung (2)"]
  class g3 groupnode
  g3 --> t11("erkennung_ueber_quelle_und_namen")
  g3 --> t12("sichtbare_layer_aus_thema_feste_liste_oder_layerbaum")
  root --> g4["TestAblauf (6)"]
  class g4 groupnode
  g4 --> t13("ohne_basemap_layer_passiert_nichts")
  g4 --> t14("gewaehlte_eintraege_werden_geschrieben_und_gemerkt")
  g4 --> t15("abbruch_im_dialog_aendert_nichts")
  g4 --> t16("rueckfall_auf_druckbereich_wird_gemeldet")
  g4 --> t17("ohne_objekte_keine_legende")
  g4 --> t18("viele_kacheln_werden_vorher_bestaetigt")
  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
  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üftStatus
TestStileUndEintraege
test_stil_aktiv_nur_eingeschaltet_und_im_zoombereich
Prüft, dass ein Style nur aktiv ist, wenn er eingeschaltet ist und die Zoomstufe im Bereich liegt (-1 = unbegrenzt).grün
TestStileUndEintraege
test_getroffene_stile_pruefen_layer_geometrie_zoom_und_filter
Prüft, dass ein Style nur Objekte seines Quell-Layers und Geometrietyps zählt, deren Filter zutrifft, und nur bei passender Zoomstufe.grün
TestStileUndEintraege
test_eintraege_fassen_styles_zusammen_und_sortieren_nach_gruppe
Prüft, dass mehrere Styles eines Katalogeintrags einen Eintrag ergeben und die Einträge nach Gruppen- und Katalogreihenfolge sortiert sind.grün
TestStileUndEintraege
test_ausgeschlossene_und_unbekannte_styles
Prüft, dass ausgeschlossene Styles entfallen und unbekannte Styles als nicht bekannter Eintrag in „Sonstiges“ landen.grün
TestAuswahlUndEinstellungen
test_vorauswahl_bekannte_an_unbekannte_aus
Prüft, dass ohne gespeicherte Auswahl Katalogeinträge vorausgewählt und unbekannte Styles abgewählt sind.grün
TestAuswahlUndEinstellungen
test_auswahl_wird_gemerkt_und_vorbelegt
Prüft, dass ab- und angewählte Einträge in der Projektvariable gespeichert und beim nächsten Mal so vorbelegt werden.grün
TestAuswahlUndEinstellungen
test_merken_ergaenzt_die_bisherige_auswahl
Prüft, dass das Merken die Auswahl nicht angezeigter Einträge aus früheren Läufen behält.grün
TestAuswahlUndEinstellungen
test_kaputte_projektvariable_ergibt_leere_auswahl
Prüft, dass eine nicht lesbare Projektvariable als leere Auswahl gilt.grün
TestAuswahlUndEinstellungen
test_auswertebereich_standard_und_umstellung
Prüft, dass der Auswertebereich standardmäßig das Verfahrensgebiet ist, umgestellt werden kann und unbekannte Werte abgewiesen werden.grün
TestAuswahlUndEinstellungen
test_legende_erzeugen_standard_an
Prüft, dass das Erzeugen der Basemap-Legende standardmäßig eingeschaltet ist und abgeschaltet werden kann.grün
TestLayerErkennung
test_erkennung_ueber_quelle_und_namen
Prüft, dass der Basemap-Layer an Vektorkacheln mit basemap.de-Quelle erkannt wird, der Name nur als Rückfall dient und andere Layertypen nicht zählen.grün
TestLayerErkennung
test_sichtbare_layer_aus_thema_feste_liste_oder_layerbaum
Prüft, dass die Layer der Karte aus dem Kartenthema, sonst aus der festen Layerliste, sonst aus dem sichtbaren Layerbaum kommen.grün
TestAblauf
test_ohne_basemap_layer_passiert_nichts
Prüft, dass ohne sichtbaren Basemap-Layer weder Dialog noch Legende entstehen.grün
TestAblauf
test_gewaehlte_eintraege_werden_geschrieben_und_gemerkt
Prüft, dass nur die im Dialog gewählten Einträge in die Legende geschrieben und die Auswahl gespeichert wird.grün
TestAblauf
test_abbruch_im_dialog_aendert_nichts
Prüft, dass ein Abbruch im Auswahldialog die Legende nicht verändert und keine Auswahl speichert.grün
TestAblauf
test_rueckfall_auf_druckbereich_wird_gemeldet
Prüft, dass ohne Verfahrensgebiet auf den Druckbereich zurückgefallen und das gemeldet wird.grün
TestAblauf
test_ohne_objekte_keine_legende
Prüft, dass ohne Basemap-Objekte im Auswertebereich weder Dialog noch Legende entstehen.grün
TestAblauf
test_viele_kacheln_werden_vorher_bestaetigt
Prüft, dass vor einer Auswertung mit sehr vielen Kacheln nachgefragt wird und eine Ablehnung die Auswertung abbricht.grün

Tests für modules/basemap_legende_layout.py – Basemap-Legende im Drucklayout (Basis #88).

TestKennzeichenUndKarte 2TestSymbolwahl 2TestAutobahnSymbol 3TestHilfslayer 3TestPlatzierung 7
flowchart TD
  root(["test_basemap_legende_layout.py"])
  class root rootnode
  root --> g1["TestKennzeichenUndKarte (2)"]
  class g1 groupnode
  g1 --> t1("layout_kennzeichen_setzen_und_erkennen")
  g1 --> t2("hauptkarte_ueber_id")
  root --> g2["TestSymbolwahl (2)"]
  class g2 groupnode
  g2 --> t3("symbolnamen_aus_aktiven_symbol_stilen_in_renderer_reihenfolge")
  g2 --> t4("ohne_aktive_symbol_stile_erster_getroffener_style")
  root --> g3["TestAutobahnSymbol (3)"]
  class g3 groupnode
  g3 --> t5("druckmassstab_ab_zoom_14_blauer_decker_auf_grauer_kontur")
  g3 --> t6("zoom_11_bis_13_bisherige_kontur_und_decker")
  g3 --> t7("unter_zoom_11_blauer_decker")
  root --> g4["TestHilfslayer (3)"]
  class g4 groupnode
  g4 --> t8("je_gruppe_und_geometrietyp_ein_leerer_hilfslayer")
  g4 --> t9("alte_hilfslayer_werden_entfernt")
  g4 --> t10("ohne_eintraege_wird_vorhandene_basemap_legende_entfernt")
  root --> g5["TestPlatzierung (7)"]
  class g5 groupnode
  g5 --> t11("einspaltig_ueber_der_quellenangabe")
  g5 --> t12("mehrspaltig_wenn_hoehe_nicht_reicht")
  g5 --> t13("spalten_ungleich_breit")
  g5 --> t14("mindestgroesse_mit_ungleichen_spalten_und_umbruch")
  g5 --> t15("neue_basemap_legende_mindestens_so_breit_wie_kartenschild")
  g5 --> t16("titel_zweizeilig")
  g5 --> t17("nie_breiter_als_der_seitenrand_mit_hinweis")
  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
  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üftStatus
TestKennzeichenUndKarte
test_layout_kennzeichen_setzen_und_erkennen
Prüft, dass ein markiertes Layout als Nutzer der Basemap-Legende erkannt und in der Projektliste geführt wird.grün
TestKennzeichenUndKarte
test_hauptkarte_ueber_id
Prüft, dass die Karte mit der ID „Hauptkarte“ gefunden wird.grün
TestSymbolwahl
test_symbolnamen_aus_aktiven_symbol_stilen_in_renderer_reihenfolge
Prüft, dass die Symbol-Styles des Katalogs in Zeichenreihenfolge genommen und inaktive übergangen werden.grün
TestSymbolwahl
test_ohne_aktive_symbol_stile_erster_getroffener_style
Prüft, dass ohne aktiven Symbol-Style der erste tatsächlich getroffene Style das Legendensymbol liefert.grün
TestAutobahnSymbol
test_druckmassstab_ab_zoom_14_blauer_decker_auf_grauer_kontur
Prüft, dass das Autobahn-Symbol ab Zoom 14 aus grauer Kontur und blauem Decker der Fahrbahnachse besteht statt nur aus einem grauen Style.grün
TestAutobahnSymbol
test_zoom_11_bis_13_bisherige_kontur_und_decker
Prüft, dass das Autobahn-Symbol bei Zoom 11 bis 13 weiterhin aus Kontur und Decker der getrennten Fahrbahn besteht.grün
TestAutobahnSymbol
test_unter_zoom_11_blauer_decker
Prüft, dass das Autobahn-Symbol unter Zoom 11 den blauen Decker der Übersichtsdarstellung nutzt.grün
TestHilfslayer
test_je_gruppe_und_geometrietyp_ein_leerer_hilfslayer
Prüft, dass je Gruppe und Geometrietyp ein Hilfslayer außerhalb des Layerbaums entsteht, Flächen vor Linien, ohne Rückfrage beim Schließen.grün
TestHilfslayer
test_alte_hilfslayer_werden_entfernt
Prüft, dass die Hilfslayer einer früheren Basemap-Legende des Layouts aus dem Projekt entfernt werden.grün
TestHilfslayer
test_ohne_eintraege_wird_vorhandene_basemap_legende_entfernt
Prüft, dass ohne gewählte Einträge eine vorhandene Basemap-Legende entfernt und die Auswahl am Layout vermerkt wird.grün
TestPlatzierung
test_einspaltig_ueber_der_quellenangabe
Prüft, dass die Basemap-Legende einspaltig unten an der Quellenangabe verankert wird, wenn der Platz reicht.grün
TestPlatzierung
test_mehrspaltig_wenn_hoehe_nicht_reicht
Prüft, dass die Legende zwei- oder dreispaltig wird, wenn sie einspaltig nicht zwischen Hauptlegende und Quellenangabe passt.grün
TestPlatzierung
test_spalten_ungleich_breit
Prüft, dass die Basemap-Legende ungleich breite Spalten bekommt (#96).grün
TestPlatzierung
test_mindestgroesse_mit_ungleichen_spalten_und_umbruch
Prüft, dass der Platzbedarf mit ungleich breiten Spalten und Textumbruch berechnet wird (#96).grün
TestPlatzierung
test_neue_basemap_legende_mindestens_so_breit_wie_kartenschild
Prüft, dass eine neu angelegte Basemap-Legende die Breite des Kartenschilds als Mindestbreite bekommt.grün
TestPlatzierung
test_titel_zweizeilig
Prüft, dass der Titel der Basemap-Legende zweizeilig ist, damit er die Mindestbreite nicht bestimmt (#96).grün
TestPlatzierung
test_nie_breiter_als_der_seitenrand_mit_hinweis
Prüft, dass keine Spaltenzahl gewählt wird, die über den Seitenrand ragt, und dann ein Hinweis kommt.grün

Tests für den Legendenrand weißer Basemap-Flächen (Basis #92).

TestBrauchtLegendenrand 4TestErgaenzeLegendenrand 2
flowchart TD
  root(["test_basemap_legende_rand.py"])
  class root rootnode
  root --> g1["TestBrauchtLegendenrand (4)"]
  class g1 groupnode
  g1 --> t1("weisse_flaeche_ohne_rand")
  g1 --> t2("farbige_flaeche_oder_flaeche_mit_kontur")
  g1 --> t3("heller_rand_und_fast_weiss_zaehlen_als_unsichtbar")
  g1 --> t4("andere_ebenen_und_leeres_symbol")
  root --> g2["TestErgaenzeLegendenrand (2)"]
  class g2 groupnode
  g2 --> t5("weisse_flaeche_bekommt_grauen_rand")
  g2 --> t6("farbige_flaeche_und_linien_bleiben_unveraendert")
  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üftStatus
TestBrauchtLegendenrand
test_weisse_flaeche_ohne_rand
Prüft, dass eine weiße Fläche ohne Umrandung einen Legendenrand braucht.grün
TestBrauchtLegendenrand
test_farbige_flaeche_oder_flaeche_mit_kontur
Prüft, dass farbige Flächen und weiße Flächen mit dunkler Kontur oder eigener Konturlinie keinen Rand bekommen.grün
TestBrauchtLegendenrand
test_heller_rand_und_fast_weiss_zaehlen_als_unsichtbar
Prüft, dass fast weiße Füllungen und helle oder durchsichtige Ränder als unsichtbar gelten.grün
TestBrauchtLegendenrand
test_andere_ebenen_und_leeres_symbol
Prüft, dass Symbole mit anderen Ebenen (Muster, Punkte) und leere Symbole keinen Rand bekommen.grün
TestErgaenzeLegendenrand
test_weisse_flaeche_bekommt_grauen_rand
Prüft, dass eine weiße Fläche ohne Kontur eine graue Randlinie als oberste Ebene bekommt.grün
TestErgaenzeLegendenrand
test_farbige_flaeche_und_linien_bleiben_unveraendert
Prüft, dass farbige Flächen, Flächen mit Kontur und Liniensymbole keinen Rand bekommen.grün

Tests für modules/basemap_stilkorrektur.py – Punktlinien des Basemap-Layers sichtbar machen (Basis #90).

TestMusterUndAusdruck 2TestLayerkorrektur 4
flowchart TD
  root(["test_basemap_stilkorrektur.py"])
  class root rootnode
  root --> g1["TestMusterUndAusdruck (2)"]
  class g1 groupnode
  g1 --> t1("strichlaenge_null_im_festen_muster")
  g1 --> t2("strichlaenge_null_im_zoomabhaengigen_ausdruck")
  root --> g2["TestLayerkorrektur (4)"]
  class g2 groupnode
  g2 --> t3("punktlinien_werden_korrigiert_andere_styles_nicht")
  g2 --> t4("zweiter_lauf_korrigiert_nichts")
  g2 --> t5("nur_ausdruck_ohne_festes_muster")
  g2 --> t6("layer_ohne_renderer")
  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üftStatus
TestMusterUndAusdruck
test_strichlaenge_null_im_festen_muster
Prüft, dass Strichlängen 0 (gerade Positionen) im Strichmuster ersetzt und Lücken der Länge 0 nicht verändert werden.grün
TestMusterUndAusdruck
test_strichlaenge_null_im_zoomabhaengigen_ausdruck
Prüft, dass jede Strichlänge 0 in den array(...)-Mustern des Konverter-Ausdrucks ersetzt wird und der übrige Ausdruck gleich bleibt.grün
TestLayerkorrektur
test_punktlinien_werden_korrigiert_andere_styles_nicht
Prüft, dass nur Styles mit Strichlänge 0 korrigiert werden – Muster und Ausdruck – und die Anzahl zurückkommt.grün
TestLayerkorrektur
test_zweiter_lauf_korrigiert_nichts
Prüft, dass ein zweiter Lauf keine Styles mehr korrigiert und nicht neu zeichnen lässt.grün
TestLayerkorrektur
test_nur_ausdruck_ohne_festes_muster
Prüft, dass auch ein Style korrigiert wird, dessen Strichlänge 0 nur im zoomabhängigen Ausdruck steht.grün
TestLayerkorrektur
test_layer_ohne_renderer
Prüft, dass ein Layer ohne Renderer 0 korrigierte Styles liefert.grün

Tests für modules/basemap_stilvorlagen.py – lokale Stilvorlagen des Basemap-Layers (Basis #88),

TestStilvorlagen 8TestExportImport 6
flowchart TD
  root(["test_basemap_stilvorlagen.py"])
  class root rootnode
  root --> g1["TestStilvorlagen (8)"]
  class g1 groupnode
  g1 --> t1("speichern_und_auflisten")
  g1 --> t2("mehrere_varianten_alphabetisch")
  g1 --> t3("leerer_name_oder_fehler_beim_schreiben")
  g1 --> t4("laden_setzt_stil_und_zeichnet_neu")
  g1 --> t5("passung_meldet_fremde_styles")
  g1 --> t6("standard_setzen_und_beim_loeschen_entfernen")
  g1 --> t7("fehlende_begleitdatei_wird_toleriert")
  g1 --> t8("ohne_ordner_leere_liste")
  root --> g2["TestExportImport (6)"]
  class g2 groupnode
  g2 --> t9("export_und_import_uebertragen_vorlage_mit_begleitdaten")
  g2 --> t10("export_einer_fehlenden_vorlage")
  g2 --> t11("import_einer_reinen_qml_datei")
  g2 --> t12("import_lehnt_ungeeignete_dateien_ab")
  g2 --> t13("import_uebernimmt_nur_bekannte_begleitdaten")
  g2 --> t14("thema_der_vorlage_passt_nicht_zum_layer")
  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
  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üftStatus
TestStilvorlagen
test_speichern_und_auflisten
Prüft, dass eine gespeicherte Vorlage mit Anzeigenamen, QML-Datei und Begleitdatei aufgelistet wird.grün
TestStilvorlagen
test_mehrere_varianten_alphabetisch
Prüft, dass mehrere Varianten nebeneinander bestehen und alphabetisch nach Anzeigename sortiert werden.grün
TestStilvorlagen
test_leerer_name_oder_fehler_beim_schreiben
Prüft, dass ein leerer Name und ein Schreibfehler von QGIS als ValueError gemeldet werden.grün
TestStilvorlagen
test_laden_setzt_stil_und_zeichnet_neu
Prüft, dass das Laden die QML-Datei der Vorlage in den Layer lädt und neu zeichnen lässt.grün
TestStilvorlagen
test_passung_meldet_fremde_styles
Prüft, dass Style-Namen der Vorlage gemeldet werden, die der Ziel-Layer nicht kennt.grün
TestStilvorlagen
test_standard_setzen_und_beim_loeschen_entfernen
Prüft, dass eine Vorlage als Standard markiert wird und die Markierung beim Löschen der Vorlage entfällt.grün
TestStilvorlagen
test_fehlende_begleitdatei_wird_toleriert
Prüft, dass eine QML-Datei ohne Begleitdatei mit ihrem Dateinamen aufgelistet wird.grün
TestStilvorlagen
test_ohne_ordner_leere_liste
Prüft, dass ohne angelegten Vorlagenordner eine leere Liste zurückkommt.grün
TestExportImport
test_export_und_import_uebertragen_vorlage_mit_begleitdaten
Prüft, dass eine exportierte Vorlage auf einem anderen Rechner mit Anzeigename, Thema, Style-Namen und Legendenauswahl ankommt.grün
TestExportImport
test_export_einer_fehlenden_vorlage
Prüft, dass der Export einer nicht vorhandenen Vorlage als ValueError gemeldet wird und keine Datei entsteht.grün
TestExportImport
test_import_einer_reinen_qml_datei
Prüft, dass eine QML-Datei ohne Begleitdatei mit dem Dateinamen als Namensvorschlag und ohne Thema übernommen wird.grün
TestExportImport
test_import_lehnt_ungeeignete_dateien_ab
Prüft, dass Dateien ohne QGIS-Stil und ZIP-Dateien ohne genau eine QML-Datei abgelehnt werden, ohne etwas anzulegen.grün
TestExportImport
test_import_uebernimmt_nur_bekannte_begleitdaten
Prüft, dass ein Import unbekannte oder falsch typisierte Angaben der Begleitdatei verwirft und den gewählten Namen nutzt.grün
TestExportImport
test_thema_der_vorlage_passt_nicht_zum_layer
Prüft, dass ein abweichendes Thema der Vorlage gemeldet wird und ohne Thema in Vorlage oder Layer keine Meldung kommt.grün

Tests für modules/basemap_themen.py und den Abschnitt „Basemap-Layer“ im Basemap-Bereich (Basis #100):

TestQuelleUndThema 4TestPruefwert 3TestLayerUndThemenwechsel 7TestStilvorlageMitThema 1TestAuswahlDialog 1TestBasemapHinzufuegen 5TestThemaWechseln 8TestZielLayer 1
flowchart TD
  root(["test_basemap_themen.py"])
  class root rootnode
  root --> g1["TestQuelleUndThema (4)"]
  class g1 groupnode
  g1 --> t1("quelle_enthaelt_kachel_url_und_style_des_themas")
  g1 --> t2("unbekannte_style_json_ergibt_kein_thema")
  g1 --> t3("unbekannter_schluessel_faellt_auf_farbe_zurueck")
  g1 --> t4("vorhandener_layer_wird_an_der_quell_url_erkannt")
  root --> g2["TestPruefwert (3)"]
  class g2 groupnode
  g2 --> t5("gleiche_darstellung_gleicher_pruefwert_auch_bei_anderer_qgis_version")
  g2 --> t6("ohne_ausgabe_der_darstellung_kein_pruefwert")
  g2 --> t7("aenderungsstand_unbekannt_unveraendert_geaendert")
  root --> g3["TestLayerUndThemenwechsel (7)"]
  class g3 groupnode
  g3 --> t8("neuer_layer_hat_thema_namen_und_gemerkten_stand")
  g3 --> t9("ungueltiger_layer_oder_fehlender_themenstil_meldet_fehler")
  g3 --> t10("ohne_vektorkacheln_kein_layer")
  g3 --> t11("layer_kommt_ganz_unten_in_den_layerbaum")
  g3 --> t12("themenwechsel_stellt_quelle_um_und_merkt_neuen_stand")
  g3 --> t13("themenwechsel_behaelt_eigenen_layernamen")
  g3 --> t14("themenwechsel_ohne_umstellbare_quelle_meldet_fehler")
  root --> g4["TestStilvorlageMitThema (1)"]
  class g4 groupnode
  g4 --> t15("stilvorlage_vermerkt_das_thema")
  root --> g5["TestAuswahlDialog (1)"]
  class g5 groupnode
  g5 --> t16("mock_modus_liefert_vorbelegung")
  root --> g6["TestBasemapHinzufuegen (5)"]
  class g6 groupnode
  g6 --> t17("ohne_vorhandenen_layer_wird_ohne_rueckfrage_hinzugefuegt")
  g6 --> t18("vorhandener_layer_wird_in_der_rueckfrage_genannt_abbrechen")
  g6 --> t19("zusaetzlich_laden_fuegt_zweiten_layer_hinzu")
  g6 --> t20("ersetzen_laedt_vorhandenen_layer_im_gewaehlten_thema")
  g6 --> t21("fehler_beim_anlegen_wird_gemeldet")
  root --> g7["TestThemaWechseln (8)"]
  class g7 groupnode
  g7 --> t22("unveraenderter_layer_wechselt_ohne_rueckfrage")
  g7 --> t23("gleiches_thema_aendert_nichts")
  g7 --> t24("geaenderte_darstellung_abbrechen_behaelt_thema")
  g7 --> t25("geaenderte_darstellung_verwerfen_wechselt")
  g7 --> t26("als_stil_speichern_sichert_vor_dem_wechsel")
  g7 --> t27("abgebrochenes_speichern_verhindert_den_wechsel")
  g7 --> t28("unbekannter_stand_fragt_nach")
  g7 --> t29("ohne_basemap_layer_nur_vorauswahl")
  root --> g8["TestZielLayer (1)"]
  class g8 groupnode
  g8 --> t30("ausgewaehlter_basemap_layer_hat_vorrang")
  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
  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üftStatus
TestQuelleUndThema
test_quelle_enthaelt_kachel_url_und_style_des_themas
Prüft, dass die Layerquelle eines Themas die gemeinsame Kachel-URL und die Style-JSON des Themas enthält.grün
TestQuelleUndThema
test_unbekannte_style_json_ergibt_kein_thema
Prüft, dass ein Layer mit fremder oder fehlender Style-JSON keinem Thema zugeordnet wird.grün
TestQuelleUndThema
test_unbekannter_schluessel_faellt_auf_farbe_zurueck
Prüft, dass ein unbekannter Themenschlüssel auf das Standardthema „Farbe“ zurückfällt.grün
TestQuelleUndThema
test_vorhandener_layer_wird_an_der_quell_url_erkannt
Prüft, dass ein vorhandener Basemap-Layer an der Kachel-URL erkannt wird – unabhängig von Name, Thema und URL-Kodierung.grün
TestPruefwert
test_gleiche_darstellung_gleicher_pruefwert_auch_bei_anderer_qgis_version
Prüft, dass dieselbe Darstellung denselben Prüfwert ergibt, auch wenn die QGIS-Version in der QML abweicht.grün
TestPruefwert
test_ohne_ausgabe_der_darstellung_kein_pruefwert
Prüft, dass kein Prüfwert entsteht, wenn der Layer seine Darstellung nicht ausgeben kann.grün
TestPruefwert
test_aenderungsstand_unbekannt_unveraendert_geaendert
Prüft, dass der Änderungsstand ohne gemerkten Prüfwert „unbekannt“ ist, nach dem Merken „unverändert“ und nach einer Änderung „geändert“.grün
TestLayerUndThemenwechsel
test_neuer_layer_hat_thema_namen_und_gemerkten_stand
Prüft, dass ein neuer Basemap-Layer im gewählten Thema entsteht, den Themenstil lädt und als unverändert gilt.grün
TestLayerUndThemenwechsel
test_ungueltiger_layer_oder_fehlender_themenstil_meldet_fehler
Prüft, dass ein ungültiger Layer oder ein nicht ladbarer Themenstil als ValueError gemeldet wird.grün
TestLayerUndThemenwechsel
test_ohne_vektorkacheln_kein_layer
Prüft, dass ohne Vektorkachel-Unterstützung (Mock-Modus) kein Layer erzeugt, sondern ein Fehler gemeldet wird.grün
TestLayerUndThemenwechsel
test_layer_kommt_ganz_unten_in_den_layerbaum
Prüft, dass der Basemap-Layer ohne automatische Einordnung ins Projekt kommt und unten an den Layerbaum angehängt wird.grün
TestLayerUndThemenwechsel
test_themenwechsel_stellt_quelle_um_und_merkt_neuen_stand
Prüft, dass der Themenwechsel die Style-JSON der Quelle umstellt, den Themenstil lädt, den automatischen Namen anpasst und den neuen Stand merkt.grün
TestLayerUndThemenwechsel
test_themenwechsel_behaelt_eigenen_layernamen
Prüft, dass ein vom Nutzer vergebener Layername beim Themenwechsel erhalten bleibt.grün
TestLayerUndThemenwechsel
test_themenwechsel_ohne_umstellbare_quelle_meldet_fehler
Prüft, dass ein Layer ohne setDataSource den Themenwechsel mit einem ValueError ablehnt.grün
TestStilvorlageMitThema
test_stilvorlage_vermerkt_das_thema
Prüft, dass eine gespeicherte Stilvorlage das Thema des Layers in ihrer Begleitdatei und in der Liste vermerkt.grün
TestAuswahlDialog
test_mock_modus_liefert_vorbelegung
Prüft, dass die Rückfrage mit frei benannten Knöpfen im Mock-Modus den vorbelegten Schlüssel liefert.grün
TestBasemapHinzufuegen
test_ohne_vorhandenen_layer_wird_ohne_rueckfrage_hinzugefuegt
Prüft, dass ohne Basemap-Layer gleicher Quelle sofort ein Layer im gewählten Thema hinzugefügt wird.grün
TestBasemapHinzufuegen
test_vorhandener_layer_wird_in_der_rueckfrage_genannt_abbrechen
Prüft, dass ein vorhandener Layer gleicher Quelle in der Rückfrage genannt wird und „Abbrechen“ nichts verändert.grün
TestBasemapHinzufuegen
test_zusaetzlich_laden_fuegt_zweiten_layer_hinzu
Prüft, dass „Zusätzlich laden“ einen weiteren Basemap-Layer neben dem vorhandenen hinzufügt.grün
TestBasemapHinzufuegen
test_ersetzen_laedt_vorhandenen_layer_im_gewaehlten_thema
Prüft, dass „Ersetzen“ keinen neuen Layer anlegt, sondern den vorhandenen im gewählten Thema neu lädt.grün
TestBasemapHinzufuegen
test_fehler_beim_anlegen_wird_gemeldet
Prüft, dass ein nicht erreichbarer Dienst als Warnung gemeldet und kein Layer hinzugefügt wird.grün
TestThemaWechseln
test_unveraenderter_layer_wechselt_ohne_rueckfrage
Prüft, dass ein unveränderter Basemap-Layer ohne Rückfrage auf das gewählte Thema wechselt.grün
TestThemaWechseln
test_gleiches_thema_aendert_nichts
Prüft, dass die Wahl des Themas, das der Layer schon hat, nichts neu lädt.grün
TestThemaWechseln
test_geaenderte_darstellung_abbrechen_behaelt_thema
Prüft, dass bei geänderter Darstellung nachgefragt wird und „Abbrechen“ Thema und Darstellung unverändert lässt.grün
TestThemaWechseln
test_geaenderte_darstellung_verwerfen_wechselt
Prüft, dass „Verwerfen“ die geänderte Darstellung aufgibt und das Thema wechselt.grün
TestThemaWechseln
test_als_stil_speichern_sichert_vor_dem_wechsel
Prüft, dass „Als Stil speichern“ die Darstellung vor dem Themenwechsel als Stilvorlage sichert.grün
TestThemaWechseln
test_abgebrochenes_speichern_verhindert_den_wechsel
Prüft, dass das Thema nicht wechselt, wenn „Als Stil speichern“ gewählt, die Namensabfrage aber abgebrochen wird.grün
TestThemaWechseln
test_unbekannter_stand_fragt_nach
Prüft, dass bei einem Layer ohne gemerkten Prüfwert (vor dieser Funktion geladen) vorsichtshalber nachgefragt wird.grün
TestThemaWechseln
test_ohne_basemap_layer_nur_vorauswahl
Prüft, dass die Themenwahl ohne Basemap-Layer nur als Vorauswahl für „Basemap hinzufügen“ dient und nichts meldet.grün
TestZielLayer
test_ausgewaehlter_basemap_layer_hat_vorrang
Prüft, dass der im Layerbaum ausgewählte Basemap-Layer Ziel des Themenwechsels ist, sonst der erste Basemap-Layer.grün

— (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 (8)"]
  class g1 groupnode
  g1 --> t1("analyze_source_type_detects_excel")
  g1 --> t2("analyze_source_type_returns_unknown_filetype")
  g1 --> t3("analyze_source_type_detects_service_when_file_check_fails")
  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üftStatus
TestDataGrabber
test_analyze_source_type_detects_excel
Prüft, dass eine erreichbare .xlsx-Datei als Quelltyp 'excel' erkannt wird.grün
TestDataGrabber
test_analyze_source_type_returns_unknown_filetype
Prüft, dass eine erreichbare Datei mit unbekannter Endung als 'unbekannter_dateityp' eingestuft wird.grün
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ün
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
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
TestDataGrabber
test_run_returns_failure_summary_without_rows
Prüft, dass run() bei nicht erkennbarer Quelle eine Fehlermeldung ohne Zeilen liefert.grün
TestDataGrabber
test_aggregate_results_mit_zeilen_liefert_erfolgsergebnis
Prüft, dass _aggregate_results bei vorhandenen Zeilen ein Erfolgsergebnis mit Zeilenzahl liefert.grün
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

— (Docstring fehlt)

TestDateipruefer 17
flowchart TD
  root(["test_dateipruefer.py"])
  class root rootnode
  root --> g1["TestDateipruefer (17)"]
  class g1 groupnode
  g1 --> t1("leereingabe_erlaubt")
  g1 --> t2("leereingabe_nicht_erlaubt")
  g1 --> t3("standarddatei_vorschlagen")
  g1 --> t4("temporaer_erlaubt")
  g1 --> t5("datei_nicht_gefunden")
  g1 --> t6("datei_ok")
  g1 --> t7("erkenne_dateityp_unterscheidet_excel_datenbank_und_unbekannt")
  g1 --> t8("pfad_verbindet_relativen_pfad_mit_basispfad")
  g1 --> t9("pfad_laesst_absoluten_pfad_unveraendert")
  g1 --> t10("ist_gueltiger_gpkg_pfad_akzeptiert_vorhandenes_verzeichnis")
  g1 --> t11("ist_gueltiger_gpkg_pfad_lehnt_falsche_endung_ab")
  g1 --> t12("ist_gueltiger_gpkg_pfad_lehnt_fehlendes_verzeichnis_ab")
  g1 --> t13("ist_leer_erkennt_none_und_nicht_string_als_leer")
  g1 --> t14("ist_leer_erkennt_reinen_whitespace_als_leer")
  g1 --> t15("ist_leer_meldet_pfad_mit_sichtbaren_zeichen_nicht_als_leer")
  g1 --> t16("leere_eingabe_bevorzugt_leereingabe_erlaubt_vor_standarddatei")
  g1 --> t17("leere_eingabe_bevorzugt_standarddatei_vor_temporaer_erlaubt")
  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
  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üftStatus
TestDateipruefer
test_leereingabe_erlaubt
Prüft, dass eine leere Pfadangabe bei leereingabe_erlaubt=True als 'leereingabe_erlaubt' ohne Kontext gemeldet wird.grün
TestDateipruefer
test_leereingabe_nicht_erlaubt
Prüft, dass eine leere Pfadangabe ohne leereingabe_erlaubt als 'leereingabe_nicht_erlaubt' abgelehnt wird.grün
TestDateipruefer
test_standarddatei_vorschlagen
Prüft, dass bei leerer Pfadangabe mit gesetzter Standarddatei 'standarddatei_vorschlagen' mit dem Standardpfad als Kontext geliefert wird.grün
TestDateipruefer
test_temporaer_erlaubt
Prüft, dass eine leere Pfadangabe bei temporaer_erlaubt=True als 'temporaer_erlaubt' ohne Kontext gemeldet wird.grün
TestDateipruefer
test_datei_nicht_gefunden
Prüft, dass ein nicht existierender Dateipfad als 'datei_nicht_gefunden' mit dem Pfad als Kontext abgelehnt wird.grün
TestDateipruefer
test_datei_ok
Prüft, dass ein existierender Dateipfad als 'ok' mit dem Pfad als Kontext bestätigt wird.grün
TestDateipruefer
test_erkenne_dateityp_unterscheidet_excel_datenbank_und_unbekannt
Prüft, dass erkenne_dateityp .xlsx als 'excel', .gpkg/.sqlite als 'datenbank' und Rest als 'unbekannt' erkennt.grün
TestDateipruefer
test_pfad_verbindet_relativen_pfad_mit_basispfad
Prüft, dass _pfad einen relativen Pfad mit dem Basisverzeichnis verbindet.grün
TestDateipruefer
test_pfad_laesst_absoluten_pfad_unveraendert
Prüft, dass _pfad einen bereits absoluten Pfad nicht mit dem Basisverzeichnis verbindet.grün
TestDateipruefer
test_ist_gueltiger_gpkg_pfad_akzeptiert_vorhandenes_verzeichnis
Prüft, dass ein .gpkg-Pfad mit vorhandenem Zielverzeichnis als gültig gilt.grün
TestDateipruefer
test_ist_gueltiger_gpkg_pfad_lehnt_falsche_endung_ab
Prüft, dass ein Pfad ohne .gpkg-Endung als ungültig gilt, auch bei vorhandenem Verzeichnis.grün
TestDateipruefer
test_ist_gueltiger_gpkg_pfad_lehnt_fehlendes_verzeichnis_ab
Prüft, dass ein .gpkg-Pfad in einem nicht vorhandenen Verzeichnis als ungültig gilt.grün
TestDateipruefer
test_ist_leer_erkennt_none_und_nicht_string_als_leer
Prüft, dass _ist_leer sowohl None als auch einen Nicht-String-Wert als leer meldet.grün
TestDateipruefer
test_ist_leer_erkennt_reinen_whitespace_als_leer
Prüft, dass _ist_leer eine Eingabe aus reinen Leerzeichen als leer meldet.grün
TestDateipruefer
test_ist_leer_meldet_pfad_mit_sichtbaren_zeichen_nicht_als_leer
Prüft, dass _ist_leer einen Pfad mit sichtbaren Zeichen nicht als leer meldet.grün
TestDateipruefer
test_leere_eingabe_bevorzugt_leereingabe_erlaubt_vor_standarddatei
Prüft, dass bei leerer Eingabe leereingabe_erlaubt Vorrang vor einer gesetzten Standarddatei hat.grün
TestDateipruefer
test_leere_eingabe_bevorzugt_standarddatei_vor_temporaer_erlaubt
Prüft, dass bei leerer Eingabe eine gesetzte Standarddatei Vorrang vor temporaer_erlaubt hat.grün

Tests für sn_basis/modules/Datenabruf.py (Datenabruf-Kernpipeline, Issue #63).

DetermineSpatialFilterTests 7BuildProviderUrlTests 9FetchFeaturesTests 5DatenabrufOrchestrierungTests 3
flowchart TD
  root(["test_datenabruf.py"])
  class root rootnode
  root --> g1["DetermineSpatialFilterTests (7)"]
  class g1 groupnode
  g1 --> t1("raumfilter_ohne_liefert_none")
  g1 --> t2("fehlender_layer_liefert_none")
  g1 --> t3("unbekannter_raumfilter_liefert_none")
  g1 --> t4("verfahrensgebiet_liefert_extent_und_crs")
  g1 --> t5("verfahrensgebiet_ohne_extent_liefert_none")
  g1 --> t6("pufferlayer_liefert_extent_des_pufferlayers")
  g1 --> t7("pufferlayer_ohne_puffer_liefert_none")
  root --> g2["BuildProviderUrlTests (9)"]
  class g2 groupnode
  g2 --> t8("wms_liefert_link_unveraendert")
  g2 --> t9("url_praefix_wird_entfernt")
  g2 --> t10("wfs_baut_standardparameter_und_bbox_mit_crs")
  g2 --> t11("wfs_repariert_doppeltes_fragezeichen")
  g2 --> t12("wfs_ohne_raumfilter_setzt_keine_bbox")
  g2 --> t13("rest_provider_haengt_query_endpunkt_an")
  g2 --> t14("rest_provider_mit_bbox_baut_geometry_envelope_und_srid")
  g2 --> t15("default_provider_haengt_generischen_bbox_parameter_an")
  g2 --> t16("default_provider_ohne_raumfilter_laesst_query_unveraendert")
  root --> g3["FetchFeaturesTests (5)"]
  class g3 groupnode
  g3 --> t17("wms_liefert_keine_features_ohne_fehler")
  g3 --> t18("abbruch_vor_abruf_liefert_fehlermeldung")
  g3 --> t19("json_featurecollection_wird_geparst")
  g3 --> t20("netzwerkfehler_wird_als_fehlermeldung_gemeldet")
  g3 --> t21("wfs_xml_liefert_anzahl_aus_numberofmatched")
  root --> g4["DatenabrufOrchestrierungTests (3)"]
  class g4 groupnode
  g4 --> t22("fehlende_pflichtfelder_werden_als_ungueltig_gemeldet")
  g4 --> t23("wms_zeile_ohne_features_landet_in_ausserhalb")
  g4 --> t24("abbruch_ueber_progress_stoppt_weitere_zeilen")
  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
  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üftStatus
DetermineSpatialFilterTests
test_raumfilter_ohne_liefert_none
Prüft, dass Raumfilter 'ohne' unabhängig vom Layer immer None liefert.grün
DetermineSpatialFilterTests
test_fehlender_layer_liefert_none
Prüft, dass ohne Verfahrensgebiet-Layer kein Raumfilter gebaut wird.grün
DetermineSpatialFilterTests
test_unbekannter_raumfilter_liefert_none
Prüft, dass ein unbekannter Raumfilter-Wert None liefert, statt einen Fehler zu werfen.grün
DetermineSpatialFilterTests
test_verfahrensgebiet_liefert_extent_und_crs
Prüft, dass Raumfilter 'Verfahrensgebiet' Extent und CRS des Verfahrensgebiet-Layers liefert.grün
DetermineSpatialFilterTests
test_verfahrensgebiet_ohne_extent_liefert_none
Prüft, dass ein Verfahrensgebiet-Layer ohne ermittelbaren Extent None liefert.grün
DetermineSpatialFilterTests
test_pufferlayer_liefert_extent_des_pufferlayers
Prüft, dass Raumfilter 'Pufferlayer' Extent und CRS des erzeugten Pufferlayers liefert.grün
DetermineSpatialFilterTests
test_pufferlayer_ohne_puffer_liefert_none
Prüft, dass 'Pufferlayer' None liefert, wenn kein Pufferlayer erzeugt werden konnte.grün
BuildProviderUrlTests
test_wms_liefert_link_unveraendert
Prüft, dass bei Provider WMS der Link unverändert durchgereicht wird, auch mit Raumfilter.grün
BuildProviderUrlTests
test_url_praefix_wird_entfernt
Prüft, dass ein vorangestelltes 'url=' aus dem Link entfernt wird.grün
BuildProviderUrlTests
test_wfs_baut_standardparameter_und_bbox_mit_crs
Prüft, dass WFS-Abrufe Standardparameter, umbenanntes TYPENAMES und BBOX mit CRS-URN erhalten.grün
BuildProviderUrlTests
test_wfs_repariert_doppeltes_fragezeichen
Prüft, dass ein zweites '?' im WFS-Link zu '&' korrigiert wird, statt eine ungültige URL zu erzeugen.grün
BuildProviderUrlTests
test_wfs_ohne_raumfilter_setzt_keine_bbox
Prüft, dass WFS ohne Raumfilter (bbox_geom=None) keinen BBOX-Parameter setzt.grün
BuildProviderUrlTests
test_rest_provider_haengt_query_endpunkt_an
Prüft, dass REST/ArcGIS-Links ohne '/query'-Endpunkt automatisch ergänzt werden.grün
BuildProviderUrlTests
test_rest_provider_mit_bbox_baut_geometry_envelope_und_srid
Prüft, dass REST-Abrufe mit Raumfilter eine Geometry-Envelope und inSR/outSR aus dem CRS setzen.grün
BuildProviderUrlTests
test_default_provider_haengt_generischen_bbox_parameter_an
Prüft, dass ein unbekannter Provider mit Raumfilter einen generischen bbox-Parameter erhält.grün
BuildProviderUrlTests
test_default_provider_ohne_raumfilter_laesst_query_unveraendert
Prüft, dass ein unbekannter Provider ohne Raumfilter keinen bbox-Parameter ergänzt.grün
FetchFeaturesTests
test_wms_liefert_keine_features_ohne_fehler
Prüft, dass bei Provider WMS kein Featureabruf stattfindet und kein Fehler gemeldet wird.grün
FetchFeaturesTests
test_abbruch_vor_abruf_liefert_fehlermeldung
Prüft, dass ein bereits gesetzter Abbruch vor dem eigentlichen Abruf erkannt wird.grün
FetchFeaturesTests
test_json_featurecollection_wird_geparst
Prüft, dass eine JSON-FeatureCollection-Antwort in eine Feature-Liste umgewandelt wird.grün
FetchFeaturesTests
test_netzwerkfehler_wird_als_fehlermeldung_gemeldet
Prüft, dass ein fehlgeschlagener HTTP-Abruf eine Fehlermeldung statt einer Ausnahme liefert.grün
FetchFeaturesTests
test_wfs_xml_liefert_anzahl_aus_numberofmatched
Prüft, dass eine WFS-XML-Antwort ohne JSON die Trefferzahl aus numberOfMatched übernimmt.grün
DatenabrufOrchestrierungTests
test_fehlende_pflichtfelder_werden_als_ungueltig_gemeldet
Prüft, dass eine Zeile ohne Link/Provider mit Aktion 'pflichtfelder_fehlen' gemeldet und übersprungen wird.grün
DatenabrufOrchestrierungTests
test_wms_zeile_ohne_features_landet_in_ausserhalb
Prüft, dass eine erfolgreich abgerufene WMS-Zeile mit 0 Features als 'ausserhalb' gezählt wird.grün
DatenabrufOrchestrierungTests
test_abbruch_ueber_progress_stoppt_weitere_zeilen
Prüft, dass ein Abbruch über das Progress-Objekt die Verarbeitung weiterer Zeilen stoppt.grün

Tests für sn_basis/modules/Datenschreiber.py (Schreib-/Ladepipeline, Issue #63).

WriteLayerToGpkgTests 2ResolveStylePathTests 3SchreibeDatenTests 4LadeLayerTests 3SchreibeLogTests 2StoreStyleInGpkgTests 4
flowchart TD
  root(["test_datenschreiber.py"])
  class root rootnode
  root --> g1["WriteLayerToGpkgTests (2)"]
  class g1 groupnode
  g1 --> t1("ungueltiger_layer_liefert_fehlermeldung")
  g1 --> t2("gueltiger_layer_wird_ohne_fehler_geschrieben")
  root --> g2["ResolveStylePathTests (3)"]
  class g2 groupnode
  g2 --> t3("leerer_stilpfad_liefert_none")
  g2 --> t4("absoluter_vorhandener_stilpfad_wird_aufgeloest")
  g2 --> t5("nicht_vorhandener_stilpfad_liefert_none")
  root --> g3["SchreibeDatenTests (4)"]
  class g3 groupnode
  g3 --> t6("ohne_speicherort_wirft_valueerror")
  g3 --> t7("eintrag_ohne_gueltigen_layer_wird_uebersprungen")
  g3 --> t8("erfolgreicher_eintrag_liefert_layer_path_und_thema")
  g3 --> t9("ohne_thema_wird_ident_als_layername_verwendet")
  root --> g4["LadeLayerTests (3)"]
  class g4 groupnode
  g4 --> t10("ohne_layer_path_wird_uebersprungen")
  g4 --> t11("gueltiger_layer_wird_dem_projekt_hinzugefuegt")
  g4 --> t12("ungueltiger_layer_meldet_layer_nicht_gefunden")
  root --> g5["SchreibeLogTests (2)"]
  class g5 groupnode
  g5 --> t13("ohne_speicherort_wirft_valueerror")
  g5 --> t14("schreibt_json_datei_mit_ergebnissen_und_gibt_pfad_zurueck")
  root --> g6["StoreStyleInGpkgTests (4)"]
  class g6 groupnode
  g6 --> t15("legt_tabelle_an_und_speichert_stil_als_default")
  g6 --> t16("setzt_bisherigen_default_stil_desselben_layers_zurueck")
  g6 --> t17("liest_geometriespalte_ueber_geometrycolumn_aus")
  g6 --> t18("fehlender_stilpfad_meldet_fehler_ueber_pruefmanager_statt_absturz")
  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
  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üftStatus
WriteLayerToGpkgTests
test_ungueltiger_layer_liefert_fehlermeldung
Prüft, dass ein ungültiger Layer eine Fehlermeldung statt eines Absturzes liefert.grün
WriteLayerToGpkgTests
test_gueltiger_layer_wird_ohne_fehler_geschrieben
Prüft, dass ein gültiger Layer im Mock-Modus ohne Fehlermeldung geschrieben wird.grün
ResolveStylePathTests
test_leerer_stilpfad_liefert_none
Prüft, dass ein leerer oder fehlender Stilpfad None liefert.grün
ResolveStylePathTests
test_absoluter_vorhandener_stilpfad_wird_aufgeloest
Prüft, dass ein absoluter, vorhandener Stilpfad normalisiert und unverändert erkannt wird.grün
ResolveStylePathTests
test_nicht_vorhandener_stilpfad_liefert_none
Prüft, dass ein nicht vorhandener Stilpfad None liefert, statt einen ungültigen Pfad zurückzugeben.grün
SchreibeDatenTests
test_ohne_speicherort_wirft_valueerror
Prüft, dass schreibe_Daten ohne Speicherort einen ValueError wirft.grün
SchreibeDatenTests
test_eintrag_ohne_gueltigen_layer_wird_uebersprungen
Prüft, dass ein Eintrag ohne gültigen Layer übersprungen wird und ein Fehlerergebnis meldet.grün
SchreibeDatenTests
test_erfolgreicher_eintrag_liefert_layer_path_und_thema
Prüft, dass ein gültiger Layer einen Layer-Path mit GPKG-Pfad und Layername liefert.grün
SchreibeDatenTests
test_ohne_thema_wird_ident_als_layername_verwendet
Prüft, dass ohne passendes Thema in processed_results der ident als Layername verwendet wird.grün
LadeLayerTests
test_ohne_layer_path_wird_uebersprungen
Prüft, dass ein Eintrag ohne layer_path übersprungen wird, ohne einen Fehler zu melden.grün
LadeLayerTests
test_gueltiger_layer_wird_dem_projekt_hinzugefuegt
Prüft, dass ein gültig ladbarer Layer ohne Fehlermeldung verarbeitet wird.grün
LadeLayerTests
test_ungueltiger_layer_meldet_layer_nicht_gefunden
Prüft, dass ein ungültig ladbarer Layer als 'layer_nicht_gefunden' gemeldet wird.grün
SchreibeLogTests
test_ohne_speicherort_wirft_valueerror
Prüft, dass schreibe_log ohne Speicherort einen ValueError wirft.grün
SchreibeLogTests
test_schreibt_json_datei_mit_ergebnissen_und_gibt_pfad_zurueck
Prüft, dass schreibe_log eine lesbare JSON-Log-Datei erzeugt und deren Pfad zurückgibt.grün
StoreStyleInGpkgTests
test_legt_tabelle_an_und_speichert_stil_als_default
Prüft, dass _store_style_in_gpkg die layer_styles-Tabelle anlegt und den Stil als Default speichert.grün
StoreStyleInGpkgTests
test_setzt_bisherigen_default_stil_desselben_layers_zurueck
Prüft, dass _store_style_in_gpkg den useAsDefault-Wert vorhandener Stile desselben Layers zurücksetzt.grün
StoreStyleInGpkgTests
test_liest_geometriespalte_ueber_geometrycolumn_aus
Prüft, dass _store_style_in_gpkg die Geometriespalte eines Layers mit geometryColumn() übernimmt.grün
StoreStyleInGpkgTests
test_fehlender_stilpfad_meldet_fehler_ueber_pruefmanager_statt_absturz
Prüft, dass ein nicht lesbarer Stilpfad über den Pruefmanager gemeldet wird statt eine Exception zu werfen.grün

Tests für sn_basis/ui/dockmanager.py (nur ein Dock gleichzeitig sichtbar, Issue #65).

DockManagerShowTests 6
flowchart TD
  root(["test_dockmanager.py"])
  class root rootnode
  root --> g1["DockManagerShowTests (6)"]
  class g1 groupnode
  g1 --> t1("none_dock_meldet_fehler_und_zeigt_nichts_an")
  g1 --> t2("setzt_objectname_wenn_leer")
  g1 --> t3("entfernt_andere_sn_docks_aber_nicht_sich_selbst")
  g1 --> t4("zeigt_neues_dock_mit_default_area_an")
  g1 --> t5("fehler_beim_entfernen_wird_als_warnung_gemeldet")
  g1 --> t6("fehler_beim_anzeigen_wird_gemeldet")
  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üftStatus
DockManagerShowTests
test_none_dock_meldet_fehler_und_zeigt_nichts_an
Prüft, dass ein fehlendes Dock-Widget (None) einen Fehler meldet und nichts anzeigt.grün
DockManagerShowTests
test_setzt_objectname_wenn_leer
Prüft, dass ein Dock ohne Namen einen technischen Namen mit dem Präfix 'sn_dock_' erhält.grün
DockManagerShowTests
test_entfernt_andere_sn_docks_aber_nicht_sich_selbst
Prüft, dass andere sn_basis-Docks entfernt werden, das neue Dock und fremde Widgets aber unangetastet bleiben.grün
DockManagerShowTests
test_zeigt_neues_dock_mit_default_area_an
Prüft, dass ein neues Dock mit der Standard-Area (DockAreaRight) angezeigt wird.grün
DockManagerShowTests
test_fehler_beim_entfernen_wird_als_warnung_gemeldet
Prüft, dass ein Fehler beim Entfernen alter Docks nur gewarnt und das neue Dock trotzdem angezeigt wird.grün
DockManagerShowTests
test_fehler_beim_anzeigen_wird_gemeldet
Prüft, dass ein Fehler beim Anzeigen des Docks als Fehler gemeldet wird.grün

Tests zu Basis #99: Ist das Projekt-KBS ein anderes als das KBS des Verfahrensgebiets, müssen

TestTransformiereRechteck 3TestZoomAufLayer 2TestDruckKbs 5TestLayoutkarteImDruckKbs 1
flowchart TD
  root(["test_druck_kbs.py"])
  class root rootnode
  root --> g1["TestTransformiereRechteck (3)"]
  class g1 groupnode
  g1 --> t1("verschiedene_kbs_werden_umgerechnet")
  g1 --> t2("gleiches_fehlendes_oder_ungueltiges_kbs_laesst_rechteck_unveraendert")
  g1 --> t3("fehler_bei_der_umrechnung_liefert_das_rechteck")
  root --> g2["TestZoomAufLayer (2)"]
  class g2 groupnode
  g2 --> t4("ausdehnung_wird_ins_kbs_der_kartenansicht_umgerechnet")
  g2 --> t5("ohne_layer_oder_kartenansicht_kein_zoom")
  root --> g3["TestDruckKbs (5)"]
  class g3 groupnode
  g3 --> t6("druck_kbs_ist_das_kbs_des_verfahrensgebiets")
  g3 --> t7("kartenfenster_wird_vom_kbs_der_kartenansicht_umgerechnet")
  g3 --> t8("auswahl_wird_vor_dem_puffern_vom_layer_kbs_umgerechnet")
  g3 --> t9("ohne_druck_kbs_wird_nicht_umgerechnet")
  g3 --> t10("druckrechteck_wird_ins_kbs_seines_layers_umgerechnet")
  root --> g4["TestLayoutkarteImDruckKbs (1)"]
  class g4 groupnode
  g4 --> t11("hauptkarte_bekommt_das_kbs_vor_der_ausdehnung")
  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üftStatus
TestTransformiereRechteck
test_verschiedene_kbs_werden_umgerechnet
Prüft, dass ein Rechteck bei verschiedenen KBS mit QgsCoordinateTransform von Quell- nach Ziel-KBS umgerechnet wird.grün
TestTransformiereRechteck
test_gleiches_fehlendes_oder_ungueltiges_kbs_laesst_rechteck_unveraendert
Prüft, dass bei gleichem, fehlendem oder ungültigem KBS nicht umgerechnet und das Rechteck unverändert geliefert wird.grün
TestTransformiereRechteck
test_fehler_bei_der_umrechnung_liefert_das_rechteck
Prüft, dass ein Fehler bei der Umrechnung nicht durchschlägt, sondern das ursprüngliche Rechteck zurückkommt.grün
TestZoomAufLayer
test_ausdehnung_wird_ins_kbs_der_kartenansicht_umgerechnet
Prüft, dass zoom_auf_layer die Layer-Ausdehnung vom Layer-KBS in das KBS der Kartenansicht umrechnet, bevor gezoomt wird.grün
TestZoomAufLayer
test_ohne_layer_oder_kartenansicht_kein_zoom
Prüft, dass zoom_auf_layer ohne Layer oder ohne Kartenansicht nichts tut und False liefert.grün
TestDruckKbs
test_druck_kbs_ist_das_kbs_des_verfahrensgebiets
Prüft, dass die Layoutkarte im KBS des Verfahrensgebiet-Layers steht und ohne Verfahrensgebiet das Projekt-KBS gilt.grün
TestDruckKbs
test_kartenfenster_wird_vom_kbs_der_kartenansicht_umgerechnet
Prüft, dass der Druckbereich „wie Kartenfenster“ vom KBS der Kartenansicht in das Druck-KBS umgerechnet wird.grün
TestDruckKbs
test_auswahl_wird_vor_dem_puffern_vom_layer_kbs_umgerechnet
Prüft, dass der Druckbereich „Auswahl“ aus dem KBS des Auswahl-Layers umgerechnet und erst danach gepuffert wird.grün
TestDruckKbs
test_ohne_druck_kbs_wird_nicht_umgerechnet
Prüft, dass _resolve_extent ohne Druck-KBS wie bisher nicht umrechnet (Aufrufe ohne den neuen Parameter).grün
TestDruckKbs
test_druckrechteck_wird_ins_kbs_seines_layers_umgerechnet
Prüft, dass ein in der Kartenansicht gezeichnetes Druckrechteck vor dem Speichern in das KBS des Druckrechteck-Layers umgerechnet wird.grün
TestLayoutkarteImDruckKbs
test_hauptkarte_bekommt_das_kbs_vor_der_ausdehnung
Prüft, dass die Hauptkarte eines neuen Layouts das Druck-KBS erhält, bevor ihre Ausdehnung gesetzt wird.grün

Tests für sn_basis/modules/excel_importer.py (Excel-Import für Linklisten, Issue #63).

ImportXlsxTests 5ExcelImporterKonstruktorTests 2
flowchart TD
  root(["test_excel_importer.py"])
  class root rootnode
  root --> g1["ImportXlsxTests (5)"]
  class g1 groupnode
  g1 --> t1("erfolgreicher_import_liefert_zeilen_als_dicts")
  g1 --> t2("fehlende_datei_liefert_leere_liste")
  g1 --> t3("arbeitsblatt_ohne_header_liefert_leere_liste_und_meldet_kein_header")
  g1 --> t4("header_zeile_nur_leere_werte_liefert_kein_header")
  g1 --> t5("nicht_lesbare_datei_liefert_leere_liste_und_meldet_read_error")
  root --> g2["ExcelImporterKonstruktorTests (2)"]
  class g2 groupnode
  g2 --> t6("ohne_dateipfad_wirft_valueerror")
  g2 --> t7("ohne_pruefmanager_wirft_valueerror")
  class t1 ok
  class t2 ok
  class t3 ok
  class t4 ok
  class t5 ok
  class t6 ok
  class t7 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üftStatus
ImportXlsxTests
test_erfolgreicher_import_liefert_zeilen_als_dicts
Prüft, dass eine gültige Excel-Datei als Liste von Dicts mit den Header-Spalten geliefert wird.grün
ImportXlsxTests
test_fehlende_datei_liefert_leere_liste
Prüft, dass eine nicht vorhandene Datei eine leere Liste liefert, statt eine Ausnahme zu werfen.grün
ImportXlsxTests
test_arbeitsblatt_ohne_header_liefert_leere_liste_und_meldet_kein_header
Prüft, dass ein leeres Arbeitsblatt ohne Header-Zeile 'kein_header' meldet und eine leere Liste liefert.grün
ImportXlsxTests
test_header_zeile_nur_leere_werte_liefert_kein_header
Prüft, dass eine Header-Zeile aus ausschließlich leeren Zellen ebenfalls als 'kein_header' gilt.grün
ImportXlsxTests
test_nicht_lesbare_datei_liefert_leere_liste_und_meldet_read_error
Prüft, dass eine Datei mit ungültigem Excel-Inhalt 'read_error' meldet und eine leere Liste liefert.grün
ExcelImporterKonstruktorTests
test_ohne_dateipfad_wirft_valueerror
Prüft, dass ExcelImporter ohne Dateipfad einen ValueError wirft.grün
ExcelImporterKonstruktorTests
test_ohne_pruefmanager_wirft_valueerror
Prüft, dass ExcelImporter ohne Pruefmanager einen ValueError wirft.grün

Unit-Tests für `sn_basis.functions.laenderkennung`.

TestGetLaenderkennung 5
flowchart TD
  root(["test_laenderkennung.py"])
  class root rootnode
  root --> g1["TestGetLaenderkennung (5)"]
  class g1 groupnode
  g1 --> t1("bekannter_praefix_gibt_kennung_zurueck")
  g1 --> t2("praefix_gross_klein_unabhaengig")
  g1 --> t3("unbekannter_praefix_wirft_keyerror")
  g1 --> t4("ohne_argument_wird_aus_aufrufendem_modul_abgeleitet")
  g1 --> t5("mapping_enthaelt_sachsen")
  class t1 ok
  class t2 ok
  class t3 ok
  class t4 ok
  class t5 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üftStatus
TestGetLaenderkennung
test_bekannter_praefix_gibt_kennung_zurueck
Prüft, dass der Präfix 'sn' die ALKIS-Länderkennung '14' für Sachsen liefert.grün
TestGetLaenderkennung
test_praefix_gross_klein_unabhaengig
Prüft, dass die Präfixsuche groß-/kleinschreibungsunabhängig ist.grün
TestGetLaenderkennung
test_unbekannter_praefix_wirft_keyerror
Prüft, dass ein unbekannter Präfix einen KeyError auslöst.grün
TestGetLaenderkennung
test_ohne_argument_wird_aus_aufrufendem_modul_abgeleitet
Prüft, dass ohne Argument der Präfix aus dem Modulnamen des Aufrufers abgeleitet wird.grün
TestGetLaenderkennung
test_mapping_enthaelt_sachsen
Prüft, dass die Mapping-Tabelle LAENDERKENNUNGEN einen Eintrag für Sachsen ('sn' -> '14') enthält.grün

Tests für sn_basis/functions/landkreise.py::_lade_landkreise (Issue #65).

LadeLandkreiseTests 2
flowchart TD
  root(["test_landkreise.py"])
  class root rootnode
  root --> g1["LadeLandkreiseTests (2)"]
  class g1 groupnode
  g1 --> t1("laedt_die_echte_landkreisliste_nicht_leer")
  g1 --> t2("fehlende_datei_liefert_leere_liste")
  class t1 ok
  class t2 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üftStatus
LadeLandkreiseTests
test_laedt_die_echte_landkreisliste_nicht_leer
Prüft, dass _lade_landkreise die echte landkreise.json als nicht-leere Liste von (Kennzahl, Name)-Tupeln liefert.grün
LadeLandkreiseTests
test_fehlende_datei_liefert_leere_liste
Prüft, dass eine nicht lesbare Datenquelle eine leere Liste liefert, statt eine Ausnahme zu werfen.grün

Tests für sn_basis/modules/LayerLoader.py (Layer erzeugen/filtern/laden, Issue #63).

CreateLayerTests 7TransformGeometryTests 3TransformExtentTests 2FilterByExtentTests 6FilterByLayerTests 4AddToProjectTests 3
flowchart TD
  root(["test_layerloader.py"])
  class root rootnode
  root --> g1["CreateLayerTests (7)"]
  class g1 groupnode
  g1 --> t1("wfs_baut_uri_ohne_getfeature_parameter")
  g1 --> t2("wfs_mit_url_praefix_wird_nicht_doppelt_gesetzt")
  g1 --> t3("wms_baut_url_praefix_und_nutzt_rasterlayer")
  g1 --> t4("rest_featureserver_ergaenzt_layer_index")
  g1 --> t5("ogr_provider_nutzt_link_direkt")
  g1 --> t6("ungueltiger_layer_meldet_layer_nicht_verfuegbar")
  g1 --> t7("ausnahme_beim_erstellen_wird_abgefangen")
  root --> g2["TransformGeometryTests (3)"]
  class g2 groupnode
  g2 --> t8("fehlender_layer_liefert_geometrie_unveraendert")
  g2 --> t9("gleiche_crs_liefert_geometrie_unveraendert")
  g2 --> t10("unterschiedliche_crs_klont_und_transformiert_geometrie")
  root --> g3["TransformExtentTests (2)"]
  class g3 groupnode
  g3 --> t11("gleiche_crs_liefert_extent_unveraendert")
  g3 --> t12("unterschiedliche_crs_nutzt_coordinate_transform")
  root --> g4["FilterByExtentTests (6)"]
  class g4 groupnode
  g4 --> t13("ungueltiger_layer_wird_unveraendert_zurueckgegeben")
  g4 --> t14("ohne_extent_wird_layer_unveraendert_zurueckgegeben")
  g4 --> t15("falscher_layertyp_wird_unveraendert_zurueckgegeben")
  g4 --> t16("keine_treffer_liefert_none")
  g4 --> t17("abbruch_liefert_none_und_meldet_needs_user_action")
  g4 --> t18("erfolgreicher_filter_liefert_neuen_layer_mit_features")
  root --> g5["FilterByLayerTests (4)"]
  class g5 groupnode
  g5 --> t19("ungueltiger_layer_oder_filterlayer_wird_unveraendert_zurueckgegeben")
  g5 --> t20("filterlayer_ohne_features_liefert_none")
  g5 --> t21("erfolgreicher_geometriefilter_liefert_neuen_layer")
  g5 --> t22("keine_ueberschneidung_liefert_none")
  root --> g6["AddToProjectTests (3)"]
  class g6 groupnode
  g6 --> t23("gueltiger_layer_wird_dem_projekt_hinzugefuegt")
  g6 --> t24("ungueltiger_layer_wird_nicht_hinzugefuegt")
  g6 --> t25("none_layer_wird_nicht_hinzugefuegt")
  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
  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üftStatus
CreateLayerTests
test_wfs_baut_uri_ohne_getfeature_parameter
Prüft, dass für WFS die GetFeature-spezifischen Parameter aus der URI entfernt werden.grün
CreateLayerTests
test_wfs_mit_url_praefix_wird_nicht_doppelt_gesetzt
Prüft, dass ein bereits vorhandenes 'url='-Präfix im WFS-Link nicht verdoppelt wird.grün
CreateLayerTests
test_wms_baut_url_praefix_und_nutzt_rasterlayer
Prüft, dass WMS-Layer über QgsRasterLayer mit 'url='-Präfix erzeugt werden.grün
CreateLayerTests
test_rest_featureserver_ergaenzt_layer_index
Prüft, dass ein REST-Link auf '.../FeatureServer' automatisch um '/0' ergänzt wird.grün
CreateLayerTests
test_ogr_provider_nutzt_link_direkt
Prüft, dass ein OGR-Provider den Link unverändert an QgsVectorLayer übergibt.grün
CreateLayerTests
test_ungueltiger_layer_meldet_layer_nicht_verfuegbar
Prüft, dass ein ungültig erzeugter Layer als 'layer_nicht_verfuegbar' gemeldet wird und None liefert.grün
CreateLayerTests
test_ausnahme_beim_erstellen_wird_abgefangen
Prüft, dass eine Ausnahme beim Layer-Erstellen abgefangen und als Fehlerergebnis gemeldet wird.grün
TransformGeometryTests
test_fehlender_layer_liefert_geometrie_unveraendert
Prüft, dass ohne Quell- oder Ziel-Layer die Geometrie unverändert zurückgegeben wird.grün
TransformGeometryTests
test_gleiche_crs_liefert_geometrie_unveraendert
Prüft, dass bei identischem CRS von Quelle und Ziel keine Transformation stattfindet.grün
TransformGeometryTests
test_unterschiedliche_crs_klont_und_transformiert_geometrie
Prüft, dass bei unterschiedlichem CRS eine geklonte, transformierte Geometrie geliefert wird.grün
TransformExtentTests
test_gleiche_crs_liefert_extent_unveraendert
Prüft, dass bei identischem CRS von Quelle und Ziel der Extent unverändert bleibt.grün
TransformExtentTests
test_unterschiedliche_crs_nutzt_coordinate_transform
Prüft, dass bei unterschiedlichem CRS der Extent über QgsCoordinateTransform umgerechnet wird.grün
FilterByExtentTests
test_ungueltiger_layer_wird_unveraendert_zurueckgegeben
Prüft, dass ein ungültiger Layer von filter_by_extent unverändert zurückgegeben wird.grün
FilterByExtentTests
test_ohne_extent_wird_layer_unveraendert_zurueckgegeben
Prüft, dass ohne Extent (None) der Layer unverändert zurückgegeben wird.grün
FilterByExtentTests
test_falscher_layertyp_wird_unveraendert_zurueckgegeben
Prüft, dass ein Nicht-Vektor-Layer (z. B. Rasterlayer) unverändert zurückgegeben wird.grün
FilterByExtentTests
test_keine_treffer_liefert_none
Prüft, dass ein Raumfilter ohne Treffer None statt eines leeren Layers liefert.grün
FilterByExtentTests
test_abbruch_liefert_none_und_meldet_needs_user_action
Prüft, dass ein Abbruch während des Raumfilters None liefert und gemeldet wird.grün
FilterByExtentTests
test_erfolgreicher_filter_liefert_neuen_layer_mit_features
Prüft, dass ein erfolgreicher BBOX-Filter einen neuen Speicherlayer mit den gefundenen Features liefert.grün
FilterByLayerTests
test_ungueltiger_layer_oder_filterlayer_wird_unveraendert_zurueckgegeben
Prüft, dass ein ungültiger Haupt- oder Filter-Layer unverändert zurückgegeben wird.grün
FilterByLayerTests
test_filterlayer_ohne_features_liefert_none
Prüft, dass ein Filter-Layer ohne Features (leere Vereinigungsgeometrie) None liefert.grün
FilterByLayerTests
test_erfolgreicher_geometriefilter_liefert_neuen_layer
Prüft, dass ein erfolgreicher Geometriefilter einen neuen Speicherlayer mit den passenden Features liefert.grün
FilterByLayerTests
test_keine_ueberschneidung_liefert_none
Prüft, dass ohne überschneidende Features None statt eines leeren Layers geliefert wird.grün
AddToProjectTests
test_gueltiger_layer_wird_dem_projekt_hinzugefuegt
Prüft, dass ein gültiger Layer über QgsProject.instance().addMapLayer hinzugefügt wird.grün
AddToProjectTests
test_ungueltiger_layer_wird_nicht_hinzugefuegt
Prüft, dass ein ungültiger Layer nicht ans Projekt übergeben wird.grün
AddToProjectTests
test_none_layer_wird_nicht_hinzugefuegt
Prüft, dass ein fehlender Layer (None) nicht ans Projekt übergeben wird.grün

— (Docstring fehlt)

TestLayerpruefer 10
flowchart TD
  root(["test_layerpruefer.py"])
  class root rootnode
  root --> g1["TestLayerpruefer (10)"]
  class g1 groupnode
  g1 --> t1("layer_exists")
  g1 --> t2("layer_unsichtbar")
  g1 --> t3("falscher_layertyp")
  g1 --> t4("falscher_geotyp")
  g1 --> t5("layer_leer")
  g1 --> t6("falsches_crs")
  g1 --> t7("felder_fehlen")
  g1 --> t8("datenquelle_unerwartet")
  g1 --> t9("layer_nicht_editierbar")
  g1 --> t10("layer_ok")
  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
  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üftStatus
TestLayerpruefer
test_layer_exists
Prüft, dass ein nicht vorhandener Layer als 'layer_nicht_gefunden' abgelehnt wird.grün
TestLayerpruefer
test_layer_unsichtbar
Prüft, dass ein unsichtbarer Layer bei geforderter Sichtbarkeit als 'layer_unsichtbar' abgelehnt wird.grün
TestLayerpruefer
test_falscher_layertyp
Prüft, dass ein Layer mit abweichendem Layertyp (Raster statt Vektor) als 'falscher_layertyp' abgelehnt wird.grün
TestLayerpruefer
test_falscher_geotyp
Prüft, dass ein Layer mit abweichendem Geometrietyp (Punkt statt Polygon) als 'falscher_geotyp' abgelehnt wird.grün
TestLayerpruefer
test_layer_leer
Prüft, dass ein Layer ohne Features als 'layer_leer' abgelehnt wird.grün
TestLayerpruefer
test_falsches_crs
Prüft, dass ein Layer mit abweichendem Koordinatenbezugssystem als 'falsches_crs' abgelehnt wird.grün
TestLayerpruefer
test_felder_fehlen
Prüft, dass ein Layer mit fehlenden Pflichtfeldern als 'felder_fehlen' abgelehnt wird.grün
TestLayerpruefer
test_datenquelle_unerwartet
Prüft, dass eine Datenquelle außerhalb der erlaubten Liste als 'datenquelle_unerwartet' abgelehnt wird.grün
TestLayerpruefer
test_layer_nicht_editierbar
Prüft, dass ein nicht editierbarer Layer bei geforderter Editierbarkeit als 'layer_nicht_editierbar' abgelehnt wird.grün
TestLayerpruefer
test_layer_ok
Prüft, dass ein Layer, der alle Anforderungen erfüllt, als 'ok' bestätigt wird.grün

— (Docstring fehlt)

TestLinkpruefer 6
flowchart TD
  root(["test_linkpruefer.py"])
  class root rootnode
  root --> g1["TestLinkpruefer (6)"]
  class g1 groupnode
  g1 --> t1("leere_eingabe")
  g1 --> t2("remote_link_ok")
  g1 --> t3("remote_link_error")
  g1 --> t4("remote_link_network_error")
  g1 --> t5("local_link_not_found")
  g1 --> t6("local_link_ok")
  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üftStatus
TestLinkpruefer
test_leere_eingabe
Prüft, dass eine leere Eingabe ohne Netzwerk-/Dateizugriff als 'leer' abgelehnt wird.grün
TestLinkpruefer
test_remote_link_ok
Prüft, dass eine erreichbare Remote-URL (HTTP HEAD ohne Fehler) als 'ok' bestätigt wird.grün
TestLinkpruefer
test_remote_link_error
Prüft, dass eine Remote-URL mit Fehlerantwort als 'url_nicht_erreichbar' abgelehnt wird.grün
TestLinkpruefer
test_remote_link_network_error
Prüft, dass eine ausbleibende Netzwerkantwort (None) als 'netzwerkfehler' gemeldet wird.grün
TestLinkpruefer
test_local_link_not_found
Prüft, dass ein nicht existierender lokaler Pfad als 'pfad_nicht_gefunden' abgelehnt wird.grün
TestLinkpruefer
test_local_link_ok
Prüft, dass ein existierender lokaler Pfad als 'ok' bestätigt wird.grün

Tests für sn_basis/functions/ly_existence_wrapper.py::layer_is_valid/layer_is_usable (Issue #65).

LayerIsValidTests 5LayerIsUsableTests 3
flowchart TD
  root(["test_ly_existence_wrapper.py"])
  class root rootnode
  root --> g1["LayerIsValidTests (5)"]
  class g1 groupnode
  g1 --> t1("none_ist_nicht_gueltig")
  g1 --> t2("objekt_ohne_isvalid_ist_nicht_gueltig")
  g1 --> t3("gueltiger_layer_liefert_true")
  g1 --> t4("ungueltiger_layer_liefert_false")
  g1 --> t5("ausnahme_bei_isvalid_liefert_false")
  root --> g2["LayerIsUsableTests (3)"]
  class g2 groupnode
  g2 --> t6("none_ist_nicht_nutzbar")
  g2 --> t7("gueltiger_layer_ist_nutzbar")
  g2 --> t8("ungueltiger_layer_ist_nicht_nutzbar")
  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üftStatus
LayerIsValidTests
test_none_ist_nicht_gueltig
Prüft, dass layer_is_valid für None False liefert.grün
LayerIsValidTests
test_objekt_ohne_isvalid_ist_nicht_gueltig
Prüft, dass ein Objekt ohne isValid()-Methode als ungültig gilt.grün
LayerIsValidTests
test_gueltiger_layer_liefert_true
Prüft, dass ein Layer mit isValid()==True als gültig erkannt wird.grün
LayerIsValidTests
test_ungueltiger_layer_liefert_false
Prüft, dass ein Layer mit isValid()==False als ungültig erkannt wird.grün
LayerIsValidTests
test_ausnahme_bei_isvalid_liefert_false
Prüft, dass eine Ausnahme in isValid() abgefangen wird und False liefert.grün
LayerIsUsableTests
test_none_ist_nicht_nutzbar
Prüft, dass layer_is_usable für None False liefert.grün
LayerIsUsableTests
test_gueltiger_layer_ist_nutzbar
Prüft, dass ein vorhandener, gültiger Layer als nutzbar gilt.grün
LayerIsUsableTests
test_ungueltiger_layer_ist_nicht_nutzbar
Prüft, dass ein vorhandener, aber ungültiger Layer als nicht nutzbar gilt.grün

Tests für sn_basis/functions/ly_style_wrapper.py::apply_style_from_path (Issue #65).

ApplyStyleFromPathTests 4
flowchart TD
  root(["test_ly_style_wrapper.py"])
  class root rootnode
  root --> g1["ApplyStyleFromPathTests (4)"]
  class g1 groupnode
  g1 --> t1("fehlender_layer_liefert_false")
  g1 --> t2("erfolgreiches_laden_liefert_true_und_triggert_repaint")
  g1 --> t3("fehlgeschlagenes_laden_liefert_false_ohne_repaint")
  g1 --> t4("ausnahme_beim_laden_wird_abgefangen")
  class t1 ok
  class t2 ok
  class t3 ok
  class t4 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üftStatus
ApplyStyleFromPathTests
test_fehlender_layer_liefert_false
Prüft, dass ein fehlender Layer (None) False liefert, ohne einen Stil zu laden.grün
ApplyStyleFromPathTests
test_erfolgreiches_laden_liefert_true_und_triggert_repaint
Prüft, dass ein erfolgreich geladener Stil True liefert und den Layer neu zeichnet.grün
ApplyStyleFromPathTests
test_fehlgeschlagenes_laden_liefert_false_ohne_repaint
Prüft, dass ein fehlgeschlagenes Laden False liefert, ohne den Layer neu zu zeichnen.grün
ApplyStyleFromPathTests
test_ausnahme_beim_laden_wird_abgefangen
Prüft, dass eine Ausnahme beim Laden des Stils abgefangen wird und False liefert.grün

Tests für sn_basis/functions/message_wrapper.py (Issue #65).

GetMessageBarTests 2PushMessageTests 2
flowchart TD
  root(["test_message_wrapper.py"])
  class root rootnode
  root --> g1["GetMessageBarTests (2)"]
  class g1 groupnode
  g1 --> t1("liefert_objekt_mit_pushmessage_methode")
  g1 --> t2("faellt_bei_fehlerhaftem_iface_auf_mock_bar_zurueck")
  root --> g2["PushMessageTests (2)"]
  class g2 groupnode
  g2 --> t3("liefert_dict_mit_titel_text_level_und_dauer")
  g2 --> t4("fehler_in_der_message_bar_wird_abgefangen")
  class t1 ok
  class t2 ok
  class t3 ok
  class t4 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üftStatus
GetMessageBarTests
test_liefert_objekt_mit_pushmessage_methode
Prüft, dass _get_message_bar ein Objekt mit aufrufbarer pushMessage()-Methode liefert.grün
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ün
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
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

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

AddActionTests 2FinalizeMenuAndToolbarTests 2SetActivePluginTests 2RemoveActionTests 3RemoveAllTests 3
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 (3)"]
  class g5 groupnode
  g5 --> t10("entfernt_menu_toolbar_und_setzt_zustand_zurueck")
  g5 --> t11("loescht_menu_und_toolbar_objekt_damit_kein_duplikat_uebrig_bleibt")
  g5 --> t12("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
  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üftStatus
AddActionTests
test_ohne_plugin_group_liefert_none
Prüft, dass add_action ohne initialisierte Aktionsgruppe None liefert und nichts anlegt.grün
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
FinalizeMenuAndToolbarTests
test_ohne_menu_oder_toolbar_tut_nichts
Prüft, dass finalize_menu_and_toolbar ohne Menü oder Toolbar keine Ausnahme wirft.grün
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
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
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
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
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
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
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
RemoveAllTests
test_loescht_menu_und_toolbar_objekt_damit_kein_duplikat_uebrig_bleibt
Prüft, dass remove_all deleteLater() auf Menü und Toolbar aufruft, damit sie den Qt-Objektbaum tatsächlich verlassen (Issue #72).grün
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

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üftStatus
IsCaseSensitiveFsTests
test_windows_ist_nicht_case_sensitiv
Prüft, dass Windows als nicht case-sensitives Dateisystem gilt.grün
IsCaseSensitiveFsTests
test_macos_ist_nicht_case_sensitiv
Prüft, dass macOS als nicht case-sensitives Dateisystem gilt.grün
IsCaseSensitiveFsTests
test_linux_ist_case_sensitiv
Prüft, dass Linux als case-sensitives Dateisystem gilt.grün

Tests für modules/print_kartenrand.py – Anordnung des Kartenrands neben der Karte (Basis #93).

TestBerechneAnordnung 5TestOrdneKartenrandAn 5TestMindestbreiteBeimLaden 3TestAnbindungPrintLayout 2
flowchart TD
  root(["test_print_kartenrand.py"])
  class root rootnode
  root --> g1["TestBerechneAnordnung (5)"]
  class g1 groupnode
  g1 --> t1("passt_einspaltig_nichts_aendert_sich")
  g1 --> t2("mehr_spalten_und_breiterer_rand")
  g1 --> t3("seite_wird_hoeher_wenn_auch_drei_spalten_nicht_reichen")
  g1 --> t4("seite_wird_nie_kleiner")
  g1 --> t5("ohne_legenden_nur_kartenschild")
  root --> g2["TestOrdneKartenrandAn (5)"]
  class g2 groupnode
  g2 --> t6("seite_hoeher_und_kartenschild_verschoben")
  g2 --> t7("spalten_ungleich_breit_und_text_umgebrochen")
  g2 --> t8("legenden_mindestens_so_breit_wie_kartenschild")
  g2 --> t9("passt_nichts_wird_verschoben")
  g2 --> t10("ohne_karte_keine_anordnung")
  root --> g3["TestMindestbreiteBeimLaden (3)"]
  class g3 groupnode
  g3 --> t11("mindestbreite_nur_fuer_vermerkte_layouts")
  g3 --> t12("listener_verbinden_und_trennen")
  g3 --> t13("ohne_qgis_kein_listener")
  root --> g4["TestAnbindungPrintLayout (2)"]
  class g4 groupnode
  g4 --> t14("vorlage_ordnet_kartenrand_an")
  g4 --> t15("fehler_bei_der_anordnung_verhindert_die_vorlage_nicht")
  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
  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üftStatus
TestBerechneAnordnung
test_passt_einspaltig_nichts_aendert_sich
Prüft, dass bei genug Platz neben der Karte einspaltig angeordnet wird und Seite und Kartenschild bleiben.grün
TestBerechneAnordnung
test_mehr_spalten_und_breiterer_rand
Prüft, dass bei zu hohen Legenden die kleinste passende Spaltenzahl gewählt und der Kartenrand dafür verbreitert wird.grün
TestBerechneAnordnung
test_seite_wird_hoeher_wenn_auch_drei_spalten_nicht_reichen
Prüft, dass die Seite höher wird und Quellenangabe und Kartenschild nach unten rutschen, wenn auch drei Spalten nicht reichen.grün
TestBerechneAnordnung
test_seite_wird_nie_kleiner
Prüft, dass Seitenbreite und -höhe nie unter die ursprüngliche Seitengröße fallen.grün
TestBerechneAnordnung
test_ohne_legenden_nur_kartenschild
Prüft, dass ohne Legenden nur Quellenangabe und Kartenschild zählen und die Seite bei zu niedriger Karte höher wird.grün
TestOrdneKartenrandAn
test_seite_hoeher_und_kartenschild_verschoben
Prüft, dass bei zu niedriger Karte die Legende dreispaltig wird, die Seite wächst und Quellenangabe und Kartenschild um denselben Betrag nach unten rutschen.grün
TestOrdneKartenrandAn
test_spalten_ungleich_breit_und_text_umgebrochen
Prüft, dass die Legenden ungleich breite Spalten und einen automatischen Textumbruch bekommen, damit mehrspaltige Legenden nicht unnötig breit werden (#96).grün
TestOrdneKartenrandAn
test_legenden_mindestens_so_breit_wie_kartenschild
Prüft, dass die Legenden die Breite des Kartenschilds als Mindestbreite bekommen und das Layout sie für das Neuladen vermerkt.grün
TestOrdneKartenrandAn
test_passt_nichts_wird_verschoben
Prüft, dass bei ausreichend hoher Karte weder Seite noch Kartenschild verändert werden.grün
TestOrdneKartenrandAn
test_ohne_karte_keine_anordnung
Prüft, dass ein Layout ohne Hauptkarte unverändert bleibt.grün
TestMindestbreiteBeimLaden
test_mindestbreite_nur_fuer_vermerkte_layouts
Prüft, dass beim Laden die Mindestbreite nur an Layouts mit Vermerk wieder gesetzt wird.grün
TestMindestbreiteBeimLaden
test_listener_verbinden_und_trennen
Prüft, dass der Listener readProject einmal verbindet, beim Trennen wieder löst und beides mehrfach aufgerufen werden darf.grün
TestMindestbreiteBeimLaden
test_ohne_qgis_kein_listener
Prüft, dass im Mock-Modus kein Listener verbunden wird.grün
TestAnbindungPrintLayout
test_vorlage_ordnet_kartenrand_an
Prüft, dass PrintLayout beim Anlegen einer Vorlage den Kartenrand anordnen lässt.grün
TestAnbindungPrintLayout
test_fehler_bei_der_anordnung_verhindert_die_vorlage_nicht
Prüft, dass ein Fehler bei der Anordnung nur als Warnung gemeldet wird und keine Ausnahme durchreicht.grün

— (Docstring fehlt)

TestPrintLayout 5
flowchart TD
  root(["test_print_layout.py"])
  class root rootnode
  root --> g1["TestPrintLayout (5)"]
  class g1 groupnode
  g1 --> t1("create_legend_item_links_map_and_enables_map_filtering")
  g1 --> t2("create_legend_item_does_not_copy_project_layers_into_legend_model")
  g1 --> t3("configure_legend_size_uses_content_adaptive_size")
  g1 --> t4("configure_hauptkarte_grids_uses_wrapper_constants")
  g1 --> t5("create_single_page_layout_keeps_legend_linked_to_hauptkarte_and_theme")
  class t1 ok
  class t2 ok
  class t3 ok
  class t4 ok
  class t5 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üftStatus
TestPrintLayout
test_create_legend_item_links_map_and_enables_map_filtering
Prüft, dass eine erzeugte Legende mit der übergebenen Karte verknüpft ist und automatisch nach deren Sichtbarkeit gefiltert wird.grün
TestPrintLayout
test_create_legend_item_does_not_copy_project_layers_into_legend_model
Prüft, dass eine neu erzeugte Legende keine Projekt-Layer in ihr Legendenmodell übernimmt (leere Root-Gruppe).grün
TestPrintLayout
test_configure_legend_size_uses_content_adaptive_size
Prüft, dass die Legendengröße inhaltsadaptiv bestimmt wird (kein manuelles Resize) und die ermittelte Höhe zurückgegeben wird.grün
TestPrintLayout
test_configure_hauptkarte_grids_uses_wrapper_constants
Prüft, dass das Gitternetz der Hauptkarte mit den erwarteten Stil-, Rahmen- und Beschriftungskonstanten (nur rechts/unten beschriftet, Schriftgröße und Hintergrund) konfiguriert wird.grün
TestPrintLayout
test_create_single_page_layout_keeps_legend_linked_to_hauptkarte_and_theme
Prüft, dass ein einseitiges Layout die Hauptkarte auf das übergebene Kartenthema festlegt und die Legende mit dieser Karte verknüpft bleibt.grün

— (Docstring fehlt)

TestPrintLogic 17
flowchart TD
  root(["test_print_logic.py"])
  class root rootnode
  root --> g1["TestPrintLogic (17)"]
  class g1 groupnode
  g1 --> t1("get_baufreigabe_page_dimensions_prefers_a4_for_small_extent")
  g1 --> t2("get_baufreigabe_page_dimensions_escalates_to_a3")
  g1 --> t3("get_baufreigabe_page_dimensions_respects_a4_as_maximum_with_fallback")
  g1 --> t4("get_baufreigabe_page_dimensions_falls_back_to_a3_for_oversize_extent")
  g1 --> t5("select_standard_page_layout_uses_a4_as_minimum_sheet")
  g1 --> t6("select_standard_page_layout_limits_hauptkarte_to_a3")
  g1 --> t7("select_standard_page_layout_returns_none_if_a3_is_too_small")
  g1 --> t8("get_standard_layout_dimensions_uses_a4_and_forces_fit_for_small_extent")
  g1 --> t9("get_standard_layout_dimensions_caps_endlosrolle_width_at_2000_mm")
  g1 --> t10("apply_standard_minimum_a4_fallback_for_small_page")
  g1 --> t11("apply_standard_minimum_a4_fallback_keeps_large_page")
  g1 --> t12("does_plot_fit_page_true_for_standard_a4")
  g1 --> t13("does_plot_fit_page_false_if_objects_exceed_page")
  g1 --> t14("set_druckbereich_accepts_wie_kartenfenster")
  g1 --> t15("get_canvas_extent_returns_valid_extent")
  g1 --> t16("resolve_extent_uses_canvas_extent_without_buffer")
  g1 --> t17("resolve_extent_uses_rectangle_extent_without_buffer")
  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
  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üftStatus
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ün
TestPrintLogic
test_get_baufreigabe_page_dimensions_escalates_to_a3
Prüft, dass ein größerer Kartenausschnitt (Baufreigabe) auf DIN A3 eskaliert wird.grün
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ün
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ün
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ün
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ün
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ün
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ün
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ün
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ün
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ün
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ün
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ün
TestPrintLogic
test_set_druckbereich_accepts_wie_kartenfenster
Prüft, dass die Auswahl 'wie Kartenfenster' als Projektvariable 'druckbereich' gespeichert wird.grün
TestPrintLogic
test_get_canvas_extent_returns_valid_extent
Prüft, dass der aktuelle Kartenausschnitt des Kartenfensters unverändert zurückgegeben wird.grün
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
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

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üftStatus
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
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
RestoreStateTests
test_gueltige_gespeicherte_werte_werden_uebernommen
Prüft, dass _restore_state gültige gespeicherte Werte in die jeweiligen Widgets übernimmt.grün
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
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
OnDruckpufferClickedTests
test_abgebrochen_aendert_nichts
Prüft, dass ein abgebrochener Dialog den Druckpuffer nicht verändert.grün
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
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
OnVorlageErstellenTests
test_ohne_logic_tut_nichts
Prüft, dass _on_vorlage_erstellen ohne gesetzte PrintLogic keine Ausnahme wirft.grün
ProjectSignalsTests
test_connect_verbindet_alle_drei_signale
Prüft, dass _connect_project_signals alle drei Projektsignale mit _on_project_changed verbindet.grün
ProjectSignalsTests
test_disconnect_trennt_alle_drei_signale
Prüft, dass _disconnect_project_signals alle drei zuvor verbundenen Projektsignale trennt.grün
ProjectSignalsTests
test_instance_wirft_ausnahme_wird_abgefangen
Prüft, dass eine Ausnahme bei QgsProject.instance() in beiden Signalmethoden abgefangen wird.grün
CleanupTests
test_ruft_beide_disconnect_methoden_auf
Prüft, dass cleanup sowohl die Theme- als auch die Projektsignale trennt.grün
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
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
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
RestoreAtlasLayerSelectionTests
test_leere_gespeicherte_layer_id_tut_nichts
Prüft, dass eine leere gespeicherte Layer-ID das Projekt gar nicht erst anfragt.grün
ThemeCollectionSignalsTests
test_connect_verbindet_alle_signale
Prüft, dass _connect_theme_collection_signals alle Signale der Theme-Collection verbindet.grün
ThemeCollectionSignalsTests
test_connect_ist_idempotent_wenn_schon_verbunden
Prüft, dass _connect_theme_collection_signals bei bereits verbundenem Signal nichts erneut tut.grün
ThemeCollectionSignalsTests
test_disconnect_trennt_alle_signale
Prüft, dass _disconnect_theme_collection_signals alle verbundenen Theme-Signale trennt und zurücksetzt.grün
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
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
GetGespeicherteThemenTests
test_dedupliziert_und_filtert_leere_eintraege
Prüft, dass _get_gespeicherte_themen Duplikate und leere/None-Einträge entfernt.grün
GetGespeicherteThemenTests
test_fehler_liefert_leere_liste
Prüft, dass ein Fehler beim Zugriff auf die Theme-Collection eine leere Liste liefert.grün
GetCurrentCanvasScaleTests
test_liefert_skalierung_als_float
Prüft, dass _get_current_canvas_scale die Canvas-Skalierung als float liefert.grün
GetCurrentCanvasScaleTests
test_ohne_canvas_liefert_none
Prüft, dass _get_current_canvas_scale ohne verfügbares Kartenfenster None liefert.grün
GetCurrentCanvasScaleTests
test_skalierung_null_liefert_none
Prüft, dass eine Skalierung von 0 als None statt als 0.0 gilt.grün
OnAtlasLayerChangedTests
test_none_oder_leer_setzt_variable_leer
Prüft, dass None oder ein leerer Wert die Abdeckungslayer-Variable leeren.grün
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
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
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
OnAuswahlAsAtlasClickedTests
test_ohne_erzeugten_layer_tut_nichts_weiter
Prüft, dass ohne erzeugten Atlas-Layer keine UI-Aktualisierung stattfindet.grün
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
PopulateAtlasLayerComboTests
test_ohne_atlas_layer_combo_tut_nichts
Prüft, dass _populate_atlas_layer_combo ohne Atlas-Dropdown keine Ausnahme wirft.grün
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
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
OnAtlasErzeugenChangedTests
test_ohne_widgets_wirft_keine_ausnahme
Prüft, dass _on_atlas_erzeugen_changed ohne Atlas-Combo/-Button keine Ausnahme wirft.grün

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)"]
  class g1 groupnode
  g1 --> t1("liefert_true_fuer_alle_verfahrens_db_aktionen")
  g1 --> t2("liefert_false_fuer_andere_aktionen")
  root --> g2["ErlaubtePersistierungTests (2)"]
  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üftStatus
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ün
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
ErlaubtePersistierungTests
test_liefert_true_fuer_erzeugen_ueberschreiben_anhaengen
Prüft, dass erlaubte_persistierung für Erzeugen/Überschreiben/Anhängen True liefert.grün
ErlaubtePersistierungTests
test_liefert_false_fuer_ueberspringen_und_reines_existieren
Prüft, dass erlaubte_persistierung bei Überspringen und reinem 'datei_existiert' False liefert.grün
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
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

— (Docstring fehlt)

TestPruefmanager 26
flowchart TD
  root(["test_pruefmanager.py"])
  class root rootnode
  root --> g1["TestPruefmanager (26)"]
  class g1 groupnode
  g1 --> t1("ok")
  g1 --> t2("leereingabe_erlaubt_ja")
  g1 --> t3("leereingabe_erlaubt_nein")
  g1 --> t4("standarddatei_vorschlagen_ja")
  g1 --> t5("standarddatei_vorschlagen_nein")
  g1 --> t6("temporaer_erlaubt_ja")
  g1 --> t7("temporaer_erlaubt_nein")
  g1 --> t8("layer_unsichtbar_ja")
  g1 --> t9("layer_unsichtbar_nein")
  g1 --> t10("unbekannte_aktion")
  g1 --> t11("datei_existiert_overwrite")
  g1 --> t12("datei_existiert_append")
  g1 --> t13("datei_existiert_cancel")
  g1 --> t14("datei_existiert_in_non_qgis_mode_returns_input")
  g1 --> t15("verfahrensgebiet_layer_existiert_ergaenzen")
  g1 --> t16("verfahrensgebiet_layer_existiert_abbrechen")
  g1 --> t17("verfahrensgebiet_layer_existiert_entfernen")
  g1 --> t18("verfahrensgebiet_layer_existiert_ersetzen")
  g1 --> t19("verfahrensgebiet_layer_existiert_in_non_qgis_mode_returns_input")
  g1 --> t20("report_error_kritische_aktion_ruft_error_auf")
  g1 --> t21("report_error_warn_aktion_ruft_warning_auf")
  g1 --> t22("report_error_unbekannte_aktion_faellt_auf_warning_zurueck")
  g1 --> t23("frage_ja_nein_im_qgis_modus_fragt_nutzer")
  g1 --> t24("frage_ja_nein_ausserhalb_qgis_liefert_default_ohne_rueckfrage")
  g1 --> t25("frage_text_im_qgis_modus_fragt_nutzer")
  g1 --> t26("frage_text_ausserhalb_qgis_liefert_default_ohne_rueckfrage")
  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
  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üftStatus
TestPruefmanager
test_ok
Prüft, dass ein bereits erfolgreiches Prüfergebnis ohne Nutzerinteraktion als 'ok' durchgereicht wird.grün
TestPruefmanager
test_leereingabe_erlaubt_ja
Prüft, dass bei erlaubter leerer Eingabe eine Ja-Antwort des Nutzers die Entscheidung 'ok' liefert.grün
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ün
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ün
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ün
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ün
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ün
TestPruefmanager
test_layer_unsichtbar_ja
Prüft, dass eine Ja-Antwort bei unsichtbarem Layer den Layer sichtbar schaltet und die Entscheidung 'ok' liefert.grün
TestPruefmanager
test_layer_unsichtbar_nein
Prüft, dass eine Nein-Antwort bei unsichtbarem Layer die Aktion 'layer_unsichtbar' als abgelehnt bestehen lässt.grün
TestPruefmanager
test_unbekannte_aktion
Prüft, dass eine unbekannte Aktion eine Warnung auslöst und unverarbeitet als Fehlschlag zurückgegeben wird.grün
TestPruefmanager
test_datei_existiert_overwrite
Prüft, dass die Nutzerwahl 'überschreiben' bei bestehender Datei zur Aktion 'datei_existiert_ueberschreiben' führt.grün
TestPruefmanager
test_datei_existiert_append
Prüft, dass die Nutzerwahl 'anhängen' bei bestehender Datei zur Aktion 'datei_existiert_anhaengen' führt.grün
TestPruefmanager
test_datei_existiert_cancel
Prüft, dass die Nutzerwahl 'abbrechen' bei bestehender Datei zur Aktion 'datei_existiert_ueberspringen' führt.grün
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ün
TestPruefmanager
test_verfahrensgebiet_layer_existiert_ergaenzen
Prüft, dass die Nutzerwahl 'ergänzen' bei bestehendem Verfahrensgebiet zur Aktion 'verfahrensgebiet_ergaenzen' führt.grün
TestPruefmanager
test_verfahrensgebiet_layer_existiert_abbrechen
Prüft, dass die Nutzerwahl 'abbrechen' bei bestehendem Verfahrensgebiet ok=False mit Aktion 'verfahrensgebiet_abbrechen' liefert.grün
TestPruefmanager
test_verfahrensgebiet_layer_existiert_entfernen
Prüft, dass die Nutzerwahl 'entfernen' bei bestehendem Verfahrensgebiet zur Aktion 'verfahrensgebiet_entfernen' führt.grün
TestPruefmanager
test_verfahrensgebiet_layer_existiert_ersetzen
Prüft, dass die Nutzerwahl 'ersetzen' bei bestehendem Verfahrensgebiet zur Aktion 'verfahrensgebiet_ersetzen' führt.grün
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ün
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ün
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ün
TestPruefmanager
test_report_error_unbekannte_aktion_faellt_auf_warning_zurueck
Prüft, dass eine nicht eingestufte Aktion als Fallback über warning() gemeldet wird.grün
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ün
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ün
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ün
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ün

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)"]
  class g1 groupnode
  g1 --> t1("none_liefert_none")
  g1 --> t2("leere_geometrie_liefert_none")
  g1 --> t3("stufe1_nutzt_boundary_wenn_vorhanden")
  g1 --> t4("stufe2_extrahiert_ringe_bei_einfachem_polygon")
  g1 --> t5("stufe2_extrahiert_alle_ringe_bei_multipolygon")
  g1 --> t6("stufe3_fallback_wenn_keine_ringe_extrahierbar")
  g1 --> t7("alle_stufen_scheitern_liefert_none")
  root --> g2["LayerExistsInGpkgTests (4)"]
  class g2 groupnode
  g2 --> t8("fehlende_datei_liefert_false")
  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
  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
  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üftStatus
PolygonZuLinieTests
test_none_liefert_none
Prüft, dass polygon_zu_linie für None-Eingabe None liefert.grün
PolygonZuLinieTests
test_leere_geometrie_liefert_none
Prüft, dass eine leere Geometrie None liefert.grün
PolygonZuLinieTests
test_stufe1_nutzt_boundary_wenn_vorhanden
Prüft, dass eine Geometrie mit boundary() (QGIS 3.x-Pfad) deren Ergebnis direkt liefert.grün
PolygonZuLinieTests
test_stufe2_extrahiert_ringe_bei_einfachem_polygon
Prüft, dass ohne boundary() die Ringe eines einfachen Polygons manuell extrahiert werden.grün
PolygonZuLinieTests
test_stufe2_extrahiert_alle_ringe_bei_multipolygon
Prüft, dass bei einem MultiPolygon die Ringe aller Teilpolygone extrahiert werden.grün
PolygonZuLinieTests
test_stufe3_fallback_wenn_keine_ringe_extrahierbar
Prüft, dass bei fehlgeschlagener Ringextraktion auf convertToType zurückgefallen wird.grün
PolygonZuLinieTests
test_alle_stufen_scheitern_liefert_none
Prüft, dass polygon_zu_linie None liefert, wenn Ringextraktion und convertToType beide scheitern.grün
LayerExistsInGpkgTests
test_fehlende_datei_liefert_false
Prüft, dass eine nicht vorhandene GPKG-Datei False liefert.grün
LayerExistsInGpkgTests
test_leerer_pfad_oder_layername_liefert_false
Prüft, dass ein leerer Pfad oder Layername False liefert.grün
LayerExistsInGpkgTests
test_vorhandener_layer_liefert_true
Prüft, dass ein in gpkg_contents eingetragener Layername als vorhanden erkannt wird.grün
LayerExistsInGpkgTests
test_fehlender_layer_liefert_false
Prüft, dass ein nicht in gpkg_contents eingetragener Layername als nicht vorhanden gilt.grün
CreateBufferLayerTests
test_ohne_qgis_liefert_none
Prüft, dass create_buffer_layer ohne verfügbares QGIS None liefert.grün
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
CreateBufferLayerTests
test_source_layer_ohne_getfeatures_liefert_none
Prüft, dass ein Quelllayer ohne getFeatures()-Methode None liefert.grün

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)"]
  class g1 groupnode
  g1 --> t1("none_layer_liefert_false")
  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üftStatus
AddLayerToProjectTests
test_none_layer_liefert_false
Prüft, dass add_layer_to_project für einen fehlenden Layer (None) False liefert.grün
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
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
AddLayerToProjectTests
test_mit_qgis_fehler_liefert_false
Prüft, dass ein Fehler beim Hinzufügen zum Projekt abgefangen wird und False liefert.grün
FindDockWidgetsTests
test_ohne_main_window_liefert_leere_liste
Prüft, dass find_dock_widgets ohne verfügbares Hauptfenster eine leere Liste liefert.grün
FindDockWidgetsTests
test_liefert_dock_widgets_des_main_window
Prüft, dass find_dock_widgets die vom Hauptfenster gefundenen Dock-Widgets durchreicht.grün
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
AddRemoveMenuTests
test_add_menu_ohne_main_window_tut_nichts
Prüft, dass add_menu ohne Hauptfenster keine Ausnahme wirft.grün
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
AddRemoveMenuTests
test_add_menu_ohne_menuaction_wird_ignoriert
Prüft, dass ein Objekt ohne menuAction nicht an die Menüleiste übergeben wird.grün
AddRemoveMenuTests
test_remove_menu_entfernt_ueber_menuaction
Prüft, dass remove_menu das Menü über dessen menuAction() aus der Menüleiste entfernt.grün
AddRemoveMenuTests
test_remove_menu_ohne_main_window_tut_nichts
Prüft, dass remove_menu ohne Hauptfenster keine Ausnahme wirft.grün

— (Docstring fehlt)

TestSettingsLogic 4
flowchart TD
  root(["test_settings_logic.py"])
  class root rootnode
  root --> g1["TestSettingsLogic (4)"]
  class g1 groupnode
  g1 --> t1("load")
  g1 --> t2("save")
  g1 --> t3("load_handles_partial_values_with_empty_fallback")
  g1 --> t4("save_empty_string_value_is_persisted")
  class t1 ok
  class t2 ok
  class t3 ok
  class t4 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üftStatus
TestSettingsLogic
test_load
Prüft, dass load() jede bekannte Projektvariable genau einmal über get_variable() liest.grün
TestSettingsLogic
test_save
Prüft, dass save() nur bekannte Variablen-Keys speichert und unbekannte Keys ignoriert.grün
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ün
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ün

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)"]
  class g1 groupnode
  g1 --> t1("sammelt_text_und_combobox_werte_inklusive_landkreiskennzahl")
  g1 --> t2("ohne_landkreis_dropdown_wird_keine_kennzahl_ergaenzt")
  root --> g2["LoadDataTests (4)"]
  class g2 groupnode
  g2 --> t3("befuellt_textfelder_aus_gespeicherten_daten")
  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üftStatus
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ün
SaveDataTests
test_ohne_landkreis_dropdown_wird_keine_kennzahl_ergaenzt
Prüft, dass ohne Landkreis-Dropdown im Formular keine 'landkreis_kennzahl' ergänzt wird.grün
LoadDataTests
test_befuellt_textfelder_aus_gespeicherten_daten
Prüft, dass load_data ein Textfeld mit dem gespeicherten Wert befüllt.grün
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
LoadDataTests
test_waehlt_combobox_eintrag_bei_bekanntem_namen
Prüft, dass load_data im Landkreis-Dropdown den gespeicherten Landkreisnamen auswählt.grün
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
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
BuildInputTests
test_anderes_feld_liefert_lineedit
Prüft, dass _build_input für ein normales Feld ein leeres Textfeld liefert.grün

— (Docstring fehlt)

TestStilpruefer 4
flowchart TD
  root(["test_stilpruefer.py"])
  class root rootnode
  root --> g1["TestStilpruefer (4)"]
  class g1 groupnode
  g1 --> t1("keine_datei_angegeben")
  g1 --> t2("datei_existiert_mit_qml")
  g1 --> t3("datei_existiert_falsche_endung")
  g1 --> t4("datei_existiert_nicht")
  class t1 ok
  class t2 ok
  class t3 ok
  class t4 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üftStatus
TestStilpruefer
test_keine_datei_angegeben
Prüft, dass eine leere Pfadangabe als 'ok' ohne Kontext akzeptiert wird (Stil ist optional).grün
TestStilpruefer
test_datei_existiert_mit_qml
Prüft, dass eine existierende .qml-Datei als 'stil_anwendbar' bestätigt wird.grün
TestStilpruefer
test_datei_existiert_falsche_endung
Prüft, dass eine existierende Datei ohne .qml-Endung als 'falsche_endung' abgelehnt wird.grün
TestStilpruefer
test_datei_existiert_nicht
Prüft, dass ein nicht existierender .qml-Pfad als 'datei_nicht_gefunden' abgelehnt wird.grün

Unit-Tests für sn_basis.functions.sys_wrapper.get_plugin_root().

TestGetPluginRoot 1JoinPathTests 1EnsureDirTests 2GetattrSafeTests 2
flowchart TD
  root(["test_sys_wrapper.py"])
  class root rootnode
  root --> g1["TestGetPluginRoot (1)"]
  class g1 groupnode
  g1 --> t1("get_plugin_root_folgt_keiner_verzeichnisverknuepfung")
  root --> g2["JoinPathTests (1)"]
  class g2 groupnode
  g2 --> t2("verbindet_mehrere_pfadbestandteile")
  root --> g3["EnsureDirTests (2)"]
  class g3 groupnode
  g3 --> t3("legt_fehlendes_verzeichnis_inklusive_eltern_an")
  g3 --> t4("vorhandenes_verzeichnis_wirft_keinen_fehler")
  root --> g4["GetattrSafeTests (2)"]
  class g4 groupnode
  g4 --> t5("liefert_vorhandenes_attribut")
  g4 --> t6("liefert_default_bei_fehlendem_attribut")
  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üftStatus
TestGetPluginRoot
test_get_plugin_root_folgt_keiner_verzeichnisverknuepfung
Prüft, dass get_plugin_root() bei einem über eine Verzeichnisverknüpfung (wie von link_qgis_profile.py angelegt) erreichten Modul den verlinkten Pfad liefert, statt zum echten Zielverzeichnis aufzulösen (Verfahrensgebiet #50).grün
JoinPathTests
test_verbindet_mehrere_pfadbestandteile
Prüft, dass join_path mehrere Bestandteile OS-sicher zu einem Path zusammenfügt.grün
EnsureDirTests
test_legt_fehlendes_verzeichnis_inklusive_eltern_an
Prüft, dass ensure_dir ein fehlendes Verzeichnis samt Elternverzeichnissen anlegt.grün
EnsureDirTests
test_vorhandenes_verzeichnis_wirft_keinen_fehler
Prüft, dass ensure_dir bei einem bereits vorhandenen Verzeichnis keinen Fehler wirft.grün
GetattrSafeTests
test_liefert_vorhandenes_attribut
Prüft, dass getattr_safe ein vorhandenes Attribut liefert.grün
GetattrSafeTests
test_liefert_default_bei_fehlendem_attribut
Prüft, dass getattr_safe bei fehlendem Attribut den Default-Wert liefert.grün

Unit-Tests für `sn_basis.functions.text_wrapper`.

TestSanitizeBezeichner 7
flowchart TD
  root(["test_text_wrapper.py"])
  class root rootnode
  root --> g1["TestSanitizeBezeichner (7)"]
  class g1 groupnode
  g1 --> t1("umlaute_bleiben_erhalten")
  g1 --> t2("bindestrich_bleibt_erhalten")
  g1 --> t3("unterstrich_bleibt_erhalten")
  g1 --> t4("leerzeichen_wird_durch_ersatz_zusammengefasst")
  g1 --> t5("fuehrender_und_folgender_ersatz_wird_entfernt")
  g1 --> t6("eigenes_ersatzzeichen_wird_verwendet")
  g1 --> t7("nur_unzulaessige_zeichen_ergibt_leeren_string")
  class t1 ok
  class t2 ok
  class t3 ok
  class t4 ok
  class t5 ok
  class t6 ok
  class t7 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üftStatus
TestSanitizeBezeichner
test_umlaute_bleiben_erhalten
Prüft, dass Umlaute und ß nicht durch den Ersatz entfernt werden.grün
TestSanitizeBezeichner
test_bindestrich_bleibt_erhalten
Prüft, dass ein Bindestrich im Bezeichner erhalten bleibt (Issue #42).grün
TestSanitizeBezeichner
test_unterstrich_bleibt_erhalten
Prüft, dass ein Unterstrich im Bezeichner erhalten bleibt.grün
TestSanitizeBezeichner
test_leerzeichen_wird_durch_ersatz_zusammengefasst
Prüft, dass Leerzeichen (kein zulässiges Zeichen) zu einem Ersatzzeichen werden.grün
TestSanitizeBezeichner
test_fuehrender_und_folgender_ersatz_wird_entfernt
Prüft, dass ein Ersatzzeichen am Anfang oder Ende des Ergebnisses entfernt wird.grün
TestSanitizeBezeichner
test_eigenes_ersatzzeichen_wird_verwendet
Prüft, dass ein abweichendes Ersatzzeichen anstelle von Unterstrich genutzt wird.grün
TestSanitizeBezeichner
test_nur_unzulaessige_zeichen_ergibt_leeren_string
Prüft, dass ein Bezeichner ganz aus unzulässigen Zeichen zu einem leeren String wird.grün

— (Docstring fehlt)

TestVariableWrapper 6
flowchart TD
  root(["test_variable_wrapper.py"])
  class root rootnode
  root --> g1["TestVariableWrapper (6)"]
  class g1 groupnode
  g1 --> t1("set_variable_project_noop_write_is_skipped")
  g1 --> t2("set_variable_project_changed_value_is_written")
  g1 --> t3("set_variable_global_writes_prefixed_name")
  g1 --> t4("get_variable_global_returns_empty_string_fallback")
  g1 --> t5("get_variable_invalid_scope_raises")
  g1 --> t6("set_variable_invalid_scope_raises")
  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üftStatus
TestVariableWrapper
test_set_variable_project_noop_write_is_skipped
Prüft, dass set_variable() im Projekt-Scope nicht schreibt, wenn der neue Wert dem bestehenden entspricht.grün
TestVariableWrapper
test_set_variable_project_changed_value_is_written
Prüft, dass set_variable() im Projekt-Scope bei geändertem Wert mit dem Präfix 'sn_' geschrieben wird.grün
TestVariableWrapper
test_set_variable_global_writes_prefixed_name
Prüft, dass set_variable() im globalen Scope den Variablennamen mit 'sn_' vorangestellt schreibt.grün
TestVariableWrapper
test_get_variable_global_returns_empty_string_fallback
Prüft, dass get_variable() im globalen Scope für eine nicht gesetzte Variable einen leeren String liefert.grün
TestVariableWrapper
test_get_variable_invalid_scope_raises
Prüft, dass get_variable() bei einem unbekannten Scope-Namen einen ValueError auslöst.grün
TestVariableWrapper
test_set_variable_invalid_scope_raises
Prüft, dass set_variable() bei einem unbekannten Scope-Namen einen ValueError auslöst.grün

Tests für sn_basis/functions/verfahrensgebiet_manager.py (zentrale Layer-Verfolgung, Issue #65).

TestVerfahrensgebietManager 5OnHandlerTests 5ListenerSetupTests 3
flowchart TD
  root(["test_verfahrensgebiet_manager.py"])
  class root rootnode
  root --> g1["TestVerfahrensgebietManager (5)"]
  class g1 groupnode
  g1 --> t1("get_verfahrensgebiet_layer_id_returns_value")
  g1 --> t2("get_verfahrensgebiet_layer_id_returns_none_for_empty_value")
  g1 --> t3("set_verfahrensgebiet_layer_id_writes_project_variable")
  g1 --> t4("update_without_layer_does_not_write_when_already_empty")
  g1 --> t5("update_with_layer_writes_variable")
  root --> g2["OnHandlerTests (5)"]
  class g2 groupnode
  g2 --> t6("on_project_changed_ohne_layer_setzt_variable_leer")
  g2 --> t7("on_project_changed_mit_layer_setzt_variable")
  g2 --> t8("on_layers_added_findet_neuen_layer")
  g2 --> t9("on_layer_removed_bei_aktuellem_layer_sucht_neu")
  g2 --> t10("on_layer_removed_bei_anderem_layer_aendert_nichts")
  root --> g3["ListenerSetupTests (3)"]
  class g3 groupnode
  g3 --> t11("setup_ohne_qgis_tut_nichts")
  g3 --> t12("setup_verbindet_signale_und_ist_idempotent")
  g3 --> t13("teardown_trennt_alle_signale_und_ist_idempotent")
  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
  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üftStatus
TestVerfahrensgebietManager
test_get_verfahrensgebiet_layer_id_returns_value
Prüft, dass get_verfahrensgebiet_layer_id() die in der Projektvariable gespeicherte Layer-ID liefert.grün
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ün
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ün
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ün
TestVerfahrensgebietManager
test_update_with_layer_writes_variable
Prüft, dass ein gefundener Verfahrensgebiet-Layer seine ID als Projektvariable speichert.grün
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ün
OnHandlerTests
test_on_project_changed_mit_layer_setzt_variable
Prüft, dass _on_project_changed die Layer-ID eines gefundenen Verfahrensgebiet-Layers übernimmt.grün
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ün
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ün
OnHandlerTests
test_on_layer_removed_bei_anderem_layer_aendert_nichts
Prüft, dass das Entfernen eines anderen Layers keine Neusuche auslöst.grün
ListenerSetupTests
test_setup_ohne_qgis_tut_nichts
Prüft, dass setup_verfahrensgebiet_listener ohne QGIS keine Signale registriert.grün
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ün
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ün

sn_verfahrensgebiet

Fachplugin · Ordner Plugin_SN_Verfahrensgebiet · 18 Testdateien · 289 Testfälle

Unit-Tests für `sn_verfahrensgebiet.functions.beteiligung_pruefung`.

TestBaueFlurstueckCsv 12TestBaueFlurstueckCsvListe 1TestHoleVerfahrensgebietLayer 3TestFordereManuellesLadenAn 2TestTry3Bootstrap 1TestBeteiligungPruefenDispatch 2TestLadeBeteiligungCsv 4
flowchart TD
  root(["test_beteiligung_pruefung.py"])
  class root rootnode
  root --> g1["TestBaueFlurstueckCsv (12)"]
  class g1 groupnode
  g1 --> t1("normalfall_mit_fuehrenden_nullen")
  g1 --> t2("nenner_null_wird_zu_unterstrichen")
  g1 --> t3("nenner_leer_wird_zu_unterstrichen")
  g1 --> t4("gemarkung_ohne_fuehrende_nullen_wird_aufgefuellt")
  g1 --> t5("ungueltiges_format_gibt_none")
  g1 --> t6("leerer_wert_gibt_none")
  g1 --> t7("nenner_9001_wird_zu_buchstabe_a")
  g1 --> t8("nenner_9002_wird_zu_buchstabe_b")
  g1 --> t9("nenner_9026_wird_zu_buchstabe_z")
  g1 --> t10("nenner_ausserhalb_buchstaben_bereich_bleibt_numerisch")
  g1 --> t11("nenner_9001_mit_fuehrenden_nullen_wird_erkannt")
  g1 --> t12("einstellige_folge_wird_auf_2_stellen_aufgefuellt")
  root --> g2["TestBaueFlurstueckCsvListe (1)"]
  class g2 groupnode
  g2 --> t13("nur_gueltige_zeilen_in_liste")
  root --> g3["TestHoleVerfahrensgebietLayer (3)"]
  class g3 groupnode
  g3 --> t14("layer_per_name_hat_vorrang_vor_combo_auswahl")
  g3 --> t15("combo_auswahl_als_fallback_ohne_namens_layer")
  g3 --> t16("kein_layer_gibt_none")
  root --> g4["TestFordereManuellesLadenAn (2)"]
  class g4 groupnode
  g4 --> t17("ohne_vef_vkzf_nennt_fehlende_kennzeichen")
  g4 --> t18("mit_vef_vkzf_nennt_verfahrensnummer")
  root --> g5["TestTry3Bootstrap (1)"]
  class g5 groupnode
  g5 --> t19("setzt_verfahrensnummer_und_fordert_manuelles_laden_an")
  root --> g6["TestBeteiligungPruefenDispatch (2)"]
  class g6 groupnode
  g6 --> t20("layer_ohne_kennzeichen_fordert_manuelles_laden_an")
  g6 --> t21("kein_layer_setzt_verfahrensnummer_und_fordert_laden_an")
  root --> g7["TestLadeBeteiligungCsv (4)"]
  class g7 groupnode
  g7 --> t22("dialog_abgebrochen_gibt_none")
  g7 --> t23("fehlende_flurstueck_spalte_wirft_fehler")
  g7 --> t24("leere_datei_wirft_fehler")
  g7 --> t25("erfolgsfall_gibt_zeilen_und_spalten_zurueck")
  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
  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üftStatus
TestBaueFlurstueckCsv
test_normalfall_mit_fuehrenden_nullen
— (Docstring fehlt)grün
TestBaueFlurstueckCsv
test_nenner_null_wird_zu_unterstrichen
— (Docstring fehlt)grün
TestBaueFlurstueckCsv
test_nenner_leer_wird_zu_unterstrichen
— (Docstring fehlt)grün
TestBaueFlurstueckCsv
test_gemarkung_ohne_fuehrende_nullen_wird_aufgefuellt
— (Docstring fehlt)grün
TestBaueFlurstueckCsv
test_ungueltiges_format_gibt_none
— (Docstring fehlt)grün
TestBaueFlurstueckCsv
test_leerer_wert_gibt_none
— (Docstring fehlt)grün
TestBaueFlurstueckCsv
test_nenner_9001_wird_zu_buchstabe_a
— (Docstring fehlt)grün
TestBaueFlurstueckCsv
test_nenner_9002_wird_zu_buchstabe_b
— (Docstring fehlt)grün
TestBaueFlurstueckCsv
test_nenner_9026_wird_zu_buchstabe_z
— (Docstring fehlt)grün
TestBaueFlurstueckCsv
test_nenner_ausserhalb_buchstaben_bereich_bleibt_numerisch
— (Docstring fehlt)grün
TestBaueFlurstueckCsv
test_nenner_9001_mit_fuehrenden_nullen_wird_erkannt
— (Docstring fehlt)grün
TestBaueFlurstueckCsv
test_einstellige_folge_wird_auf_2_stellen_aufgefuellt
— (Docstring fehlt)grün
TestBaueFlurstueckCsvListe
test_nur_gueltige_zeilen_in_liste
— (Docstring fehlt)grün
TestHoleVerfahrensgebietLayer
test_layer_per_name_hat_vorrang_vor_combo_auswahl
— (Docstring fehlt)grün
TestHoleVerfahrensgebietLayer
test_combo_auswahl_als_fallback_ohne_namens_layer
— (Docstring fehlt)grün
TestHoleVerfahrensgebietLayer
test_kein_layer_gibt_none
— (Docstring fehlt)grün
TestFordereManuellesLadenAn
test_ohne_vef_vkzf_nennt_fehlende_kennzeichen
— (Docstring fehlt)grün
TestFordereManuellesLadenAn
test_mit_vef_vkzf_nennt_verfahrensnummer
— (Docstring fehlt)grün
TestTry3Bootstrap
test_setzt_verfahrensnummer_und_fordert_manuelles_laden_an
— (Docstring fehlt)grün
TestBeteiligungPruefenDispatch
test_layer_ohne_kennzeichen_fordert_manuelles_laden_an
— (Docstring fehlt)grün
TestBeteiligungPruefenDispatch
test_kein_layer_setzt_verfahrensnummer_und_fordert_laden_an
— (Docstring fehlt)grün
TestLadeBeteiligungCsv
test_dialog_abgebrochen_gibt_none
— (Docstring fehlt)grün
TestLadeBeteiligungCsv
test_fehlende_flurstueck_spalte_wirft_fehler
— (Docstring fehlt)grün
TestLadeBeteiligungCsv
test_leere_datei_wirft_fehler
— (Docstring fehlt)grün
TestLadeBeteiligungCsv
test_erfolgsfall_gibt_zeilen_und_spalten_zurueck
— (Docstring fehlt)grün

— (Docstring fehlt)

TestDockWidget 2
flowchart TD
  root(["test_dockwidget.py"])
  class root rootnode
  root --> g1["TestDockWidget (2)"]
  class g1 groupnode
  g1 --> t1("init_tabs_with_services_injects_available_services")
  g1 --> t2("init_tabs_with_services_reports_errors")
  class t1 ok
  class t2 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üftStatus
TestDockWidget
test_init_tabs_with_services_injects_available_services
— (Docstring fehlt)grün
TestDockWidget
test_init_tabs_with_services_reports_errors
— (Docstring fehlt)grün

Tests für das Anzeigefenster des Eigentümer-Datenabgleichs (#56).

TestAnzeigetext 6TestFensterOeffnen 3
flowchart TD
  root(["test_eigentuemer_anzeige.py"])
  class root rootnode
  root --> g1["TestAnzeigetext (6)"]
  class g1 groupnode
  g1 --> t1("name_anschrift_email")
  g1 --> t2("keine_internen_angaben")
  g1 --> t3("fehlende_email_wird_genannt")
  g1 --> t4("werte_werden_maskiert")
  g1 --> t5("mehrere_eintraege_getrennt")
  g1 --> t6("leer_nur_platzhalter")
  root --> g2["TestFensterOeffnen (3)"]
  class g2 groupnode
  g2 --> t7("normales_fenster_in_standardgroesse")
  g2 --> t8("gemerkte_lage_wird_wiederhergestellt")
  g2 --> t9("unbrauchbare_lage_ergibt_standardgroesse")
  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
  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üftStatus
TestAnzeigetext
test_name_anschrift_email
Prüft, dass die Anzeige Name mit Anrede und Titel, die mehrzeilige Anschrift mit Ortsteil und die E-Mail zeigt.grün
TestAnzeigetext
test_keine_internen_angaben
Prüft, dass der Eigentümer weder Konten, Personen-IDs, Rechtsperson-Wert noch das Kennzeichen „verstorben“ sieht.grün
TestAnzeigetext
test_fehlende_email_wird_genannt
Prüft, dass eine fehlende E-Mail ausdrücklich als „keine angegeben“ erscheint.grün
TestAnzeigetext
test_werte_werden_maskiert
Prüft, dass Sonderzeichen aus den Daten maskiert werden und kein HTML einschleusen.grün
TestAnzeigetext
test_mehrere_eintraege_getrennt
Prüft, dass mehrere Einträge untereinander, durch eine Linie getrennt, erscheinen.grün
TestAnzeigetext
test_leer_nur_platzhalter
Prüft, dass die leere Anzeige nur den neutralen Platzhalter zeigt.grün
TestFensterOeffnen
test_normales_fenster_in_standardgroesse
Prüft, dass das Anzeigefenster ohne gemerkte Lage als normales Fenster mit Rahmen in Standardgröße öffnet, nie im Vollbild.grün
TestFensterOeffnen
test_gemerkte_lage_wird_wiederhergestellt
Prüft, dass eine gemerkte Größe und Lage der letzten Sitzung wiederhergestellt wird.grün
TestFensterOeffnen
test_unbrauchbare_lage_ergibt_standardgroesse
Prüft, dass eine nicht wiederherstellbare Lage auf die Standardgröße zurückfällt.grün

Tests für die Korrekturen beim Eigentümer-Datenabgleich (#56).

TestAenderungen 4TestKorrekturPfad 3TestSchreiben 5
flowchart TD
  root(["test_eigentuemer_korrektur.py"])
  class root rootnode
  root --> g1["TestAenderungen (4)"]
  class g1 groupnode
  g1 --> t1("feldwerte")
  g1 --> t2("nur_echte_aenderungen")
  g1 --> t3("feld_leeren_ist_aenderung")
  g1 --> t4("wende_an")
  root --> g2["TestKorrekturPfad (3)"]
  class g2 groupnode
  g2 --> t5("textdatei_provider")
  g2 --> t6("ogr_provider")
  g2 --> t7("keine_csv")
  root --> g3["TestSchreiben (5)"]
  class g3 groupnode
  g3 --> t8("neue_datei_mit_kopfzeile_und_bom")
  g3 --> t9("anhaengen_ohne_zweite_kopfzeile")
  g3 --> t10("ohne_aenderung_keine_datei")
  g3 --> t11("schreibfehler_wird_weitergereicht")
  g3 --> t12("schreibt_nichts_auf_die_konsole")
  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üftStatus
TestAenderungen
test_feldwerte
Prüft, dass alle korrigierbaren Felder vorbelegt werden, mehrere E-Mails durch Komma getrennt.grün
TestAenderungen
test_nur_echte_aenderungen
Prüft, dass nur geänderte Felder zählen und Leerraum am Rand oder doppelte Leerzeichen keine Änderung sind.grün
TestAenderungen
test_feld_leeren_ist_aenderung
Prüft, dass das Leeren eines Feldes als Änderung zählt.grün
TestAenderungen
test_wende_an
Prüft, dass die Änderungen im angezeigten Eintrag landen und E-Mails wieder getrennt werden; Konten bleiben.grün
TestKorrekturPfad
test_textdatei_provider
Prüft, dass aus der Quelle eines Textdatei-Layers (file-URI, Leerzeichen kodiert) der Pfad neben der CSV wird.grün
TestKorrekturPfad
test_ogr_provider
Prüft, dass auch eine OGR-Quelle mit Layernamen den Pfad neben der CSV ergibt.grün
TestKorrekturPfad
test_keine_csv
Prüft, dass für Quellen ohne CSV-Datei kein Pfad vorgeschlagen wird.grün
TestSchreiben
test_neue_datei_mit_kopfzeile_und_bom
Prüft, dass eine neue Korrektur-CSV mit BOM, Kopfzeile und je Änderung einer Zeile mit Exportspaltennamen entsteht.grün
TestSchreiben
test_anhaengen_ohne_zweite_kopfzeile
Prüft, dass weitere Korrekturen angehängt werden, ohne Kopfzeile oder BOM zu wiederholen.grün
TestSchreiben
test_ohne_aenderung_keine_datei
Prüft, dass ohne Änderung keine Datei angelegt wird.grün
TestSchreiben
test_schreibfehler_wird_weitergereicht
Prüft, dass ein nicht schreibbarer Pfad als OSError beim Aufrufer ankommt.grün
TestSchreiben
test_schreibt_nichts_auf_die_konsole
Prüft, dass das Festhalten von Korrekturen keine Personendaten auf die Konsole schreibt (Datenschutz).grün

Tests für die Eigentümersuche im Serienbriefexport (#56).

TestLayererkennung 2TestSuche 10TestAnzeigeformen 1
flowchart TD
  root(["test_eigentuemer_suche.py"])
  class root rootnode
  root --> g1["TestLayererkennung (2)"]
  class g1 groupnode
  g1 --> t1("layer_mit_name_und_vorname_ist_eigentuemerlayer")
  g1 --> t2("eigentuemerlayer_im_projekt")
  root --> g2["TestSuche (10)"]
  class g2 groupnode
  g2 --> t3("ohne_eingabe_fehler")
  g2 --> t4("layer_ohne_pflichtspalten")
  g2 --> t5("teilstring_ohne_gross_kleinschreibung")
  g2 --> t6("umlaute_und_eszett")
  g2 --> t7("gleiche_person_gleiche_anschrift_zusammengefasst")
  g2 --> t8("andere_anschrift_eigener_treffer")
  g2 --> t9("kennzeichen_verstorben")
  g2 --> t10("rechtsperson_als_rohwert")
  g2 --> t11("plz_mit_fuehrender_null")
  g2 --> t12("suche_gibt_nichts_aus")
  root --> g3["TestAnzeigeformen (1)"]
  class g3 groupnode
  g3 --> t13("name_und_anschrift")
  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
  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üftStatus
TestLayererkennung
test_layer_mit_name_und_vorname_ist_eigentuemerlayer
Prüft, dass ein Layer mit den Spalten Nachname und Vorname als Eigentümerdatei erkannt wird, auch mit BOM und anderer Schreibweise.grün
TestLayererkennung
test_eigentuemerlayer_im_projekt
Prüft, dass aus dem Projekt nur passende Layer kommen, nach Namen sortiert.grün
TestSuche
test_ohne_eingabe_fehler
Prüft, dass ohne Name und Vorname nicht die ganze Datei gelistet, sondern um eine Eingabe gebeten wird.grün
TestSuche
test_layer_ohne_pflichtspalten
Prüft, dass ein Layer ohne Nachname/Vorname mit Hinweis auf den Serienbriefexport abgelehnt wird.grün
TestSuche
test_teilstring_ohne_gross_kleinschreibung
Prüft, dass Name und Vorname als Teilstring ohne Rücksicht auf Groß-/Kleinschreibung gesucht werden.grün
TestSuche
test_umlaute_und_eszett
Prüft, dass „Müller“ auch „Mueller“ findet und „Strauss“ auch „Strauß“.grün
TestSuche
test_gleiche_person_gleiche_anschrift_zusammengefasst
Prüft, dass Zeilen mit gleichem Namen und gleicher Anschrift ein Treffer werden und Konten, Personen-IDs und E-Mails gesammelt werden.grün
TestSuche
test_andere_anschrift_eigener_treffer
Prüft, dass dieselbe Person mit anderer Anschrift ein eigener Treffer bleibt, sortiert nach Wohnort.grün
TestSuche
test_kennzeichen_verstorben
Prüft, dass „verstorben“ beim Exportwert 1 (auch als Zahl gelesen) gesetzt ist und bei 0, Leerem und NULL nicht.grün
TestSuche
test_rechtsperson_als_rohwert
Prüft, dass PER_RECHTSPERSON unverändert angezeigt wird (0, 1, 5, 9; noch nicht entschlüsselt) und abweichende Werte einer Person gesammelt werden.grün
TestSuche
test_plz_mit_fuehrender_null
Prüft, dass eine von QGIS als Zahl gelesene PLZ wieder fünfstellig mit führender Null erscheint und Zeilen dadurch zusammenfinden.grün
TestSuche
test_suche_gibt_nichts_aus
Prüft, dass die Suche keine Personendaten auf die Konsole schreibt (Datenschutz).grün
TestAnzeigeformen
test_name_und_anschrift
Prüft, dass Name mit Titel und einzeilige Anschrift mit Ortsteil lesbar zusammengesetzt werden.grün

Tests für den Tab „Eigentümer“ – Flurstückssuche, Eigentümersuche, Anzeige und Korrektur (#56).

TestFlurstueckSuchen 5TestEigentuemerSuchen 4TestTrefferliste 3TestSitzung 7TestKorrekturLabel 4TestKorrektur 5TestKorrekturDatei 2TestDockWidgetTabs 1
flowchart TD
  root(["test_eigentuemer_tab.py"])
  class root rootnode
  root --> g1["TestFlurstueckSuchen (5)"]
  class g1 groupnode
  g1 --> t1("ohne_flurstueckslayer_erscheint_hinweisdialog")
  g1 --> t2("eingabefehler_als_warnung")
  g1 --> t3("kein_treffer")
  g1 --> t4("treffer_werden_ausgewaehlt_und_angezoomt")
  g1 --> t5("ohne_kartenansicht_bleibt_auswahl")
  root --> g2["TestEigentuemerSuchen (4)"]
  class g2 groupnode
  g2 --> t6("ohne_eigentuemerdatei_warnung")
  g2 --> t7("suchfehler_als_warnung")
  g2 --> t8("kein_treffer_ohne_namen_in_meldung")
  g2 --> t9("treffer_oeffnen_trefferliste_und_ersetzen_die_alte")
  root --> g3["TestTrefferliste (3)"]
  class g3 groupnode
  g3 --> t10("trefferzeile_mit_hinweis")
  g3 --> t11("ausgewaehlte_eigentuemer")
  g3 --> t12("daten_anzeigen_gibt_auswahl_weiter")
  root --> g4["TestSitzung (7)"]
  class g4 groupnode
  g4 --> t13("sitzung_beginnen_oeffnet_leeres_fenster_mit_rahmen")
  g4 --> t14("lage_gilt_fuer_naechste_sitzung")
  g4 --> t15("daten_anzeigen_beginnt_sitzung_bei_bedarf")
  g4 --> t16("daten_anzeigen_ohne_auswahl")
  g4 --> t17("anzeige_leeren_laesst_fenster_offen")
  g4 --> t18("sitzung_beenden_schliesst_fenster")
  g4 --> t19("von_aussen_geschlossen_beendet_sitzung")
  root --> g5["TestKorrekturLabel (4)"]
  class g5 groupnode
  g5 --> t20("ohne_eigentuemerdatei")
  g5 --> t21("pfad_neben_der_eigentuemerdatei")
  g5 --> t22("ohne_csv_quelle_wird_abgefragt")
  g5 --> t23("gewaehlter_pfad_wird_angezeigt")
  root --> g6["TestKorrektur (5)"]
  class g6 groupnode
  g6 --> t24("korrektur_wird_festgehalten_und_angezeigt")
  g6 --> t25("ohne_aenderung_nichts_schreiben")
  g6 --> t26("abbruch_nichts_schreiben")
  g6 --> t27("schreibfehler_warnung_und_anzeige_unveraendert")
  g6 --> t28("ohne_anzeige_keine_korrektur")
  root --> g7["TestKorrekturDatei (2)"]
  class g7 groupnode
  g7 --> t29("vorschlag_neben_der_eigentuemerdatei")
  g7 --> t30("ohne_csv_quelle_wird_gefragt")
  root --> g8["TestDockWidgetTabs (1)"]
  class g8 groupnode
  g8 --> t31("tab_ist_im_dockwidget_eingetragen")
  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
  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üftStatus
TestFlurstueckSuchen
test_ohne_flurstueckslayer_erscheint_hinweisdialog
Prüft, dass ohne Layer „Flurstücke“ ein Dialog zum Laden von Verfahrensgebiet und Flurstücken erscheint.grün
TestFlurstueckSuchen
test_eingabefehler_als_warnung
Prüft, dass eine ungültige Eingabe als Warnung in der Meldungsleiste erscheint, nicht als Dialog.grün
TestFlurstueckSuchen
test_kein_treffer
Prüft, dass ohne Treffer ein Hinweis erscheint und keine Auswahl gesetzt wird.grün
TestFlurstueckSuchen
test_treffer_werden_ausgewaehlt_und_angezoomt
Prüft, dass Treffer im Flurstückslayer ausgewählt, angezoomt und gemeldet werden.grün
TestFlurstueckSuchen
test_ohne_kartenansicht_bleibt_auswahl
Prüft, dass die Auswahl auch ohne Kartenansicht gesetzt und gemeldet wird.grün
TestEigentuemerSuchen
test_ohne_eigentuemerdatei_warnung
Prüft, dass ohne gewählte Eigentümerdatei die Liste aufgefrischt und dann auf das Laden der CSV hingewiesen wird.grün
TestEigentuemerSuchen
test_suchfehler_als_warnung
Prüft, dass ein Fehler der Suche (z. B. leere Eingabe) als Warnung erscheint.grün
TestEigentuemerSuchen
test_kein_treffer_ohne_namen_in_meldung
Prüft, dass ohne Treffer ein Hinweis erscheint, der den gesuchten Namen nicht wiederholt (Datenschutz).grün
TestEigentuemerSuchen
test_treffer_oeffnen_trefferliste_und_ersetzen_die_alte
Prüft, dass Treffer in einer neuen Trefferliste mit Anzeige-Rückruf erscheinen, eine offene alte Liste geschlossen wird und die Eingaben an die Suche gehen.grün
TestTrefferliste
test_trefferzeile_mit_hinweis
Prüft, dass die Trefferliste Name, Anschrift, E-Mail, den Rohwert von PER_RECHTSPERSON und das Kennzeichen „verstorben“ zeigt.grün
TestTrefferliste
test_ausgewaehlte_eigentuemer
Prüft, dass das Trefferfenster die in der Tabelle gewählten Einträge zurückgibt.grün
TestTrefferliste
test_daten_anzeigen_gibt_auswahl_weiter
Prüft, dass „Daten anzeigen“ die Auswahl der Trefferliste an den Tab übergibt.grün
TestSitzung
test_sitzung_beginnen_oeffnet_leeres_fenster_mit_rahmen
Prüft, dass „Sitzung beginnen“ ein leeres Anzeigefenster als normales Fenster öffnet (ohne gemerkte Lage beim ersten Mal).grün
TestSitzung
test_lage_gilt_fuer_naechste_sitzung
Prüft, dass Größe und Lage des Fensters beim Beenden gemerkt und in der nächsten Sitzung wiederverwendet werden.grün
TestSitzung
test_daten_anzeigen_beginnt_sitzung_bei_bedarf
Prüft, dass „Daten anzeigen“ ohne laufende Sitzung diese beginnt und die Einträge zeigt; die Statuszeile nennt nur die Anzahl.grün
TestSitzung
test_daten_anzeigen_ohne_auswahl
Prüft, dass „Daten anzeigen“ ohne Auswahl nur einen Hinweis gibt und keine Sitzung beginnt.grün
TestSitzung
test_anzeige_leeren_laesst_fenster_offen
Prüft, dass „Anzeige leeren“ die Daten entfernt, das Fenster aber nicht schließt.grün
TestSitzung
test_sitzung_beenden_schliesst_fenster
Prüft, dass „Sitzung beenden“ das Anzeigefenster schließt und die angezeigten Daten vergisst.grün
TestSitzung
test_von_aussen_geschlossen_beendet_sitzung
Prüft, dass ein über den Fensterrahmen geschlossenes Anzeigefenster die Sitzung beendet und seine Lage gemerkt wird.grün
TestKorrekturLabel
test_ohne_eigentuemerdatei
Prüft, dass ohne Eigentümerdatei unter den Knöpfen steht, dass keine gewählt ist.grün
TestKorrekturLabel
test_pfad_neben_der_eigentuemerdatei
Prüft, dass der Pfad der Korrektur-CSV angezeigt wird, mit Hinweis, solange sie noch nicht angelegt ist.grün
TestKorrekturLabel
test_ohne_csv_quelle_wird_abgefragt
Prüft, dass bei einer Quelle ohne CSV angekündigt wird, dass der Speicherort beim ersten Speichern abgefragt wird.grün
TestKorrekturLabel
test_gewaehlter_pfad_wird_angezeigt
Prüft, dass ein einmal gewählter Speicherort angezeigt wird.grün
TestKorrektur
test_korrektur_wird_festgehalten_und_angezeigt
Prüft, dass eine Korrektur in die Korrektur-CSV geschrieben, sofort angezeigt und ohne Namen gemeldet wird.grün
TestKorrektur
test_ohne_aenderung_nichts_schreiben
Prüft, dass ein unverändert gespeicherter Dialog nichts schreibt.grün
TestKorrektur
test_abbruch_nichts_schreiben
Prüft, dass ein abgebrochener Korrekturdialog nichts schreibt.grün
TestKorrektur
test_schreibfehler_warnung_und_anzeige_unveraendert
Prüft, dass bei einem Schreibfehler gewarnt, die Anzeige nicht geändert und der Pfad beim nächsten Mal neu bestimmt wird.grün
TestKorrektur
test_ohne_anzeige_keine_korrektur
Prüft, dass ohne angezeigte Daten kein Korrekturdialog erscheint.grün
TestKorrekturDatei
test_vorschlag_neben_der_eigentuemerdatei
Prüft, dass die Korrektur-CSV ohne Rückfrage neben der Eigentümerdatei liegt, wenn der Ordner beschreibbar ist, und gemerkt wird.grün
TestKorrekturDatei
test_ohne_csv_quelle_wird_gefragt
Prüft, dass ohne verwertbare CSV-Quelle nach dem Speicherort gefragt wird; Abbrechen liefert keinen Pfad.grün
TestDockWidgetTabs
test_tab_ist_im_dockwidget_eingetragen
Prüft, dass der Tab „Eigentümer“ im DockWidget direkt nach dem Bearbeitungs-Tab steht.grün

Unit-Tests für das flurstueck_alkis-Modul.

TestFlurstueckAlkis 11TestFlurstueckAlkisAnhaengenDedup 3
flowchart TD
  root(["test_flurstueck_alkis.py"])
  class root rootnode
  root --> g1["TestFlurstueckAlkis (11)"]
  class g1 groupnode
  g1 --> t1("user_cancel_returns_none")
  g1 --> t2("empty_text_after_confirmation_returns_none")
  g1 --> t3("invalid_wfs_layer_returns_none")
  g1 --> t4("success_returns_layer_and_first_status")
  g1 --> t5("sql_filter_contains_all_schluessel")
  g1 --> t6("existing_layer_reload_yes")
  g1 --> t7("existing_layer_abbrechen_returns_none")
  g1 --> t8("vorgabe_schluessel_prefills_default_text")
  g1 --> t9("vorgabe_namen_appears_in_label")
  g1 --> t10("backwards_compatible_no_new_params")
  g1 --> t11("ohne_schluessel_abfrage_ueberspringt_ask_text")
  root --> g2["TestFlurstueckAlkisAnhaengenDedup (3)"]
  class g2 groupnode
  g2 --> t12("append_ueberspringt_bereits_vorhandene_flurstuecke")
  g2 --> t13("append_ohne_kennzeichen_feld_haengt_alles_an")
  g2 --> t14("ohne_schluessel_abfrage_append_dedup")
  class t1 ok
  class t2 ok
  class t3 ok
  class t4 warn
  class t5 warn
  class t6 warn
  class t7 ok
  class t8 warn
  class t9 warn
  class t10 warn
  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üftStatus
TestFlurstueckAlkis
test_user_cancel_returns_none
Prüft, dass ein Abbruch im Eingabedialog (ok=False) (None, LoadStatus.NONE) liefert.grün
TestFlurstueckAlkis
test_empty_text_after_confirmation_returns_none
Prüft, dass ein bestätigter, aber leerer Eingabetext ebenfalls (None, LoadStatus.NONE) liefert.grün
TestFlurstueckAlkis
test_invalid_wfs_layer_returns_none
Prüft, dass ein ungültiger WFS-Layer (None, LoadStatus.NONE) liefert.grün
TestFlurstueckAlkis
test_success_returns_layer_and_first_status
Prüft, dass ohne bestehenden Layer der von lade_flurstuecke_per_gemarkung gelieferte Layer mit LoadStatus.FIRST zurückgegeben wird.rot
TestFlurstueckAlkis
test_sql_filter_contains_all_schluessel
Prüft, dass lade_flurstuecke_per_gemarkung für jeden Gemarkungsschlüssel eine eigene WFS-Anfrage mit dessen Schlüssel stellt.rot
TestFlurstueckAlkis
test_existing_layer_reload_yes
Prüft, dass bei bestehendem Layer und Klick auf 'Überschreiben' der alte Layer entfernt und LoadStatus.RELOAD geliefert wird.rot
TestFlurstueckAlkis
test_existing_layer_abbrechen_returns_none
Prüft, dass bei bestehendem Layer und Klick auf 'Abbrechen' nichts verändert wird und (None, LoadStatus.NONE) geliefert wird.grün
TestFlurstueckAlkis
test_vorgabe_schluessel_prefills_default_text
Prüft, dass vorgabe_schluessel als vorbelegter default_text im Eingabedialog erscheint.rot
TestFlurstueckAlkis
test_vorgabe_namen_appears_in_label
Prüft, dass vorgabe_namen im Beschriftungstext des Eingabedialogs erscheint.rot
TestFlurstueckAlkis
test_backwards_compatible_no_new_params
Prüft, dass flurstueck_alkis() ohne die neuen optionalen Parameter weiterhin fehlerfrei einen Layer mit LoadStatus.FIRST liefert.rot
TestFlurstueckAlkis
test_ohne_schluessel_abfrage_ueberspringt_ask_text
Prüft, dass ohne_schluessel_abfrage=True vorgabe_schluessel direkt verwendet und ask_text nicht aufgerufen wird.grün
TestFlurstueckAlkisAnhaengenDedup
test_append_ueberspringt_bereits_vorhandene_flurstuecke
Prüft, dass beim Anhängen bereits vorhandene flurstueckskennzeichen nicht erneut hinzugefügt werden.grün
TestFlurstueckAlkisAnhaengenDedup
test_append_ohne_kennzeichen_feld_haengt_alles_an
Prüft, dass ohne flurstueckskennzeichen-Feld weiterhin alle Features angehängt werden (Rückfallverhalten).grün
TestFlurstueckAlkisAnhaengenDedup
test_ohne_schluessel_abfrage_append_dedup
ohne_schluessel_abfrage=True: Anhängen dedupliziert trotzdem, ohne nach Schlüsseln zu fragen (#47).grün

Tests für die Flurstückssuche im Layer „Flurstücke“ (#56).

TestEingabe 6TestSuche 6
flowchart TD
  root(["test_flurstueck_suche.py"])
  class root rootnode
  root --> g1["TestEingabe (6)"]
  class g1 groupnode
  g1 --> t1("flurstuecksnummer_mit_und_ohne_nenner")
  g1 --> t2("ungueltige_flurstuecksnummer")
  g1 --> t3("kennzeichen_zerlegen")
  g1 --> t4("gemarkungsnummer_aus_ziffern")
  g1 --> t5("gemarkungsname_ueber_gemarkungslayer")
  g1 --> t6("gemarkungsname_ohne_layer_oder_unbekannt")
  root --> g2["TestSuche (6)"]
  class g2 groupnode
  g2 --> t7("mit_nenner_genau_ein_treffer")
  g2 --> t8("ohne_nenner_alle_mit_diesem_zaehler")
  g2 --> t9("kein_treffer")
  g2 --> t10("layer_ohne_kennzeichenfeld")
  g2 --> t11("fehlender_flurstueckslayer_bricht_ab")
  g2 --> t12("suche_im_projekt_mit_gemarkungsname")
  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üftStatus
TestEingabe
test_flurstuecksnummer_mit_und_ohne_nenner
Prüft, dass Zähler und Nenner getrennt und führende Nullen entfernt werden.grün
TestEingabe
test_ungueltige_flurstuecksnummer
Prüft, dass leere oder unzulässige Flurstücksnummern abgelehnt werden.grün
TestEingabe
test_kennzeichen_zerlegen
Prüft, dass Gemarkung, Zähler und Nenner aus dem ALKIS-Kennzeichen gelesen werden.grün
TestEingabe
test_gemarkungsnummer_aus_ziffern
Prüft, dass Ziffern als Gemarkungsnummer gelten, auch ohne führende Nullen oder als langer Schlüssel.grün
TestEingabe
test_gemarkungsname_ueber_gemarkungslayer
Prüft, dass ein Gemarkungsname ohne Rücksicht auf Großschreibung in alle passenden Nummern übersetzt wird.grün
TestEingabe
test_gemarkungsname_ohne_layer_oder_unbekannt
Prüft, dass ein Name ohne Gemarkungslayer oder ohne Treffer eine verständliche Meldung ergibt.grün
TestSuche
test_mit_nenner_genau_ein_treffer
Prüft, dass mit Nenner nur das passende Flurstück der Gemarkung gefunden wird.grün
TestSuche
test_ohne_nenner_alle_mit_diesem_zaehler
Prüft, dass ohne Nenner alle Flurstücke mit dem Zähler gefunden werden, aber nur in der gesuchten Gemarkung.grün
TestSuche
test_kein_treffer
Prüft, dass ein nicht vorhandenes Flurstück eine leere Trefferliste ergibt.grün
TestSuche
test_layer_ohne_kennzeichenfeld
Prüft, dass ein Flurstückslayer ohne Feld „flurstueckskennzeichen“ gemeldet wird.grün
TestSuche
test_fehlender_flurstueckslayer_bricht_ab
Prüft, dass die Suche ohne Layer „Flurstücke“ mit dem Hinweis abbricht, zuerst Verfahrensgebiet und Flurstücke zu laden.grün
TestSuche
test_suche_im_projekt_mit_gemarkungsname
Prüft, dass die Suche im Projekt den Gemarkungsnamen auflöst und Layer samt Treffern liefert.grün

Unit-Tests für `sn_verfahrensgebiet.functions.gemarkung_alkis`.

TestExtractSchluesselUndName 4TestGemarkungSchluesselbbox 6TestGemarkungSchluesselnurNummern 2TestLadeGemarkungenlayer 2
flowchart TD
  root(["test_gemarkung_alkis.py"])
  class root rootnode
  root --> g1["TestExtractSchluesselUndName (4)"]
  class g1 groupnode
  g1 --> t1("standard_attribute")
  g1 --> t2("fallback_attribute")
  g1 --> t3("missing_attribute_returns_empty")
  g1 --> t4("none_value_returns_empty")
  root --> g2["TestGemarkungSchluesselbbox (6)"]
  class g2 groupnode
  g2 --> t5("success_bbox_filter")
  g2 --> t6("fallback_when_bbox_fails")
  g2 --> t7("both_layers_fail_returns_empty")
  g2 --> t8("deduplication_and_sorting")
  g2 --> t9("feature_without_schluessel_skipped")
  g2 --> t10("exception_returns_empty")
  root --> g3["TestGemarkungSchluesselnurNummern (2)"]
  class g3 groupnode
  g3 --> t11("returns_only_nummern")
  g3 --> t12("empty_input_returns_empty")
  root --> g4["TestLadeGemarkungenlayer (2)"]
  class g4 groupnode
  g4 --> t13("returns_layer_when_service_reachable")
  g4 --> t14("returns_none_when_service_unreachable")
  class t1 warn
  class t2 warn
  class t3 ok
  class t4 ok
  class t5 skip
  class t6 skip
  class t7 skip
  class t8 skip
  class t9 skip
  class t10 skip
  class t11 skip
  class t12 skip
  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üftStatus
TestExtractSchluesselUndName
test_standard_attribute
— (Docstring fehlt)rot
TestExtractSchluesselUndName
test_fallback_attribute
— (Docstring fehlt)rot
TestExtractSchluesselUndName
test_missing_attribute_returns_empty
— (Docstring fehlt)grün
TestExtractSchluesselUndName
test_none_value_returns_empty
— (Docstring fehlt)grün
TestGemarkungSchluesselbbox
test_success_bbox_filter
WFS-BBox-Filter liefert Features → korrekte Tupel-Liste.übersp.
TestGemarkungSchluesselbbox
test_fallback_when_bbox_fails
BBox-Filter schlägt fehl → Fallback auf Volllade + client-seitige Filterung.übersp.
TestGemarkungSchluesselbbox
test_both_layers_fail_returns_empty
Beide Lade-Strategien scheitern → leere Liste.übersp.
TestGemarkungSchluesselbbox
test_deduplication_and_sorting
Doppelte Schlüssel werden dedupliziert, Ergebnis ist sortiert.übersp.
TestGemarkungSchluesselbbox
test_feature_without_schluessel_skipped
Feature ohne Schlüssel-Attribut wird übersprungen.übersp.
TestGemarkungSchluesselbbox
test_exception_returns_empty
Exception im Ladevorgang → leere Liste (kein Crash).übersp.
TestGemarkungSchluesselnurNummern
test_returns_only_nummern
— (Docstring fehlt)übersp.
TestGemarkungSchluesselnurNummern
test_empty_input_returns_empty
— (Docstring fehlt)übersp.
TestLadeGemarkungenlayer
test_returns_layer_when_service_reachable
Dienst erreichbar (isValid=True) → Layer-Objekt zurückgegeben.grün
TestLadeGemarkungenlayer
test_returns_none_when_service_unreachable
Dienst nicht erreichbar (isValid=False) → None zurückgegeben.grün

Unit-Tests für `sn_verfahrensgebiet.functions.grenzpunkt_alkis`.

TestExtrahiereGmlIds 5TestGrenzpunktAlkis 7TestGrenzpunkteGemarkungsweiseStil 1
flowchart TD
  root(["test_grenzpunkt_alkis.py"])
  class root rootnode
  root --> g1["TestExtrahiereGmlIds (5)"]
  class g1 groupnode
  g1 --> t1("xlink_href_format")
  g1 --> t2("plain_gml_id")
  g1 --> t3("empty_value_skipped")
  g1 --> t4("deduplication")
  g1 --> t5("sorted_output")
  root --> g2["TestGrenzpunktAlkis (7)"]
  class g2 groupnode
  g2 --> t6("no_vg_layer_returns_none")
  g2 --> t7("invalid_punktort_layer")
  g2 --> t8("empty_punktort_layer")
  g2 --> t9("no_gml_ids_returns_pta_only")
  g2 --> t10("grenzpunkt_batch_empty")
  g2 --> t11("success_returns_both_layers")
  g2 --> t12("extent_derived_from_vg_layer")
  root --> g3["TestGrenzpunkteGemarkungsweiseStil (1)"]
  class g3 groupnode
  g3 --> t13("stil_wird_nach_dem_laden_auf_den_ergebnis_layer_angewendet")
  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 warn
  class t10 warn
  class t11 warn
  class t12 warn
  class t13 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üftStatus
TestExtrahiereGmlIds
test_xlink_href_format
URN-Format 'urn:adv:oid:DEABC123' → nur 'DEABC123' extrahiert.grün
TestExtrahiereGmlIds
test_plain_gml_id
Plain-GML-ID ohne Doppelpunkt → direkt übernommen.grün
TestExtrahiereGmlIds
test_empty_value_skipped
Leerer gehoertZu-Wert wird übersprungen.grün
TestExtrahiereGmlIds
test_deduplication
Doppelte Referenzen werden dedupliziert.grün
TestExtrahiereGmlIds
test_sorted_output
Rückgabe ist aufsteigend sortiert.grün
TestGrenzpunktAlkis
test_no_vg_layer_returns_none
— (Docstring fehlt)grün
TestGrenzpunktAlkis
test_invalid_punktort_layer
— (Docstring fehlt)grün
TestGrenzpunktAlkis
test_empty_punktort_layer
— (Docstring fehlt)grün
TestGrenzpunktAlkis
test_no_gml_ids_returns_pta_only
— (Docstring fehlt)rot
TestGrenzpunktAlkis
test_grenzpunkt_batch_empty
— (Docstring fehlt)rot
TestGrenzpunktAlkis
test_success_returns_both_layers
— (Docstring fehlt)rot
TestGrenzpunktAlkis
test_extent_derived_from_vg_layer
Wenn kein extent übergeben → Extent aus VG-Layer holen.rot
TestGrenzpunkteGemarkungsweiseStil
test_stil_wird_nach_dem_laden_auf_den_ergebnis_layer_angewendet
Prüft, dass grenzpunkte_gemarkungsweise() nach dem Laden apply_style() mit dem neuen ALKIS-Grenzpunkt-Stil auf den fertigen Join-Layer anwendet (#53).grün

Unit-Tests für `sn_verfahrensgebiet.functions.knickpunkt_pruefung`.

TestExtrahiereKnickpunkte 4TestKnickpunktPruefungInputvalidierung 3TestKnickpunktPruefungKlassifizierung 2TestFehlendKnickpunkteViaVerbindungslinien 4
flowchart TD
  root(["test_knickpunkt_pruefung.py"])
  class root rootnode
  root --> g1["TestExtrahiereKnickpunkte (4)"]
  class g1 groupnode
  g1 --> t1("leerer_layer_gibt_leere_liste")
  g1 --> t2("keine_gueltige_geometrie_gibt_leere_liste")
  g1 --> t3("feature_mit_leerer_geometrie_gibt_leere_liste")
  g1 --> t4("qgis_nicht_verfuegbar_gibt_leere_liste")
  root --> g2["TestKnickpunktPruefungInputvalidierung (3)"]
  class g2 groupnode
  g2 --> t5("keine_knickpunkte_gibt_none_zurueck")
  g2 --> t6("kein_punktort_layer_gibt_none_zurueck")
  g2 --> t7("abbruch_via_progress_gibt_none_zurueck")
  root --> g3["TestKnickpunktPruefungKlassifizierung (2)"]
  class g3 groupnode
  g3 --> t8("identischer_punkt_wird_gruen_gezaehlt")
  g3 --> t9("kein_pta_an_knickpunkt_wird_rot_gezaehlt")
  root --> g4["TestFehlendKnickpunkteViaVerbindungslinien (4)"]
  class g4 groupnode
  g4 --> t10("leere_union_gibt_null_zurueck")
  g4 --> t11("weniger_als_zwei_pta_auf_ring_kein_orange")
  g4 --> t12("ungematchter_pta_im_puffer_wird_orange")
  g4 --> t13("ungematchter_pta_ausserhalb_puffer_kein_orange")
  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
  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üftStatus
TestExtrahiereKnickpunkte
test_leerer_layer_gibt_leere_liste
— (Docstring fehlt)grün
TestExtrahiereKnickpunkte
test_keine_gueltige_geometrie_gibt_leere_liste
— (Docstring fehlt)grün
TestExtrahiereKnickpunkte
test_feature_mit_leerer_geometrie_gibt_leere_liste
— (Docstring fehlt)grün
TestExtrahiereKnickpunkte
test_qgis_nicht_verfuegbar_gibt_leere_liste
Wenn qgis.core kein QgsPointXY hat (ImportError in Funktion), leere Liste.grün
TestKnickpunktPruefungInputvalidierung
test_keine_knickpunkte_gibt_none_zurueck
— (Docstring fehlt)grün
TestKnickpunktPruefungInputvalidierung
test_kein_punktort_layer_gibt_none_zurueck
— (Docstring fehlt)grün
TestKnickpunktPruefungInputvalidierung
test_abbruch_via_progress_gibt_none_zurueck
— (Docstring fehlt)grün
TestKnickpunktPruefungKlassifizierung
test_identischer_punkt_wird_gruen_gezaehlt
PunktortTA exakt am Knickpunkt → identisch_count == 1.grün
TestKnickpunktPruefungKlassifizierung
test_kein_pta_an_knickpunkt_wird_rot_gezaehlt
Kein PunktortTA am Knickpunkt → kein_pta_count == 1.grün
TestFehlendKnickpunkteViaVerbindungslinien
test_leere_union_gibt_null_zurueck
bror_union.isEmpty() == True → (0, []).grün
TestFehlendKnickpunkteViaVerbindungslinien
test_weniger_als_zwei_pta_auf_ring_kein_orange
Nur 1 gematchter PunktortTA auf Ring → keine fehlenden Knickpunkte.grün
TestFehlendKnickpunkteViaVerbindungslinien
test_ungematchter_pta_im_puffer_wird_orange
Nicht-gematchter PunktortTA innerhalb 3-cm-Puffer → orange gezählt.grün
TestFehlendKnickpunkteViaVerbindungslinien
test_ungematchter_pta_ausserhalb_puffer_kein_orange
Nicht-gematchter PunktortTA außerhalb Puffer → nicht orange gezählt.grün

— (Docstring fehlt)

TestPluginMain 4
flowchart TD
  root(["test_main.py"])
  class root rootnode
  root --> g1["TestPluginMain (4)"]
  class g1 groupnode
  g1 --> t1("init_sets_services_and_names")
  g1 --> t2("initGui_registers_action_when_basis_ui_exists")
  g1 --> t3("run_creates_dock_and_marks_toolbar_active")
  g1 --> t4("unload_removes_dock_and_action")
  class t1 ok
  class t2 ok
  class t3 ok
  class t4 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üftStatus
TestPluginMain
test_init_sets_services_and_names
— (Docstring fehlt)grün
TestPluginMain
test_initGui_registers_action_when_basis_ui_exists
— (Docstring fehlt)grün
TestPluginMain
test_run_creates_dock_and_marks_toolbar_active
— (Docstring fehlt)grün
TestPluginMain
test_unload_removes_dock_and_action
— (Docstring fehlt)grün

— (Docstring fehlt)

TestVerfahrensgebietAlkis 8
flowchart TD
  root(["test_verfahrensgebiet_alkis.py"])
  class root rootnode
  root --> g1["TestVerfahrensgebietAlkis (8)"]
  class g1 groupnode
  g1 --> t1("check_existing_layer_first_load")
  g1 --> t2("check_existing_layer_keep_existing")
  g1 --> t3("verfahrensgebiet_alkis_fails_when_verfahrensnummer_missing")
  g1 --> t4("verfahrensgebiet_alkis_fails_on_invalid_wfs_layer")
  g1 --> t5("verfahrensgebiet_alkis_success_single_kombination")
  g1 --> t6("verfahrensgebiet_alkis_multi_kombination_dialog_auswahl")
  g1 --> t7("verfahrensgebiet_alkis_multi_kombination_dialog_abbruch")
  g1 --> t8("verfahrensgebiet_alkis_multi_kombination_mehrfachauswahl")
  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üftStatus
TestVerfahrensgebietAlkis
test_check_existing_layer_first_load
— (Docstring fehlt)grün
TestVerfahrensgebietAlkis
test_check_existing_layer_keep_existing
— (Docstring fehlt)grün
TestVerfahrensgebietAlkis
test_verfahrensgebiet_alkis_fails_when_verfahrensnummer_missing
— (Docstring fehlt)grün
TestVerfahrensgebietAlkis
test_verfahrensgebiet_alkis_fails_on_invalid_wfs_layer
— (Docstring fehlt)grün
TestVerfahrensgebietAlkis
test_verfahrensgebiet_alkis_success_single_kombination
Einzelne (adv_name, bezeichnung)-Kombination → kein Dialog, Memory-Layer zurück.grün
TestVerfahrensgebietAlkis
test_verfahrensgebiet_alkis_multi_kombination_dialog_auswahl
Zwei verschiedene Kombinationen → Dialog wird gezeigt, gewählte Features genutzt.grün
TestVerfahrensgebietAlkis
test_verfahrensgebiet_alkis_multi_kombination_dialog_abbruch
Zwei verschiedene Kombinationen → Nutzer bricht Dialog ab → NONE.grün
TestVerfahrensgebietAlkis
test_verfahrensgebiet_alkis_multi_kombination_mehrfachauswahl
Zwei verschiedene Kombinationen → beide ausgewählt → beide Feature-Gruppen genutzt.grün

Unit-Tests für `sn_verfahrensgebiet.functions.verfahrensgebiet_alkis_komplett`.

TestSelectByLocation 3TestFuegeVkzFeldHinzu 3TestFlaechenvergleich 8TestVerfahrensgebietAlkisKomplett 16
flowchart TD
  root(["test_verfahrensgebiet_alkis_komplett.py"])
  class root rootnode
  root --> g1["TestSelectByLocation (3)"]
  class g1 groupnode
  g1 --> t1("processing_not_available_returns_zero")
  g1 --> t2("processing_success_returns_count")
  g1 --> t3("processing_exception_returns_zero")
  root --> g2["TestFuegeVkzFeldHinzu (3)"]
  class g2 groupnode
  g2 --> t4("empty_vkz_does_nothing")
  g2 --> t5("none_vkz_does_nothing")
  g2 --> t6("vkz_field_added")
  root --> g3["TestFlaechenvergleich (8)"]
  class g3 groupnode
  g3 --> t7("gleiche_flaeche_stimmt_ueberein")
  g3 --> t8("verschiedene_flaeche_stimmt_nicht_ueberein")
  g3 --> t9("differenz_innerhalb_toleranz")
  g3 --> t10("differenz_ausserhalb_toleranz")
  g3 --> t11("flaechen_werte_korrekt")
  g3 --> t12("lese_toleranz_default_ist_null")
  g3 --> t13("lese_toleranz_parst_string")
  g3 --> t14("lese_toleranz_ungueltig_fallback_null")
  root --> g4["TestVerfahrensgebietAlkisKomplett (16)"]
  class g4 groupnode
  g4 --> t15("vg_alkis_none_aborts")
  g4 --> t16("flst_none_aborts")
  g4 --> t17("no_selection_returns_none_enriched")
  g4 --> t18("invalid_enriched_layer_returns_none")
  g4 --> t19("progress_cancel_after_step1_returns_none")
  g4 --> t20("success_flaechen_match_zeigt_info")
  g4 --> t21("no_vkz_variable_passes_empty_string")
  g4 --> t22("flaechen_abweichung_abbrechen_kein_detailcheck")
  g4 --> t23("flaechen_abweichung_als_vg_laden")
  g4 --> t24("flaechen_abweichung_detailpruefung_startet_knickpruefung")
  g4 --> t25("bror_layer_bleibt_bei_erfolg_im_projekt")
  g4 --> t26("bror_layer_wird_bei_fehler_entfernt")
  g4 --> t27("kein_vkz_kein_landkreis_dialog_abgebrochen")
  g4 --> t28("kein_vkz_kein_landkreis_dialog_liefert_landkreis")
  g4 --> t29("landkreis_modus_wird_bei_fehlender_vkz_verwendet")
  g4 --> t30("landkreis_modus_nur_laden_ueberspringt_dialog2")
  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
  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üftStatus
TestSelectByLocation
test_processing_not_available_returns_zero
— (Docstring fehlt)grün
TestSelectByLocation
test_processing_success_returns_count
— (Docstring fehlt)grün
TestSelectByLocation
test_processing_exception_returns_zero
— (Docstring fehlt)grün
TestFuegeVkzFeldHinzu
test_empty_vkz_does_nothing
— (Docstring fehlt)grün
TestFuegeVkzFeldHinzu
test_none_vkz_does_nothing
— (Docstring fehlt)grün
TestFuegeVkzFeldHinzu
test_vkz_field_added
— (Docstring fehlt)grün
TestFlaechenvergleich
test_gleiche_flaeche_stimmt_ueberein
— (Docstring fehlt)grün
TestFlaechenvergleich
test_verschiedene_flaeche_stimmt_nicht_ueberein
— (Docstring fehlt)grün
TestFlaechenvergleich
test_differenz_innerhalb_toleranz
— (Docstring fehlt)grün
TestFlaechenvergleich
test_differenz_ausserhalb_toleranz
— (Docstring fehlt)grün
TestFlaechenvergleich
test_flaechen_werte_korrekt
— (Docstring fehlt)grün
TestFlaechenvergleich
test_lese_toleranz_default_ist_null
— (Docstring fehlt)grün
TestFlaechenvergleich
test_lese_toleranz_parst_string
— (Docstring fehlt)grün
TestFlaechenvergleich
test_lese_toleranz_ungueltig_fallback_null
— (Docstring fehlt)grün
TestVerfahrensgebietAlkisKomplett
test_vg_alkis_none_aborts
— (Docstring fehlt)grün
TestVerfahrensgebietAlkisKomplett
test_flst_none_aborts
— (Docstring fehlt)grün
TestVerfahrensgebietAlkisKomplett
test_no_selection_returns_none_enriched
— (Docstring fehlt)grün
TestVerfahrensgebietAlkisKomplett
test_invalid_enriched_layer_returns_none
— (Docstring fehlt)grün
TestVerfahrensgebietAlkisKomplett
test_progress_cancel_after_step1_returns_none
Abbruch nach Schritt 1 → sofortiger sauberer Rückgabestatus.grün
TestVerfahrensgebietAlkisKomplett
test_success_flaechen_match_zeigt_info
Flächenübereinstimmung → show_info_dialog mit erwartetem Text.grün
TestVerfahrensgebietAlkisKomplett
test_no_vkz_variable_passes_empty_string
— (Docstring fehlt)grün
TestVerfahrensgebietAlkisKomplett
test_flaechen_abweichung_abbrechen_kein_detailcheck
Abweichung + Abbrechen → knickpunkt_pruefung wird NICHT aufgerufen.grün
TestVerfahrensgebietAlkisKomplett
test_flaechen_abweichung_als_vg_laden
Abweichung + Als VG laden → BROR-Layer wird umbenannt und alsgrün
TestVerfahrensgebietAlkisKomplett
test_flaechen_abweichung_detailpruefung_startet_knickpruefung
Abweichung + Detailprüfung → lade_punktort_ta + knickpunkt_pruefunggrün
TestVerfahrensgebietAlkisKomplett
test_bror_layer_bleibt_bei_erfolg_im_projekt
Bei Erfolg darf der BROR-Layer NICHT entfernt werden.grün
TestVerfahrensgebietAlkisKomplett
test_bror_layer_wird_bei_fehler_entfernt
Bei Fehler (flst_alkis NONE) wird der BROR-Layer aus dem Projekt entfernt.grün
TestVerfahrensgebietAlkisKomplett
test_kein_vkz_kein_landkreis_dialog_abgebrochen
Weder Verfahrensnummer noch Landkreis gesetzt, Nutzer bricht dengrün
TestVerfahrensgebietAlkisKomplett
test_kein_vkz_kein_landkreis_dialog_liefert_landkreis
Weder Verfahrensnummer noch Landkreis gesetzt, Nutzer wählt einengrün
TestVerfahrensgebietAlkisKomplett
test_landkreis_modus_wird_bei_fehlender_vkz_verwendet
Keine Verfahrensnummer, aber Landkreis gesetzt → Landkreis-Suchpfadgrün
TestVerfahrensgebietAlkisKomplett
test_landkreis_modus_nur_laden_ueberspringt_dialog2
nur_laden=True → Funktion kehrt sofort zurück, Dialog 2 (Gemarkunggrün

Tests für die gemeinsame Auswahltabelle in verfahrensgebiet_dialoge (#56).

TestAuswahltabelle 2
flowchart TD
  root(["test_verfahrensgebiet_dialoge.py"])
  class root rootnode
  root --> g1["TestAuswahltabelle (2)"]
  class g1 groupnode
  g1 --> t1("suchfilter_ueber_alle_spalten")
  g1 --> t2("auswahl_nach_umsortieren")
  class t1 ok
  class t2 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üftStatus
TestAuswahltabelle
test_suchfilter_ueber_alle_spalten
Prüft, dass der Suchfilter Teilstrings in jeder Spalte ohne Groß-/Kleinschreibung findet und leer alles zeigt.grün
TestAuswahltabelle
test_auswahl_nach_umsortieren
Prüft, dass die Auswahl über den gespeicherten Index auf die ursprünglichen Zeilen zurückgeführt wird, auch wenn die Tabelle umsortiert ist.grün

Unit-Tests für das Verfahrensgebiet-Edit-Service-Modul.

TestPruefeFlurstueckLayer 3TestPruefeAuswahl 3TestGetKennzeichenMenge 3TestErstelle 3TestErgaenzeVerfahrensgebiet 3TestEntferneAusVerfahrensgebiet 5TestErsetze 1
flowchart TD
  root(["test_verfahrensgebiet_edit_service.py"])
  class root rootnode
  root --> g1["TestPruefeFlurstueckLayer (3)"]
  class g1 groupnode
  g1 --> t1("layer_ok_passes")
  g1 --> t2("layer_missing_field_fails")
  g1 --> t3("layer_wrong_geometry_fails")
  root --> g2["TestPruefeAuswahl (3)"]
  class g2 groupnode
  g2 --> t4("no_selection_fails")
  g2 --> t5("with_selection_passes")
  g2 --> t6("selectedFeatureCount_exception_treated_as_zero")
  root --> g3["TestGetKennzeichenMenge (3)"]
  class g3 groupnode
  g3 --> t7("returns_set_of_ids")
  g3 --> t8("empty_layer_returns_empty_set")
  g3 --> t9("single_kennzeichen_without_comma")
  root --> g4["TestErstelle (3)"]
  class g4 groupnode
  g4 --> t10("success_counts")
  g4 --> t11("partial_failure_on_empty_geometry")
  g4 --> t12("all_fail_on_empty_geometries")
  root --> g5["TestErgaenzeVerfahrensgebiet (3)"]
  class g5 groupnode
  g5 --> t13("adds_only_new_ids")
  g5 --> t14("skip_empty_geometry_counts_as_failed")
  g5 --> t15("all_already_present")
  root --> g6["TestEntferneAusVerfahrensgebiet (5)"]
  class g6 groupnode
  g6 --> t16("removes_present_ids")
  g6 --> t17("counts_ids_not_in_layer")
  g6 --> t18("none_present_in_layer")
  g6 --> t19("empty_selection_removes_nothing")
  g6 --> t20("removes_last_id_deletes_feature")
  root --> g7["TestErsetze (1)"]
  class g7 groupnode
  g7 --> t21("ersetze_delegates_to_erstelle")
  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
  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üftStatus
TestPruefeFlurstueckLayer
test_layer_ok_passes
Gültiger Polygon-Vektor-Layer mit Pflichtfeldern → ok=True.grün
TestPruefeFlurstueckLayer
test_layer_missing_field_fails
Layer ohne Pflichtfelder → ok=False, aktion=felder_fehlen.grün
TestPruefeFlurstueckLayer
test_layer_wrong_geometry_fails
Layer mit falschem Geometrietyp → ok=False, aktion=falscher_geotyp.grün
TestPruefeAuswahl
test_no_selection_fails
— (Docstring fehlt)grün
TestPruefeAuswahl
test_with_selection_passes
— (Docstring fehlt)grün
TestPruefeAuswahl
test_selectedFeatureCount_exception_treated_as_zero
— (Docstring fehlt)grün
TestGetKennzeichenMenge
test_returns_set_of_ids
Kommagetrennte Kennzeichen im Single-Feature werden korrekt geparst.grün
TestGetKennzeichenMenge
test_empty_layer_returns_empty_set
— (Docstring fehlt)grün
TestGetKennzeichenMenge
test_single_kennzeichen_without_comma
Einzelnes Kennzeichen ohne Komma wird korrekt erkannt.grün
TestErstelle
test_success_counts
3 gültige Features → erfolgreich=3, fehlgeschlagen=0, 1 Union-Feature im Layer.grün
TestErstelle
test_partial_failure_on_empty_geometry
2 ok + 1 leere Geometrie → erfolgreich=2, fehlgeschlagen=1.grün
TestErstelle
test_all_fail_on_empty_geometries
Alle Features haben leere Geometrie → erfolgreich=0, kein Feature im Layer.grün
TestErgaenzeVerfahrensgebiet
test_adds_only_new_ids
Auswahl enthält 1 neue + 1 bereits vorhandene ID → hinzugefügt=1.grün
TestErgaenzeVerfahrensgebiet
test_skip_empty_geometry_counts_as_failed
Neue ID mit leerer Geometrie → fehlgeschlagen=1, hinzugefügt=0.grün
TestErgaenzeVerfahrensgebiet
test_all_already_present
Alle ausgewählten IDs bereits vorhanden → bereits_vorhanden=n, hinzugefügt=0.grün
TestEntferneAusVerfahrensgebiet
test_removes_present_ids
Auswahl enthält 1 vorhandene ID → entfernt=1, nicht_enthalten=0.grün
TestEntferneAusVerfahrensgebiet
test_counts_ids_not_in_layer
Auswahl enthält ID, die nicht im Verfahrensgebiet ist → nicht_enthalten=1.grün
TestEntferneAusVerfahrensgebiet
test_none_present_in_layer
Auswahl hat IDs, die alle nicht im Layer sind → entfernt=0, nicht_enthalten=n.grün
TestEntferneAusVerfahrensgebiet
test_empty_selection_removes_nothing
Leere Auswahl → nichts entfernt, nichts nicht_enthalten.grün
TestEntferneAusVerfahrensgebiet
test_removes_last_id_deletes_feature
Wird das letzte Kennzeichen entfernt, wird das Feature gelöscht.grün
TestErsetze
test_ersetze_delegates_to_erstelle
ersetze_verfahrensgebiet gibt dasselbe Ergebnis wie erstelle zurück.grün

Unit-Tests für `sn_verfahrensgebiet.functions.verfahrensgebiet_shape_komplett`.

TestFindShp 4TestErstelleMemoryLayerAusShp 3TestLadeVgAusZip 6TestVerfahrensgebietShapeKomplett 18
flowchart TD
  root(["test_verfahrensgebiet_shape_komplett.py"])
  class root rootnode
  root --> g1["TestFindShp (4)"]
  class g1 groupnode
  g1 --> t1("findet_shp_in_root")
  g1 --> t2("findet_shp_in_unterordner")
  g1 --> t3("kein_shp_gibt_none_zurueck")
  g1 --> t4("case_insensitive_erkennung")
  root --> g2["TestErstelleMemoryLayerAusShp (3)"]
  class g2 groupnode
  g2 --> t5("leere_geometrien_geben_none")
  g2 --> t6("keine_features_gibt_none")
  g2 --> t7("attribute_von_erstem_feature_werden_gesetzt")
  root --> g3["TestLadeVgAusZip (6)"]
  class g3 groupnode
  g3 --> t8("dialog_abgebrochen_gibt_none_zurueck")
  g3 --> t9("zip_fehler_gibt_none_und_warning")
  g3 --> t10("kein_shp_in_zip_gibt_none_und_warning")
  g3 --> t11("invalider_qgslayer_gibt_none_und_warning")
  g3 --> t12("leere_geometrien_geben_none_und_warning")
  g3 --> t13("erfolg_gibt_memory_layer_zurueck")
  root --> g4["TestVerfahrensgebietShapeKomplett (18)"]
  class g4 groupnode
  g4 --> t14("lade_zip_none_aborts")
  g4 --> t15("shape_vg_sofort_ins_projekt_nach_laden")
  g4 --> t16("shape_vg_wird_bei_abbruch_aus_projekt_entfernt")
  g4 --> t17("shape_vg_bleibt_im_projekt_bei_erfolg")
  g4 --> t18("flst_none_aborts")
  g4 --> t19("keine_flurstuecke_selektiert_gibt_warning")
  g4 --> t20("flaechen_uebereinstimmung_gibt_info_und_kein_dialog")
  g4 --> t21("abweichung_abbrechen_gibt_shape_vg_zurueck")
  g4 --> t22("abweichung_detailpruefung_ruft_knickpunkt_pruefung_auf")
  g4 --> t23("punktort_ta_none_gibt_shape_vg_zurueck_und_zeigt_fehler")
  g4 --> t24("temp_layer_wird_stets_entfernt")
  g4 --> t25("bror_layer_ist_stets_none")
  g4 --> t26("bror_geladen_und_zurueckgegeben_wenn_vkz_gesetzt")
  g4 --> t27("bror_wird_vor_shape_vg_ins_projekt_eingefuegt")
  g4 --> t28("bror_wird_bei_abbruch_aus_projekt_entfernt")
  g4 --> t29("verfahrensgebiet_alkis_nicht_aufgerufen_wenn_vkz_leer")
  g4 --> t30("bror_als_erstes_argument_beim_flaechenvergleich")
  g4 --> t31("fallback_auf_temp_enriched_wenn_bror_ladeversagen")
  class t1 ok
  class t2 ok
  class t3 ok
  class t4 ok
  class t5 ok
  class t6 ok
  class t7 ok
  class t8 warn
  class t9 warn
  class t10 warn
  class t11 warn
  class t12 warn
  class t13 warn
  class t14 ok
  class t15 warn
  class t16 warn
  class t17 ok
  class t18 ok
  class t19 ok
  class t20 warn
  class t21 warn
  class t22 warn
  class t23 warn
  class t24 ok
  class t25 ok
  class t26 warn
  class t27 warn
  class t28 warn
  class t29 ok
  class t30 warn
  class t31 warn
  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üftStatus
TestFindShp
test_findet_shp_in_root
— (Docstring fehlt)grün
TestFindShp
test_findet_shp_in_unterordner
— (Docstring fehlt)grün
TestFindShp
test_kein_shp_gibt_none_zurueck
— (Docstring fehlt)grün
TestFindShp
test_case_insensitive_erkennung
— (Docstring fehlt)grün
TestErstelleMemoryLayerAusShp
test_leere_geometrien_geben_none
— (Docstring fehlt)grün
TestErstelleMemoryLayerAusShp
test_keine_features_gibt_none
— (Docstring fehlt)grün
TestErstelleMemoryLayerAusShp
test_attribute_von_erstem_feature_werden_gesetzt
Attributwerte des ersten Features werden auf das Union-Feature übertragen.grün
TestLadeVgAusZip
test_dialog_abgebrochen_gibt_none_zurueck
— (Docstring fehlt)rot
TestLadeVgAusZip
test_zip_fehler_gibt_none_und_warning
— (Docstring fehlt)rot
TestLadeVgAusZip
test_kein_shp_in_zip_gibt_none_und_warning
— (Docstring fehlt)rot
TestLadeVgAusZip
test_invalider_qgslayer_gibt_none_und_warning
— (Docstring fehlt)rot
TestLadeVgAusZip
test_leere_geometrien_geben_none_und_warning
— (Docstring fehlt)rot
TestLadeVgAusZip
test_erfolg_gibt_memory_layer_zurueck
— (Docstring fehlt)rot
TestVerfahrensgebietShapeKomplett
test_lade_zip_none_aborts
— (Docstring fehlt)grün
TestVerfahrensgebietShapeKomplett
test_shape_vg_sofort_ins_projekt_nach_laden
Shape-VG wird unmittelbar nach dem Laden ins Projekt eingefügt.rot
TestVerfahrensgebietShapeKomplett
test_shape_vg_wird_bei_abbruch_aus_projekt_entfernt
Shape-VG wird bei Fehler/Abbruch aus dem Projekt entfernt.rot
TestVerfahrensgebietShapeKomplett
test_shape_vg_bleibt_im_projekt_bei_erfolg
Bei erfolgreichem Abschluss wird shape_vg NICHT aus dem Projekt entfernt.grün
TestVerfahrensgebietShapeKomplett
test_flst_none_aborts
— (Docstring fehlt)grün
TestVerfahrensgebietShapeKomplett
test_keine_flurstuecke_selektiert_gibt_warning
— (Docstring fehlt)grün
TestVerfahrensgebietShapeKomplett
test_flaechen_uebereinstimmung_gibt_info_und_kein_dialog
— (Docstring fehlt)rot
TestVerfahrensgebietShapeKomplett
test_abweichung_abbrechen_gibt_shape_vg_zurueck
— (Docstring fehlt)rot
TestVerfahrensgebietShapeKomplett
test_abweichung_detailpruefung_ruft_knickpunkt_pruefung_auf
— (Docstring fehlt)rot
TestVerfahrensgebietShapeKomplett
test_punktort_ta_none_gibt_shape_vg_zurueck_und_zeigt_fehler
— (Docstring fehlt)rot
TestVerfahrensgebietShapeKomplett
test_temp_layer_wird_stets_entfernt
— (Docstring fehlt)grün
TestVerfahrensgebietShapeKomplett
test_bror_layer_ist_stets_none
Dritter Rückgabewert ist im Shape-Workflow immer None (kein BROR).grün
TestVerfahrensgebietShapeKomplett
test_bror_geladen_und_zurueckgegeben_wenn_vkz_gesetzt
VKZ gesetzt → verfahrensgebiet_alkis aufgerufen, bror_layer zurückgegeben.rot
TestVerfahrensgebietShapeKomplett
test_bror_wird_vor_shape_vg_ins_projekt_eingefuegt
BROR wird VOR shape_vg ins Projekt eingefügt (kein Namenskonflikt).rot
TestVerfahrensgebietShapeKomplett
test_bror_wird_bei_abbruch_aus_projekt_entfernt
BROR und shape_vg werden bei Fehler aus dem Projekt entfernt.rot
TestVerfahrensgebietShapeKomplett
test_verfahrensgebiet_alkis_nicht_aufgerufen_wenn_vkz_leer
Leere VKZ → verfahrensgebiet_alkis wird NICHT aufgerufen.grün
TestVerfahrensgebietShapeKomplett
test_bror_als_erstes_argument_beim_flaechenvergleich
Mit BROR: _vergleiche_flaechen wird (bror, shape_vg, ...) aufgerufen.rot
TestVerfahrensgebietShapeKomplett
test_fallback_auf_temp_enriched_wenn_bror_ladeversagen
BROR-Ladeversagen → Fallback: _vergleiche_flaechen mit shape_vg vs temp_enriched.rot

— (Docstring fehlt)

TestWorkingTab 24TestHandleVerfShape 9TestZoomImProjektKbs 2
flowchart TD
  root(["test_working_tab.py"])
  class root rootnode
  root --> g1["TestWorkingTab (24)"]
  class g1 groupnode
  g1 --> t1("set_busy_updates_button_state")
  g1 --> t2("on_verf_layer_changed_valid_sets_variable")
  g1 --> t3("on_verf_layer_changed_none_clears_variable")
  g1 --> t4("handle_verf_alkis_success_path")
  g1 --> t5("handle_verf_alkis_failure_clears_layer_var")
  g1 --> t6("handle_flurst_alkis_first_load_uebernimmt_layer")
  g1 --> t7("handle_flurst_aus_gemarkungen_ruft_flurstueck_alkis_ohne_schluessel_abfrage")
  g1 --> t8("handle_flurst_aus_gemarkungen_abbruch_zeigt_keine_zusaetzliche_meldung")
  g1 --> t9("handle_grenz_alkis_success_sets_haken")
  g1 --> t10("handle_grenz_alkis_none_result_sets_no_haken")
  g1 --> t11("handle_flurst_alkis_success_sets_haken_and_style")
  g1 --> t12("handle_flurst_alkis_existing_layer_keep_path")
  g1 --> t13("handle_flurst_alkis_invalid_input_returns_early")
  g1 --> t14("handle_verfahrensgebiet_from_selection_requires_active_layer")
  g1 --> t15("handle_verfahrensgebiet_from_selection_requires_required_fields")
  g1 --> t16("handle_verfahrensgebiet_from_selection_requires_selection")
  g1 --> t17("handle_verfahrensgebiet_from_selection_new_layer_success")
  g1 --> t18("handle_verfahrensgebiet_from_selection_existing_layer_ergaenzen_dispatch")
  g1 --> t19("handle_verfahrensgebiet_from_selection_existing_layer_entfernen_dispatch")
  g1 --> t20("handle_verfahrensgebiet_from_selection_existing_layer_ersetzen_dispatch")
  g1 --> t21("aus_liste_button_shows_not_implemented_hint")
  g1 --> t22("handle_gem_alkis_service_reachable_adds_layer")
  g1 --> t23("handle_gem_alkis_service_unreachable_shows_warning")
  g1 --> t24("handle_gem_alkis_layer_already_exists_shows_info")
  root --> g2["TestHandleVerfShape (9)"]
  class g2 groupnode
  g2 --> t25("status_none_clears_layer_variable")
  g2 --> t26("button_always_re_enabled_on_failure")
  g2 --> t27("verfahrensnummer_nicht_gesetzt_nein_bricht_ab")
  g2 --> t28("verfahrensnummer_nicht_gesetzt_ja_fuehrt_fort")
  g2 --> t29("verfahrensnummer_gesetzt_kein_rueckfrage_dialog")
  g2 --> t30("success_path_applies_style_and_sets_haken")
  g2 --> t31("bror_layer_erhaelt_qml_stil")
  g2 --> t32("enriched_layer_already_in_project_not_added_again")
  g2 --> t33("busy_state_set_during_execution")
  root --> g3["TestZoomImProjektKbs (2)"]
  class g3 groupnode
  g3 --> t34("alkis_zoom_ueber_zoom_auf_layer")
  g3 --> t35("shape_zoom_ueber_zoom_auf_layer")
  class t1 ok
  class t2 ok
  class t3 ok
  class t4 warn
  class t5 ok
  class t6 ok
  class t7 ok
  class t8 ok
  class t9 warn
  class t10 warn
  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 warn
  class t28 warn
  class t29 ok
  class t30 ok
  class t31 ok
  class t32 ok
  class t33 ok
  class t34 ok
  class t35 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üftStatus
TestWorkingTab
test_set_busy_updates_button_state
— (Docstring fehlt)grün
TestWorkingTab
test_on_verf_layer_changed_valid_sets_variable
— (Docstring fehlt)grün
TestWorkingTab
test_on_verf_layer_changed_none_clears_variable
— (Docstring fehlt)grün
TestWorkingTab
test_handle_verf_alkis_success_path
verfahrensgebiet_alkis_komplett → 4-Tupel (enriched, flst, bror, FIRST).rot
TestWorkingTab
test_handle_verf_alkis_failure_clears_layer_var
Status NONE → Layer-Variable wird auf '' gesetzt.grün
TestWorkingTab
test_handle_flurst_alkis_first_load_uebernimmt_layer
Erstmaliges Laden über 'Flurstücke laden' fügt den Layer dem Projekt hinzu.grün
TestWorkingTab
test_handle_flurst_aus_gemarkungen_ruft_flurstueck_alkis_ohne_schluessel_abfrage
Der Gemarkungen-Auswahl-Button ruft dieselbe Ladefunktion mit ohne_schluessel_abfrage=True auf (#47).grün
TestWorkingTab
test_handle_flurst_aus_gemarkungen_abbruch_zeigt_keine_zusaetzliche_meldung
Bricht flurstueck_alkis() ab (None, NONE), zeigt der Button keine eigene Meldung – flurstueck_alkis() hat das schon getan (#47).grün
TestWorkingTab
test_handle_grenz_alkis_success_sets_haken
Grenzpunkte erfolgreich geladen → haken_grenz wird gesetzt.rot
TestWorkingTab
test_handle_grenz_alkis_none_result_sets_no_haken
grenzpunkt_alkis liefert (None, None) → kein Haken.rot
TestWorkingTab
test_handle_flurst_alkis_success_sets_haken_and_style
— (Docstring fehlt)grün
TestWorkingTab
test_handle_flurst_alkis_existing_layer_keep_path
— (Docstring fehlt)grün
TestWorkingTab
test_handle_flurst_alkis_invalid_input_returns_early
Status NONE (z. B. Nutzerabbruch) → kein Layer, kein Haken.grün
TestWorkingTab
test_handle_verfahrensgebiet_from_selection_requires_active_layer
Kein aktiver Layer → warning, kein Layer wird erstellt.grün
TestWorkingTab
test_handle_verfahrensgebiet_from_selection_requires_required_fields
Layer ohne Pflichtfelder → warning, kein Layer wird erstellt.grün
TestWorkingTab
test_handle_verfahrensgebiet_from_selection_requires_selection
Keine Flurstück-Auswahl → warning, kein Layer erstellt.grün
TestWorkingTab
test_handle_verfahrensgebiet_from_selection_new_layer_success
Erstlauf ohne bestehenden Layer → Layer wird erstellt und hinzugefügt.grün
TestWorkingTab
test_handle_verfahrensgebiet_from_selection_existing_layer_ergaenzen_dispatch
Entscheidung 'ergaenzen' → ergaenze_verfahrensgebiet wird aufgerufen.grün
TestWorkingTab
test_handle_verfahrensgebiet_from_selection_existing_layer_entfernen_dispatch
Entscheidung 'entfernen' → entferne_aus_verfahrensgebiet wird aufgerufen.grün
TestWorkingTab
test_handle_verfahrensgebiet_from_selection_existing_layer_ersetzen_dispatch
Entscheidung 'ersetzen' → alter Layer entfernt, neuer hinzugefügt.grün
TestWorkingTab
test_aus_liste_button_shows_not_implemented_hint
— (Docstring fehlt)grün
TestWorkingTab
test_handle_gem_alkis_service_reachable_adds_layer
Dienst erreichbar → Layer ins Projekt, Stil angewendet, Haken gesetzt.grün
TestWorkingTab
test_handle_gem_alkis_service_unreachable_shows_warning
Dienst nicht erreichbar (None) → warning, kein addMapLayer.grün
TestWorkingTab
test_handle_gem_alkis_layer_already_exists_shows_info
Layer 'Gemarkungen' bereits vorhanden → info, kein erneutes Laden.grün
TestHandleVerfShape
test_status_none_clears_layer_variable
Status NONE → Layer-Variable wird auf '' gesetzt.grün
TestHandleVerfShape
test_button_always_re_enabled_on_failure
Button muss nach Status NONE wieder freigegeben sein (finally).grün
TestHandleVerfShape
test_verfahrensnummer_nicht_gesetzt_nein_bricht_ab
Verfahrensnummer leer + Nutzer wählt 'Nein' → Vorgang abgebrochen.rot
TestHandleVerfShape
test_verfahrensnummer_nicht_gesetzt_ja_fuehrt_fort
Verfahrensnummer leer + Nutzer wählt 'Ja' → Pipeline wird aufgerufen.rot
TestHandleVerfShape
test_verfahrensnummer_gesetzt_kein_rueckfrage_dialog
Verfahrensnummer gesetzt → kein ask_yes_no-Dialog.grün
TestHandleVerfShape
test_success_path_applies_style_and_sets_haken
Erfolg → verfahrensgebiet.qml angewendet, haken_verf gesetzt, success aufgerufen.grün
TestHandleVerfShape
test_bror_layer_erhaelt_qml_stil
Wenn bror_layer zurückgegeben → BauRaumOderBodenordnungsrecht.qml angewendet.grün
TestHandleVerfShape
test_enriched_layer_already_in_project_not_added_again
Layer bereits im Projekt → kein erneutes addMapLayer für VG-Layer.grün
TestHandleVerfShape
test_busy_state_set_during_execution
Button wird während der Ausführung auf busy gesetzt.grün
TestZoomImProjektKbs
test_alkis_zoom_ueber_zoom_auf_layer
Prüft, dass nach dem Laden aus ALKIS über zoom_auf_layer auf das Verfahrensgebiet gezoomt wird und nicht mit der unumgerechneten Layer-Ausdehnung.grün
TestZoomImProjektKbs
test_shape_zoom_ueber_zoom_auf_layer
Prüft, dass nach dem Laden aus einem Shape über zoom_auf_layer auf das Verfahrensgebiet gezoomt wird und nicht mit der unumgerechneten Layer-Ausdehnung.grün

sn_plan41

Fachplugin · Ordner Plugin_SN_Plan41 · 5 Testdateien · 44 Testfälle

— (Docstring fehlt)

TestListenauswerter 4
flowchart TD
  root(["test_listenauswerter.py"])
  class root rootnode
  root --> g1["TestListenauswerter (4)"]
  class g1 groupnode
  g1 --> t1("validate_rows_accepts_valid_row_and_normalizes_provider")
  g1 --> t2("validate_rows_rejects_missing_required_fields")
  g1 --> t3("validate_rows_sets_stildatei_none_on_style_failure")
  g1 --> t4("validate_rows_handles_non_mapping_rows_edge_case")
  class t1 ok
  class t2 ok
  class t3 ok
  class t4 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üftStatus
TestListenauswerter
test_validate_rows_accepts_valid_row_and_normalizes_provider
— (Docstring fehlt)grün
TestListenauswerter
test_validate_rows_rejects_missing_required_fields
— (Docstring fehlt)grün
TestListenauswerter
test_validate_rows_sets_stildatei_none_on_style_failure
— (Docstring fehlt)grün
TestListenauswerter
test_validate_rows_handles_non_mapping_rows_edge_case
— (Docstring fehlt)grün

— (Docstring fehlt)

TestTabALogic 9
flowchart TD
  root(["test_tab_a_logic.py"])
  class root rootnode
  root --> g1["TestTabALogic (9)"]
  class g1 groupnode
  g1 --> t1("verfahrens_db_set_and_load_roundtrip")
  g1 --> t2("verfahrens_db_clear")
  g1 --> t3("linkliste_set_and_load_existing_path")
  g1 --> t4("linkliste_load_returns_none_when_file_missing")
  g1 --> t5("resolve_linkliste_empty_uses_standard_and_persists")
  g1 --> t6("resolve_linkliste_returns_none_when_pruefmanager_rejects")
  g1 --> t7("resolve_raumfilter_without_filter_returns_none")
  g1 --> t8("resolve_raumfilter_verfahrensgebiet_uses_layer_lookup")
  g1 --> t9("extract_datenabruf_error_maps_merges_reason_maps")
  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
  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üftStatus
TestTabALogic
test_verfahrens_db_set_and_load_roundtrip
— (Docstring fehlt)grün
TestTabALogic
test_verfahrens_db_clear
— (Docstring fehlt)grün
TestTabALogic
test_linkliste_set_and_load_existing_path
— (Docstring fehlt)grün
TestTabALogic
test_linkliste_load_returns_none_when_file_missing
— (Docstring fehlt)grün
TestTabALogic
test_resolve_linkliste_empty_uses_standard_and_persists
— (Docstring fehlt)grün
TestTabALogic
test_resolve_linkliste_returns_none_when_pruefmanager_rejects
— (Docstring fehlt)grün
TestTabALogic
test_resolve_raumfilter_without_filter_returns_none
— (Docstring fehlt)grün
TestTabALogic
test_resolve_raumfilter_verfahrensgebiet_uses_layer_lookup
— (Docstring fehlt)grün
TestTabALogic
test_extract_datenabruf_error_maps_merges_reason_maps
— (Docstring fehlt)grün

— (Docstring fehlt)

TestTabAPreconditions 3
flowchart TD
  root(["test_tab_a_preconditions.py"])
  class root rootnode
  root --> g1["TestTabAPreconditions (3)"]
  class g1 groupnode
  g1 --> t1("get_verfahrensgebiet_layer_shows_hint_when_layer_id_missing")
  g1 --> t2("get_verfahrensgebiet_layer_shows_hint_when_layer_not_in_project")
  g1 --> t3("pipeline_aborts_and_shows_hint_when_verfahrensgebiet_missing")
  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üftStatus
TestTabAPreconditions
test_get_verfahrensgebiet_layer_shows_hint_when_layer_id_missing
— (Docstring fehlt)grün
TestTabAPreconditions
test_get_verfahrensgebiet_layer_shows_hint_when_layer_not_in_project
— (Docstring fehlt)grün
TestTabAPreconditions
test_pipeline_aborts_and_shows_hint_when_verfahrensgebiet_missing
— (Docstring fehlt)grün

— (Docstring fehlt)

TestTabAUI 3
flowchart TD
  root(["test_tab_a_ui.py"])
  class root rootnode
  root --> g1["TestTabAUI (3)"]
  class g1 groupnode
  g1 --> t1("tab_a_callbacks_can_be_called_without_crash")
  g1 --> t2("tab_a_raumfilter_callback_persists_value")
  g1 --> t3("set_services_initializes_logic_and_injects_data_grabber")
  class t1 ok
  class t2 ok
  class t3 warn
  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üftStatus
TestTabAUI
test_tab_a_callbacks_can_be_called_without_crash
— (Docstring fehlt)grün
TestTabAUI
test_tab_a_raumfilter_callback_persists_value
— (Docstring fehlt)grün
TestTabAUI
test_set_services_initializes_logic_and_injects_data_grabber
— (Docstring fehlt)rot

Tests für sn_plan41/modules/vln_api_logic.py

TestVlnApiLogicAvailability 2TestVlnApiLogicCredentials 4TestVlnApiLogicLogin 6TestVlnApiLogicVerfahren 2TestVlnApiLogicVkz 4TestVlnApiLogicLoadP41 3TestVlnApiLogicUpload 4
flowchart TD
  root(["test_vln_api_logic.py"])
  class root rootnode
  root --> g1["TestVlnApiLogicAvailability (2)"]
  class g1 groupnode
  g1 --> t1("is_available_reflects_import_state")
  g1 --> t2("is_available_false_when_vln_karten_missing")
  root --> g2["TestVlnApiLogicCredentials (4)"]
  class g2 groupnode
  g2 --> t3("save_api_key_calls_qsettings")
  g2 --> t4("clear_api_key_calls_remove")
  g2 --> t5("load_stored_credentials_returns_api_key_and_mail")
  g2 --> t6("load_stored_credentials_returns_none_for_empty")
  root --> g3["TestVlnApiLogicLogin (6)"]
  class g3 groupnode
  g3 --> t7("login_sets_client_and_saves_key")
  g3 --> t8("login_raises_runtime_error_without_qgis_modules")
  g3 --> t9("login_propagates_api_error")
  g3 --> t10("logout_clears_client")
  g3 --> t11("is_authenticated_false_after_logout")
  g3 --> t12("handle_session_expired_clears_key_and_client")
  root --> g4["TestVlnApiLogicVerfahren (2)"]
  class g4 groupnode
  g4 --> t13("get_verfahren_raises_when_not_authenticated")
  g4 --> t14("get_verfahren_delegates_to_client")
  root --> g5["TestVlnApiLogicVkz (4)"]
  class g5 groupnode
  g5 --> t15("load_stored_vkz_reads_from_project")
  g5 --> t16("load_stored_vkz_returns_none_for_empty")
  g5 --> t17("save_vkz_writes_to_project")
  g5 --> t18("save_vkz_does_nothing_for_none")
  root --> g6["TestVlnApiLogicLoadP41 (3)"]
  class g6 groupnode
  g6 --> t19("load_p41_raises_without_vln_karten")
  g6 --> t20("load_p41_applies_styles_to_polygon_and_line_layers")
  g6 --> t21("load_p41_no_style_for_point_layer")
  root --> g7["TestVlnApiLogicUpload (4)"]
  class g7 groupnode
  g7 --> t22("upload_returns_error_for_layer_without_api_path")
  g7 --> t23("upload_returns_error_for_none_layer")
  g7 --> t24("upload_returns_false_without_qgis_modules")
  g7 --> t25("upload_calls_save_feature_collection")
  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
  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üftStatus
TestVlnApiLogicAvailability
test_is_available_reflects_import_state
— (Docstring fehlt)grün
TestVlnApiLogicAvailability
test_is_available_false_when_vln_karten_missing
Wenn VLN_KARTEN_AVAILABLE=False, liefert is_available() False.grün
TestVlnApiLogicCredentials
test_save_api_key_calls_qsettings
— (Docstring fehlt)grün
TestVlnApiLogicCredentials
test_clear_api_key_calls_remove
— (Docstring fehlt)grün
TestVlnApiLogicCredentials
test_load_stored_credentials_returns_api_key_and_mail
— (Docstring fehlt)grün
TestVlnApiLogicCredentials
test_load_stored_credentials_returns_none_for_empty
— (Docstring fehlt)grün
TestVlnApiLogicLogin
test_login_sets_client_and_saves_key
— (Docstring fehlt)grün
TestVlnApiLogicLogin
test_login_raises_runtime_error_without_qgis_modules
— (Docstring fehlt)grün
TestVlnApiLogicLogin
test_login_propagates_api_error
— (Docstring fehlt)grün
TestVlnApiLogicLogin
test_logout_clears_client
— (Docstring fehlt)grün
TestVlnApiLogicLogin
test_is_authenticated_false_after_logout
— (Docstring fehlt)grün
TestVlnApiLogicLogin
test_handle_session_expired_clears_key_and_client
— (Docstring fehlt)grün
TestVlnApiLogicVerfahren
test_get_verfahren_raises_when_not_authenticated
— (Docstring fehlt)grün
TestVlnApiLogicVerfahren
test_get_verfahren_delegates_to_client
— (Docstring fehlt)grün
TestVlnApiLogicVkz
test_load_stored_vkz_reads_from_project
— (Docstring fehlt)grün
TestVlnApiLogicVkz
test_load_stored_vkz_returns_none_for_empty
— (Docstring fehlt)grün
TestVlnApiLogicVkz
test_save_vkz_writes_to_project
— (Docstring fehlt)grün
TestVlnApiLogicVkz
test_save_vkz_does_nothing_for_none
— (Docstring fehlt)grün
TestVlnApiLogicLoadP41
test_load_p41_raises_without_vln_karten
— (Docstring fehlt)grün
TestVlnApiLogicLoadP41
test_load_p41_applies_styles_to_polygon_and_line_layers
— (Docstring fehlt)grün
TestVlnApiLogicLoadP41
test_load_p41_no_style_for_point_layer
— (Docstring fehlt)grün
TestVlnApiLogicUpload
test_upload_returns_error_for_layer_without_api_path
— (Docstring fehlt)grün
TestVlnApiLogicUpload
test_upload_returns_error_for_none_layer
— (Docstring fehlt)grün
TestVlnApiLogicUpload
test_upload_returns_false_without_qgis_modules
— (Docstring fehlt)grün
TestVlnApiLogicUpload
test_upload_calls_save_feature_collection
— (Docstring fehlt)grün