Files
Projektwissen/docs/tests/testkatalog.html
T
DanielandClaude Opus 5.5 abac5a015c Anzeigefenster ohne Vollbild: Testkonzept und Fallstrick (Verfahrensgebiet #56)
Befund aus dem QGIS-Test (Fenster immer auf dem Hauptbildschirm, im
Vollbild nicht zu verlassen) in fallstricke.md festgehalten; Testkonzept,
Modulkarte und Testkatalog an das Fenster mit Rahmen und die
Pfadanzeige der Korrektur-Datei angepasst.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 13:44:18 +02:00

2726 lines
475 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<title>Prüfstand</title>
<meta charset="utf-8">
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ctext y='.9em' font-size='90'%3E%F0%9F%93%90%3C/text%3E%3C/svg%3E">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Archivo:wght@500;600;700;800&family=Source+Sans+3:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap">
<style>
:root{
--bg: #f3f0e6; --bg-plan: #f6f4ea; --surface: #fffdf7; --surface-2: #ece7d8;
--ink: #211f18; --ink-soft: #4a4739; --muted: #7a7460; --line: #dcd5c0; --line-strong: #c7bea3;
--accent: #2f5b52; --accent-strong: #1c3b34; --accent-tint: #e2ece7;
--ok: #3f7d4a; --ok-bg: #e5f1e2; --warn: #a8641f; --warn-bg: #f7ead6; --skip: #5d6072; --skip-bg: #e8e8ee;
--shadow: 0 1px 2px rgba(33,31,24,.06), 0 4px 14px rgba(33,31,24,.05); --focus: #1c3b34;
color-scheme: light dark;
}
@media (prefers-color-scheme: dark){
:root:not([data-theme="light"]){
--bg:#1a1a16; --bg-plan:#211f18; --surface:#232019; --surface-2:#2b2820; --ink:#efe9d8; --ink-soft:#cdc6b0;
--muted:#97917c; --line:#3a3628; --line-strong:#4c4732; --accent:#7fb3a2; --accent-strong:#9cc9ba;
--accent-tint:#263530; --ok:#7fb386; --ok-bg:#223226; --warn:#d6a05e; --warn-bg:#3a2d1c; --skip:#a8abbd;
--skip-bg:#2a2b35; --shadow:0 1px 2px rgba(0,0,0,.3),0 6px 18px rgba(0,0,0,.35); --focus:#cfe6dc;
}
}
:root[data-theme="dark"]{
--bg:#1a1a16; --bg-plan:#211f18; --surface:#232019; --surface-2:#2b2820; --ink:#efe9d8; --ink-soft:#cdc6b0;
--muted:#97917c; --line:#3a3628; --line-strong:#4c4732; --accent:#7fb3a2; --accent-strong:#9cc9ba;
--accent-tint:#263530; --ok:#7fb386; --ok-bg:#223226; --warn:#d6a05e; --warn-bg:#3a2d1c; --skip:#a8abbd;
--skip-bg:#2a2b35; --shadow:0 1px 2px rgba(0,0,0,.3),0 6px 18px rgba(0,0,0,.35); --focus:#cfe6dc;
}
*{ box-sizing:border-box; }
html,body{ margin:0; }
body{ background:var(--bg); color:var(--ink); font-family:"Source Sans 3",system-ui,-apple-system,sans-serif;
font-size:15px; line-height:1.5; padding-inline:20px; }
h1,h2,h3{ font-family:"Archivo",system-ui,sans-serif; text-wrap:balance; margin:0; }
.mono{ font-family:"IBM Plex Mono",ui-monospace,monospace; }
a{ color:var(--accent-strong); }
.topbar{ max-width:1180px; margin:0 auto; padding-block:28px 18px; display:flex; flex-wrap:wrap; gap:16px 28px;
align-items:flex-end; justify-content:space-between; border-bottom:2px solid var(--line-strong); }
.brand{ display:flex; align-items:baseline; gap:14px; flex-wrap:wrap; }
.brand h1{ font-size:clamp(28px,4vw,38px); font-weight:800; letter-spacing:-0.01em; color:var(--accent-strong); }
.brand .tagline{ color:var(--muted); font-size:14.5px; max-width:46ch; }
.meta-line{ color:var(--muted); font-size:12.5px; text-align:right; }
.meta-line b{ color:var(--ink-soft); font-weight:600; }
.summary{ max-width:1180px; margin:22px auto 0; display:grid; gap:14px; grid-template-columns:repeat(auto-fit,minmax(150px,1fr)); }
.stat{ background:var(--surface); border:1px solid var(--line); border-radius:10px; padding:14px 16px; box-shadow:var(--shadow); }
.stat .n{ font-family:"IBM Plex Mono",monospace; font-variant-numeric:tabular-nums; font-size:26px; font-weight:600; color:var(--ink); display:block; }
.stat .l{ font-size:12px; text-transform:uppercase; letter-spacing:.06em; color:var(--muted); }
.stat.ok .n{ color:var(--ok); } .stat.warn .n{ color:var(--warn); } .stat.skip .n{ color:var(--skip); }
.pkg-bars{ max-width:1180px; margin:16px auto 0; background:var(--surface); border:1px solid var(--line);
border-radius:10px; padding:14px 18px; box-shadow:var(--shadow); display:grid; gap:10px; }
.pkg-bars-title{ font-size:12px; text-transform:uppercase; letter-spacing:.06em; color:var(--muted); margin-bottom:2px; }
.pkg-bar-row{ display:grid; grid-template-columns:170px 1fr auto; gap:12px; align-items:center; }
.pkg-bar-row .name{ font-family:"IBM Plex Mono",monospace; font-size:13px; }
.pkg-bar-row .count{ font-family:"IBM Plex Mono",monospace; font-variant-numeric:tabular-nums; font-size:12.5px; color:var(--muted); white-space:nowrap; }
.minibar{ height:9px; border-radius:6px; overflow:hidden; display:flex; background:var(--surface-2); border:1px solid var(--line); }
.minibar .seg{ height:100%; display:block; }
.controls{ max-width:1180px; margin:20px auto 0; display:flex; flex-wrap:wrap; gap:10px 14px; align-items:center;
position:sticky; top:env(safe-area-inset-top,0px); z-index:5; background:var(--bg); padding-block:10px; }
.nav-links{ display:flex; gap:6px; flex-wrap:wrap; }
.nav-links a{ font-size:13px; text-decoration:none; padding:6px 11px; border-radius:999px; border:1px solid var(--line-strong);
color:var(--ink-soft); background:var(--surface); }
.nav-links a:hover{ border-color:var(--accent); color:var(--accent-strong); }
.filters{ display:flex; gap:6px; flex-wrap:wrap; margin-left:auto; }
.chip{ font-size:12.5px; padding:6px 11px; border-radius:999px; border:1px solid var(--line-strong);
background:var(--surface); color:var(--ink-soft); cursor:pointer; font-family:inherit; }
.chip[aria-pressed="true"]{ background:var(--accent-strong); border-color:var(--accent-strong); color:var(--bg-plan); }
.searchbox{ display:flex; align-items:center; gap:6px; border:1px solid var(--line-strong); border-radius:999px;
background:var(--surface); padding:5px 12px; min-width:190px; }
.searchbox input{ border:none; background:none; outline:none; font-family:inherit; font-size:13px; color:var(--ink); width:100%; }
.searchbox input::placeholder{ color:var(--muted); }
.pkg-section{ max-width:1180px; margin:34px auto 0; scroll-margin-top:64px; }
.pkg-head{ display:flex; flex-wrap:wrap; gap:12px 24px; align-items:flex-end; justify-content:space-between; margin-bottom:16px; }
.pkg-head h2{ font-family:"IBM Plex Mono",monospace; font-size:21px; font-weight:600; color:var(--accent-strong); }
.pkg-sub{ color:var(--muted); font-size:13px; margin-top:3px; }
.pkg-bar{ width:220px; height:9px; border-radius:6px; overflow:hidden; display:flex; background:var(--surface-2); border:1px solid var(--line); }
.pkg-bar .seg{ height:100%; display:block; }
.seg-ok{ background:var(--ok); } .seg-warn{ background:var(--warn); } .seg-skip{ background:var(--skip); }
.card-grid{ display:grid; gap:12px; }
.filecard{ background:var(--surface); border:1px solid var(--line); border-radius:12px; box-shadow:var(--shadow); overflow:hidden; }
.card-toggle{ width:100%; display:flex; flex-wrap:wrap; align-items:center; gap:8px 14px; justify-content:space-between;
padding:13px 16px; background:none; border:none; cursor:pointer; text-align:left; font-family:inherit; color:var(--ink); }
.card-toggle:hover{ background:var(--accent-tint); }
.card-toggle:focus-visible{ outline:2px solid var(--focus); outline-offset:-2px; }
.card-path{ font-size:13.5px; font-weight:500; color:var(--ink); }
.card-meta{ display:flex; align-items:center; gap:8px; flex-wrap:wrap; font-size:12px; }
.count-total{ color:var(--muted); font-variant-numeric:tabular-nums; }
.cpill{ font-family:"IBM Plex Mono",monospace; font-variant-numeric:tabular-nums; font-size:11.5px; padding:2px 7px; border-radius:999px; font-weight:600; }
.cpill-ok{ background:var(--ok-bg); color:var(--ok); } .cpill-warn{ background:var(--warn-bg); color:var(--warn); } .cpill-skip{ background:var(--skip-bg); color:var(--skip); }
.docbadge{ color:var(--muted); border:1px solid var(--line-strong); border-radius:999px; padding:2px 8px; }
.chev{ color:var(--muted); transition:transform .15s ease; }
.filecard.open .chev{ transform:rotate(180deg); }
.card-body{ max-height:0; overflow:hidden; transition:max-height .22s ease; border-top:0 solid var(--line); }
.filecard.open .card-body{ border-top-width:1px; }
.card-body-inner{ padding:16px; }
.filedesc{ color:var(--ink-soft); margin:0 0 12px; max-width:70ch; }
.empty-note{ color:var(--muted); font-size:13.5px; margin:0; }
.gchips{ display:flex; flex-wrap:wrap; gap:6px; margin-bottom:14px; }
.gchip{ font-size:12px; background:var(--accent-tint); color:var(--accent-strong); border:1px solid var(--line); border-radius:7px; padding:3px 9px; }
.gchip b{ font-family:"IBM Plex Mono",monospace; font-weight:600; }
.diagram-wrap{ background:var(--bg-plan); border:1px solid var(--line-strong);
border-image: repeating-linear-gradient(45deg, var(--line-strong) 0 2px, transparent 2px 6px) 1;
border-radius:8px; padding:14px; margin-bottom:16px; overflow-x:auto; }
.diagram-wrap svg{ display:block; margin:0 auto; }
.test-table{ width:100%; border-collapse:collapse; font-size:13px; }
.test-table th{ text-align:left; font-size:11px; text-transform:uppercase; letter-spacing:.05em; color:var(--muted);
border-bottom:1px solid var(--line-strong); padding:6px 8px; }
.test-table td{ border-bottom:1px solid var(--line); padding:8px 8px; vertical-align:top; }
.test-table tr:last-child td{ border-bottom:none; }
.testname{ color:var(--muted); font-size:12px; }
.nodoc{ color:var(--muted); font-style:italic; }
.pill{ font-size:11.5px; padding:2px 8px; border-radius:999px; font-weight:600; white-space:nowrap; }
.pill-ok{ background:var(--ok-bg); color:var(--ok); } .pill-warn{ background:var(--warn-bg); color:var(--warn); } .pill-skip{ background:var(--skip-bg); color:var(--skip); }
footer{ max-width:1180px; margin:40px auto 30px; color:var(--muted); font-size:12px; border-top:1px solid var(--line); padding-top:14px; }
[hidden]{ display:none !important; }
@media (max-width:640px){ .pkg-bar{ width:130px; } .controls{ position:static; } }
</style>
<div class="topbar"><div class="brand"><h1>Prüfstand</h1>
<span class="tagline">Testkatalog der sn_*-Plugins — was die Suite heute prüft, auf einen Blick.</span></div>
<div class="meta-line">Quelle: <b>docs/tests/testkatalog.md</b><br>Baseline: <span class="mono">docs/status/testbaseline.json</span> (SHA-256 aeabc946a7f3)</div></div>
<div class="summary">
<div class="stat"><span class="n">823</span><span class="l">Testfälle</span></div>
<div class="stat ok"><span class="n">780</span><span class="l">grün</span></div>
<div class="stat warn"><span class="n">35</span><span class="l">rot (Baseline)</span></div>
<div class="stat skip"><span class="n">8</span><span class="l">übersprungen</span></div>
<div class="stat"><span class="n">82%</span><span class="l">mit Docstring</span></div>
<div class="stat"><span class="n">66</span><span class="l">Testdateien</span></div>
</div>
<div class="pkg-bars"><div class="pkg-bars-title">Verteilung je Paket</div>
<div class="pkg-bar-row"><span class="name">sn_basis</span><span class="minibar" role="img" aria-label="490 grün, 0 rot, 0 übersprungen"><span class="seg seg-ok" style="width:100%"></span><span class="seg seg-warn" style="width:0%"></span><span class="seg seg-skip" style="width:0%"></span></span><span class="count">43 Dateien · 490 Testfälle</span></div>
<div class="pkg-bar-row"><span class="name">sn_verfahrensgebiet</span><span class="minibar" role="img" aria-label="247 grün, 34 rot, 8 übersprungen"><span class="seg seg-ok" style="width:85%"></span><span class="seg seg-warn" style="width:12%"></span><span class="seg seg-skip" style="width:3%"></span></span><span class="count">18 Dateien · 289 Testfälle</span></div>
<div class="pkg-bar-row"><span class="name">sn_plan41</span><span class="minibar" role="img" aria-label="43 grün, 1 rot, 0 übersprungen"><span class="seg seg-ok" style="width:98%"></span><span class="seg seg-warn" style="width:2%"></span><span class="seg seg-skip" style="width:0%"></span></span><span class="count">5 Dateien · 44 Testfälle</span></div>
</div>
<div class="controls"><nav class="nav-links">
<a href="#pkg-sn_basis">sn_basis <span class="mono">(490)</span></a>
<a href="#pkg-sn_verfahrensgebiet">sn_verfahrensgebiet <span class="mono">(289)</span></a>
<a href="#pkg-sn_plan41">sn_plan41 <span class="mono">(44)</span></a>
</nav><div class="filters">
<button class="chip" data-filter="all" aria-pressed="true">Alle</button>
<button class="chip" data-filter="hasred" aria-pressed="false">Mit rot</button>
<button class="chip" data-filter="hasskip" aria-pressed="false">Mit übersprungen</button>
<button class="chip" data-filter="nodoc" aria-pressed="false">Schwach beschrieben (&lt;50%)</button>
</div>
<div class="searchbox"><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" aria-hidden="true"><circle cx="11" cy="11" r="7"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg><input type="search" id="searchInput" placeholder="Testfall oder Datei suchen…" aria-label="Testfall oder Datei suchen"></div></div>
<section class="pkg-section" id="pkg-sn_basis">
<div class="pkg-head">
<div>
<h2>sn_basis</h2>
<p class="pkg-sub">Plattform-Plugin · Ordner <span class="mono">Plugin_SN_Basis</span> · 43 Testdateien · 490 Testfälle</p>
</div>
<div class="pkg-bar" role="img" aria-label="490 grün, 0 rot, 0 übersprungen">
<span class="seg seg-ok" style="width:100%"></span><span class="seg seg-warn" style="width:0%"></span><span class="seg seg-skip" style="width:0%"></span>
</div>
</div>
<div class="card-grid"><article class="filecard" data-search="plugin_sn_basis/tests/test_base_dockwidget.py closeeventtests test_ruft_cleanup_aller_tabs_auf closeeventtests test_ignoriert_tabs_ohne_cleanup closeeventtests test_fehler_in_cleanup_wird_abgefangen_und_andere_tabs_laufen_weiter closeeventtests test_setzt_toolbar_action_zurueck closeeventtests test_ohne_action_wird_nichts_zurueckgesetzt scrollbereichtests test_jeder_tab_liegt_in_einem_scrollbereich scrollbereichtests test_fachplugin_mit_eigenem_tabaufbau_bekommt_scrollbereich scrollbereichtests test_scrollbereich_wird_nicht_doppelt_angelegt scrollbereichtests test_setwidget_none_und_andere_widgets_bleiben_unveraendert scrollbereichtests test_cleanup_erreicht_tabs_im_scrollbereich" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-base-dockwidget-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_base_dockwidget.py</span><span class="card-meta"><span class="count-total">10 Testfälle</span><span class="cpill cpill-ok">10</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-base-dockwidget-py"><p class="filedesc">Tests für sn_basis/ui/base_dockwidget.py: closeEvent (Issue #65) und Scroll-Bereich je Tab (Basis #104).</p><div class="gchips"><span class="gchip" title="">CloseEventTests <b>5</b></span><span class="gchip" title="Lange Tabs dürfen das QGIS-Fenster nicht über den Bildschirmrand schieben (Basis #104).">ScrollbereichTests <b>5</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_base_dockwidget.py&quot;])
class root rootnode
root --&gt; g1[&quot;CloseEventTests (5)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;ruft_cleanup_aller_tabs_auf&quot;)
g1 --&gt; t2(&quot;ignoriert_tabs_ohne_cleanup&quot;)
g1 --&gt; t3(&quot;fehler_in_cleanup_wird_abgefangen_und_andere_tabs_laufen_weiter&quot;)
g1 --&gt; t4(&quot;setzt_toolbar_action_zurueck&quot;)
g1 --&gt; t5(&quot;ohne_action_wird_nichts_zurueckgesetzt&quot;)
root --&gt; g2[&quot;ScrollbereichTests (5)&quot;]
class g2 groupnode
g2 --&gt; t6(&quot;jeder_tab_liegt_in_einem_scrollbereich&quot;)
g2 --&gt; t7(&quot;fachplugin_mit_eigenem_tabaufbau_bekommt_scrollbereich&quot;)
g2 --&gt; t8(&quot;scrollbereich_wird_nicht_doppelt_angelegt&quot;)
g2 --&gt; t9(&quot;setwidget_none_und_andere_widgets_bleiben_unveraendert&quot;)
g2 --&gt; t10(&quot;cleanup_erreicht_tabs_im_scrollbereich&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">CloseEventTests<br><span class="testname">test_ruft_cleanup_aller_tabs_auf</span></td><td>Prüft, dass closeEvent cleanup() auf allen Tabs des Dock-Widgets aufruft.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">CloseEventTests<br><span class="testname">test_ignoriert_tabs_ohne_cleanup</span></td><td>Prüft, dass ein Tab ohne cleanup()-Methode nicht zu einem Fehler führt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">CloseEventTests<br><span class="testname">test_fehler_in_cleanup_wird_abgefangen_und_andere_tabs_laufen_weiter</span></td><td>Prüft, dass ein Fehler in cleanup() eines Tabs nicht die übrigen Tabs verhindert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">CloseEventTests<br><span class="testname">test_setzt_toolbar_action_zurueck</span></td><td>Prüft, dass closeEvent die verknüpfte Toolbar-Action auf &#x27;nicht gedrückt&#x27; zurücksetzt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">CloseEventTests<br><span class="testname">test_ohne_action_wird_nichts_zurueckgesetzt</span></td><td>Prüft, dass closeEvent ohne verknüpfte Toolbar-Action keine Ausnahme wirft.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ScrollbereichTests<br><span class="testname">test_jeder_tab_liegt_in_einem_scrollbereich</span></td><td>Prüft, dass BaseDockWidget jeden Tab in einen mitwachsenden Scroll-Bereich packt, damit ein langer Tab scrollt, statt das Fenster zu verlängern.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ScrollbereichTests<br><span class="testname">test_fachplugin_mit_eigenem_tabaufbau_bekommt_scrollbereich</span></td><td>Prüft, dass auch ein Fachplugin, das seine Tabs selbst aufbaut und per setWidget einsetzt (wie Plan41, Verfahrensgebiet), Scroll-Bereiche bekommt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ScrollbereichTests<br><span class="testname">test_scrollbereich_wird_nicht_doppelt_angelegt</span></td><td>Prüft, dass ein Tab, der schon in einem Scroll-Bereich liegt, beim erneuten Einsetzen nicht ein zweites Mal verpackt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ScrollbereichTests<br><span class="testname">test_setwidget_none_und_andere_widgets_bleiben_unveraendert</span></td><td>Prüft, dass setWidget(None) und Widgets ohne Tabs ohne Fehler und unverändert eingesetzt werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ScrollbereichTests<br><span class="testname">test_cleanup_erreicht_tabs_im_scrollbereich</span></td><td>Prüft, dass closeEvent cleanup() auch für Tabs aufruft, die in einem Scroll-Bereich liegen.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_basemap_anbindung.py testmehrfachauswahl test_mock_modus_liefert_vorauswahl_in_listenreihenfolge testdruckanbindung test_basemap_legende_nur_fuer_38_und_41_und_bei_eingeschaltetem_schalter testdruckanbindung test_layout_wird_markiert_und_legende_erzeugt testdruckanbindung test_fehler_der_basemap_legende_verhindert_die_vorlage_nicht testdruckanbindung test_druck_tab_aktualisiert_basemap_bereich_falls_vorhanden testbasemapbereich test_auswertebereich_wird_gespeichert testbasemapbereich test_aktualisieren_ohne_vorlage_warnt testbasemapbereich test_aktualisieren_wertet_gewaehlte_vorlage_aus testbasemapbereich test_stil_laden_uebernimmt_legendenauswahl testbasemapbereich test_stil_laden_bricht_bei_fremder_vorlage_ab testbasemapbereich test_vorhandene_vorlage_wird_nur_nach_rueckfrage_ersetzt testbasemapbereich test_speichern_mit_aktueller_legendenauswahl testbasemapbereich test_punktlinien_korrigieren_meldet_anzahl testbasemapbereich test_punktlinien_ohne_basemap_layer_warnt testbasemapbereich test_stil_speichern_ohne_basemap_layer_warnt testbasemapbereich test_stil_laden_bricht_bei_fremdem_thema_ab teststilvorlagenaustausch test_export_schreibt_gewaehlte_vorlage teststilvorlagenaustausch test_export_abgebrochen_oder_ohne_vorlage teststilvorlagenaustausch test_import_uebernimmt_datei_unter_gewaehltem_namen teststilvorlagenaustausch test_import_ersetzt_vorhandene_nur_nach_rueckfrage teststilvorlagenaustausch test_import_ungeeigneter_datei_warnt" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-basemap-anbindung-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_basemap_anbindung.py</span><span class="card-meta"><span class="count-total">21 Testfälle</span><span class="cpill cpill-ok">21</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-basemap-anbindung-py"><p class="filedesc">Tests für die Anbindung der Basemap-Legende an Druckablauf, Dialog und Druck-Tab (Basis #88):</p><div class="gchips"><span class="gchip" title="">TestMehrfachauswahl <b>1</b></span><span class="gchip" title="">TestDruckanbindung <b>4</b></span><span class="gchip" title="">TestBasemapBereich <b>11</b></span><span class="gchip" title="">TestStilvorlagenAustausch <b>5</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_basemap_anbindung.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestMehrfachauswahl (1)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;mock_modus_liefert_vorauswahl_in_listenreihenfolge&quot;)
root --&gt; g2[&quot;TestDruckanbindung (4)&quot;]
class g2 groupnode
g2 --&gt; t2(&quot;basemap_legende_nur_fuer_38_und_41_und_bei_eingeschaltetem_schalter&quot;)
g2 --&gt; t3(&quot;layout_wird_markiert_und_legende_erzeugt&quot;)
g2 --&gt; t4(&quot;fehler_der_basemap_legende_verhindert_die_vorlage_nicht&quot;)
g2 --&gt; t5(&quot;druck_tab_aktualisiert_basemap_bereich_falls_vorhanden&quot;)
root --&gt; g3[&quot;TestBasemapBereich (11)&quot;]
class g3 groupnode
g3 --&gt; t6(&quot;auswertebereich_wird_gespeichert&quot;)
g3 --&gt; t7(&quot;aktualisieren_ohne_vorlage_warnt&quot;)
g3 --&gt; t8(&quot;aktualisieren_wertet_gewaehlte_vorlage_aus&quot;)
g3 --&gt; t9(&quot;stil_laden_uebernimmt_legendenauswahl&quot;)
g3 --&gt; t10(&quot;stil_laden_bricht_bei_fremder_vorlage_ab&quot;)
g3 --&gt; t11(&quot;vorhandene_vorlage_wird_nur_nach_rueckfrage_ersetzt&quot;)
g3 --&gt; t12(&quot;speichern_mit_aktueller_legendenauswahl&quot;)
g3 --&gt; t13(&quot;punktlinien_korrigieren_meldet_anzahl&quot;)
g3 --&gt; t14(&quot;punktlinien_ohne_basemap_layer_warnt&quot;)
g3 --&gt; t15(&quot;stil_speichern_ohne_basemap_layer_warnt&quot;)
g3 --&gt; t16(&quot;stil_laden_bricht_bei_fremdem_thema_ab&quot;)
root --&gt; g4[&quot;TestStilvorlagenAustausch (5)&quot;]
class g4 groupnode
g4 --&gt; t17(&quot;export_schreibt_gewaehlte_vorlage&quot;)
g4 --&gt; t18(&quot;export_abgebrochen_oder_ohne_vorlage&quot;)
g4 --&gt; t19(&quot;import_uebernimmt_datei_unter_gewaehltem_namen&quot;)
g4 --&gt; t20(&quot;import_ersetzt_vorhandene_nur_nach_rueckfrage&quot;)
g4 --&gt; t21(&quot;import_ungeeigneter_datei_warnt&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestMehrfachauswahl<br><span class="testname">test_mock_modus_liefert_vorauswahl_in_listenreihenfolge</span></td><td>Prüft, dass der Mehrfachauswahl-Dialog im Mock-Modus die vorausgewählten Schlüssel in Listenreihenfolge liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDruckanbindung<br><span class="testname">test_basemap_legende_nur_fuer_38_und_41_und_bei_eingeschaltetem_schalter</span></td><td>Prüft, dass nur §-38- und §-41-Vorlagen eine Basemap-Legende bekommen und nur, wenn der Schalter im Druck-Tab an ist.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDruckanbindung<br><span class="testname">test_layout_wird_markiert_und_legende_erzeugt</span></td><td>Prüft, dass PrintLayout das Layout als Basemap-Nutzer kennzeichnet und die Basemap-Legende erzeugen lässt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDruckanbindung<br><span class="testname">test_fehler_der_basemap_legende_verhindert_die_vorlage_nicht</span></td><td>Prüft, dass ein Fehler beim Erzeugen der Basemap-Legende nur als Warnung gemeldet wird und keine Ausnahme durchreicht.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDruckanbindung<br><span class="testname">test_druck_tab_aktualisiert_basemap_bereich_falls_vorhanden</span></td><td>Prüft, dass der Druck-Tab den Basemap-Bereich neu einliest und ohne Bereich nichts tut.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBasemapBereich<br><span class="testname">test_auswertebereich_wird_gespeichert</span></td><td>Prüft, dass die Wahl des Auswertebereichs in der Projektvariable landet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBasemapBereich<br><span class="testname">test_aktualisieren_ohne_vorlage_warnt</span></td><td>Prüft, dass „Basemap-Legende aktualisieren“ ohne vorhandene Vorlage warnt und nichts auswertet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBasemapBereich<br><span class="testname">test_aktualisieren_wertet_gewaehlte_vorlage_aus</span></td><td>Prüft, dass „Basemap-Legende aktualisieren“ die gewählte Vorlage auswertet und den Erfolg meldet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBasemapBereich<br><span class="testname">test_stil_laden_uebernimmt_legendenauswahl</span></td><td>Prüft, dass das Laden einer Stilvorlage den Layerstil ersetzt und ihre Legendenauswahl in das Projekt übernimmt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBasemapBereich<br><span class="testname">test_stil_laden_bricht_bei_fremder_vorlage_ab</span></td><td>Prüft, dass eine Vorlage mit unbekannten Styles nur nach Bestätigung geladen wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBasemapBereich<br><span class="testname">test_vorhandene_vorlage_wird_nur_nach_rueckfrage_ersetzt</span></td><td>Prüft, dass eine gleichnamige Stilvorlage ohne Bestätigung nicht überschrieben wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBasemapBereich<br><span class="testname">test_speichern_mit_aktueller_legendenauswahl</span></td><td>Prüft, dass eine neue Stilvorlage zusammen mit der aktuellen Legendenauswahl gespeichert wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBasemapBereich<br><span class="testname">test_punktlinien_korrigieren_meldet_anzahl</span></td><td>Prüft, dass „Punktlinien korrigieren“ den Basemap-Layer korrigiert und die Anzahl korrigierter Styles meldet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBasemapBereich<br><span class="testname">test_punktlinien_ohne_basemap_layer_warnt</span></td><td>Prüft, dass ohne Basemap-Layer nichts korrigiert, sondern gewarnt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBasemapBereich<br><span class="testname">test_stil_speichern_ohne_basemap_layer_warnt</span></td><td>Prüft, dass ohne Basemap-Layer keine Stilvorlage gespeichert, sondern gewarnt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBasemapBereich<br><span class="testname">test_stil_laden_bricht_bei_fremdem_thema_ab</span></td><td>Prüft, dass eine Vorlage eines anderen Themas (Grau auf Farbe) nur nach Bestätigung geladen wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestStilvorlagenAustausch<br><span class="testname">test_export_schreibt_gewaehlte_vorlage</span></td><td>Prüft, dass „Exportieren …“ die gewählte Vorlage in die im Dateidialog gewählte Datei schreibt und den Pfad meldet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestStilvorlagenAustausch<br><span class="testname">test_export_abgebrochen_oder_ohne_vorlage</span></td><td>Prüft, dass ohne gewählte Vorlage oder bei abgebrochenem Dateidialog nichts exportiert wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestStilvorlagenAustausch<br><span class="testname">test_import_uebernimmt_datei_unter_gewaehltem_namen</span></td><td>Prüft, dass „Importieren …“ den Namen aus der Datei vorschlägt, unter dem gewählten Namen importiert und die neue Vorlage auswählt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestStilvorlagenAustausch<br><span class="testname">test_import_ersetzt_vorhandene_nur_nach_rueckfrage</span></td><td>Prüft, dass ein Import eine gleichnamige Vorlage ohne Bestätigung nicht überschreibt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestStilvorlagenAustausch<br><span class="testname">test_import_ungeeigneter_datei_warnt</span></td><td>Prüft, dass eine ungeeignete Importdatei gemeldet wird, ohne nach einem Namen zu fragen oder etwas zu importieren.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_basemap_kacheln.py testsammleobjekte test_gleiche_objekte_aus_mehreren_kacheln_werden_entdoppelt testsammleobjekte test_kacheln_ausserhalb_der_geometrie_werden_uebersprungen testsammleobjekte test_abbruch_liefert_none_und_hebt_auswahl_auf testsammleobjekte test_anzahl_kacheln_aus_kachelbereich testzoomundstile test_zoomstufen_wie_im_qgis_renderer testzoomundstile test_stile_aus_layer_liest_renderer_styles" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-basemap-kacheln-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_basemap_kacheln.py</span><span class="card-meta"><span class="count-total">6 Testfälle</span><span class="cpill cpill-ok">6</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-basemap-kacheln-py"><p class="filedesc">Tests für modules/basemap_kacheln.py – kachelweise Auswertung des Basemap-Layers (Basis #88).</p><div class="gchips"><span class="gchip" title="">TestSammleObjekte <b>4</b></span><span class="gchip" title="">TestZoomUndStile <b>2</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_basemap_kacheln.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestSammleObjekte (4)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;gleiche_objekte_aus_mehreren_kacheln_werden_entdoppelt&quot;)
g1 --&gt; t2(&quot;kacheln_ausserhalb_der_geometrie_werden_uebersprungen&quot;)
g1 --&gt; t3(&quot;abbruch_liefert_none_und_hebt_auswahl_auf&quot;)
g1 --&gt; t4(&quot;anzahl_kacheln_aus_kachelbereich&quot;)
root --&gt; g2[&quot;TestZoomUndStile (2)&quot;]
class g2 groupnode
g2 --&gt; t5(&quot;zoomstufen_wie_im_qgis_renderer&quot;)
g2 --&gt; t6(&quot;stile_aus_layer_liest_renderer_styles&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestSammleObjekte<br><span class="testname">test_gleiche_objekte_aus_mehreren_kacheln_werden_entdoppelt</span></td><td>Prüft, dass Objekte mit gleichem Quell-Layer, Geometrietyp und Attributen über Kachelgrenzen hinweg nur einmal gezählt werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSammleObjekte<br><span class="testname">test_kacheln_ausserhalb_der_geometrie_werden_uebersprungen</span></td><td>Prüft, dass Kacheln ohne Schnitt mit dem Auswertebereich nicht abgefragt werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSammleObjekte<br><span class="testname">test_abbruch_liefert_none_und_hebt_auswahl_auf</span></td><td>Prüft, dass ein Abbruch über den Fortschritt None liefert und die Auswahl auf dem Basemap-Layer trotzdem aufgehoben wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSammleObjekte<br><span class="testname">test_anzahl_kacheln_aus_kachelbereich</span></td><td>Prüft, dass die Kachelzahl aus dem Kachelbereich der Geometrie berechnet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestZoomUndStile<br><span class="testname">test_zoomstufen_wie_im_qgis_renderer</span></td><td>Prüft, dass Kachelzoom begrenzt, Darstellungszoom unbegrenzt und der gebrochene Zoom aus dem Maßstab bestimmt werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestZoomUndStile<br><span class="testname">test_stile_aus_layer_liest_renderer_styles</span></td><td>Prüft, dass Name, Quell-Layer, Geometrietyp, Zoombereich, Schalter und Filter der Renderer-Styles übernommen werden.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_basemap_katalog.py testrendererstil test_beschriftung_und_3d_sind_keine_renderer_stile testrendererstil test_ausschluss_ueber_liste_und_praefix testrendererstil test_normalisierung_entfernt_variantenkennungen testerzeugekatalog test_kontur_decker_und_bruecke_bilden_einen_eintrag testerzeugekatalog test_zustand_im_bau_wird_eigener_eintrag testerzeugekatalog test_punkt_und_flaeche_derselben_objektart_werden_zusammengefasst testerzeugekatalog test_ausgeschlossene_stile_fehlen_im_katalog testerzeugekatalog test_fachliche_nachbearbeitung_bleibt_beim_erneuten_lauf_erhalten testerzeugekatalog test_entfallene_style_ids_werden_gemeldet testsymbolwahlundpruefung test_symbol_stile_je_rolle_nur_grundvariante testsymbolwahlundpruefung test_pruefung_findet_doppelte_zuordnung_und_unbekannte_symbole testsymbolwahlundpruefung test_ausgelieferter_katalog_ist_konsistent" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-basemap-katalog-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_basemap_katalog.py</span><span class="card-meta"><span class="count-total">12 Testfälle</span><span class="cpill cpill-ok">12</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-basemap-katalog-py"><p class="filedesc">Tests für modules/basemap_katalog.py – Legendenkatalog aus der basemap.de-Style-JSON (Basis #88).</p><div class="gchips"><span class="gchip" title="">TestRendererStil <b>3</b></span><span class="gchip" title="">TestErzeugeKatalog <b>6</b></span><span class="gchip" title="">TestSymbolwahlUndPruefung <b>3</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_basemap_katalog.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestRendererStil (3)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;beschriftung_und_3d_sind_keine_renderer_stile&quot;)
g1 --&gt; t2(&quot;ausschluss_ueber_liste_und_praefix&quot;)
g1 --&gt; t3(&quot;normalisierung_entfernt_variantenkennungen&quot;)
root --&gt; g2[&quot;TestErzeugeKatalog (6)&quot;]
class g2 groupnode
g2 --&gt; t4(&quot;kontur_decker_und_bruecke_bilden_einen_eintrag&quot;)
g2 --&gt; t5(&quot;zustand_im_bau_wird_eigener_eintrag&quot;)
g2 --&gt; t6(&quot;punkt_und_flaeche_derselben_objektart_werden_zusammengefasst&quot;)
g2 --&gt; t7(&quot;ausgeschlossene_stile_fehlen_im_katalog&quot;)
g2 --&gt; t8(&quot;fachliche_nachbearbeitung_bleibt_beim_erneuten_lauf_erhalten&quot;)
g2 --&gt; t9(&quot;entfallene_style_ids_werden_gemeldet&quot;)
root --&gt; g3[&quot;TestSymbolwahlUndPruefung (3)&quot;]
class g3 groupnode
g3 --&gt; t10(&quot;symbol_stile_je_rolle_nur_grundvariante&quot;)
g3 --&gt; t11(&quot;pruefung_findet_doppelte_zuordnung_und_unbekannte_symbole&quot;)
g3 --&gt; t12(&quot;ausgelieferter_katalog_ist_konsistent&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestRendererStil<br><span class="testname">test_beschriftung_und_3d_sind_keine_renderer_stile</span></td><td>Prüft, dass reine Beschriftungen und 3D-Gebäude nicht als Renderer-Style gelten, Icon-Symbole und Flächen schon.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestRendererStil<br><span class="testname">test_ausschluss_ueber_liste_und_praefix</span></td><td>Prüft, dass Style-IDs über die Ausschlussliste und über Präfixe (Nummernschilder) ausgeschlossen werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestRendererStil<br><span class="testname">test_normalisierung_entfernt_variantenkennungen</span></td><td>Prüft, dass Variantenkennungen wie Kontur, Brücke oder Breitenangaben beim Normalisieren einer Style-ID entfallen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestErzeugeKatalog<br><span class="testname">test_kontur_decker_und_bruecke_bilden_einen_eintrag</span></td><td>Prüft, dass Kontur-, Decker-, Fahrbahn- und Brückenvarianten derselben Straßenklasse genau einen Legendeneintrag bilden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestErzeugeKatalog<br><span class="testname">test_zustand_im_bau_wird_eigener_eintrag</span></td><td>Prüft, dass „im Bau“ einen eigenen Legendeneintrag mit Zustandsangabe in der Bezeichnung bekommt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestErzeugeKatalog<br><span class="testname">test_punkt_und_flaeche_derselben_objektart_werden_zusammengefasst</span></td><td>Prüft, dass das Kran-Symbol aus Bauwerkspunkt und Bauwerksfläche in einem Eintrag landet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestErzeugeKatalog<br><span class="testname">test_ausgeschlossene_stile_fehlen_im_katalog</span></td><td>Prüft, dass Hintergrund, Beschriftungen, Nummernschilder und 3D-Gebäude keinem Eintrag zugeordnet werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestErzeugeKatalog<br><span class="testname">test_fachliche_nachbearbeitung_bleibt_beim_erneuten_lauf_erhalten</span></td><td>Prüft, dass Bezeichnung, Gruppe, Zusammenführung und Symbolwahl eines bestehenden Katalogs bei einem erneuten Lauf erhalten bleiben.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestErzeugeKatalog<br><span class="testname">test_entfallene_style_ids_werden_gemeldet</span></td><td>Prüft, dass eine Style-ID, die in der neuen Style-JSON fehlt, als entfallen gemeldet und aus dem Katalog entfernt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSymbolwahlUndPruefung<br><span class="testname">test_symbol_stile_je_rolle_nur_grundvariante</span></td><td>Prüft, dass für das Legendensymbol je Rolle (Kontur, Decker) nur die erste Grundvariante gewählt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSymbolwahlUndPruefung<br><span class="testname">test_pruefung_findet_doppelte_zuordnung_und_unbekannte_symbole</span></td><td>Prüft, dass die Katalogprüfung doppelt zugeordnete Style-IDs und Symbol-Styles außerhalb des Katalogs meldet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSymbolwahlUndPruefung<br><span class="testname">test_ausgelieferter_katalog_ist_konsistent</span></td><td>Prüft, dass der ausgelieferte Katalog data/basemap_legende.json ohne Fehler geprüft wird und Kreisstraße mit Kontur und Decker enthält.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_basemap_legende.py teststileundeintraege test_stil_aktiv_nur_eingeschaltet_und_im_zoombereich teststileundeintraege test_getroffene_stile_pruefen_layer_geometrie_zoom_und_filter teststileundeintraege test_eintraege_fassen_styles_zusammen_und_sortieren_nach_gruppe teststileundeintraege test_ausgeschlossene_und_unbekannte_styles testauswahlundeinstellungen test_vorauswahl_bekannte_an_unbekannte_aus testauswahlundeinstellungen test_auswahl_wird_gemerkt_und_vorbelegt testauswahlundeinstellungen test_merken_ergaenzt_die_bisherige_auswahl testauswahlundeinstellungen test_kaputte_projektvariable_ergibt_leere_auswahl testauswahlundeinstellungen test_auswertebereich_standard_und_umstellung testauswahlundeinstellungen test_legende_erzeugen_standard_an testlayererkennung test_erkennung_ueber_quelle_und_namen testlayererkennung test_sichtbare_layer_aus_thema_feste_liste_oder_layerbaum testablauf test_ohne_basemap_layer_passiert_nichts testablauf test_gewaehlte_eintraege_werden_geschrieben_und_gemerkt testablauf test_abbruch_im_dialog_aendert_nichts testablauf test_rueckfall_auf_druckbereich_wird_gemeldet testablauf test_ohne_objekte_keine_legende testablauf test_viele_kacheln_werden_vorher_bestaetigt" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-basemap-legende-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_basemap_legende.py</span><span class="card-meta"><span class="count-total">18 Testfälle</span><span class="cpill cpill-ok">18</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-basemap-legende-py"><p class="filedesc">Tests für modules/basemap_legende.py – Zuordnung, Auswahl und Ablauf der Basemap-Legende (Basis #88).</p><div class="gchips"><span class="gchip" title="">TestStileUndEintraege <b>4</b></span><span class="gchip" title="">TestAuswahlUndEinstellungen <b>6</b></span><span class="gchip" title="">TestLayerErkennung <b>2</b></span><span class="gchip" title="">TestAblauf <b>6</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_basemap_legende.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestStileUndEintraege (4)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;stil_aktiv_nur_eingeschaltet_und_im_zoombereich&quot;)
g1 --&gt; t2(&quot;getroffene_stile_pruefen_layer_geometrie_zoom_und_filter&quot;)
g1 --&gt; t3(&quot;eintraege_fassen_styles_zusammen_und_sortieren_nach_gruppe&quot;)
g1 --&gt; t4(&quot;ausgeschlossene_und_unbekannte_styles&quot;)
root --&gt; g2[&quot;TestAuswahlUndEinstellungen (6)&quot;]
class g2 groupnode
g2 --&gt; t5(&quot;vorauswahl_bekannte_an_unbekannte_aus&quot;)
g2 --&gt; t6(&quot;auswahl_wird_gemerkt_und_vorbelegt&quot;)
g2 --&gt; t7(&quot;merken_ergaenzt_die_bisherige_auswahl&quot;)
g2 --&gt; t8(&quot;kaputte_projektvariable_ergibt_leere_auswahl&quot;)
g2 --&gt; t9(&quot;auswertebereich_standard_und_umstellung&quot;)
g2 --&gt; t10(&quot;legende_erzeugen_standard_an&quot;)
root --&gt; g3[&quot;TestLayerErkennung (2)&quot;]
class g3 groupnode
g3 --&gt; t11(&quot;erkennung_ueber_quelle_und_namen&quot;)
g3 --&gt; t12(&quot;sichtbare_layer_aus_thema_feste_liste_oder_layerbaum&quot;)
root --&gt; g4[&quot;TestAblauf (6)&quot;]
class g4 groupnode
g4 --&gt; t13(&quot;ohne_basemap_layer_passiert_nichts&quot;)
g4 --&gt; t14(&quot;gewaehlte_eintraege_werden_geschrieben_und_gemerkt&quot;)
g4 --&gt; t15(&quot;abbruch_im_dialog_aendert_nichts&quot;)
g4 --&gt; t16(&quot;rueckfall_auf_druckbereich_wird_gemeldet&quot;)
g4 --&gt; t17(&quot;ohne_objekte_keine_legende&quot;)
g4 --&gt; t18(&quot;viele_kacheln_werden_vorher_bestaetigt&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestStileUndEintraege<br><span class="testname">test_stil_aktiv_nur_eingeschaltet_und_im_zoombereich</span></td><td>Prüft, dass ein Style nur aktiv ist, wenn er eingeschaltet ist und die Zoomstufe im Bereich liegt (-1 = unbegrenzt).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestStileUndEintraege<br><span class="testname">test_getroffene_stile_pruefen_layer_geometrie_zoom_und_filter</span></td><td>Prüft, dass ein Style nur Objekte seines Quell-Layers und Geometrietyps zählt, deren Filter zutrifft, und nur bei passender Zoomstufe.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestStileUndEintraege<br><span class="testname">test_eintraege_fassen_styles_zusammen_und_sortieren_nach_gruppe</span></td><td>Prüft, dass mehrere Styles eines Katalogeintrags einen Eintrag ergeben und die Einträge nach Gruppen- und Katalogreihenfolge sortiert sind.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestStileUndEintraege<br><span class="testname">test_ausgeschlossene_und_unbekannte_styles</span></td><td>Prüft, dass ausgeschlossene Styles entfallen und unbekannte Styles als nicht bekannter Eintrag in „Sonstiges“ landen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAuswahlUndEinstellungen<br><span class="testname">test_vorauswahl_bekannte_an_unbekannte_aus</span></td><td>Prüft, dass ohne gespeicherte Auswahl Katalogeinträge vorausgewählt und unbekannte Styles abgewählt sind.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAuswahlUndEinstellungen<br><span class="testname">test_auswahl_wird_gemerkt_und_vorbelegt</span></td><td>Prüft, dass ab- und angewählte Einträge in der Projektvariable gespeichert und beim nächsten Mal so vorbelegt werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAuswahlUndEinstellungen<br><span class="testname">test_merken_ergaenzt_die_bisherige_auswahl</span></td><td>Prüft, dass das Merken die Auswahl nicht angezeigter Einträge aus früheren Läufen behält.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAuswahlUndEinstellungen<br><span class="testname">test_kaputte_projektvariable_ergibt_leere_auswahl</span></td><td>Prüft, dass eine nicht lesbare Projektvariable als leere Auswahl gilt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAuswahlUndEinstellungen<br><span class="testname">test_auswertebereich_standard_und_umstellung</span></td><td>Prüft, dass der Auswertebereich standardmäßig das Verfahrensgebiet ist, umgestellt werden kann und unbekannte Werte abgewiesen werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAuswahlUndEinstellungen<br><span class="testname">test_legende_erzeugen_standard_an</span></td><td>Prüft, dass das Erzeugen der Basemap-Legende standardmäßig eingeschaltet ist und abgeschaltet werden kann.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerErkennung<br><span class="testname">test_erkennung_ueber_quelle_und_namen</span></td><td>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.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerErkennung<br><span class="testname">test_sichtbare_layer_aus_thema_feste_liste_oder_layerbaum</span></td><td>Prüft, dass die Layer der Karte aus dem Kartenthema, sonst aus der festen Layerliste, sonst aus dem sichtbaren Layerbaum kommen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAblauf<br><span class="testname">test_ohne_basemap_layer_passiert_nichts</span></td><td>Prüft, dass ohne sichtbaren Basemap-Layer weder Dialog noch Legende entstehen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAblauf<br><span class="testname">test_gewaehlte_eintraege_werden_geschrieben_und_gemerkt</span></td><td>Prüft, dass nur die im Dialog gewählten Einträge in die Legende geschrieben und die Auswahl gespeichert wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAblauf<br><span class="testname">test_abbruch_im_dialog_aendert_nichts</span></td><td>Prüft, dass ein Abbruch im Auswahldialog die Legende nicht verändert und keine Auswahl speichert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAblauf<br><span class="testname">test_rueckfall_auf_druckbereich_wird_gemeldet</span></td><td>Prüft, dass ohne Verfahrensgebiet auf den Druckbereich zurückgefallen und das gemeldet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAblauf<br><span class="testname">test_ohne_objekte_keine_legende</span></td><td>Prüft, dass ohne Basemap-Objekte im Auswertebereich weder Dialog noch Legende entstehen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAblauf<br><span class="testname">test_viele_kacheln_werden_vorher_bestaetigt</span></td><td>Prüft, dass vor einer Auswertung mit sehr vielen Kacheln nachgefragt wird und eine Ablehnung die Auswertung abbricht.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_basemap_legende_layout.py testkennzeichenundkarte test_layout_kennzeichen_setzen_und_erkennen testkennzeichenundkarte test_hauptkarte_ueber_id testsymbolwahl test_symbolnamen_aus_aktiven_symbol_stilen_in_renderer_reihenfolge testsymbolwahl test_ohne_aktive_symbol_stile_erster_getroffener_style testautobahnsymbol test_druckmassstab_ab_zoom_14_blauer_decker_auf_grauer_kontur testautobahnsymbol test_zoom_11_bis_13_bisherige_kontur_und_decker testautobahnsymbol test_unter_zoom_11_blauer_decker testhilfslayer test_je_gruppe_und_geometrietyp_ein_leerer_hilfslayer testhilfslayer test_alte_hilfslayer_werden_entfernt testhilfslayer test_ohne_eintraege_wird_vorhandene_basemap_legende_entfernt testplatzierung test_einspaltig_ueber_der_quellenangabe testplatzierung test_mehrspaltig_wenn_hoehe_nicht_reicht testplatzierung test_spalten_ungleich_breit testplatzierung test_mindestgroesse_mit_ungleichen_spalten_und_umbruch testplatzierung test_neue_basemap_legende_mindestens_so_breit_wie_kartenschild testplatzierung test_titel_zweizeilig testplatzierung test_nie_breiter_als_der_seitenrand_mit_hinweis" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-basemap-legende-layout-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_basemap_legende_layout.py</span><span class="card-meta"><span class="count-total">17 Testfälle</span><span class="cpill cpill-ok">17</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-basemap-legende-layout-py"><p class="filedesc">Tests für modules/basemap_legende_layout.py – Basemap-Legende im Drucklayout (Basis #88).</p><div class="gchips"><span class="gchip" title="">TestKennzeichenUndKarte <b>2</b></span><span class="gchip" title="">TestSymbolwahl <b>2</b></span><span class="gchip" title="Autobahn-Symbol aus dem ausgelieferten Katalog (Basis #98).">TestAutobahnSymbol <b>3</b></span><span class="gchip" title="">TestHilfslayer <b>3</b></span><span class="gchip" title="">TestPlatzierung <b>7</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_basemap_legende_layout.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestKennzeichenUndKarte (2)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;layout_kennzeichen_setzen_und_erkennen&quot;)
g1 --&gt; t2(&quot;hauptkarte_ueber_id&quot;)
root --&gt; g2[&quot;TestSymbolwahl (2)&quot;]
class g2 groupnode
g2 --&gt; t3(&quot;symbolnamen_aus_aktiven_symbol_stilen_in_renderer_reihenfolge&quot;)
g2 --&gt; t4(&quot;ohne_aktive_symbol_stile_erster_getroffener_style&quot;)
root --&gt; g3[&quot;TestAutobahnSymbol (3)&quot;]
class g3 groupnode
g3 --&gt; t5(&quot;druckmassstab_ab_zoom_14_blauer_decker_auf_grauer_kontur&quot;)
g3 --&gt; t6(&quot;zoom_11_bis_13_bisherige_kontur_und_decker&quot;)
g3 --&gt; t7(&quot;unter_zoom_11_blauer_decker&quot;)
root --&gt; g4[&quot;TestHilfslayer (3)&quot;]
class g4 groupnode
g4 --&gt; t8(&quot;je_gruppe_und_geometrietyp_ein_leerer_hilfslayer&quot;)
g4 --&gt; t9(&quot;alte_hilfslayer_werden_entfernt&quot;)
g4 --&gt; t10(&quot;ohne_eintraege_wird_vorhandene_basemap_legende_entfernt&quot;)
root --&gt; g5[&quot;TestPlatzierung (7)&quot;]
class g5 groupnode
g5 --&gt; t11(&quot;einspaltig_ueber_der_quellenangabe&quot;)
g5 --&gt; t12(&quot;mehrspaltig_wenn_hoehe_nicht_reicht&quot;)
g5 --&gt; t13(&quot;spalten_ungleich_breit&quot;)
g5 --&gt; t14(&quot;mindestgroesse_mit_ungleichen_spalten_und_umbruch&quot;)
g5 --&gt; t15(&quot;neue_basemap_legende_mindestens_so_breit_wie_kartenschild&quot;)
g5 --&gt; t16(&quot;titel_zweizeilig&quot;)
g5 --&gt; t17(&quot;nie_breiter_als_der_seitenrand_mit_hinweis&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestKennzeichenUndKarte<br><span class="testname">test_layout_kennzeichen_setzen_und_erkennen</span></td><td>Prüft, dass ein markiertes Layout als Nutzer der Basemap-Legende erkannt und in der Projektliste geführt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKennzeichenUndKarte<br><span class="testname">test_hauptkarte_ueber_id</span></td><td>Prüft, dass die Karte mit der ID „Hauptkarte“ gefunden wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSymbolwahl<br><span class="testname">test_symbolnamen_aus_aktiven_symbol_stilen_in_renderer_reihenfolge</span></td><td>Prüft, dass die Symbol-Styles des Katalogs in Zeichenreihenfolge genommen und inaktive übergangen werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSymbolwahl<br><span class="testname">test_ohne_aktive_symbol_stile_erster_getroffener_style</span></td><td>Prüft, dass ohne aktiven Symbol-Style der erste tatsächlich getroffene Style das Legendensymbol liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAutobahnSymbol<br><span class="testname">test_druckmassstab_ab_zoom_14_blauer_decker_auf_grauer_kontur</span></td><td>Prüft, dass das Autobahn-Symbol ab Zoom 14 aus grauer Kontur und blauem Decker der Fahrbahnachse besteht statt nur aus einem grauen Style.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAutobahnSymbol<br><span class="testname">test_zoom_11_bis_13_bisherige_kontur_und_decker</span></td><td>Prüft, dass das Autobahn-Symbol bei Zoom 11 bis 13 weiterhin aus Kontur und Decker der getrennten Fahrbahn besteht.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAutobahnSymbol<br><span class="testname">test_unter_zoom_11_blauer_decker</span></td><td>Prüft, dass das Autobahn-Symbol unter Zoom 11 den blauen Decker der Übersichtsdarstellung nutzt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestHilfslayer<br><span class="testname">test_je_gruppe_und_geometrietyp_ein_leerer_hilfslayer</span></td><td>Prüft, dass je Gruppe und Geometrietyp ein Hilfslayer außerhalb des Layerbaums entsteht, Flächen vor Linien, ohne Rückfrage beim Schließen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestHilfslayer<br><span class="testname">test_alte_hilfslayer_werden_entfernt</span></td><td>Prüft, dass die Hilfslayer einer früheren Basemap-Legende des Layouts aus dem Projekt entfernt werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestHilfslayer<br><span class="testname">test_ohne_eintraege_wird_vorhandene_basemap_legende_entfernt</span></td><td>Prüft, dass ohne gewählte Einträge eine vorhandene Basemap-Legende entfernt und die Auswahl am Layout vermerkt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPlatzierung<br><span class="testname">test_einspaltig_ueber_der_quellenangabe</span></td><td>Prüft, dass die Basemap-Legende einspaltig unten an der Quellenangabe verankert wird, wenn der Platz reicht.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPlatzierung<br><span class="testname">test_mehrspaltig_wenn_hoehe_nicht_reicht</span></td><td>Prüft, dass die Legende zwei- oder dreispaltig wird, wenn sie einspaltig nicht zwischen Hauptlegende und Quellenangabe passt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPlatzierung<br><span class="testname">test_spalten_ungleich_breit</span></td><td>Prüft, dass die Basemap-Legende ungleich breite Spalten bekommt (#96).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPlatzierung<br><span class="testname">test_mindestgroesse_mit_ungleichen_spalten_und_umbruch</span></td><td>Prüft, dass der Platzbedarf mit ungleich breiten Spalten und Textumbruch berechnet wird (#96).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPlatzierung<br><span class="testname">test_neue_basemap_legende_mindestens_so_breit_wie_kartenschild</span></td><td>Prüft, dass eine neu angelegte Basemap-Legende die Breite des Kartenschilds als Mindestbreite bekommt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPlatzierung<br><span class="testname">test_titel_zweizeilig</span></td><td>Prüft, dass der Titel der Basemap-Legende zweizeilig ist, damit er die Mindestbreite nicht bestimmt (#96).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPlatzierung<br><span class="testname">test_nie_breiter_als_der_seitenrand_mit_hinweis</span></td><td>Prüft, dass keine Spaltenzahl gewählt wird, die über den Seitenrand ragt, und dann ein Hinweis kommt.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_basemap_legende_rand.py testbrauchtlegendenrand test_weisse_flaeche_ohne_rand testbrauchtlegendenrand test_farbige_flaeche_oder_flaeche_mit_kontur testbrauchtlegendenrand test_heller_rand_und_fast_weiss_zaehlen_als_unsichtbar testbrauchtlegendenrand test_andere_ebenen_und_leeres_symbol testergaenzelegendenrand test_weisse_flaeche_bekommt_grauen_rand testergaenzelegendenrand test_farbige_flaeche_und_linien_bleiben_unveraendert" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-basemap-legende-rand-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_basemap_legende_rand.py</span><span class="card-meta"><span class="count-total">6 Testfälle</span><span class="cpill cpill-ok">6</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-basemap-legende-rand-py"><p class="filedesc">Tests für den Legendenrand weißer Basemap-Flächen (Basis #92).</p><div class="gchips"><span class="gchip" title="">TestBrauchtLegendenrand <b>4</b></span><span class="gchip" title="">TestErgaenzeLegendenrand <b>2</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_basemap_legende_rand.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestBrauchtLegendenrand (4)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;weisse_flaeche_ohne_rand&quot;)
g1 --&gt; t2(&quot;farbige_flaeche_oder_flaeche_mit_kontur&quot;)
g1 --&gt; t3(&quot;heller_rand_und_fast_weiss_zaehlen_als_unsichtbar&quot;)
g1 --&gt; t4(&quot;andere_ebenen_und_leeres_symbol&quot;)
root --&gt; g2[&quot;TestErgaenzeLegendenrand (2)&quot;]
class g2 groupnode
g2 --&gt; t5(&quot;weisse_flaeche_bekommt_grauen_rand&quot;)
g2 --&gt; t6(&quot;farbige_flaeche_und_linien_bleiben_unveraendert&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestBrauchtLegendenrand<br><span class="testname">test_weisse_flaeche_ohne_rand</span></td><td>Prüft, dass eine weiße Fläche ohne Umrandung einen Legendenrand braucht.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBrauchtLegendenrand<br><span class="testname">test_farbige_flaeche_oder_flaeche_mit_kontur</span></td><td>Prüft, dass farbige Flächen und weiße Flächen mit dunkler Kontur oder eigener Konturlinie keinen Rand bekommen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBrauchtLegendenrand<br><span class="testname">test_heller_rand_und_fast_weiss_zaehlen_als_unsichtbar</span></td><td>Prüft, dass fast weiße Füllungen und helle oder durchsichtige Ränder als unsichtbar gelten.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBrauchtLegendenrand<br><span class="testname">test_andere_ebenen_und_leeres_symbol</span></td><td>Prüft, dass Symbole mit anderen Ebenen (Muster, Punkte) und leere Symbole keinen Rand bekommen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestErgaenzeLegendenrand<br><span class="testname">test_weisse_flaeche_bekommt_grauen_rand</span></td><td>Prüft, dass eine weiße Fläche ohne Kontur eine graue Randlinie als oberste Ebene bekommt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestErgaenzeLegendenrand<br><span class="testname">test_farbige_flaeche_und_linien_bleiben_unveraendert</span></td><td>Prüft, dass farbige Flächen, Flächen mit Kontur und Liniensymbole keinen Rand bekommen.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_basemap_stilkorrektur.py testmusterundausdruck test_strichlaenge_null_im_festen_muster testmusterundausdruck test_strichlaenge_null_im_zoomabhaengigen_ausdruck testlayerkorrektur test_punktlinien_werden_korrigiert_andere_styles_nicht testlayerkorrektur test_zweiter_lauf_korrigiert_nichts testlayerkorrektur test_nur_ausdruck_ohne_festes_muster testlayerkorrektur test_layer_ohne_renderer" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-basemap-stilkorrektur-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_basemap_stilkorrektur.py</span><span class="card-meta"><span class="count-total">6 Testfälle</span><span class="cpill cpill-ok">6</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-basemap-stilkorrektur-py"><p class="filedesc">Tests für modules/basemap_stilkorrektur.py – Punktlinien des Basemap-Layers sichtbar machen (Basis #90).</p><div class="gchips"><span class="gchip" title="">TestMusterUndAusdruck <b>2</b></span><span class="gchip" title="">TestLayerkorrektur <b>4</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_basemap_stilkorrektur.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestMusterUndAusdruck (2)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;strichlaenge_null_im_festen_muster&quot;)
g1 --&gt; t2(&quot;strichlaenge_null_im_zoomabhaengigen_ausdruck&quot;)
root --&gt; g2[&quot;TestLayerkorrektur (4)&quot;]
class g2 groupnode
g2 --&gt; t3(&quot;punktlinien_werden_korrigiert_andere_styles_nicht&quot;)
g2 --&gt; t4(&quot;zweiter_lauf_korrigiert_nichts&quot;)
g2 --&gt; t5(&quot;nur_ausdruck_ohne_festes_muster&quot;)
g2 --&gt; t6(&quot;layer_ohne_renderer&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestMusterUndAusdruck<br><span class="testname">test_strichlaenge_null_im_festen_muster</span></td><td>Prüft, dass Strichlängen 0 (gerade Positionen) im Strichmuster ersetzt und Lücken der Länge 0 nicht verändert werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestMusterUndAusdruck<br><span class="testname">test_strichlaenge_null_im_zoomabhaengigen_ausdruck</span></td><td>Prüft, dass jede Strichlänge 0 in den array(...)-Mustern des Konverter-Ausdrucks ersetzt wird und der übrige Ausdruck gleich bleibt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerkorrektur<br><span class="testname">test_punktlinien_werden_korrigiert_andere_styles_nicht</span></td><td>Prüft, dass nur Styles mit Strichlänge 0 korrigiert werden – Muster und Ausdruck – und die Anzahl zurückkommt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerkorrektur<br><span class="testname">test_zweiter_lauf_korrigiert_nichts</span></td><td>Prüft, dass ein zweiter Lauf keine Styles mehr korrigiert und nicht neu zeichnen lässt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerkorrektur<br><span class="testname">test_nur_ausdruck_ohne_festes_muster</span></td><td>Prüft, dass auch ein Style korrigiert wird, dessen Strichlänge 0 nur im zoomabhängigen Ausdruck steht.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerkorrektur<br><span class="testname">test_layer_ohne_renderer</span></td><td>Prüft, dass ein Layer ohne Renderer 0 korrigierte Styles liefert.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_basemap_stilvorlagen.py teststilvorlagen test_speichern_und_auflisten teststilvorlagen test_mehrere_varianten_alphabetisch teststilvorlagen test_leerer_name_oder_fehler_beim_schreiben teststilvorlagen test_laden_setzt_stil_und_zeichnet_neu teststilvorlagen test_passung_meldet_fremde_styles teststilvorlagen test_standard_setzen_und_beim_loeschen_entfernen teststilvorlagen test_fehlende_begleitdatei_wird_toleriert teststilvorlagen test_ohne_ordner_leere_liste testexportimport test_export_und_import_uebertragen_vorlage_mit_begleitdaten testexportimport test_export_einer_fehlenden_vorlage testexportimport test_import_einer_reinen_qml_datei testexportimport test_import_lehnt_ungeeignete_dateien_ab testexportimport test_import_uebernimmt_nur_bekannte_begleitdaten testexportimport test_thema_der_vorlage_passt_nicht_zum_layer" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-basemap-stilvorlagen-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_basemap_stilvorlagen.py</span><span class="card-meta"><span class="count-total">14 Testfälle</span><span class="cpill cpill-ok">14</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-basemap-stilvorlagen-py"><p class="filedesc">Tests für modules/basemap_stilvorlagen.py – lokale Stilvorlagen des Basemap-Layers (Basis #88),</p><div class="gchips"><span class="gchip" title="">TestStilvorlagen <b>8</b></span><span class="gchip" title="">TestExportImport <b>6</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_basemap_stilvorlagen.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestStilvorlagen (8)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;speichern_und_auflisten&quot;)
g1 --&gt; t2(&quot;mehrere_varianten_alphabetisch&quot;)
g1 --&gt; t3(&quot;leerer_name_oder_fehler_beim_schreiben&quot;)
g1 --&gt; t4(&quot;laden_setzt_stil_und_zeichnet_neu&quot;)
g1 --&gt; t5(&quot;passung_meldet_fremde_styles&quot;)
g1 --&gt; t6(&quot;standard_setzen_und_beim_loeschen_entfernen&quot;)
g1 --&gt; t7(&quot;fehlende_begleitdatei_wird_toleriert&quot;)
g1 --&gt; t8(&quot;ohne_ordner_leere_liste&quot;)
root --&gt; g2[&quot;TestExportImport (6)&quot;]
class g2 groupnode
g2 --&gt; t9(&quot;export_und_import_uebertragen_vorlage_mit_begleitdaten&quot;)
g2 --&gt; t10(&quot;export_einer_fehlenden_vorlage&quot;)
g2 --&gt; t11(&quot;import_einer_reinen_qml_datei&quot;)
g2 --&gt; t12(&quot;import_lehnt_ungeeignete_dateien_ab&quot;)
g2 --&gt; t13(&quot;import_uebernimmt_nur_bekannte_begleitdaten&quot;)
g2 --&gt; t14(&quot;thema_der_vorlage_passt_nicht_zum_layer&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestStilvorlagen<br><span class="testname">test_speichern_und_auflisten</span></td><td>Prüft, dass eine gespeicherte Vorlage mit Anzeigenamen, QML-Datei und Begleitdatei aufgelistet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestStilvorlagen<br><span class="testname">test_mehrere_varianten_alphabetisch</span></td><td>Prüft, dass mehrere Varianten nebeneinander bestehen und alphabetisch nach Anzeigename sortiert werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestStilvorlagen<br><span class="testname">test_leerer_name_oder_fehler_beim_schreiben</span></td><td>Prüft, dass ein leerer Name und ein Schreibfehler von QGIS als ValueError gemeldet werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestStilvorlagen<br><span class="testname">test_laden_setzt_stil_und_zeichnet_neu</span></td><td>Prüft, dass das Laden die QML-Datei der Vorlage in den Layer lädt und neu zeichnen lässt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestStilvorlagen<br><span class="testname">test_passung_meldet_fremde_styles</span></td><td>Prüft, dass Style-Namen der Vorlage gemeldet werden, die der Ziel-Layer nicht kennt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestStilvorlagen<br><span class="testname">test_standard_setzen_und_beim_loeschen_entfernen</span></td><td>Prüft, dass eine Vorlage als Standard markiert wird und die Markierung beim Löschen der Vorlage entfällt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestStilvorlagen<br><span class="testname">test_fehlende_begleitdatei_wird_toleriert</span></td><td>Prüft, dass eine QML-Datei ohne Begleitdatei mit ihrem Dateinamen aufgelistet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestStilvorlagen<br><span class="testname">test_ohne_ordner_leere_liste</span></td><td>Prüft, dass ohne angelegten Vorlagenordner eine leere Liste zurückkommt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestExportImport<br><span class="testname">test_export_und_import_uebertragen_vorlage_mit_begleitdaten</span></td><td>Prüft, dass eine exportierte Vorlage auf einem anderen Rechner mit Anzeigename, Thema, Style-Namen und Legendenauswahl ankommt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestExportImport<br><span class="testname">test_export_einer_fehlenden_vorlage</span></td><td>Prüft, dass der Export einer nicht vorhandenen Vorlage als ValueError gemeldet wird und keine Datei entsteht.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestExportImport<br><span class="testname">test_import_einer_reinen_qml_datei</span></td><td>Prüft, dass eine QML-Datei ohne Begleitdatei mit dem Dateinamen als Namensvorschlag und ohne Thema übernommen wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestExportImport<br><span class="testname">test_import_lehnt_ungeeignete_dateien_ab</span></td><td>Prüft, dass Dateien ohne QGIS-Stil und ZIP-Dateien ohne genau eine QML-Datei abgelehnt werden, ohne etwas anzulegen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestExportImport<br><span class="testname">test_import_uebernimmt_nur_bekannte_begleitdaten</span></td><td>Prüft, dass ein Import unbekannte oder falsch typisierte Angaben der Begleitdatei verwirft und den gewählten Namen nutzt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestExportImport<br><span class="testname">test_thema_der_vorlage_passt_nicht_zum_layer</span></td><td>Prüft, dass ein abweichendes Thema der Vorlage gemeldet wird und ohne Thema in Vorlage oder Layer keine Meldung kommt.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_basemap_themen.py testquelleundthema test_quelle_enthaelt_kachel_url_und_style_des_themas testquelleundthema test_unbekannte_style_json_ergibt_kein_thema testquelleundthema test_unbekannter_schluessel_faellt_auf_farbe_zurueck testquelleundthema test_vorhandener_layer_wird_an_der_quell_url_erkannt testpruefwert test_gleiche_darstellung_gleicher_pruefwert_auch_bei_anderer_qgis_version testpruefwert test_ohne_ausgabe_der_darstellung_kein_pruefwert testpruefwert test_aenderungsstand_unbekannt_unveraendert_geaendert testlayerundthemenwechsel test_neuer_layer_hat_thema_namen_und_gemerkten_stand testlayerundthemenwechsel test_ungueltiger_layer_oder_fehlender_themenstil_meldet_fehler testlayerundthemenwechsel test_ohne_vektorkacheln_kein_layer testlayerundthemenwechsel test_layer_kommt_ganz_unten_in_den_layerbaum testlayerundthemenwechsel test_themenwechsel_stellt_quelle_um_und_merkt_neuen_stand testlayerundthemenwechsel test_themenwechsel_behaelt_eigenen_layernamen testlayerundthemenwechsel test_themenwechsel_ohne_umstellbare_quelle_meldet_fehler teststilvorlagemitthema test_stilvorlage_vermerkt_das_thema testauswahldialog test_mock_modus_liefert_vorbelegung testbasemaphinzufuegen test_ohne_vorhandenen_layer_wird_ohne_rueckfrage_hinzugefuegt testbasemaphinzufuegen test_vorhandener_layer_wird_in_der_rueckfrage_genannt_abbrechen testbasemaphinzufuegen test_zusaetzlich_laden_fuegt_zweiten_layer_hinzu testbasemaphinzufuegen test_ersetzen_laedt_vorhandenen_layer_im_gewaehlten_thema testbasemaphinzufuegen test_fehler_beim_anlegen_wird_gemeldet testthemawechseln test_unveraenderter_layer_wechselt_ohne_rueckfrage testthemawechseln test_gleiches_thema_aendert_nichts testthemawechseln test_geaenderte_darstellung_abbrechen_behaelt_thema testthemawechseln test_geaenderte_darstellung_verwerfen_wechselt testthemawechseln test_als_stil_speichern_sichert_vor_dem_wechsel testthemawechseln test_abgebrochenes_speichern_verhindert_den_wechsel testthemawechseln test_unbekannter_stand_fragt_nach testthemawechseln test_ohne_basemap_layer_nur_vorauswahl testziellayer test_ausgewaehlter_basemap_layer_hat_vorrang" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-basemap-themen-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_basemap_themen.py</span><span class="card-meta"><span class="count-total">30 Testfälle</span><span class="cpill cpill-ok">30</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-basemap-themen-py"><p class="filedesc">Tests für modules/basemap_themen.py und den Abschnitt „Basemap-Layer“ im Basemap-Bereich (Basis #100):</p><div class="gchips"><span class="gchip" title="Layerquelle der Themen, Thema eines Layers und Erkennung über die Kachel-URL.">TestQuelleUndThema <b>4</b></span><span class="gchip" title="Prüfwert der Darstellung und Änderungsstand für ungespeicherte Änderungen.">TestPruefwert <b>3</b></span><span class="gchip" title="Basemap-Layer anlegen, in den Layerbaum einfügen und Thema wechseln.">TestLayerUndThemenwechsel <b>7</b></span><span class="gchip" title="Stilvorlagen vermerken das Thema des Layers.">TestStilvorlageMitThema <b>1</b></span><span class="gchip" title="Rückfrage mit frei benannten Knöpfen.">TestAuswahlDialog <b>1</b></span><span class="gchip" title="Knopf „Basemap hinzufügen“ mit Rückfrage bei vorhandenem Layer gleicher Quelle.">TestBasemapHinzufuegen <b>5</b></span><span class="gchip" title="Themenauswahl mit Rückfrage bei geänderter oder unbekannter Darstellung.">TestThemaWechseln <b>8</b></span><span class="gchip" title="Auswahl des Basemap-Layers, auf den Thema und Stil wirken.">TestZielLayer <b>1</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_basemap_themen.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestQuelleUndThema (4)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;quelle_enthaelt_kachel_url_und_style_des_themas&quot;)
g1 --&gt; t2(&quot;unbekannte_style_json_ergibt_kein_thema&quot;)
g1 --&gt; t3(&quot;unbekannter_schluessel_faellt_auf_farbe_zurueck&quot;)
g1 --&gt; t4(&quot;vorhandener_layer_wird_an_der_quell_url_erkannt&quot;)
root --&gt; g2[&quot;TestPruefwert (3)&quot;]
class g2 groupnode
g2 --&gt; t5(&quot;gleiche_darstellung_gleicher_pruefwert_auch_bei_anderer_qgis_version&quot;)
g2 --&gt; t6(&quot;ohne_ausgabe_der_darstellung_kein_pruefwert&quot;)
g2 --&gt; t7(&quot;aenderungsstand_unbekannt_unveraendert_geaendert&quot;)
root --&gt; g3[&quot;TestLayerUndThemenwechsel (7)&quot;]
class g3 groupnode
g3 --&gt; t8(&quot;neuer_layer_hat_thema_namen_und_gemerkten_stand&quot;)
g3 --&gt; t9(&quot;ungueltiger_layer_oder_fehlender_themenstil_meldet_fehler&quot;)
g3 --&gt; t10(&quot;ohne_vektorkacheln_kein_layer&quot;)
g3 --&gt; t11(&quot;layer_kommt_ganz_unten_in_den_layerbaum&quot;)
g3 --&gt; t12(&quot;themenwechsel_stellt_quelle_um_und_merkt_neuen_stand&quot;)
g3 --&gt; t13(&quot;themenwechsel_behaelt_eigenen_layernamen&quot;)
g3 --&gt; t14(&quot;themenwechsel_ohne_umstellbare_quelle_meldet_fehler&quot;)
root --&gt; g4[&quot;TestStilvorlageMitThema (1)&quot;]
class g4 groupnode
g4 --&gt; t15(&quot;stilvorlage_vermerkt_das_thema&quot;)
root --&gt; g5[&quot;TestAuswahlDialog (1)&quot;]
class g5 groupnode
g5 --&gt; t16(&quot;mock_modus_liefert_vorbelegung&quot;)
root --&gt; g6[&quot;TestBasemapHinzufuegen (5)&quot;]
class g6 groupnode
g6 --&gt; t17(&quot;ohne_vorhandenen_layer_wird_ohne_rueckfrage_hinzugefuegt&quot;)
g6 --&gt; t18(&quot;vorhandener_layer_wird_in_der_rueckfrage_genannt_abbrechen&quot;)
g6 --&gt; t19(&quot;zusaetzlich_laden_fuegt_zweiten_layer_hinzu&quot;)
g6 --&gt; t20(&quot;ersetzen_laedt_vorhandenen_layer_im_gewaehlten_thema&quot;)
g6 --&gt; t21(&quot;fehler_beim_anlegen_wird_gemeldet&quot;)
root --&gt; g7[&quot;TestThemaWechseln (8)&quot;]
class g7 groupnode
g7 --&gt; t22(&quot;unveraenderter_layer_wechselt_ohne_rueckfrage&quot;)
g7 --&gt; t23(&quot;gleiches_thema_aendert_nichts&quot;)
g7 --&gt; t24(&quot;geaenderte_darstellung_abbrechen_behaelt_thema&quot;)
g7 --&gt; t25(&quot;geaenderte_darstellung_verwerfen_wechselt&quot;)
g7 --&gt; t26(&quot;als_stil_speichern_sichert_vor_dem_wechsel&quot;)
g7 --&gt; t27(&quot;abgebrochenes_speichern_verhindert_den_wechsel&quot;)
g7 --&gt; t28(&quot;unbekannter_stand_fragt_nach&quot;)
g7 --&gt; t29(&quot;ohne_basemap_layer_nur_vorauswahl&quot;)
root --&gt; g8[&quot;TestZielLayer (1)&quot;]
class g8 groupnode
g8 --&gt; t30(&quot;ausgewaehlter_basemap_layer_hat_vorrang&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestQuelleUndThema<br><span class="testname">test_quelle_enthaelt_kachel_url_und_style_des_themas</span></td><td>Prüft, dass die Layerquelle eines Themas die gemeinsame Kachel-URL und die Style-JSON des Themas enthält.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestQuelleUndThema<br><span class="testname">test_unbekannte_style_json_ergibt_kein_thema</span></td><td>Prüft, dass ein Layer mit fremder oder fehlender Style-JSON keinem Thema zugeordnet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestQuelleUndThema<br><span class="testname">test_unbekannter_schluessel_faellt_auf_farbe_zurueck</span></td><td>Prüft, dass ein unbekannter Themenschlüssel auf das Standardthema „Farbe“ zurückfällt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestQuelleUndThema<br><span class="testname">test_vorhandener_layer_wird_an_der_quell_url_erkannt</span></td><td>Prüft, dass ein vorhandener Basemap-Layer an der Kachel-URL erkannt wird – unabhängig von Name, Thema und URL-Kodierung.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefwert<br><span class="testname">test_gleiche_darstellung_gleicher_pruefwert_auch_bei_anderer_qgis_version</span></td><td>Prüft, dass dieselbe Darstellung denselben Prüfwert ergibt, auch wenn die QGIS-Version in der QML abweicht.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefwert<br><span class="testname">test_ohne_ausgabe_der_darstellung_kein_pruefwert</span></td><td>Prüft, dass kein Prüfwert entsteht, wenn der Layer seine Darstellung nicht ausgeben kann.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefwert<br><span class="testname">test_aenderungsstand_unbekannt_unveraendert_geaendert</span></td><td>Prüft, dass der Änderungsstand ohne gemerkten Prüfwert „unbekannt“ ist, nach dem Merken „unverändert“ und nach einer Änderung „geändert“.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerUndThemenwechsel<br><span class="testname">test_neuer_layer_hat_thema_namen_und_gemerkten_stand</span></td><td>Prüft, dass ein neuer Basemap-Layer im gewählten Thema entsteht, den Themenstil lädt und als unverändert gilt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerUndThemenwechsel<br><span class="testname">test_ungueltiger_layer_oder_fehlender_themenstil_meldet_fehler</span></td><td>Prüft, dass ein ungültiger Layer oder ein nicht ladbarer Themenstil als ValueError gemeldet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerUndThemenwechsel<br><span class="testname">test_ohne_vektorkacheln_kein_layer</span></td><td>Prüft, dass ohne Vektorkachel-Unterstützung (Mock-Modus) kein Layer erzeugt, sondern ein Fehler gemeldet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerUndThemenwechsel<br><span class="testname">test_layer_kommt_ganz_unten_in_den_layerbaum</span></td><td>Prüft, dass der Basemap-Layer ohne automatische Einordnung ins Projekt kommt und unten an den Layerbaum angehängt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerUndThemenwechsel<br><span class="testname">test_themenwechsel_stellt_quelle_um_und_merkt_neuen_stand</span></td><td>Prüft, dass der Themenwechsel die Style-JSON der Quelle umstellt, den Themenstil lädt, den automatischen Namen anpasst und den neuen Stand merkt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerUndThemenwechsel<br><span class="testname">test_themenwechsel_behaelt_eigenen_layernamen</span></td><td>Prüft, dass ein vom Nutzer vergebener Layername beim Themenwechsel erhalten bleibt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerUndThemenwechsel<br><span class="testname">test_themenwechsel_ohne_umstellbare_quelle_meldet_fehler</span></td><td>Prüft, dass ein Layer ohne setDataSource den Themenwechsel mit einem ValueError ablehnt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestStilvorlageMitThema<br><span class="testname">test_stilvorlage_vermerkt_das_thema</span></td><td>Prüft, dass eine gespeicherte Stilvorlage das Thema des Layers in ihrer Begleitdatei und in der Liste vermerkt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAuswahlDialog<br><span class="testname">test_mock_modus_liefert_vorbelegung</span></td><td>Prüft, dass die Rückfrage mit frei benannten Knöpfen im Mock-Modus den vorbelegten Schlüssel liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBasemapHinzufuegen<br><span class="testname">test_ohne_vorhandenen_layer_wird_ohne_rueckfrage_hinzugefuegt</span></td><td>Prüft, dass ohne Basemap-Layer gleicher Quelle sofort ein Layer im gewählten Thema hinzugefügt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBasemapHinzufuegen<br><span class="testname">test_vorhandener_layer_wird_in_der_rueckfrage_genannt_abbrechen</span></td><td>Prüft, dass ein vorhandener Layer gleicher Quelle in der Rückfrage genannt wird und „Abbrechen“ nichts verändert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBasemapHinzufuegen<br><span class="testname">test_zusaetzlich_laden_fuegt_zweiten_layer_hinzu</span></td><td>Prüft, dass „Zusätzlich laden“ einen weiteren Basemap-Layer neben dem vorhandenen hinzufügt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBasemapHinzufuegen<br><span class="testname">test_ersetzen_laedt_vorhandenen_layer_im_gewaehlten_thema</span></td><td>Prüft, dass „Ersetzen“ keinen neuen Layer anlegt, sondern den vorhandenen im gewählten Thema neu lädt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBasemapHinzufuegen<br><span class="testname">test_fehler_beim_anlegen_wird_gemeldet</span></td><td>Prüft, dass ein nicht erreichbarer Dienst als Warnung gemeldet und kein Layer hinzugefügt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestThemaWechseln<br><span class="testname">test_unveraenderter_layer_wechselt_ohne_rueckfrage</span></td><td>Prüft, dass ein unveränderter Basemap-Layer ohne Rückfrage auf das gewählte Thema wechselt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestThemaWechseln<br><span class="testname">test_gleiches_thema_aendert_nichts</span></td><td>Prüft, dass die Wahl des Themas, das der Layer schon hat, nichts neu lädt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestThemaWechseln<br><span class="testname">test_geaenderte_darstellung_abbrechen_behaelt_thema</span></td><td>Prüft, dass bei geänderter Darstellung nachgefragt wird und „Abbrechen“ Thema und Darstellung unverändert lässt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestThemaWechseln<br><span class="testname">test_geaenderte_darstellung_verwerfen_wechselt</span></td><td>Prüft, dass „Verwerfen“ die geänderte Darstellung aufgibt und das Thema wechselt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestThemaWechseln<br><span class="testname">test_als_stil_speichern_sichert_vor_dem_wechsel</span></td><td>Prüft, dass „Als Stil speichern“ die Darstellung vor dem Themenwechsel als Stilvorlage sichert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestThemaWechseln<br><span class="testname">test_abgebrochenes_speichern_verhindert_den_wechsel</span></td><td>Prüft, dass das Thema nicht wechselt, wenn „Als Stil speichern“ gewählt, die Namensabfrage aber abgebrochen wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestThemaWechseln<br><span class="testname">test_unbekannter_stand_fragt_nach</span></td><td>Prüft, dass bei einem Layer ohne gemerkten Prüfwert (vor dieser Funktion geladen) vorsichtshalber nachgefragt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestThemaWechseln<br><span class="testname">test_ohne_basemap_layer_nur_vorauswahl</span></td><td>Prüft, dass die Themenwahl ohne Basemap-Layer nur als Vorauswahl für „Basemap hinzufügen“ dient und nichts meldet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestZielLayer<br><span class="testname">test_ausgewaehlter_basemap_layer_hat_vorrang</span></td><td>Prüft, dass der im Layerbaum ausgewählte Basemap-Layer Ziel des Themenwechsels ist, sonst der erste Basemap-Layer.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_bootstrap.py " data-hasred="0" data-hasskip="0" data-nodoc="1"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-bootstrap-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_bootstrap.py</span><span class="card-meta"><span class="count-total">0 Testfälle</span><span class="docbadge" title="Anteil mit Docstring">0% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-bootstrap-py"><p class="filedesc">— (Docstring fehlt)</p><p class="empty-note">Keine Testfälle: Die Datei enthält keine <span class="mono">unittest.TestCase</span>-Klasse – sie ist eine reine Hilfsdatei, die beim Testlauf nur importiert wird.</p></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_datagrabber.py testdatagrabber test_analyze_source_type_detects_excel testdatagrabber test_analyze_source_type_returns_unknown_filetype testdatagrabber test_analyze_source_type_detects_service_when_file_check_fails testdatagrabber test_analyze_source_type_returns_unbekannte_quelle_on_full_failure testdatagrabber test_run_returns_success_summary_with_valid_rows testdatagrabber test_run_returns_failure_summary_without_rows testdatagrabber test_aggregate_results_mit_zeilen_liefert_erfolgsergebnis testdatagrabber test_aggregate_results_ohne_zeilen_liefert_keine_validen_eintraege" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-datagrabber-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_datagrabber.py</span><span class="card-meta"><span class="count-total">8 Testfälle</span><span class="cpill cpill-ok">8</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-datagrabber-py"><p class="filedesc">— (Docstring fehlt)</p><div class="gchips"><span class="gchip" title="">TestDataGrabber <b>8</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_datagrabber.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestDataGrabber (8)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;analyze_source_type_detects_excel&quot;)
g1 --&gt; t2(&quot;analyze_source_type_returns_unknown_filetype&quot;)
g1 --&gt; t3(&quot;analyze_source_type_detects_service_when_file_check_fails&quot;)
g1 --&gt; t4(&quot;analyze_source_type_returns_unbekannte_quelle_on_full_failure&quot;)
g1 --&gt; t5(&quot;run_returns_success_summary_with_valid_rows&quot;)
g1 --&gt; t6(&quot;run_returns_failure_summary_without_rows&quot;)
g1 --&gt; t7(&quot;aggregate_results_mit_zeilen_liefert_erfolgsergebnis&quot;)
g1 --&gt; t8(&quot;aggregate_results_ohne_zeilen_liefert_keine_validen_eintraege&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestDataGrabber<br><span class="testname">test_analyze_source_type_detects_excel</span></td><td>Prüft, dass eine erreichbare .xlsx-Datei als Quelltyp &#x27;excel&#x27; erkannt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDataGrabber<br><span class="testname">test_analyze_source_type_returns_unknown_filetype</span></td><td>Prüft, dass eine erreichbare Datei mit unbekannter Endung als &#x27;unbekannter_dateityp&#x27; eingestuft wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDataGrabber<br><span class="testname">test_analyze_source_type_detects_service_when_file_check_fails</span></td><td>Prüft, dass eine Quelle als &#x27;dienst&#x27; erkannt wird, wenn die Dateiprüfung fehlschlägt, die URL aber erreichbar ist.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDataGrabber<br><span class="testname">test_analyze_source_type_returns_unbekannte_quelle_on_full_failure</span></td><td>Prüft, dass eine Quelle als &#x27;unbekannte_quelle&#x27; eingestuft wird, wenn weder Datei- noch Linkprüfung erfolgreich sind.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDataGrabber<br><span class="testname">test_run_returns_success_summary_with_valid_rows</span></td><td>Prüft, dass run() bei erfolgreichem Excel-Import eine Erfolgsmeldung mit den geladenen Zeilen liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDataGrabber<br><span class="testname">test_run_returns_failure_summary_without_rows</span></td><td>Prüft, dass run() bei nicht erkennbarer Quelle eine Fehlermeldung ohne Zeilen liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDataGrabber<br><span class="testname">test_aggregate_results_mit_zeilen_liefert_erfolgsergebnis</span></td><td>Prüft, dass _aggregate_results bei vorhandenen Zeilen ein Erfolgsergebnis mit Zeilenzahl liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDataGrabber<br><span class="testname">test_aggregate_results_ohne_zeilen_liefert_keine_validen_eintraege</span></td><td>Prüft, dass _aggregate_results ohne Zeilen ok=False mit Aktion &#x27;keine_validen_eintraege&#x27; liefert.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_dateipruefer.py testdateipruefer test_leereingabe_erlaubt testdateipruefer test_leereingabe_nicht_erlaubt testdateipruefer test_standarddatei_vorschlagen testdateipruefer test_temporaer_erlaubt testdateipruefer test_datei_nicht_gefunden testdateipruefer test_datei_ok testdateipruefer test_erkenne_dateityp_unterscheidet_excel_datenbank_und_unbekannt testdateipruefer test_pfad_verbindet_relativen_pfad_mit_basispfad testdateipruefer test_pfad_laesst_absoluten_pfad_unveraendert testdateipruefer test_ist_gueltiger_gpkg_pfad_akzeptiert_vorhandenes_verzeichnis testdateipruefer test_ist_gueltiger_gpkg_pfad_lehnt_falsche_endung_ab testdateipruefer test_ist_gueltiger_gpkg_pfad_lehnt_fehlendes_verzeichnis_ab testdateipruefer test_ist_leer_erkennt_none_und_nicht_string_als_leer testdateipruefer test_ist_leer_erkennt_reinen_whitespace_als_leer testdateipruefer test_ist_leer_meldet_pfad_mit_sichtbaren_zeichen_nicht_als_leer testdateipruefer test_leere_eingabe_bevorzugt_leereingabe_erlaubt_vor_standarddatei testdateipruefer test_leere_eingabe_bevorzugt_standarddatei_vor_temporaer_erlaubt" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-dateipruefer-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_dateipruefer.py</span><span class="card-meta"><span class="count-total">17 Testfälle</span><span class="cpill cpill-ok">17</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-dateipruefer-py"><p class="filedesc">— (Docstring fehlt)</p><div class="gchips"><span class="gchip" title="">TestDateipruefer <b>17</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_dateipruefer.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestDateipruefer (17)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;leereingabe_erlaubt&quot;)
g1 --&gt; t2(&quot;leereingabe_nicht_erlaubt&quot;)
g1 --&gt; t3(&quot;standarddatei_vorschlagen&quot;)
g1 --&gt; t4(&quot;temporaer_erlaubt&quot;)
g1 --&gt; t5(&quot;datei_nicht_gefunden&quot;)
g1 --&gt; t6(&quot;datei_ok&quot;)
g1 --&gt; t7(&quot;erkenne_dateityp_unterscheidet_excel_datenbank_und_unbekannt&quot;)
g1 --&gt; t8(&quot;pfad_verbindet_relativen_pfad_mit_basispfad&quot;)
g1 --&gt; t9(&quot;pfad_laesst_absoluten_pfad_unveraendert&quot;)
g1 --&gt; t10(&quot;ist_gueltiger_gpkg_pfad_akzeptiert_vorhandenes_verzeichnis&quot;)
g1 --&gt; t11(&quot;ist_gueltiger_gpkg_pfad_lehnt_falsche_endung_ab&quot;)
g1 --&gt; t12(&quot;ist_gueltiger_gpkg_pfad_lehnt_fehlendes_verzeichnis_ab&quot;)
g1 --&gt; t13(&quot;ist_leer_erkennt_none_und_nicht_string_als_leer&quot;)
g1 --&gt; t14(&quot;ist_leer_erkennt_reinen_whitespace_als_leer&quot;)
g1 --&gt; t15(&quot;ist_leer_meldet_pfad_mit_sichtbaren_zeichen_nicht_als_leer&quot;)
g1 --&gt; t16(&quot;leere_eingabe_bevorzugt_leereingabe_erlaubt_vor_standarddatei&quot;)
g1 --&gt; t17(&quot;leere_eingabe_bevorzugt_standarddatei_vor_temporaer_erlaubt&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestDateipruefer<br><span class="testname">test_leereingabe_erlaubt</span></td><td>Prüft, dass eine leere Pfadangabe bei leereingabe_erlaubt=True als &#x27;leereingabe_erlaubt&#x27; ohne Kontext gemeldet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDateipruefer<br><span class="testname">test_leereingabe_nicht_erlaubt</span></td><td>Prüft, dass eine leere Pfadangabe ohne leereingabe_erlaubt als &#x27;leereingabe_nicht_erlaubt&#x27; abgelehnt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDateipruefer<br><span class="testname">test_standarddatei_vorschlagen</span></td><td>Prüft, dass bei leerer Pfadangabe mit gesetzter Standarddatei &#x27;standarddatei_vorschlagen&#x27; mit dem Standardpfad als Kontext geliefert wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDateipruefer<br><span class="testname">test_temporaer_erlaubt</span></td><td>Prüft, dass eine leere Pfadangabe bei temporaer_erlaubt=True als &#x27;temporaer_erlaubt&#x27; ohne Kontext gemeldet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDateipruefer<br><span class="testname">test_datei_nicht_gefunden</span></td><td>Prüft, dass ein nicht existierender Dateipfad als &#x27;datei_nicht_gefunden&#x27; mit dem Pfad als Kontext abgelehnt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDateipruefer<br><span class="testname">test_datei_ok</span></td><td>Prüft, dass ein existierender Dateipfad als &#x27;ok&#x27; mit dem Pfad als Kontext bestätigt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDateipruefer<br><span class="testname">test_erkenne_dateityp_unterscheidet_excel_datenbank_und_unbekannt</span></td><td>Prüft, dass erkenne_dateityp .xlsx als &#x27;excel&#x27;, .gpkg/.sqlite als &#x27;datenbank&#x27; und Rest als &#x27;unbekannt&#x27; erkennt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDateipruefer<br><span class="testname">test_pfad_verbindet_relativen_pfad_mit_basispfad</span></td><td>Prüft, dass _pfad einen relativen Pfad mit dem Basisverzeichnis verbindet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDateipruefer<br><span class="testname">test_pfad_laesst_absoluten_pfad_unveraendert</span></td><td>Prüft, dass _pfad einen bereits absoluten Pfad nicht mit dem Basisverzeichnis verbindet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDateipruefer<br><span class="testname">test_ist_gueltiger_gpkg_pfad_akzeptiert_vorhandenes_verzeichnis</span></td><td>Prüft, dass ein .gpkg-Pfad mit vorhandenem Zielverzeichnis als gültig gilt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDateipruefer<br><span class="testname">test_ist_gueltiger_gpkg_pfad_lehnt_falsche_endung_ab</span></td><td>Prüft, dass ein Pfad ohne .gpkg-Endung als ungültig gilt, auch bei vorhandenem Verzeichnis.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDateipruefer<br><span class="testname">test_ist_gueltiger_gpkg_pfad_lehnt_fehlendes_verzeichnis_ab</span></td><td>Prüft, dass ein .gpkg-Pfad in einem nicht vorhandenen Verzeichnis als ungültig gilt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDateipruefer<br><span class="testname">test_ist_leer_erkennt_none_und_nicht_string_als_leer</span></td><td>Prüft, dass _ist_leer sowohl None als auch einen Nicht-String-Wert als leer meldet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDateipruefer<br><span class="testname">test_ist_leer_erkennt_reinen_whitespace_als_leer</span></td><td>Prüft, dass _ist_leer eine Eingabe aus reinen Leerzeichen als leer meldet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDateipruefer<br><span class="testname">test_ist_leer_meldet_pfad_mit_sichtbaren_zeichen_nicht_als_leer</span></td><td>Prüft, dass _ist_leer einen Pfad mit sichtbaren Zeichen nicht als leer meldet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDateipruefer<br><span class="testname">test_leere_eingabe_bevorzugt_leereingabe_erlaubt_vor_standarddatei</span></td><td>Prüft, dass bei leerer Eingabe leereingabe_erlaubt Vorrang vor einer gesetzten Standarddatei hat.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDateipruefer<br><span class="testname">test_leere_eingabe_bevorzugt_standarddatei_vor_temporaer_erlaubt</span></td><td>Prüft, dass bei leerer Eingabe eine gesetzte Standarddatei Vorrang vor temporaer_erlaubt hat.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_datenabruf.py determinespatialfiltertests test_raumfilter_ohne_liefert_none determinespatialfiltertests test_fehlender_layer_liefert_none determinespatialfiltertests test_unbekannter_raumfilter_liefert_none determinespatialfiltertests test_verfahrensgebiet_liefert_extent_und_crs determinespatialfiltertests test_verfahrensgebiet_ohne_extent_liefert_none determinespatialfiltertests test_pufferlayer_liefert_extent_des_pufferlayers determinespatialfiltertests test_pufferlayer_ohne_puffer_liefert_none buildproviderurltests test_wms_liefert_link_unveraendert buildproviderurltests test_url_praefix_wird_entfernt buildproviderurltests test_wfs_baut_standardparameter_und_bbox_mit_crs buildproviderurltests test_wfs_repariert_doppeltes_fragezeichen buildproviderurltests test_wfs_ohne_raumfilter_setzt_keine_bbox buildproviderurltests test_rest_provider_haengt_query_endpunkt_an buildproviderurltests test_rest_provider_mit_bbox_baut_geometry_envelope_und_srid buildproviderurltests test_default_provider_haengt_generischen_bbox_parameter_an buildproviderurltests test_default_provider_ohne_raumfilter_laesst_query_unveraendert fetchfeaturestests test_wms_liefert_keine_features_ohne_fehler fetchfeaturestests test_abbruch_vor_abruf_liefert_fehlermeldung fetchfeaturestests test_json_featurecollection_wird_geparst fetchfeaturestests test_netzwerkfehler_wird_als_fehlermeldung_gemeldet fetchfeaturestests test_wfs_xml_liefert_anzahl_aus_numberofmatched datenabruforchestrierungtests test_fehlende_pflichtfelder_werden_als_ungueltig_gemeldet datenabruforchestrierungtests test_wms_zeile_ohne_features_landet_in_ausserhalb datenabruforchestrierungtests test_abbruch_ueber_progress_stoppt_weitere_zeilen" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-datenabruf-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_datenabruf.py</span><span class="card-meta"><span class="count-total">24 Testfälle</span><span class="cpill cpill-ok">24</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-datenabruf-py"><p class="filedesc">Tests für sn_basis/modules/Datenabruf.py (Datenabruf-Kernpipeline, Issue #63).</p><div class="gchips"><span class="gchip" title="">DetermineSpatialFilterTests <b>7</b></span><span class="gchip" title="">BuildProviderUrlTests <b>9</b></span><span class="gchip" title="">FetchFeaturesTests <b>5</b></span><span class="gchip" title="">DatenabrufOrchestrierungTests <b>3</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_datenabruf.py&quot;])
class root rootnode
root --&gt; g1[&quot;DetermineSpatialFilterTests (7)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;raumfilter_ohne_liefert_none&quot;)
g1 --&gt; t2(&quot;fehlender_layer_liefert_none&quot;)
g1 --&gt; t3(&quot;unbekannter_raumfilter_liefert_none&quot;)
g1 --&gt; t4(&quot;verfahrensgebiet_liefert_extent_und_crs&quot;)
g1 --&gt; t5(&quot;verfahrensgebiet_ohne_extent_liefert_none&quot;)
g1 --&gt; t6(&quot;pufferlayer_liefert_extent_des_pufferlayers&quot;)
g1 --&gt; t7(&quot;pufferlayer_ohne_puffer_liefert_none&quot;)
root --&gt; g2[&quot;BuildProviderUrlTests (9)&quot;]
class g2 groupnode
g2 --&gt; t8(&quot;wms_liefert_link_unveraendert&quot;)
g2 --&gt; t9(&quot;url_praefix_wird_entfernt&quot;)
g2 --&gt; t10(&quot;wfs_baut_standardparameter_und_bbox_mit_crs&quot;)
g2 --&gt; t11(&quot;wfs_repariert_doppeltes_fragezeichen&quot;)
g2 --&gt; t12(&quot;wfs_ohne_raumfilter_setzt_keine_bbox&quot;)
g2 --&gt; t13(&quot;rest_provider_haengt_query_endpunkt_an&quot;)
g2 --&gt; t14(&quot;rest_provider_mit_bbox_baut_geometry_envelope_und_srid&quot;)
g2 --&gt; t15(&quot;default_provider_haengt_generischen_bbox_parameter_an&quot;)
g2 --&gt; t16(&quot;default_provider_ohne_raumfilter_laesst_query_unveraendert&quot;)
root --&gt; g3[&quot;FetchFeaturesTests (5)&quot;]
class g3 groupnode
g3 --&gt; t17(&quot;wms_liefert_keine_features_ohne_fehler&quot;)
g3 --&gt; t18(&quot;abbruch_vor_abruf_liefert_fehlermeldung&quot;)
g3 --&gt; t19(&quot;json_featurecollection_wird_geparst&quot;)
g3 --&gt; t20(&quot;netzwerkfehler_wird_als_fehlermeldung_gemeldet&quot;)
g3 --&gt; t21(&quot;wfs_xml_liefert_anzahl_aus_numberofmatched&quot;)
root --&gt; g4[&quot;DatenabrufOrchestrierungTests (3)&quot;]
class g4 groupnode
g4 --&gt; t22(&quot;fehlende_pflichtfelder_werden_als_ungueltig_gemeldet&quot;)
g4 --&gt; t23(&quot;wms_zeile_ohne_features_landet_in_ausserhalb&quot;)
g4 --&gt; t24(&quot;abbruch_ueber_progress_stoppt_weitere_zeilen&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">DetermineSpatialFilterTests<br><span class="testname">test_raumfilter_ohne_liefert_none</span></td><td>Prüft, dass Raumfilter &#x27;ohne&#x27; unabhängig vom Layer immer None liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">DetermineSpatialFilterTests<br><span class="testname">test_fehlender_layer_liefert_none</span></td><td>Prüft, dass ohne Verfahrensgebiet-Layer kein Raumfilter gebaut wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">DetermineSpatialFilterTests<br><span class="testname">test_unbekannter_raumfilter_liefert_none</span></td><td>Prüft, dass ein unbekannter Raumfilter-Wert None liefert, statt einen Fehler zu werfen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">DetermineSpatialFilterTests<br><span class="testname">test_verfahrensgebiet_liefert_extent_und_crs</span></td><td>Prüft, dass Raumfilter &#x27;Verfahrensgebiet&#x27; Extent und CRS des Verfahrensgebiet-Layers liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">DetermineSpatialFilterTests<br><span class="testname">test_verfahrensgebiet_ohne_extent_liefert_none</span></td><td>Prüft, dass ein Verfahrensgebiet-Layer ohne ermittelbaren Extent None liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">DetermineSpatialFilterTests<br><span class="testname">test_pufferlayer_liefert_extent_des_pufferlayers</span></td><td>Prüft, dass Raumfilter &#x27;Pufferlayer&#x27; Extent und CRS des erzeugten Pufferlayers liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">DetermineSpatialFilterTests<br><span class="testname">test_pufferlayer_ohne_puffer_liefert_none</span></td><td>Prüft, dass &#x27;Pufferlayer&#x27; None liefert, wenn kein Pufferlayer erzeugt werden konnte.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">BuildProviderUrlTests<br><span class="testname">test_wms_liefert_link_unveraendert</span></td><td>Prüft, dass bei Provider WMS der Link unverändert durchgereicht wird, auch mit Raumfilter.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">BuildProviderUrlTests<br><span class="testname">test_url_praefix_wird_entfernt</span></td><td>Prüft, dass ein vorangestelltes &#x27;url=&#x27; aus dem Link entfernt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">BuildProviderUrlTests<br><span class="testname">test_wfs_baut_standardparameter_und_bbox_mit_crs</span></td><td>Prüft, dass WFS-Abrufe Standardparameter, umbenanntes TYPENAMES und BBOX mit CRS-URN erhalten.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">BuildProviderUrlTests<br><span class="testname">test_wfs_repariert_doppeltes_fragezeichen</span></td><td>Prüft, dass ein zweites &#x27;?&#x27; im WFS-Link zu &#x27;&amp;&#x27; korrigiert wird, statt eine ungültige URL zu erzeugen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">BuildProviderUrlTests<br><span class="testname">test_wfs_ohne_raumfilter_setzt_keine_bbox</span></td><td>Prüft, dass WFS ohne Raumfilter (bbox_geom=None) keinen BBOX-Parameter setzt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">BuildProviderUrlTests<br><span class="testname">test_rest_provider_haengt_query_endpunkt_an</span></td><td>Prüft, dass REST/ArcGIS-Links ohne &#x27;/query&#x27;-Endpunkt automatisch ergänzt werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">BuildProviderUrlTests<br><span class="testname">test_rest_provider_mit_bbox_baut_geometry_envelope_und_srid</span></td><td>Prüft, dass REST-Abrufe mit Raumfilter eine Geometry-Envelope und inSR/outSR aus dem CRS setzen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">BuildProviderUrlTests<br><span class="testname">test_default_provider_haengt_generischen_bbox_parameter_an</span></td><td>Prüft, dass ein unbekannter Provider mit Raumfilter einen generischen bbox-Parameter erhält.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">BuildProviderUrlTests<br><span class="testname">test_default_provider_ohne_raumfilter_laesst_query_unveraendert</span></td><td>Prüft, dass ein unbekannter Provider ohne Raumfilter keinen bbox-Parameter ergänzt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FetchFeaturesTests<br><span class="testname">test_wms_liefert_keine_features_ohne_fehler</span></td><td>Prüft, dass bei Provider WMS kein Featureabruf stattfindet und kein Fehler gemeldet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FetchFeaturesTests<br><span class="testname">test_abbruch_vor_abruf_liefert_fehlermeldung</span></td><td>Prüft, dass ein bereits gesetzter Abbruch vor dem eigentlichen Abruf erkannt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FetchFeaturesTests<br><span class="testname">test_json_featurecollection_wird_geparst</span></td><td>Prüft, dass eine JSON-FeatureCollection-Antwort in eine Feature-Liste umgewandelt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FetchFeaturesTests<br><span class="testname">test_netzwerkfehler_wird_als_fehlermeldung_gemeldet</span></td><td>Prüft, dass ein fehlgeschlagener HTTP-Abruf eine Fehlermeldung statt einer Ausnahme liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FetchFeaturesTests<br><span class="testname">test_wfs_xml_liefert_anzahl_aus_numberofmatched</span></td><td>Prüft, dass eine WFS-XML-Antwort ohne JSON die Trefferzahl aus numberOfMatched übernimmt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">DatenabrufOrchestrierungTests<br><span class="testname">test_fehlende_pflichtfelder_werden_als_ungueltig_gemeldet</span></td><td>Prüft, dass eine Zeile ohne Link/Provider mit Aktion &#x27;pflichtfelder_fehlen&#x27; gemeldet und übersprungen wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">DatenabrufOrchestrierungTests<br><span class="testname">test_wms_zeile_ohne_features_landet_in_ausserhalb</span></td><td>Prüft, dass eine erfolgreich abgerufene WMS-Zeile mit 0 Features als &#x27;ausserhalb&#x27; gezählt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">DatenabrufOrchestrierungTests<br><span class="testname">test_abbruch_ueber_progress_stoppt_weitere_zeilen</span></td><td>Prüft, dass ein Abbruch über das Progress-Objekt die Verarbeitung weiterer Zeilen stoppt.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_datenschreiber.py writelayertogpkgtests test_ungueltiger_layer_liefert_fehlermeldung writelayertogpkgtests test_gueltiger_layer_wird_ohne_fehler_geschrieben resolvestylepathtests test_leerer_stilpfad_liefert_none resolvestylepathtests test_absoluter_vorhandener_stilpfad_wird_aufgeloest resolvestylepathtests test_nicht_vorhandener_stilpfad_liefert_none schreibedatentests test_ohne_speicherort_wirft_valueerror schreibedatentests test_eintrag_ohne_gueltigen_layer_wird_uebersprungen schreibedatentests test_erfolgreicher_eintrag_liefert_layer_path_und_thema schreibedatentests test_ohne_thema_wird_ident_als_layername_verwendet ladelayertests test_ohne_layer_path_wird_uebersprungen ladelayertests test_gueltiger_layer_wird_dem_projekt_hinzugefuegt ladelayertests test_ungueltiger_layer_meldet_layer_nicht_gefunden schreibelogtests test_ohne_speicherort_wirft_valueerror schreibelogtests test_schreibt_json_datei_mit_ergebnissen_und_gibt_pfad_zurueck storestyleingpkgtests test_legt_tabelle_an_und_speichert_stil_als_default storestyleingpkgtests test_setzt_bisherigen_default_stil_desselben_layers_zurueck storestyleingpkgtests test_liest_geometriespalte_ueber_geometrycolumn_aus storestyleingpkgtests test_fehlender_stilpfad_meldet_fehler_ueber_pruefmanager_statt_absturz" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-datenschreiber-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_datenschreiber.py</span><span class="card-meta"><span class="count-total">18 Testfälle</span><span class="cpill cpill-ok">18</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-datenschreiber-py"><p class="filedesc">Tests für sn_basis/modules/Datenschreiber.py (Schreib-/Ladepipeline, Issue #63).</p><div class="gchips"><span class="gchip" title="">WriteLayerToGpkgTests <b>2</b></span><span class="gchip" title="">ResolveStylePathTests <b>3</b></span><span class="gchip" title="">SchreibeDatenTests <b>4</b></span><span class="gchip" title="">LadeLayerTests <b>3</b></span><span class="gchip" title="">SchreibeLogTests <b>2</b></span><span class="gchip" title="Tests für Datenschreiber._store_style_in_gpkg (Issue #70, nachgezogen aus #63).">StoreStyleInGpkgTests <b>4</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_datenschreiber.py&quot;])
class root rootnode
root --&gt; g1[&quot;WriteLayerToGpkgTests (2)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;ungueltiger_layer_liefert_fehlermeldung&quot;)
g1 --&gt; t2(&quot;gueltiger_layer_wird_ohne_fehler_geschrieben&quot;)
root --&gt; g2[&quot;ResolveStylePathTests (3)&quot;]
class g2 groupnode
g2 --&gt; t3(&quot;leerer_stilpfad_liefert_none&quot;)
g2 --&gt; t4(&quot;absoluter_vorhandener_stilpfad_wird_aufgeloest&quot;)
g2 --&gt; t5(&quot;nicht_vorhandener_stilpfad_liefert_none&quot;)
root --&gt; g3[&quot;SchreibeDatenTests (4)&quot;]
class g3 groupnode
g3 --&gt; t6(&quot;ohne_speicherort_wirft_valueerror&quot;)
g3 --&gt; t7(&quot;eintrag_ohne_gueltigen_layer_wird_uebersprungen&quot;)
g3 --&gt; t8(&quot;erfolgreicher_eintrag_liefert_layer_path_und_thema&quot;)
g3 --&gt; t9(&quot;ohne_thema_wird_ident_als_layername_verwendet&quot;)
root --&gt; g4[&quot;LadeLayerTests (3)&quot;]
class g4 groupnode
g4 --&gt; t10(&quot;ohne_layer_path_wird_uebersprungen&quot;)
g4 --&gt; t11(&quot;gueltiger_layer_wird_dem_projekt_hinzugefuegt&quot;)
g4 --&gt; t12(&quot;ungueltiger_layer_meldet_layer_nicht_gefunden&quot;)
root --&gt; g5[&quot;SchreibeLogTests (2)&quot;]
class g5 groupnode
g5 --&gt; t13(&quot;ohne_speicherort_wirft_valueerror&quot;)
g5 --&gt; t14(&quot;schreibt_json_datei_mit_ergebnissen_und_gibt_pfad_zurueck&quot;)
root --&gt; g6[&quot;StoreStyleInGpkgTests (4)&quot;]
class g6 groupnode
g6 --&gt; t15(&quot;legt_tabelle_an_und_speichert_stil_als_default&quot;)
g6 --&gt; t16(&quot;setzt_bisherigen_default_stil_desselben_layers_zurueck&quot;)
g6 --&gt; t17(&quot;liest_geometriespalte_ueber_geometrycolumn_aus&quot;)
g6 --&gt; t18(&quot;fehlender_stilpfad_meldet_fehler_ueber_pruefmanager_statt_absturz&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">WriteLayerToGpkgTests<br><span class="testname">test_ungueltiger_layer_liefert_fehlermeldung</span></td><td>Prüft, dass ein ungültiger Layer eine Fehlermeldung statt eines Absturzes liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">WriteLayerToGpkgTests<br><span class="testname">test_gueltiger_layer_wird_ohne_fehler_geschrieben</span></td><td>Prüft, dass ein gültiger Layer im Mock-Modus ohne Fehlermeldung geschrieben wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ResolveStylePathTests<br><span class="testname">test_leerer_stilpfad_liefert_none</span></td><td>Prüft, dass ein leerer oder fehlender Stilpfad None liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ResolveStylePathTests<br><span class="testname">test_absoluter_vorhandener_stilpfad_wird_aufgeloest</span></td><td>Prüft, dass ein absoluter, vorhandener Stilpfad normalisiert und unverändert erkannt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ResolveStylePathTests<br><span class="testname">test_nicht_vorhandener_stilpfad_liefert_none</span></td><td>Prüft, dass ein nicht vorhandener Stilpfad None liefert, statt einen ungültigen Pfad zurückzugeben.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">SchreibeDatenTests<br><span class="testname">test_ohne_speicherort_wirft_valueerror</span></td><td>Prüft, dass schreibe_Daten ohne Speicherort einen ValueError wirft.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">SchreibeDatenTests<br><span class="testname">test_eintrag_ohne_gueltigen_layer_wird_uebersprungen</span></td><td>Prüft, dass ein Eintrag ohne gültigen Layer übersprungen wird und ein Fehlerergebnis meldet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">SchreibeDatenTests<br><span class="testname">test_erfolgreicher_eintrag_liefert_layer_path_und_thema</span></td><td>Prüft, dass ein gültiger Layer einen Layer-Path mit GPKG-Pfad und Layername liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">SchreibeDatenTests<br><span class="testname">test_ohne_thema_wird_ident_als_layername_verwendet</span></td><td>Prüft, dass ohne passendes Thema in processed_results der ident als Layername verwendet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">LadeLayerTests<br><span class="testname">test_ohne_layer_path_wird_uebersprungen</span></td><td>Prüft, dass ein Eintrag ohne layer_path übersprungen wird, ohne einen Fehler zu melden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">LadeLayerTests<br><span class="testname">test_gueltiger_layer_wird_dem_projekt_hinzugefuegt</span></td><td>Prüft, dass ein gültig ladbarer Layer ohne Fehlermeldung verarbeitet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">LadeLayerTests<br><span class="testname">test_ungueltiger_layer_meldet_layer_nicht_gefunden</span></td><td>Prüft, dass ein ungültig ladbarer Layer als &#x27;layer_nicht_gefunden&#x27; gemeldet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">SchreibeLogTests<br><span class="testname">test_ohne_speicherort_wirft_valueerror</span></td><td>Prüft, dass schreibe_log ohne Speicherort einen ValueError wirft.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">SchreibeLogTests<br><span class="testname">test_schreibt_json_datei_mit_ergebnissen_und_gibt_pfad_zurueck</span></td><td>Prüft, dass schreibe_log eine lesbare JSON-Log-Datei erzeugt und deren Pfad zurückgibt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">StoreStyleInGpkgTests<br><span class="testname">test_legt_tabelle_an_und_speichert_stil_als_default</span></td><td>Prüft, dass _store_style_in_gpkg die layer_styles-Tabelle anlegt und den Stil als Default speichert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">StoreStyleInGpkgTests<br><span class="testname">test_setzt_bisherigen_default_stil_desselben_layers_zurueck</span></td><td>Prüft, dass _store_style_in_gpkg den useAsDefault-Wert vorhandener Stile desselben Layers zurücksetzt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">StoreStyleInGpkgTests<br><span class="testname">test_liest_geometriespalte_ueber_geometrycolumn_aus</span></td><td>Prüft, dass _store_style_in_gpkg die Geometriespalte eines Layers mit geometryColumn() übernimmt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">StoreStyleInGpkgTests<br><span class="testname">test_fehlender_stilpfad_meldet_fehler_ueber_pruefmanager_statt_absturz</span></td><td>Prüft, dass ein nicht lesbarer Stilpfad über den Pruefmanager gemeldet wird statt eine Exception zu werfen.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_dockmanager.py dockmanagershowtests test_none_dock_meldet_fehler_und_zeigt_nichts_an dockmanagershowtests test_setzt_objectname_wenn_leer dockmanagershowtests test_entfernt_andere_sn_docks_aber_nicht_sich_selbst dockmanagershowtests test_zeigt_neues_dock_mit_default_area_an dockmanagershowtests test_fehler_beim_entfernen_wird_als_warnung_gemeldet dockmanagershowtests test_fehler_beim_anzeigen_wird_gemeldet" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-dockmanager-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_dockmanager.py</span><span class="card-meta"><span class="count-total">6 Testfälle</span><span class="cpill cpill-ok">6</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-dockmanager-py"><p class="filedesc">Tests für sn_basis/ui/dockmanager.py (nur ein Dock gleichzeitig sichtbar, Issue #65).</p><div class="gchips"><span class="gchip" title="">DockManagerShowTests <b>6</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_dockmanager.py&quot;])
class root rootnode
root --&gt; g1[&quot;DockManagerShowTests (6)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;none_dock_meldet_fehler_und_zeigt_nichts_an&quot;)
g1 --&gt; t2(&quot;setzt_objectname_wenn_leer&quot;)
g1 --&gt; t3(&quot;entfernt_andere_sn_docks_aber_nicht_sich_selbst&quot;)
g1 --&gt; t4(&quot;zeigt_neues_dock_mit_default_area_an&quot;)
g1 --&gt; t5(&quot;fehler_beim_entfernen_wird_als_warnung_gemeldet&quot;)
g1 --&gt; t6(&quot;fehler_beim_anzeigen_wird_gemeldet&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">DockManagerShowTests<br><span class="testname">test_none_dock_meldet_fehler_und_zeigt_nichts_an</span></td><td>Prüft, dass ein fehlendes Dock-Widget (None) einen Fehler meldet und nichts anzeigt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">DockManagerShowTests<br><span class="testname">test_setzt_objectname_wenn_leer</span></td><td>Prüft, dass ein Dock ohne Namen einen technischen Namen mit dem Präfix &#x27;sn_dock_&#x27; erhält.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">DockManagerShowTests<br><span class="testname">test_entfernt_andere_sn_docks_aber_nicht_sich_selbst</span></td><td>Prüft, dass andere sn_basis-Docks entfernt werden, das neue Dock und fremde Widgets aber unangetastet bleiben.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">DockManagerShowTests<br><span class="testname">test_zeigt_neues_dock_mit_default_area_an</span></td><td>Prüft, dass ein neues Dock mit der Standard-Area (DockAreaRight) angezeigt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">DockManagerShowTests<br><span class="testname">test_fehler_beim_entfernen_wird_als_warnung_gemeldet</span></td><td>Prüft, dass ein Fehler beim Entfernen alter Docks nur gewarnt und das neue Dock trotzdem angezeigt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">DockManagerShowTests<br><span class="testname">test_fehler_beim_anzeigen_wird_gemeldet</span></td><td>Prüft, dass ein Fehler beim Anzeigen des Docks als Fehler gemeldet wird.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_druck_kbs.py testtransformiererechteck test_verschiedene_kbs_werden_umgerechnet testtransformiererechteck test_gleiches_fehlendes_oder_ungueltiges_kbs_laesst_rechteck_unveraendert testtransformiererechteck test_fehler_bei_der_umrechnung_liefert_das_rechteck testzoomauflayer test_ausdehnung_wird_ins_kbs_der_kartenansicht_umgerechnet testzoomauflayer test_ohne_layer_oder_kartenansicht_kein_zoom testdruckkbs test_druck_kbs_ist_das_kbs_des_verfahrensgebiets testdruckkbs test_kartenfenster_wird_vom_kbs_der_kartenansicht_umgerechnet testdruckkbs test_auswahl_wird_vor_dem_puffern_vom_layer_kbs_umgerechnet testdruckkbs test_ohne_druck_kbs_wird_nicht_umgerechnet testdruckkbs test_druckrechteck_wird_ins_kbs_seines_layers_umgerechnet testlayoutkarteimdruckkbs test_hauptkarte_bekommt_das_kbs_vor_der_ausdehnung" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-druck-kbs-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_druck_kbs.py</span><span class="card-meta"><span class="count-total">11 Testfälle</span><span class="cpill cpill-ok">11</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-druck-kbs-py"><p class="filedesc">Tests zu Basis #99: Ist das Projekt-KBS ein anderes als das KBS des Verfahrensgebiets, müssen</p><div class="gchips"><span class="gchip" title="Umrechnung eines Rechtecks zwischen zwei KBS.">TestTransformiereRechteck <b>3</b></span><span class="gchip" title="Zoom der Kartenansicht auf einen Layer in einem anderen KBS.">TestZoomAufLayer <b>2</b></span><span class="gchip" title="KBS der Layoutkarte und Umrechnung der Druckbereiche.">TestDruckKbs <b>5</b></span><span class="gchip" title="Die Layoutkarte bekommt das Druck-KBS, bevor die Ausdehnung gesetzt wird.">TestLayoutkarteImDruckKbs <b>1</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_druck_kbs.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestTransformiereRechteck (3)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;verschiedene_kbs_werden_umgerechnet&quot;)
g1 --&gt; t2(&quot;gleiches_fehlendes_oder_ungueltiges_kbs_laesst_rechteck_unveraendert&quot;)
g1 --&gt; t3(&quot;fehler_bei_der_umrechnung_liefert_das_rechteck&quot;)
root --&gt; g2[&quot;TestZoomAufLayer (2)&quot;]
class g2 groupnode
g2 --&gt; t4(&quot;ausdehnung_wird_ins_kbs_der_kartenansicht_umgerechnet&quot;)
g2 --&gt; t5(&quot;ohne_layer_oder_kartenansicht_kein_zoom&quot;)
root --&gt; g3[&quot;TestDruckKbs (5)&quot;]
class g3 groupnode
g3 --&gt; t6(&quot;druck_kbs_ist_das_kbs_des_verfahrensgebiets&quot;)
g3 --&gt; t7(&quot;kartenfenster_wird_vom_kbs_der_kartenansicht_umgerechnet&quot;)
g3 --&gt; t8(&quot;auswahl_wird_vor_dem_puffern_vom_layer_kbs_umgerechnet&quot;)
g3 --&gt; t9(&quot;ohne_druck_kbs_wird_nicht_umgerechnet&quot;)
g3 --&gt; t10(&quot;druckrechteck_wird_ins_kbs_seines_layers_umgerechnet&quot;)
root --&gt; g4[&quot;TestLayoutkarteImDruckKbs (1)&quot;]
class g4 groupnode
g4 --&gt; t11(&quot;hauptkarte_bekommt_das_kbs_vor_der_ausdehnung&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestTransformiereRechteck<br><span class="testname">test_verschiedene_kbs_werden_umgerechnet</span></td><td>Prüft, dass ein Rechteck bei verschiedenen KBS mit QgsCoordinateTransform von Quell- nach Ziel-KBS umgerechnet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestTransformiereRechteck<br><span class="testname">test_gleiches_fehlendes_oder_ungueltiges_kbs_laesst_rechteck_unveraendert</span></td><td>Prüft, dass bei gleichem, fehlendem oder ungültigem KBS nicht umgerechnet und das Rechteck unverändert geliefert wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestTransformiereRechteck<br><span class="testname">test_fehler_bei_der_umrechnung_liefert_das_rechteck</span></td><td>Prüft, dass ein Fehler bei der Umrechnung nicht durchschlägt, sondern das ursprüngliche Rechteck zurückkommt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestZoomAufLayer<br><span class="testname">test_ausdehnung_wird_ins_kbs_der_kartenansicht_umgerechnet</span></td><td>Prüft, dass zoom_auf_layer die Layer-Ausdehnung vom Layer-KBS in das KBS der Kartenansicht umrechnet, bevor gezoomt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestZoomAufLayer<br><span class="testname">test_ohne_layer_oder_kartenansicht_kein_zoom</span></td><td>Prüft, dass zoom_auf_layer ohne Layer oder ohne Kartenansicht nichts tut und False liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDruckKbs<br><span class="testname">test_druck_kbs_ist_das_kbs_des_verfahrensgebiets</span></td><td>Prüft, dass die Layoutkarte im KBS des Verfahrensgebiet-Layers steht und ohne Verfahrensgebiet das Projekt-KBS gilt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDruckKbs<br><span class="testname">test_kartenfenster_wird_vom_kbs_der_kartenansicht_umgerechnet</span></td><td>Prüft, dass der Druckbereich „wie Kartenfenster“ vom KBS der Kartenansicht in das Druck-KBS umgerechnet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDruckKbs<br><span class="testname">test_auswahl_wird_vor_dem_puffern_vom_layer_kbs_umgerechnet</span></td><td>Prüft, dass der Druckbereich „Auswahl“ aus dem KBS des Auswahl-Layers umgerechnet und erst danach gepuffert wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDruckKbs<br><span class="testname">test_ohne_druck_kbs_wird_nicht_umgerechnet</span></td><td>Prüft, dass _resolve_extent ohne Druck-KBS wie bisher nicht umrechnet (Aufrufe ohne den neuen Parameter).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDruckKbs<br><span class="testname">test_druckrechteck_wird_ins_kbs_seines_layers_umgerechnet</span></td><td>Prüft, dass ein in der Kartenansicht gezeichnetes Druckrechteck vor dem Speichern in das KBS des Druckrechteck-Layers umgerechnet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayoutkarteImDruckKbs<br><span class="testname">test_hauptkarte_bekommt_das_kbs_vor_der_ausdehnung</span></td><td>Prüft, dass die Hauptkarte eines neuen Layouts das Druck-KBS erhält, bevor ihre Ausdehnung gesetzt wird.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_excel_importer.py importxlsxtests test_erfolgreicher_import_liefert_zeilen_als_dicts importxlsxtests test_fehlende_datei_liefert_leere_liste importxlsxtests test_arbeitsblatt_ohne_header_liefert_leere_liste_und_meldet_kein_header importxlsxtests test_header_zeile_nur_leere_werte_liefert_kein_header importxlsxtests test_nicht_lesbare_datei_liefert_leere_liste_und_meldet_read_error excelimporterkonstruktortests test_ohne_dateipfad_wirft_valueerror excelimporterkonstruktortests test_ohne_pruefmanager_wirft_valueerror" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-excel-importer-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_excel_importer.py</span><span class="card-meta"><span class="count-total">7 Testfälle</span><span class="cpill cpill-ok">7</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-excel-importer-py"><p class="filedesc">Tests für sn_basis/modules/excel_importer.py (Excel-Import für Linklisten, Issue #63).</p><div class="gchips"><span class="gchip" title="">ImportXlsxTests <b>5</b></span><span class="gchip" title="">ExcelImporterKonstruktorTests <b>2</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_excel_importer.py&quot;])
class root rootnode
root --&gt; g1[&quot;ImportXlsxTests (5)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;erfolgreicher_import_liefert_zeilen_als_dicts&quot;)
g1 --&gt; t2(&quot;fehlende_datei_liefert_leere_liste&quot;)
g1 --&gt; t3(&quot;arbeitsblatt_ohne_header_liefert_leere_liste_und_meldet_kein_header&quot;)
g1 --&gt; t4(&quot;header_zeile_nur_leere_werte_liefert_kein_header&quot;)
g1 --&gt; t5(&quot;nicht_lesbare_datei_liefert_leere_liste_und_meldet_read_error&quot;)
root --&gt; g2[&quot;ExcelImporterKonstruktorTests (2)&quot;]
class g2 groupnode
g2 --&gt; t6(&quot;ohne_dateipfad_wirft_valueerror&quot;)
g2 --&gt; t7(&quot;ohne_pruefmanager_wirft_valueerror&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">ImportXlsxTests<br><span class="testname">test_erfolgreicher_import_liefert_zeilen_als_dicts</span></td><td>Prüft, dass eine gültige Excel-Datei als Liste von Dicts mit den Header-Spalten geliefert wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ImportXlsxTests<br><span class="testname">test_fehlende_datei_liefert_leere_liste</span></td><td>Prüft, dass eine nicht vorhandene Datei eine leere Liste liefert, statt eine Ausnahme zu werfen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ImportXlsxTests<br><span class="testname">test_arbeitsblatt_ohne_header_liefert_leere_liste_und_meldet_kein_header</span></td><td>Prüft, dass ein leeres Arbeitsblatt ohne Header-Zeile &#x27;kein_header&#x27; meldet und eine leere Liste liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ImportXlsxTests<br><span class="testname">test_header_zeile_nur_leere_werte_liefert_kein_header</span></td><td>Prüft, dass eine Header-Zeile aus ausschließlich leeren Zellen ebenfalls als &#x27;kein_header&#x27; gilt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ImportXlsxTests<br><span class="testname">test_nicht_lesbare_datei_liefert_leere_liste_und_meldet_read_error</span></td><td>Prüft, dass eine Datei mit ungültigem Excel-Inhalt &#x27;read_error&#x27; meldet und eine leere Liste liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ExcelImporterKonstruktorTests<br><span class="testname">test_ohne_dateipfad_wirft_valueerror</span></td><td>Prüft, dass ExcelImporter ohne Dateipfad einen ValueError wirft.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ExcelImporterKonstruktorTests<br><span class="testname">test_ohne_pruefmanager_wirft_valueerror</span></td><td>Prüft, dass ExcelImporter ohne Pruefmanager einen ValueError wirft.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_laenderkennung.py testgetlaenderkennung test_bekannter_praefix_gibt_kennung_zurueck testgetlaenderkennung test_praefix_gross_klein_unabhaengig testgetlaenderkennung test_unbekannter_praefix_wirft_keyerror testgetlaenderkennung test_ohne_argument_wird_aus_aufrufendem_modul_abgeleitet testgetlaenderkennung test_mapping_enthaelt_sachsen" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-laenderkennung-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_laenderkennung.py</span><span class="card-meta"><span class="count-total">5 Testfälle</span><span class="cpill cpill-ok">5</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-laenderkennung-py"><p class="filedesc">Unit-Tests für `sn_basis.functions.laenderkennung`.</p><div class="gchips"><span class="gchip" title="">TestGetLaenderkennung <b>5</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_laenderkennung.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestGetLaenderkennung (5)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;bekannter_praefix_gibt_kennung_zurueck&quot;)
g1 --&gt; t2(&quot;praefix_gross_klein_unabhaengig&quot;)
g1 --&gt; t3(&quot;unbekannter_praefix_wirft_keyerror&quot;)
g1 --&gt; t4(&quot;ohne_argument_wird_aus_aufrufendem_modul_abgeleitet&quot;)
g1 --&gt; t5(&quot;mapping_enthaelt_sachsen&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestGetLaenderkennung<br><span class="testname">test_bekannter_praefix_gibt_kennung_zurueck</span></td><td>Prüft, dass der Präfix &#x27;sn&#x27; die ALKIS-Länderkennung &#x27;14&#x27; für Sachsen liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestGetLaenderkennung<br><span class="testname">test_praefix_gross_klein_unabhaengig</span></td><td>Prüft, dass die Präfixsuche groß-/kleinschreibungsunabhängig ist.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestGetLaenderkennung<br><span class="testname">test_unbekannter_praefix_wirft_keyerror</span></td><td>Prüft, dass ein unbekannter Präfix einen KeyError auslöst.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestGetLaenderkennung<br><span class="testname">test_ohne_argument_wird_aus_aufrufendem_modul_abgeleitet</span></td><td>Prüft, dass ohne Argument der Präfix aus dem Modulnamen des Aufrufers abgeleitet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestGetLaenderkennung<br><span class="testname">test_mapping_enthaelt_sachsen</span></td><td>Prüft, dass die Mapping-Tabelle LAENDERKENNUNGEN einen Eintrag für Sachsen (&#x27;sn&#x27; -&gt; &#x27;14&#x27;) enthält.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_landkreise.py ladelandkreisetests test_laedt_die_echte_landkreisliste_nicht_leer ladelandkreisetests test_fehlende_datei_liefert_leere_liste" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-landkreise-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_landkreise.py</span><span class="card-meta"><span class="count-total">2 Testfälle</span><span class="cpill cpill-ok">2</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-landkreise-py"><p class="filedesc">Tests für sn_basis/functions/landkreise.py::_lade_landkreise (Issue #65).</p><div class="gchips"><span class="gchip" title="">LadeLandkreiseTests <b>2</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_landkreise.py&quot;])
class root rootnode
root --&gt; g1[&quot;LadeLandkreiseTests (2)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;laedt_die_echte_landkreisliste_nicht_leer&quot;)
g1 --&gt; t2(&quot;fehlende_datei_liefert_leere_liste&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">LadeLandkreiseTests<br><span class="testname">test_laedt_die_echte_landkreisliste_nicht_leer</span></td><td>Prüft, dass _lade_landkreise die echte landkreise.json als nicht-leere Liste von (Kennzahl, Name)-Tupeln liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">LadeLandkreiseTests<br><span class="testname">test_fehlende_datei_liefert_leere_liste</span></td><td>Prüft, dass eine nicht lesbare Datenquelle eine leere Liste liefert, statt eine Ausnahme zu werfen.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_layerloader.py createlayertests test_wfs_baut_uri_ohne_getfeature_parameter createlayertests test_wfs_mit_url_praefix_wird_nicht_doppelt_gesetzt createlayertests test_wms_baut_url_praefix_und_nutzt_rasterlayer createlayertests test_rest_featureserver_ergaenzt_layer_index createlayertests test_ogr_provider_nutzt_link_direkt createlayertests test_ungueltiger_layer_meldet_layer_nicht_verfuegbar createlayertests test_ausnahme_beim_erstellen_wird_abgefangen transformgeometrytests test_fehlender_layer_liefert_geometrie_unveraendert transformgeometrytests test_gleiche_crs_liefert_geometrie_unveraendert transformgeometrytests test_unterschiedliche_crs_klont_und_transformiert_geometrie transformextenttests test_gleiche_crs_liefert_extent_unveraendert transformextenttests test_unterschiedliche_crs_nutzt_coordinate_transform filterbyextenttests test_ungueltiger_layer_wird_unveraendert_zurueckgegeben filterbyextenttests test_ohne_extent_wird_layer_unveraendert_zurueckgegeben filterbyextenttests test_falscher_layertyp_wird_unveraendert_zurueckgegeben filterbyextenttests test_keine_treffer_liefert_none filterbyextenttests test_abbruch_liefert_none_und_meldet_needs_user_action filterbyextenttests test_erfolgreicher_filter_liefert_neuen_layer_mit_features filterbylayertests test_ungueltiger_layer_oder_filterlayer_wird_unveraendert_zurueckgegeben filterbylayertests test_filterlayer_ohne_features_liefert_none filterbylayertests test_erfolgreicher_geometriefilter_liefert_neuen_layer filterbylayertests test_keine_ueberschneidung_liefert_none addtoprojecttests test_gueltiger_layer_wird_dem_projekt_hinzugefuegt addtoprojecttests test_ungueltiger_layer_wird_nicht_hinzugefuegt addtoprojecttests test_none_layer_wird_nicht_hinzugefuegt" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-layerloader-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_layerloader.py</span><span class="card-meta"><span class="count-total">25 Testfälle</span><span class="cpill cpill-ok">25</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-layerloader-py"><p class="filedesc">Tests für sn_basis/modules/LayerLoader.py (Layer erzeugen/filtern/laden, Issue #63).</p><div class="gchips"><span class="gchip" title="">CreateLayerTests <b>7</b></span><span class="gchip" title="">TransformGeometryTests <b>3</b></span><span class="gchip" title="">TransformExtentTests <b>2</b></span><span class="gchip" title="">FilterByExtentTests <b>6</b></span><span class="gchip" title="">FilterByLayerTests <b>4</b></span><span class="gchip" title="">AddToProjectTests <b>3</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_layerloader.py&quot;])
class root rootnode
root --&gt; g1[&quot;CreateLayerTests (7)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;wfs_baut_uri_ohne_getfeature_parameter&quot;)
g1 --&gt; t2(&quot;wfs_mit_url_praefix_wird_nicht_doppelt_gesetzt&quot;)
g1 --&gt; t3(&quot;wms_baut_url_praefix_und_nutzt_rasterlayer&quot;)
g1 --&gt; t4(&quot;rest_featureserver_ergaenzt_layer_index&quot;)
g1 --&gt; t5(&quot;ogr_provider_nutzt_link_direkt&quot;)
g1 --&gt; t6(&quot;ungueltiger_layer_meldet_layer_nicht_verfuegbar&quot;)
g1 --&gt; t7(&quot;ausnahme_beim_erstellen_wird_abgefangen&quot;)
root --&gt; g2[&quot;TransformGeometryTests (3)&quot;]
class g2 groupnode
g2 --&gt; t8(&quot;fehlender_layer_liefert_geometrie_unveraendert&quot;)
g2 --&gt; t9(&quot;gleiche_crs_liefert_geometrie_unveraendert&quot;)
g2 --&gt; t10(&quot;unterschiedliche_crs_klont_und_transformiert_geometrie&quot;)
root --&gt; g3[&quot;TransformExtentTests (2)&quot;]
class g3 groupnode
g3 --&gt; t11(&quot;gleiche_crs_liefert_extent_unveraendert&quot;)
g3 --&gt; t12(&quot;unterschiedliche_crs_nutzt_coordinate_transform&quot;)
root --&gt; g4[&quot;FilterByExtentTests (6)&quot;]
class g4 groupnode
g4 --&gt; t13(&quot;ungueltiger_layer_wird_unveraendert_zurueckgegeben&quot;)
g4 --&gt; t14(&quot;ohne_extent_wird_layer_unveraendert_zurueckgegeben&quot;)
g4 --&gt; t15(&quot;falscher_layertyp_wird_unveraendert_zurueckgegeben&quot;)
g4 --&gt; t16(&quot;keine_treffer_liefert_none&quot;)
g4 --&gt; t17(&quot;abbruch_liefert_none_und_meldet_needs_user_action&quot;)
g4 --&gt; t18(&quot;erfolgreicher_filter_liefert_neuen_layer_mit_features&quot;)
root --&gt; g5[&quot;FilterByLayerTests (4)&quot;]
class g5 groupnode
g5 --&gt; t19(&quot;ungueltiger_layer_oder_filterlayer_wird_unveraendert_zurueckgegeben&quot;)
g5 --&gt; t20(&quot;filterlayer_ohne_features_liefert_none&quot;)
g5 --&gt; t21(&quot;erfolgreicher_geometriefilter_liefert_neuen_layer&quot;)
g5 --&gt; t22(&quot;keine_ueberschneidung_liefert_none&quot;)
root --&gt; g6[&quot;AddToProjectTests (3)&quot;]
class g6 groupnode
g6 --&gt; t23(&quot;gueltiger_layer_wird_dem_projekt_hinzugefuegt&quot;)
g6 --&gt; t24(&quot;ungueltiger_layer_wird_nicht_hinzugefuegt&quot;)
g6 --&gt; t25(&quot;none_layer_wird_nicht_hinzugefuegt&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">CreateLayerTests<br><span class="testname">test_wfs_baut_uri_ohne_getfeature_parameter</span></td><td>Prüft, dass für WFS die GetFeature-spezifischen Parameter aus der URI entfernt werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">CreateLayerTests<br><span class="testname">test_wfs_mit_url_praefix_wird_nicht_doppelt_gesetzt</span></td><td>Prüft, dass ein bereits vorhandenes &#x27;url=&#x27;-Präfix im WFS-Link nicht verdoppelt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">CreateLayerTests<br><span class="testname">test_wms_baut_url_praefix_und_nutzt_rasterlayer</span></td><td>Prüft, dass WMS-Layer über QgsRasterLayer mit &#x27;url=&#x27;-Präfix erzeugt werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">CreateLayerTests<br><span class="testname">test_rest_featureserver_ergaenzt_layer_index</span></td><td>Prüft, dass ein REST-Link auf &#x27;.../FeatureServer&#x27; automatisch um &#x27;/0&#x27; ergänzt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">CreateLayerTests<br><span class="testname">test_ogr_provider_nutzt_link_direkt</span></td><td>Prüft, dass ein OGR-Provider den Link unverändert an QgsVectorLayer übergibt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">CreateLayerTests<br><span class="testname">test_ungueltiger_layer_meldet_layer_nicht_verfuegbar</span></td><td>Prüft, dass ein ungültig erzeugter Layer als &#x27;layer_nicht_verfuegbar&#x27; gemeldet wird und None liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">CreateLayerTests<br><span class="testname">test_ausnahme_beim_erstellen_wird_abgefangen</span></td><td>Prüft, dass eine Ausnahme beim Layer-Erstellen abgefangen und als Fehlerergebnis gemeldet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TransformGeometryTests<br><span class="testname">test_fehlender_layer_liefert_geometrie_unveraendert</span></td><td>Prüft, dass ohne Quell- oder Ziel-Layer die Geometrie unverändert zurückgegeben wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TransformGeometryTests<br><span class="testname">test_gleiche_crs_liefert_geometrie_unveraendert</span></td><td>Prüft, dass bei identischem CRS von Quelle und Ziel keine Transformation stattfindet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TransformGeometryTests<br><span class="testname">test_unterschiedliche_crs_klont_und_transformiert_geometrie</span></td><td>Prüft, dass bei unterschiedlichem CRS eine geklonte, transformierte Geometrie geliefert wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TransformExtentTests<br><span class="testname">test_gleiche_crs_liefert_extent_unveraendert</span></td><td>Prüft, dass bei identischem CRS von Quelle und Ziel der Extent unverändert bleibt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TransformExtentTests<br><span class="testname">test_unterschiedliche_crs_nutzt_coordinate_transform</span></td><td>Prüft, dass bei unterschiedlichem CRS der Extent über QgsCoordinateTransform umgerechnet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FilterByExtentTests<br><span class="testname">test_ungueltiger_layer_wird_unveraendert_zurueckgegeben</span></td><td>Prüft, dass ein ungültiger Layer von filter_by_extent unverändert zurückgegeben wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FilterByExtentTests<br><span class="testname">test_ohne_extent_wird_layer_unveraendert_zurueckgegeben</span></td><td>Prüft, dass ohne Extent (None) der Layer unverändert zurückgegeben wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FilterByExtentTests<br><span class="testname">test_falscher_layertyp_wird_unveraendert_zurueckgegeben</span></td><td>Prüft, dass ein Nicht-Vektor-Layer (z. B. Rasterlayer) unverändert zurückgegeben wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FilterByExtentTests<br><span class="testname">test_keine_treffer_liefert_none</span></td><td>Prüft, dass ein Raumfilter ohne Treffer None statt eines leeren Layers liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FilterByExtentTests<br><span class="testname">test_abbruch_liefert_none_und_meldet_needs_user_action</span></td><td>Prüft, dass ein Abbruch während des Raumfilters None liefert und gemeldet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FilterByExtentTests<br><span class="testname">test_erfolgreicher_filter_liefert_neuen_layer_mit_features</span></td><td>Prüft, dass ein erfolgreicher BBOX-Filter einen neuen Speicherlayer mit den gefundenen Features liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FilterByLayerTests<br><span class="testname">test_ungueltiger_layer_oder_filterlayer_wird_unveraendert_zurueckgegeben</span></td><td>Prüft, dass ein ungültiger Haupt- oder Filter-Layer unverändert zurückgegeben wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FilterByLayerTests<br><span class="testname">test_filterlayer_ohne_features_liefert_none</span></td><td>Prüft, dass ein Filter-Layer ohne Features (leere Vereinigungsgeometrie) None liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FilterByLayerTests<br><span class="testname">test_erfolgreicher_geometriefilter_liefert_neuen_layer</span></td><td>Prüft, dass ein erfolgreicher Geometriefilter einen neuen Speicherlayer mit den passenden Features liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FilterByLayerTests<br><span class="testname">test_keine_ueberschneidung_liefert_none</span></td><td>Prüft, dass ohne überschneidende Features None statt eines leeren Layers geliefert wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">AddToProjectTests<br><span class="testname">test_gueltiger_layer_wird_dem_projekt_hinzugefuegt</span></td><td>Prüft, dass ein gültiger Layer über QgsProject.instance().addMapLayer hinzugefügt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">AddToProjectTests<br><span class="testname">test_ungueltiger_layer_wird_nicht_hinzugefuegt</span></td><td>Prüft, dass ein ungültiger Layer nicht ans Projekt übergeben wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">AddToProjectTests<br><span class="testname">test_none_layer_wird_nicht_hinzugefuegt</span></td><td>Prüft, dass ein fehlender Layer (None) nicht ans Projekt übergeben wird.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_layerpruefer.py testlayerpruefer test_layer_exists testlayerpruefer test_layer_unsichtbar testlayerpruefer test_falscher_layertyp testlayerpruefer test_falscher_geotyp testlayerpruefer test_layer_leer testlayerpruefer test_falsches_crs testlayerpruefer test_felder_fehlen testlayerpruefer test_datenquelle_unerwartet testlayerpruefer test_layer_nicht_editierbar testlayerpruefer test_layer_ok" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-layerpruefer-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_layerpruefer.py</span><span class="card-meta"><span class="count-total">10 Testfälle</span><span class="cpill cpill-ok">10</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-layerpruefer-py"><p class="filedesc">— (Docstring fehlt)</p><div class="gchips"><span class="gchip" title="">TestLayerpruefer <b>10</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_layerpruefer.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestLayerpruefer (10)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;layer_exists&quot;)
g1 --&gt; t2(&quot;layer_unsichtbar&quot;)
g1 --&gt; t3(&quot;falscher_layertyp&quot;)
g1 --&gt; t4(&quot;falscher_geotyp&quot;)
g1 --&gt; t5(&quot;layer_leer&quot;)
g1 --&gt; t6(&quot;falsches_crs&quot;)
g1 --&gt; t7(&quot;felder_fehlen&quot;)
g1 --&gt; t8(&quot;datenquelle_unerwartet&quot;)
g1 --&gt; t9(&quot;layer_nicht_editierbar&quot;)
g1 --&gt; t10(&quot;layer_ok&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestLayerpruefer<br><span class="testname">test_layer_exists</span></td><td>Prüft, dass ein nicht vorhandener Layer als &#x27;layer_nicht_gefunden&#x27; abgelehnt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerpruefer<br><span class="testname">test_layer_unsichtbar</span></td><td>Prüft, dass ein unsichtbarer Layer bei geforderter Sichtbarkeit als &#x27;layer_unsichtbar&#x27; abgelehnt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerpruefer<br><span class="testname">test_falscher_layertyp</span></td><td>Prüft, dass ein Layer mit abweichendem Layertyp (Raster statt Vektor) als &#x27;falscher_layertyp&#x27; abgelehnt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerpruefer<br><span class="testname">test_falscher_geotyp</span></td><td>Prüft, dass ein Layer mit abweichendem Geometrietyp (Punkt statt Polygon) als &#x27;falscher_geotyp&#x27; abgelehnt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerpruefer<br><span class="testname">test_layer_leer</span></td><td>Prüft, dass ein Layer ohne Features als &#x27;layer_leer&#x27; abgelehnt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerpruefer<br><span class="testname">test_falsches_crs</span></td><td>Prüft, dass ein Layer mit abweichendem Koordinatenbezugssystem als &#x27;falsches_crs&#x27; abgelehnt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerpruefer<br><span class="testname">test_felder_fehlen</span></td><td>Prüft, dass ein Layer mit fehlenden Pflichtfeldern als &#x27;felder_fehlen&#x27; abgelehnt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerpruefer<br><span class="testname">test_datenquelle_unerwartet</span></td><td>Prüft, dass eine Datenquelle außerhalb der erlaubten Liste als &#x27;datenquelle_unerwartet&#x27; abgelehnt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerpruefer<br><span class="testname">test_layer_nicht_editierbar</span></td><td>Prüft, dass ein nicht editierbarer Layer bei geforderter Editierbarkeit als &#x27;layer_nicht_editierbar&#x27; abgelehnt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayerpruefer<br><span class="testname">test_layer_ok</span></td><td>Prüft, dass ein Layer, der alle Anforderungen erfüllt, als &#x27;ok&#x27; bestätigt wird.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_linkpruefer.py testlinkpruefer test_leere_eingabe testlinkpruefer test_remote_link_ok testlinkpruefer test_remote_link_error testlinkpruefer test_remote_link_network_error testlinkpruefer test_local_link_not_found testlinkpruefer test_local_link_ok" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-linkpruefer-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_linkpruefer.py</span><span class="card-meta"><span class="count-total">6 Testfälle</span><span class="cpill cpill-ok">6</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-linkpruefer-py"><p class="filedesc">— (Docstring fehlt)</p><div class="gchips"><span class="gchip" title="">TestLinkpruefer <b>6</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_linkpruefer.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestLinkpruefer (6)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;leere_eingabe&quot;)
g1 --&gt; t2(&quot;remote_link_ok&quot;)
g1 --&gt; t3(&quot;remote_link_error&quot;)
g1 --&gt; t4(&quot;remote_link_network_error&quot;)
g1 --&gt; t5(&quot;local_link_not_found&quot;)
g1 --&gt; t6(&quot;local_link_ok&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestLinkpruefer<br><span class="testname">test_leere_eingabe</span></td><td>Prüft, dass eine leere Eingabe ohne Netzwerk-/Dateizugriff als &#x27;leer&#x27; abgelehnt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLinkpruefer<br><span class="testname">test_remote_link_ok</span></td><td>Prüft, dass eine erreichbare Remote-URL (HTTP HEAD ohne Fehler) als &#x27;ok&#x27; bestätigt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLinkpruefer<br><span class="testname">test_remote_link_error</span></td><td>Prüft, dass eine Remote-URL mit Fehlerantwort als &#x27;url_nicht_erreichbar&#x27; abgelehnt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLinkpruefer<br><span class="testname">test_remote_link_network_error</span></td><td>Prüft, dass eine ausbleibende Netzwerkantwort (None) als &#x27;netzwerkfehler&#x27; gemeldet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLinkpruefer<br><span class="testname">test_local_link_not_found</span></td><td>Prüft, dass ein nicht existierender lokaler Pfad als &#x27;pfad_nicht_gefunden&#x27; abgelehnt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLinkpruefer<br><span class="testname">test_local_link_ok</span></td><td>Prüft, dass ein existierender lokaler Pfad als &#x27;ok&#x27; bestätigt wird.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_ly_existence_wrapper.py layerisvalidtests test_none_ist_nicht_gueltig layerisvalidtests test_objekt_ohne_isvalid_ist_nicht_gueltig layerisvalidtests test_gueltiger_layer_liefert_true layerisvalidtests test_ungueltiger_layer_liefert_false layerisvalidtests test_ausnahme_bei_isvalid_liefert_false layerisusabletests test_none_ist_nicht_nutzbar layerisusabletests test_gueltiger_layer_ist_nutzbar layerisusabletests test_ungueltiger_layer_ist_nicht_nutzbar" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-ly-existence-wrapper-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_ly_existence_wrapper.py</span><span class="card-meta"><span class="count-total">8 Testfälle</span><span class="cpill cpill-ok">8</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-ly-existence-wrapper-py"><p class="filedesc">Tests für sn_basis/functions/ly_existence_wrapper.py::layer_is_valid/layer_is_usable (Issue #65).</p><div class="gchips"><span class="gchip" title="">LayerIsValidTests <b>5</b></span><span class="gchip" title="">LayerIsUsableTests <b>3</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_ly_existence_wrapper.py&quot;])
class root rootnode
root --&gt; g1[&quot;LayerIsValidTests (5)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;none_ist_nicht_gueltig&quot;)
g1 --&gt; t2(&quot;objekt_ohne_isvalid_ist_nicht_gueltig&quot;)
g1 --&gt; t3(&quot;gueltiger_layer_liefert_true&quot;)
g1 --&gt; t4(&quot;ungueltiger_layer_liefert_false&quot;)
g1 --&gt; t5(&quot;ausnahme_bei_isvalid_liefert_false&quot;)
root --&gt; g2[&quot;LayerIsUsableTests (3)&quot;]
class g2 groupnode
g2 --&gt; t6(&quot;none_ist_nicht_nutzbar&quot;)
g2 --&gt; t7(&quot;gueltiger_layer_ist_nutzbar&quot;)
g2 --&gt; t8(&quot;ungueltiger_layer_ist_nicht_nutzbar&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">LayerIsValidTests<br><span class="testname">test_none_ist_nicht_gueltig</span></td><td>Prüft, dass layer_is_valid für None False liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">LayerIsValidTests<br><span class="testname">test_objekt_ohne_isvalid_ist_nicht_gueltig</span></td><td>Prüft, dass ein Objekt ohne isValid()-Methode als ungültig gilt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">LayerIsValidTests<br><span class="testname">test_gueltiger_layer_liefert_true</span></td><td>Prüft, dass ein Layer mit isValid()==True als gültig erkannt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">LayerIsValidTests<br><span class="testname">test_ungueltiger_layer_liefert_false</span></td><td>Prüft, dass ein Layer mit isValid()==False als ungültig erkannt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">LayerIsValidTests<br><span class="testname">test_ausnahme_bei_isvalid_liefert_false</span></td><td>Prüft, dass eine Ausnahme in isValid() abgefangen wird und False liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">LayerIsUsableTests<br><span class="testname">test_none_ist_nicht_nutzbar</span></td><td>Prüft, dass layer_is_usable für None False liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">LayerIsUsableTests<br><span class="testname">test_gueltiger_layer_ist_nutzbar</span></td><td>Prüft, dass ein vorhandener, gültiger Layer als nutzbar gilt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">LayerIsUsableTests<br><span class="testname">test_ungueltiger_layer_ist_nicht_nutzbar</span></td><td>Prüft, dass ein vorhandener, aber ungültiger Layer als nicht nutzbar gilt.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_ly_style_wrapper.py applystylefrompathtests test_fehlender_layer_liefert_false applystylefrompathtests test_erfolgreiches_laden_liefert_true_und_triggert_repaint applystylefrompathtests test_fehlgeschlagenes_laden_liefert_false_ohne_repaint applystylefrompathtests test_ausnahme_beim_laden_wird_abgefangen" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-ly-style-wrapper-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_ly_style_wrapper.py</span><span class="card-meta"><span class="count-total">4 Testfälle</span><span class="cpill cpill-ok">4</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-ly-style-wrapper-py"><p class="filedesc">Tests für sn_basis/functions/ly_style_wrapper.py::apply_style_from_path (Issue #65).</p><div class="gchips"><span class="gchip" title="">ApplyStyleFromPathTests <b>4</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_ly_style_wrapper.py&quot;])
class root rootnode
root --&gt; g1[&quot;ApplyStyleFromPathTests (4)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;fehlender_layer_liefert_false&quot;)
g1 --&gt; t2(&quot;erfolgreiches_laden_liefert_true_und_triggert_repaint&quot;)
g1 --&gt; t3(&quot;fehlgeschlagenes_laden_liefert_false_ohne_repaint&quot;)
g1 --&gt; t4(&quot;ausnahme_beim_laden_wird_abgefangen&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">ApplyStyleFromPathTests<br><span class="testname">test_fehlender_layer_liefert_false</span></td><td>Prüft, dass ein fehlender Layer (None) False liefert, ohne einen Stil zu laden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ApplyStyleFromPathTests<br><span class="testname">test_erfolgreiches_laden_liefert_true_und_triggert_repaint</span></td><td>Prüft, dass ein erfolgreich geladener Stil True liefert und den Layer neu zeichnet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ApplyStyleFromPathTests<br><span class="testname">test_fehlgeschlagenes_laden_liefert_false_ohne_repaint</span></td><td>Prüft, dass ein fehlgeschlagenes Laden False liefert, ohne den Layer neu zu zeichnen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ApplyStyleFromPathTests<br><span class="testname">test_ausnahme_beim_laden_wird_abgefangen</span></td><td>Prüft, dass eine Ausnahme beim Laden des Stils abgefangen wird und False liefert.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_message_wrapper.py getmessagebartests test_liefert_objekt_mit_pushmessage_methode getmessagebartests test_faellt_bei_fehlerhaftem_iface_auf_mock_bar_zurueck pushmessagetests test_liefert_dict_mit_titel_text_level_und_dauer pushmessagetests test_fehler_in_der_message_bar_wird_abgefangen" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-message-wrapper-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_message_wrapper.py</span><span class="card-meta"><span class="count-total">4 Testfälle</span><span class="cpill cpill-ok">4</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-message-wrapper-py"><p class="filedesc">Tests für sn_basis/functions/message_wrapper.py (Issue #65).</p><div class="gchips"><span class="gchip" title="">GetMessageBarTests <b>2</b></span><span class="gchip" title="">PushMessageTests <b>2</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_message_wrapper.py&quot;])
class root rootnode
root --&gt; g1[&quot;GetMessageBarTests (2)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;liefert_objekt_mit_pushmessage_methode&quot;)
g1 --&gt; t2(&quot;faellt_bei_fehlerhaftem_iface_auf_mock_bar_zurueck&quot;)
root --&gt; g2[&quot;PushMessageTests (2)&quot;]
class g2 groupnode
g2 --&gt; t3(&quot;liefert_dict_mit_titel_text_level_und_dauer&quot;)
g2 --&gt; t4(&quot;fehler_in_der_message_bar_wird_abgefangen&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">GetMessageBarTests<br><span class="testname">test_liefert_objekt_mit_pushmessage_methode</span></td><td>Prüft, dass _get_message_bar ein Objekt mit aufrufbarer pushMessage()-Methode liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">GetMessageBarTests<br><span class="testname">test_faellt_bei_fehlerhaftem_iface_auf_mock_bar_zurueck</span></td><td>Prüft, dass ein Fehler beim Zugriff auf iface.messageBar() auf eine funktionierende Mock-MessageBar zurückfällt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">PushMessageTests<br><span class="testname">test_liefert_dict_mit_titel_text_level_und_dauer</span></td><td>Prüft, dass push_message im Mock-Modus ein Dict mit den übergebenen Werten liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">PushMessageTests<br><span class="testname">test_fehler_in_der_message_bar_wird_abgefangen</span></td><td>Prüft, dass eine fehlschlagende MessageBar push_message nicht zum Absturz bringt, sondern None liefert.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_navigation.py addactiontests test_ohne_plugin_group_liefert_none addactiontests test_erzeugt_action_und_fuegt_sie_gruppe_und_liste_hinzu finalizemenuandtoolbartests test_ohne_menu_oder_toolbar_tut_nichts finalizemenuandtoolbartests test_sortiert_und_fuegt_aktionen_in_prioritaetsreihenfolge_hinzu setactiveplugintests test_setzt_nur_aktive_action_auf_checked setactiveplugintests test_ohne_aktive_action_setzt_alle_auf_false removeactiontests test_none_action_tut_nichts removeactiontests test_entfernt_action_aus_menu_toolbar_und_liste removeactiontests test_ohne_menu_oder_toolbar_entfernt_trotzdem_aus_liste removealltests test_entfernt_menu_toolbar_und_setzt_zustand_zurueck removealltests test_loescht_menu_und_toolbar_objekt_damit_kein_duplikat_uebrig_bleibt removealltests test_ohne_menu_und_toolbar_ruft_wrapper_nicht_auf" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-navigation-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_navigation.py</span><span class="card-meta"><span class="count-total">12 Testfälle</span><span class="cpill cpill-ok">12</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-navigation-py"><p class="filedesc">Tests für sn_basis/ui/navigation.py::Navigation (Issue #67, ohne init_ui – s. Docstring dort).</p><div class="gchips"><span class="gchip" title="">AddActionTests <b>2</b></span><span class="gchip" title="">FinalizeMenuAndToolbarTests <b>2</b></span><span class="gchip" title="">SetActivePluginTests <b>2</b></span><span class="gchip" title="">RemoveActionTests <b>3</b></span><span class="gchip" title="">RemoveAllTests <b>3</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_navigation.py&quot;])
class root rootnode
root --&gt; g1[&quot;AddActionTests (2)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;ohne_plugin_group_liefert_none&quot;)
g1 --&gt; t2(&quot;erzeugt_action_und_fuegt_sie_gruppe_und_liste_hinzu&quot;)
root --&gt; g2[&quot;FinalizeMenuAndToolbarTests (2)&quot;]
class g2 groupnode
g2 --&gt; t3(&quot;ohne_menu_oder_toolbar_tut_nichts&quot;)
g2 --&gt; t4(&quot;sortiert_und_fuegt_aktionen_in_prioritaetsreihenfolge_hinzu&quot;)
root --&gt; g3[&quot;SetActivePluginTests (2)&quot;]
class g3 groupnode
g3 --&gt; t5(&quot;setzt_nur_aktive_action_auf_checked&quot;)
g3 --&gt; t6(&quot;ohne_aktive_action_setzt_alle_auf_false&quot;)
root --&gt; g4[&quot;RemoveActionTests (3)&quot;]
class g4 groupnode
g4 --&gt; t7(&quot;none_action_tut_nichts&quot;)
g4 --&gt; t8(&quot;entfernt_action_aus_menu_toolbar_und_liste&quot;)
g4 --&gt; t9(&quot;ohne_menu_oder_toolbar_entfernt_trotzdem_aus_liste&quot;)
root --&gt; g5[&quot;RemoveAllTests (3)&quot;]
class g5 groupnode
g5 --&gt; t10(&quot;entfernt_menu_toolbar_und_setzt_zustand_zurueck&quot;)
g5 --&gt; t11(&quot;loescht_menu_und_toolbar_objekt_damit_kein_duplikat_uebrig_bleibt&quot;)
g5 --&gt; t12(&quot;ohne_menu_und_toolbar_ruft_wrapper_nicht_auf&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">AddActionTests<br><span class="testname">test_ohne_plugin_group_liefert_none</span></td><td>Prüft, dass add_action ohne initialisierte Aktionsgruppe None liefert und nichts anlegt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">AddActionTests<br><span class="testname">test_erzeugt_action_und_fuegt_sie_gruppe_und_liste_hinzu</span></td><td>Prüft, dass add_action eine Action erzeugt, ihr die Gruppe zuweist und sie priorisiert in der Liste ablegt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FinalizeMenuAndToolbarTests<br><span class="testname">test_ohne_menu_oder_toolbar_tut_nichts</span></td><td>Prüft, dass finalize_menu_and_toolbar ohne Menü oder Toolbar keine Ausnahme wirft.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FinalizeMenuAndToolbarTests<br><span class="testname">test_sortiert_und_fuegt_aktionen_in_prioritaetsreihenfolge_hinzu</span></td><td>Prüft, dass finalize_menu_and_toolbar Aktionen nach Priorität sortiert in Menü und Toolbar einträgt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">SetActivePluginTests<br><span class="testname">test_setzt_nur_aktive_action_auf_checked</span></td><td>Prüft, dass set_active_plugin nur die übergebene Action markiert, alle anderen abwählt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">SetActivePluginTests<br><span class="testname">test_ohne_aktive_action_setzt_alle_auf_false</span></td><td>Prüft, dass set_active_plugin ohne aktive Action alle bestehenden Actions abwählt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">RemoveActionTests<br><span class="testname">test_none_action_tut_nichts</span></td><td>Prüft, dass remove_action mit None keine Ausnahme wirft und die Liste unverändert lässt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">RemoveActionTests<br><span class="testname">test_entfernt_action_aus_menu_toolbar_und_liste</span></td><td>Prüft, dass remove_action die Action aus Menü, Toolbar und der internen Liste entfernt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">RemoveActionTests<br><span class="testname">test_ohne_menu_oder_toolbar_entfernt_trotzdem_aus_liste</span></td><td>Prüft, dass remove_action ohne Menü/Toolbar trotzdem aus der internen Liste entfernt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">RemoveAllTests<br><span class="testname">test_entfernt_menu_toolbar_und_setzt_zustand_zurueck</span></td><td>Prüft, dass remove_all Menü und Toolbar über die Wrapper entfernt und den Navigationszustand zurücksetzt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">RemoveAllTests<br><span class="testname">test_loescht_menu_und_toolbar_objekt_damit_kein_duplikat_uebrig_bleibt</span></td><td>Prüft, dass remove_all deleteLater() auf Menü und Toolbar aufruft, damit sie den Qt-Objektbaum tatsächlich verlassen (Issue #72).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">RemoveAllTests<br><span class="testname">test_ohne_menu_und_toolbar_ruft_wrapper_nicht_auf</span></td><td>Prüft, dass remove_all ohne vorhandenes Menü/Toolbar die Wrapper nicht aufruft, aber die Liste leert.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_os_wrapper.py iscasesensitivefstests test_windows_ist_nicht_case_sensitiv iscasesensitivefstests test_macos_ist_nicht_case_sensitiv iscasesensitivefstests test_linux_ist_case_sensitiv" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-os-wrapper-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_os_wrapper.py</span><span class="card-meta"><span class="count-total">3 Testfälle</span><span class="cpill cpill-ok">3</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-os-wrapper-py"><p class="filedesc">Tests für sn_basis/functions/os_wrapper.py::is_case_sensitive_fs (Issue #67).</p><div class="gchips"><span class="gchip" title="">IsCaseSensitiveFsTests <b>3</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_os_wrapper.py&quot;])
class root rootnode
root --&gt; g1[&quot;IsCaseSensitiveFsTests (3)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;windows_ist_nicht_case_sensitiv&quot;)
g1 --&gt; t2(&quot;macos_ist_nicht_case_sensitiv&quot;)
g1 --&gt; t3(&quot;linux_ist_case_sensitiv&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">IsCaseSensitiveFsTests<br><span class="testname">test_windows_ist_nicht_case_sensitiv</span></td><td>Prüft, dass Windows als nicht case-sensitives Dateisystem gilt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">IsCaseSensitiveFsTests<br><span class="testname">test_macos_ist_nicht_case_sensitiv</span></td><td>Prüft, dass macOS als nicht case-sensitives Dateisystem gilt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">IsCaseSensitiveFsTests<br><span class="testname">test_linux_ist_case_sensitiv</span></td><td>Prüft, dass Linux als case-sensitives Dateisystem gilt.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_print_kartenrand.py testberechneanordnung test_passt_einspaltig_nichts_aendert_sich testberechneanordnung test_mehr_spalten_und_breiterer_rand testberechneanordnung test_seite_wird_hoeher_wenn_auch_drei_spalten_nicht_reichen testberechneanordnung test_seite_wird_nie_kleiner testberechneanordnung test_ohne_legenden_nur_kartenschild testordnekartenrandan test_seite_hoeher_und_kartenschild_verschoben testordnekartenrandan test_spalten_ungleich_breit_und_text_umgebrochen testordnekartenrandan test_legenden_mindestens_so_breit_wie_kartenschild testordnekartenrandan test_passt_nichts_wird_verschoben testordnekartenrandan test_ohne_karte_keine_anordnung testmindestbreitebeimladen test_mindestbreite_nur_fuer_vermerkte_layouts testmindestbreitebeimladen test_listener_verbinden_und_trennen testmindestbreitebeimladen test_ohne_qgis_kein_listener testanbindungprintlayout test_vorlage_ordnet_kartenrand_an testanbindungprintlayout test_fehler_bei_der_anordnung_verhindert_die_vorlage_nicht" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-print-kartenrand-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_print_kartenrand.py</span><span class="card-meta"><span class="count-total">15 Testfälle</span><span class="cpill cpill-ok">15</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-print-kartenrand-py"><p class="filedesc">Tests für modules/print_kartenrand.py – Anordnung des Kartenrands neben der Karte (Basis #93).</p><div class="gchips"><span class="gchip" title="">TestBerechneAnordnung <b>5</b></span><span class="gchip" title="">TestOrdneKartenrandAn <b>5</b></span><span class="gchip" title="">TestMindestbreiteBeimLaden <b>3</b></span><span class="gchip" title="">TestAnbindungPrintLayout <b>2</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_print_kartenrand.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestBerechneAnordnung (5)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;passt_einspaltig_nichts_aendert_sich&quot;)
g1 --&gt; t2(&quot;mehr_spalten_und_breiterer_rand&quot;)
g1 --&gt; t3(&quot;seite_wird_hoeher_wenn_auch_drei_spalten_nicht_reichen&quot;)
g1 --&gt; t4(&quot;seite_wird_nie_kleiner&quot;)
g1 --&gt; t5(&quot;ohne_legenden_nur_kartenschild&quot;)
root --&gt; g2[&quot;TestOrdneKartenrandAn (5)&quot;]
class g2 groupnode
g2 --&gt; t6(&quot;seite_hoeher_und_kartenschild_verschoben&quot;)
g2 --&gt; t7(&quot;spalten_ungleich_breit_und_text_umgebrochen&quot;)
g2 --&gt; t8(&quot;legenden_mindestens_so_breit_wie_kartenschild&quot;)
g2 --&gt; t9(&quot;passt_nichts_wird_verschoben&quot;)
g2 --&gt; t10(&quot;ohne_karte_keine_anordnung&quot;)
root --&gt; g3[&quot;TestMindestbreiteBeimLaden (3)&quot;]
class g3 groupnode
g3 --&gt; t11(&quot;mindestbreite_nur_fuer_vermerkte_layouts&quot;)
g3 --&gt; t12(&quot;listener_verbinden_und_trennen&quot;)
g3 --&gt; t13(&quot;ohne_qgis_kein_listener&quot;)
root --&gt; g4[&quot;TestAnbindungPrintLayout (2)&quot;]
class g4 groupnode
g4 --&gt; t14(&quot;vorlage_ordnet_kartenrand_an&quot;)
g4 --&gt; t15(&quot;fehler_bei_der_anordnung_verhindert_die_vorlage_nicht&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestBerechneAnordnung<br><span class="testname">test_passt_einspaltig_nichts_aendert_sich</span></td><td>Prüft, dass bei genug Platz neben der Karte einspaltig angeordnet wird und Seite und Kartenschild bleiben.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBerechneAnordnung<br><span class="testname">test_mehr_spalten_und_breiterer_rand</span></td><td>Prüft, dass bei zu hohen Legenden die kleinste passende Spaltenzahl gewählt und der Kartenrand dafür verbreitert wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBerechneAnordnung<br><span class="testname">test_seite_wird_hoeher_wenn_auch_drei_spalten_nicht_reichen</span></td><td>Prüft, dass die Seite höher wird und Quellenangabe und Kartenschild nach unten rutschen, wenn auch drei Spalten nicht reichen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBerechneAnordnung<br><span class="testname">test_seite_wird_nie_kleiner</span></td><td>Prüft, dass Seitenbreite und -höhe nie unter die ursprüngliche Seitengröße fallen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBerechneAnordnung<br><span class="testname">test_ohne_legenden_nur_kartenschild</span></td><td>Prüft, dass ohne Legenden nur Quellenangabe und Kartenschild zählen und die Seite bei zu niedriger Karte höher wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestOrdneKartenrandAn<br><span class="testname">test_seite_hoeher_und_kartenschild_verschoben</span></td><td>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.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestOrdneKartenrandAn<br><span class="testname">test_spalten_ungleich_breit_und_text_umgebrochen</span></td><td>Prüft, dass die Legenden ungleich breite Spalten und einen automatischen Textumbruch bekommen, damit mehrspaltige Legenden nicht unnötig breit werden (#96).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestOrdneKartenrandAn<br><span class="testname">test_legenden_mindestens_so_breit_wie_kartenschild</span></td><td>Prüft, dass die Legenden die Breite des Kartenschilds als Mindestbreite bekommen und das Layout sie für das Neuladen vermerkt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestOrdneKartenrandAn<br><span class="testname">test_passt_nichts_wird_verschoben</span></td><td>Prüft, dass bei ausreichend hoher Karte weder Seite noch Kartenschild verändert werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestOrdneKartenrandAn<br><span class="testname">test_ohne_karte_keine_anordnung</span></td><td>Prüft, dass ein Layout ohne Hauptkarte unverändert bleibt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestMindestbreiteBeimLaden<br><span class="testname">test_mindestbreite_nur_fuer_vermerkte_layouts</span></td><td>Prüft, dass beim Laden die Mindestbreite nur an Layouts mit Vermerk wieder gesetzt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestMindestbreiteBeimLaden<br><span class="testname">test_listener_verbinden_und_trennen</span></td><td>Prüft, dass der Listener readProject einmal verbindet, beim Trennen wieder löst und beides mehrfach aufgerufen werden darf.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestMindestbreiteBeimLaden<br><span class="testname">test_ohne_qgis_kein_listener</span></td><td>Prüft, dass im Mock-Modus kein Listener verbunden wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAnbindungPrintLayout<br><span class="testname">test_vorlage_ordnet_kartenrand_an</span></td><td>Prüft, dass PrintLayout beim Anlegen einer Vorlage den Kartenrand anordnen lässt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAnbindungPrintLayout<br><span class="testname">test_fehler_bei_der_anordnung_verhindert_die_vorlage_nicht</span></td><td>Prüft, dass ein Fehler bei der Anordnung nur als Warnung gemeldet wird und keine Ausnahme durchreicht.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_print_layout.py testprintlayout test_create_legend_item_links_map_and_enables_map_filtering testprintlayout test_create_legend_item_does_not_copy_project_layers_into_legend_model testprintlayout test_configure_legend_size_uses_content_adaptive_size testprintlayout test_configure_hauptkarte_grids_uses_wrapper_constants testprintlayout test_create_single_page_layout_keeps_legend_linked_to_hauptkarte_and_theme" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-print-layout-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_print_layout.py</span><span class="card-meta"><span class="count-total">5 Testfälle</span><span class="cpill cpill-ok">5</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-print-layout-py"><p class="filedesc">— (Docstring fehlt)</p><div class="gchips"><span class="gchip" title="">TestPrintLayout <b>5</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_print_layout.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestPrintLayout (5)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;create_legend_item_links_map_and_enables_map_filtering&quot;)
g1 --&gt; t2(&quot;create_legend_item_does_not_copy_project_layers_into_legend_model&quot;)
g1 --&gt; t3(&quot;configure_legend_size_uses_content_adaptive_size&quot;)
g1 --&gt; t4(&quot;configure_hauptkarte_grids_uses_wrapper_constants&quot;)
g1 --&gt; t5(&quot;create_single_page_layout_keeps_legend_linked_to_hauptkarte_and_theme&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestPrintLayout<br><span class="testname">test_create_legend_item_links_map_and_enables_map_filtering</span></td><td>Prüft, dass eine erzeugte Legende mit der übergebenen Karte verknüpft ist und automatisch nach deren Sichtbarkeit gefiltert wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLayout<br><span class="testname">test_create_legend_item_does_not_copy_project_layers_into_legend_model</span></td><td>Prüft, dass eine neu erzeugte Legende keine Projekt-Layer in ihr Legendenmodell übernimmt (leere Root-Gruppe).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLayout<br><span class="testname">test_configure_legend_size_uses_content_adaptive_size</span></td><td>Prüft, dass die Legendengröße inhaltsadaptiv bestimmt wird (kein manuelles Resize) und die ermittelte Höhe zurückgegeben wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLayout<br><span class="testname">test_configure_hauptkarte_grids_uses_wrapper_constants</span></td><td>Prüft, dass das Gitternetz der Hauptkarte mit den erwarteten Stil-, Rahmen- und Beschriftungskonstanten (nur rechts/unten beschriftet, Schriftgröße und Hintergrund) konfiguriert wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLayout<br><span class="testname">test_create_single_page_layout_keeps_legend_linked_to_hauptkarte_and_theme</span></td><td>Prüft, dass ein einseitiges Layout die Hauptkarte auf das übergebene Kartenthema festlegt und die Legende mit dieser Karte verknüpft bleibt.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_print_logic.py testprintlogic test_get_baufreigabe_page_dimensions_prefers_a4_for_small_extent testprintlogic test_get_baufreigabe_page_dimensions_escalates_to_a3 testprintlogic test_get_baufreigabe_page_dimensions_respects_a4_as_maximum_with_fallback testprintlogic test_get_baufreigabe_page_dimensions_falls_back_to_a3_for_oversize_extent testprintlogic test_select_standard_page_layout_uses_a4_as_minimum_sheet testprintlogic test_select_standard_page_layout_limits_hauptkarte_to_a3 testprintlogic test_select_standard_page_layout_returns_none_if_a3_is_too_small testprintlogic test_get_standard_layout_dimensions_uses_a4_and_forces_fit_for_small_extent testprintlogic test_get_standard_layout_dimensions_caps_endlosrolle_width_at_2000_mm testprintlogic test_apply_standard_minimum_a4_fallback_for_small_page testprintlogic test_apply_standard_minimum_a4_fallback_keeps_large_page testprintlogic test_does_plot_fit_page_true_for_standard_a4 testprintlogic test_does_plot_fit_page_false_if_objects_exceed_page testprintlogic test_set_druckbereich_accepts_wie_kartenfenster testprintlogic test_get_canvas_extent_returns_valid_extent testprintlogic test_resolve_extent_uses_canvas_extent_without_buffer testprintlogic test_resolve_extent_uses_rectangle_extent_without_buffer" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-print-logic-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_print_logic.py</span><span class="card-meta"><span class="count-total">17 Testfälle</span><span class="cpill cpill-ok">17</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-print-logic-py"><p class="filedesc">— (Docstring fehlt)</p><div class="gchips"><span class="gchip" title="">TestPrintLogic <b>17</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_print_logic.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestPrintLogic (17)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;get_baufreigabe_page_dimensions_prefers_a4_for_small_extent&quot;)
g1 --&gt; t2(&quot;get_baufreigabe_page_dimensions_escalates_to_a3&quot;)
g1 --&gt; t3(&quot;get_baufreigabe_page_dimensions_respects_a4_as_maximum_with_fallback&quot;)
g1 --&gt; t4(&quot;get_baufreigabe_page_dimensions_falls_back_to_a3_for_oversize_extent&quot;)
g1 --&gt; t5(&quot;select_standard_page_layout_uses_a4_as_minimum_sheet&quot;)
g1 --&gt; t6(&quot;select_standard_page_layout_limits_hauptkarte_to_a3&quot;)
g1 --&gt; t7(&quot;select_standard_page_layout_returns_none_if_a3_is_too_small&quot;)
g1 --&gt; t8(&quot;get_standard_layout_dimensions_uses_a4_and_forces_fit_for_small_extent&quot;)
g1 --&gt; t9(&quot;get_standard_layout_dimensions_caps_endlosrolle_width_at_2000_mm&quot;)
g1 --&gt; t10(&quot;apply_standard_minimum_a4_fallback_for_small_page&quot;)
g1 --&gt; t11(&quot;apply_standard_minimum_a4_fallback_keeps_large_page&quot;)
g1 --&gt; t12(&quot;does_plot_fit_page_true_for_standard_a4&quot;)
g1 --&gt; t13(&quot;does_plot_fit_page_false_if_objects_exceed_page&quot;)
g1 --&gt; t14(&quot;set_druckbereich_accepts_wie_kartenfenster&quot;)
g1 --&gt; t15(&quot;get_canvas_extent_returns_valid_extent&quot;)
g1 --&gt; t16(&quot;resolve_extent_uses_canvas_extent_without_buffer&quot;)
g1 --&gt; t17(&quot;resolve_extent_uses_rectangle_extent_without_buffer&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestPrintLogic<br><span class="testname">test_get_baufreigabe_page_dimensions_prefers_a4_for_small_extent</span></td><td>Prüft, dass für einen kleinen Kartenausschnitt (Baufreigabe) das Format DIN A4 ohne Fallback gewählt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLogic<br><span class="testname">test_get_baufreigabe_page_dimensions_escalates_to_a3</span></td><td>Prüft, dass ein größerer Kartenausschnitt (Baufreigabe) auf DIN A3 eskaliert wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLogic<br><span class="testname">test_get_baufreigabe_page_dimensions_respects_a4_as_maximum_with_fallback</span></td><td>Prüft, dass bei auf DIN A4 begrenztem Höchstformat ein eigentlich A3-großer Ausschnitt mit Fallback-Kennzeichnung auf A4 reduziert wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLogic<br><span class="testname">test_get_baufreigabe_page_dimensions_falls_back_to_a3_for_oversize_extent</span></td><td>Prüft, dass ein Ausschnitt, der auch DIN A3 übersteigt, mit Fallback-Kennzeichnung auf DIN A3 begrenzt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLogic<br><span class="testname">test_select_standard_page_layout_uses_a4_as_minimum_sheet</span></td><td>Prüft, dass für einen kleinen Ausschnitt trotz Höchstgrenze DIN A3 mindestens DIN A4 als Blattgröße gewählt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLogic<br><span class="testname">test_select_standard_page_layout_limits_hauptkarte_to_a3</span></td><td>Prüft, dass ein die Fläche voll ausnutzender Ausschnitt auf DIN A3 als größtes zulässiges Format begrenzt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLogic<br><span class="testname">test_select_standard_page_layout_returns_none_if_a3_is_too_small</span></td><td>Prüft, dass kein Layout gewählt wird (None), wenn der Ausschnitt selbst DIN A3 als Höchstformat übersteigt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLogic<br><span class="testname">test_get_standard_layout_dimensions_uses_a4_and_forces_fit_for_small_extent</span></td><td>Prüft, dass für einen kleinen Ausschnitt DIN A4 gewählt und das Einpassen (force_fit) erzwungen wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLogic<br><span class="testname">test_get_standard_layout_dimensions_caps_endlosrolle_width_at_2000_mm</span></td><td>Prüft, dass bei aktiviertem Formfaktor (Endlosrolle) die Seitenbreite auf die maximale Rollenbreite (2000 mm) begrenzt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLogic<br><span class="testname">test_apply_standard_minimum_a4_fallback_for_small_page</span></td><td>Prüft, dass eine zu kleine Seite auf die A4-Mindestgröße angehoben und als erzwungen (forced) markiert wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLogic<br><span class="testname">test_apply_standard_minimum_a4_fallback_keeps_large_page</span></td><td>Prüft, dass eine bereits ausreichend große Seite (A3) unverändert bleibt und nicht als erzwungen markiert wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLogic<br><span class="testname">test_does_plot_fit_page_true_for_standard_a4</span></td><td>Prüft, dass ein Kartenobjekt, das in eine DIN A4-Seite passt, als passend erkannt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLogic<br><span class="testname">test_does_plot_fit_page_false_if_objects_exceed_page</span></td><td>Prüft, dass ein Kartenobjekt, das die Seitenbreite überschreitet, als nicht passend erkannt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLogic<br><span class="testname">test_set_druckbereich_accepts_wie_kartenfenster</span></td><td>Prüft, dass die Auswahl &#x27;wie Kartenfenster&#x27; als Projektvariable &#x27;druckbereich&#x27; gespeichert wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLogic<br><span class="testname">test_get_canvas_extent_returns_valid_extent</span></td><td>Prüft, dass der aktuelle Kartenausschnitt des Kartenfensters unverändert zurückgegeben wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLogic<br><span class="testname">test_resolve_extent_uses_canvas_extent_without_buffer</span></td><td>Prüft, dass bei Druckbereich &#x27;wie Kartenfenster&#x27; der Kartenausschnitt ohne Puffer und ohne verknüpften Layer übernommen wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPrintLogic<br><span class="testname">test_resolve_extent_uses_rectangle_extent_without_buffer</span></td><td>Prüft, dass bei Druckbereich &#x27;Rechteck&#x27; der gezeichnete Ausschnitt ohne Puffer und ohne verknüpften Layer übernommen wird.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_print_tab.py setservicestests test_ruft_alle_set_methoden_mit_combo_werten_auf setservicestests test_ohne_combos_ruft_keine_set_methode_auf restorestatetests test_gueltige_gespeicherte_werte_werden_uebernommen restorestatetests test_ungueltige_oder_fehlende_werte_fallen_auf_defaults_zurueck ondruckpufferclickedtests test_gueltige_zahl_setzt_variable_und_button_text ondruckpufferclickedtests test_abgebrochen_aendert_nichts ondruckpufferclickedtests test_ungueltige_zahl_zeigt_hinweis_und_setzt_nichts onvorlageerstellentests test_ruft_druckvorlage_anlegen_mit_combo_werten_auf onvorlageerstellentests test_ohne_logic_tut_nichts projectsignalstests test_connect_verbindet_alle_drei_signale projectsignalstests test_disconnect_trennt_alle_drei_signale projectsignalstests test_instance_wirft_ausnahme_wird_abgefangen cleanuptests test_ruft_beide_disconnect_methoden_auf toggleatlastests test_checked_true_setzt_arrow_down_und_zeigt_inhalt toggleatlastests test_checked_false_setzt_arrow_right_und_versteckt_inhalt restoreatlaslayerselectiontests test_vorhandene_layer_id_setzt_layer_in_combo restoreatlaslayerselectiontests test_leere_gespeicherte_layer_id_tut_nichts themecollectionsignalstests test_connect_verbindet_alle_signale themecollectionsignalstests test_connect_ist_idempotent_wenn_schon_verbunden themecollectionsignalstests test_disconnect_trennt_alle_signale refreshthemacombolivetests test_erhaelt_vorherige_auswahl_wenn_noch_vorhanden refreshthemacombolivetests test_faellt_auf_wie_kartenfenster_zurueck_wenn_auswahl_verschwunden getgespeichertethementests test_dedupliziert_und_filtert_leere_eintraege getgespeichertethementests test_fehler_liefert_leere_liste getcurrentcanvasscaletests test_liefert_skalierung_als_float getcurrentcanvasscaletests test_ohne_canvas_liefert_none getcurrentcanvasscaletests test_skalierung_null_liefert_none onatlaslayerchangedtests test_none_oder_leer_setzt_variable_leer onatlaslayerchangedtests test_layer_objekt_mit_id_methode_setzt_dessen_id onatlaslayerchangedtests test_string_fallback_sucht_layer_ueber_namen onauswahlasatlasclickedtests test_erfolgreicher_layer_aktualisiert_atlas_ui onauswahlasatlasclickedtests test_ohne_erzeugten_layer_tut_nichts_weiter populateatlaslayercombotests test_befuellt_combo_ohne_druckrechteck_und_leere_namen populateatlaslayercombotests test_ohne_atlas_layer_combo_tut_nichts onatlaserzeugenchangedtests test_aktiviert_speichert_variable_und_aktiviert_widgets onatlaserzeugenchangedtests test_deaktiviert_speichert_variable_und_deaktiviert_widgets onatlaserzeugenchangedtests test_ohne_widgets_wirft_keine_ausnahme" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-print-tab-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_print_tab.py</span><span class="card-meta"><span class="count-total">37 Testfälle</span><span class="cpill cpill-ok">37</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-print-tab-py"><p class="filedesc">Tests für sn_basis/ui/tabs/print_tab.py::PrintTab (Issue #67).</p><div class="gchips"><span class="gchip" title="">SetServicesTests <b>2</b></span><span class="gchip" title="">RestoreStateTests <b>2</b></span><span class="gchip" title="">OnDruckpufferClickedTests <b>3</b></span><span class="gchip" title="">OnVorlageErstellenTests <b>2</b></span><span class="gchip" title="">ProjectSignalsTests <b>3</b></span><span class="gchip" title="">CleanupTests <b>1</b></span><span class="gchip" title="">ToggleAtlasTests <b>2</b></span><span class="gchip" title="">RestoreAtlasLayerSelectionTests <b>2</b></span><span class="gchip" title="">ThemeCollectionSignalsTests <b>3</b></span><span class="gchip" title="">RefreshThemaComboLiveTests <b>2</b></span><span class="gchip" title="">GetGespeicherteThemenTests <b>2</b></span><span class="gchip" title="">GetCurrentCanvasScaleTests <b>3</b></span><span class="gchip" title="">OnAtlasLayerChangedTests <b>3</b></span><span class="gchip" title="">OnAuswahlAsAtlasClickedTests <b>2</b></span><span class="gchip" title="">PopulateAtlasLayerComboTests <b>2</b></span><span class="gchip" title="">OnAtlasErzeugenChangedTests <b>3</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_print_tab.py&quot;])
class root rootnode
root --&gt; g1[&quot;SetServicesTests (2)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;ruft_alle_set_methoden_mit_combo_werten_auf&quot;)
g1 --&gt; t2(&quot;ohne_combos_ruft_keine_set_methode_auf&quot;)
root --&gt; g2[&quot;RestoreStateTests (2)&quot;]
class g2 groupnode
g2 --&gt; t3(&quot;gueltige_gespeicherte_werte_werden_uebernommen&quot;)
g2 --&gt; t4(&quot;ungueltige_oder_fehlende_werte_fallen_auf_defaults_zurueck&quot;)
root --&gt; g3[&quot;OnDruckpufferClickedTests (3)&quot;]
class g3 groupnode
g3 --&gt; t5(&quot;gueltige_zahl_setzt_variable_und_button_text&quot;)
g3 --&gt; t6(&quot;abgebrochen_aendert_nichts&quot;)
g3 --&gt; t7(&quot;ungueltige_zahl_zeigt_hinweis_und_setzt_nichts&quot;)
root --&gt; g4[&quot;OnVorlageErstellenTests (2)&quot;]
class g4 groupnode
g4 --&gt; t8(&quot;ruft_druckvorlage_anlegen_mit_combo_werten_auf&quot;)
g4 --&gt; t9(&quot;ohne_logic_tut_nichts&quot;)
root --&gt; g5[&quot;ProjectSignalsTests (3)&quot;]
class g5 groupnode
g5 --&gt; t10(&quot;connect_verbindet_alle_drei_signale&quot;)
g5 --&gt; t11(&quot;disconnect_trennt_alle_drei_signale&quot;)
g5 --&gt; t12(&quot;instance_wirft_ausnahme_wird_abgefangen&quot;)
root --&gt; g6[&quot;CleanupTests (1)&quot;]
class g6 groupnode
g6 --&gt; t13(&quot;ruft_beide_disconnect_methoden_auf&quot;)
root --&gt; g7[&quot;ToggleAtlasTests (2)&quot;]
class g7 groupnode
g7 --&gt; t14(&quot;checked_true_setzt_arrow_down_und_zeigt_inhalt&quot;)
g7 --&gt; t15(&quot;checked_false_setzt_arrow_right_und_versteckt_inhalt&quot;)
root --&gt; g8[&quot;RestoreAtlasLayerSelectionTests (2)&quot;]
class g8 groupnode
g8 --&gt; t16(&quot;vorhandene_layer_id_setzt_layer_in_combo&quot;)
g8 --&gt; t17(&quot;leere_gespeicherte_layer_id_tut_nichts&quot;)
root --&gt; g9[&quot;ThemeCollectionSignalsTests (3)&quot;]
class g9 groupnode
g9 --&gt; t18(&quot;connect_verbindet_alle_signale&quot;)
g9 --&gt; t19(&quot;connect_ist_idempotent_wenn_schon_verbunden&quot;)
g9 --&gt; t20(&quot;disconnect_trennt_alle_signale&quot;)
root --&gt; g10[&quot;RefreshThemaComboLiveTests (2)&quot;]
class g10 groupnode
g10 --&gt; t21(&quot;erhaelt_vorherige_auswahl_wenn_noch_vorhanden&quot;)
g10 --&gt; t22(&quot;faellt_auf_wie_kartenfenster_zurueck_wenn_auswahl_verschwunden&quot;)
root --&gt; g11[&quot;GetGespeicherteThemenTests (2)&quot;]
class g11 groupnode
g11 --&gt; t23(&quot;dedupliziert_und_filtert_leere_eintraege&quot;)
g11 --&gt; t24(&quot;fehler_liefert_leere_liste&quot;)
root --&gt; g12[&quot;GetCurrentCanvasScaleTests (3)&quot;]
class g12 groupnode
g12 --&gt; t25(&quot;liefert_skalierung_als_float&quot;)
g12 --&gt; t26(&quot;ohne_canvas_liefert_none&quot;)
g12 --&gt; t27(&quot;skalierung_null_liefert_none&quot;)
root --&gt; g13[&quot;OnAtlasLayerChangedTests (3)&quot;]
class g13 groupnode
g13 --&gt; t28(&quot;none_oder_leer_setzt_variable_leer&quot;)
g13 --&gt; t29(&quot;layer_objekt_mit_id_methode_setzt_dessen_id&quot;)
g13 --&gt; t30(&quot;string_fallback_sucht_layer_ueber_namen&quot;)
root --&gt; g14[&quot;OnAuswahlAsAtlasClickedTests (2)&quot;]
class g14 groupnode
g14 --&gt; t31(&quot;erfolgreicher_layer_aktualisiert_atlas_ui&quot;)
g14 --&gt; t32(&quot;ohne_erzeugten_layer_tut_nichts_weiter&quot;)
root --&gt; g15[&quot;PopulateAtlasLayerComboTests (2)&quot;]
class g15 groupnode
g15 --&gt; t33(&quot;befuellt_combo_ohne_druckrechteck_und_leere_namen&quot;)
g15 --&gt; t34(&quot;ohne_atlas_layer_combo_tut_nichts&quot;)
root --&gt; g16[&quot;OnAtlasErzeugenChangedTests (3)&quot;]
class g16 groupnode
g16 --&gt; t35(&quot;aktiviert_speichert_variable_und_aktiviert_widgets&quot;)
g16 --&gt; t36(&quot;deaktiviert_speichert_variable_und_deaktiviert_widgets&quot;)
g16 --&gt; t37(&quot;ohne_widgets_wirft_keine_ausnahme&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">SetServicesTests<br><span class="testname">test_ruft_alle_set_methoden_mit_combo_werten_auf</span></td><td>Prüft, dass set_services alle set_*-Methoden von PrintLogic mit den aktuellen Combo-Werten aufruft.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">SetServicesTests<br><span class="testname">test_ohne_combos_ruft_keine_set_methode_auf</span></td><td>Prüft, dass set_services ohne vorhandene Combos keine set_*-Methode von PrintLogic aufruft.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">RestoreStateTests<br><span class="testname">test_gueltige_gespeicherte_werte_werden_uebernommen</span></td><td>Prüft, dass _restore_state gültige gespeicherte Werte in die jeweiligen Widgets übernimmt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">RestoreStateTests<br><span class="testname">test_ungueltige_oder_fehlende_werte_fallen_auf_defaults_zurueck</span></td><td>Prüft, dass _restore_state ohne (gültige) gespeicherte Werte auf die Default-Konstanten zurückfällt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">OnDruckpufferClickedTests<br><span class="testname">test_gueltige_zahl_setzt_variable_und_button_text</span></td><td>Prüft, dass eine bestätigte, gültige Zahl den Druckpuffer speichert und den Button-Text aktualisiert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">OnDruckpufferClickedTests<br><span class="testname">test_abgebrochen_aendert_nichts</span></td><td>Prüft, dass ein abgebrochener Dialog den Druckpuffer nicht verändert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">OnDruckpufferClickedTests<br><span class="testname">test_ungueltige_zahl_zeigt_hinweis_und_setzt_nichts</span></td><td>Prüft, dass eine nicht-numerische Eingabe einen Hinweis zeigt und den Druckpuffer nicht setzt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">OnVorlageErstellenTests<br><span class="testname">test_ruft_druckvorlage_anlegen_mit_combo_werten_auf</span></td><td>Prüft, dass _on_vorlage_erstellen druckvorlage_anlegen mit den aktuellen Combo-Werten aufruft.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">OnVorlageErstellenTests<br><span class="testname">test_ohne_logic_tut_nichts</span></td><td>Prüft, dass _on_vorlage_erstellen ohne gesetzte PrintLogic keine Ausnahme wirft.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ProjectSignalsTests<br><span class="testname">test_connect_verbindet_alle_drei_signale</span></td><td>Prüft, dass _connect_project_signals alle drei Projektsignale mit _on_project_changed verbindet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ProjectSignalsTests<br><span class="testname">test_disconnect_trennt_alle_drei_signale</span></td><td>Prüft, dass _disconnect_project_signals alle drei zuvor verbundenen Projektsignale trennt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ProjectSignalsTests<br><span class="testname">test_instance_wirft_ausnahme_wird_abgefangen</span></td><td>Prüft, dass eine Ausnahme bei QgsProject.instance() in beiden Signalmethoden abgefangen wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">CleanupTests<br><span class="testname">test_ruft_beide_disconnect_methoden_auf</span></td><td>Prüft, dass cleanup sowohl die Theme- als auch die Projektsignale trennt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ToggleAtlasTests<br><span class="testname">test_checked_true_setzt_arrow_down_und_zeigt_inhalt</span></td><td>Prüft, dass _toggle_atlas bei checked=True den Pfeil nach unten dreht und den Inhalt einblendet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ToggleAtlasTests<br><span class="testname">test_checked_false_setzt_arrow_right_und_versteckt_inhalt</span></td><td>Prüft, dass _toggle_atlas bei checked=False den Pfeil nach rechts dreht und den Inhalt ausblendet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">RestoreAtlasLayerSelectionTests<br><span class="testname">test_vorhandene_layer_id_setzt_layer_in_combo</span></td><td>Prüft, dass eine gespeicherte Layer-ID den zugehörigen Layer im Atlas-Dropdown auswählt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">RestoreAtlasLayerSelectionTests<br><span class="testname">test_leere_gespeicherte_layer_id_tut_nichts</span></td><td>Prüft, dass eine leere gespeicherte Layer-ID das Projekt gar nicht erst anfragt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ThemeCollectionSignalsTests<br><span class="testname">test_connect_verbindet_alle_signale</span></td><td>Prüft, dass _connect_theme_collection_signals alle Signale der Theme-Collection verbindet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ThemeCollectionSignalsTests<br><span class="testname">test_connect_ist_idempotent_wenn_schon_verbunden</span></td><td>Prüft, dass _connect_theme_collection_signals bei bereits verbundenem Signal nichts erneut tut.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ThemeCollectionSignalsTests<br><span class="testname">test_disconnect_trennt_alle_signale</span></td><td>Prüft, dass _disconnect_theme_collection_signals alle verbundenen Theme-Signale trennt und zurücksetzt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">RefreshThemaComboLiveTests<br><span class="testname">test_erhaelt_vorherige_auswahl_wenn_noch_vorhanden</span></td><td>Prüft, dass _refresh_thema_combo_live die vorherige Auswahl beibehält, wenn sie noch existiert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">RefreshThemaComboLiveTests<br><span class="testname">test_faellt_auf_wie_kartenfenster_zurueck_wenn_auswahl_verschwunden</span></td><td>Prüft, dass _refresh_thema_combo_live auf &#x27;wie Kartenfenster&#x27; zurückfällt, wenn die Auswahl verschwunden ist.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">GetGespeicherteThemenTests<br><span class="testname">test_dedupliziert_und_filtert_leere_eintraege</span></td><td>Prüft, dass _get_gespeicherte_themen Duplikate und leere/None-Einträge entfernt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">GetGespeicherteThemenTests<br><span class="testname">test_fehler_liefert_leere_liste</span></td><td>Prüft, dass ein Fehler beim Zugriff auf die Theme-Collection eine leere Liste liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">GetCurrentCanvasScaleTests<br><span class="testname">test_liefert_skalierung_als_float</span></td><td>Prüft, dass _get_current_canvas_scale die Canvas-Skalierung als float liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">GetCurrentCanvasScaleTests<br><span class="testname">test_ohne_canvas_liefert_none</span></td><td>Prüft, dass _get_current_canvas_scale ohne verfügbares Kartenfenster None liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">GetCurrentCanvasScaleTests<br><span class="testname">test_skalierung_null_liefert_none</span></td><td>Prüft, dass eine Skalierung von 0 als None statt als 0.0 gilt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">OnAtlasLayerChangedTests<br><span class="testname">test_none_oder_leer_setzt_variable_leer</span></td><td>Prüft, dass None oder ein leerer Wert die Abdeckungslayer-Variable leeren.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">OnAtlasLayerChangedTests<br><span class="testname">test_layer_objekt_mit_id_methode_setzt_dessen_id</span></td><td>Prüft, dass ein echtes Layer-Objekt (mit id()-Methode) dessen ID speichert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">OnAtlasLayerChangedTests<br><span class="testname">test_string_fallback_sucht_layer_ueber_namen</span></td><td>Prüft, dass ohne id()-Methode über den Layernamen im Projekt gesucht und dessen ID gespeichert wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">OnAuswahlAsAtlasClickedTests<br><span class="testname">test_erfolgreicher_layer_aktualisiert_atlas_ui</span></td><td>Prüft, dass ein erfolgreich erzeugter Atlas-Layer den Atlas-Bereich öffnet und ins Dropdown übernimmt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">OnAuswahlAsAtlasClickedTests<br><span class="testname">test_ohne_erzeugten_layer_tut_nichts_weiter</span></td><td>Prüft, dass ohne erzeugten Atlas-Layer keine UI-Aktualisierung stattfindet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">PopulateAtlasLayerComboTests<br><span class="testname">test_befuellt_combo_ohne_druckrechteck_und_leere_namen</span></td><td>Prüft, dass _populate_atlas_layer_combo alle Layernamen außer &#x27;Druckrechteck&#x27; und leeren Namen einträgt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">PopulateAtlasLayerComboTests<br><span class="testname">test_ohne_atlas_layer_combo_tut_nichts</span></td><td>Prüft, dass _populate_atlas_layer_combo ohne Atlas-Dropdown keine Ausnahme wirft.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">OnAtlasErzeugenChangedTests<br><span class="testname">test_aktiviert_speichert_variable_und_aktiviert_widgets</span></td><td>Prüft, dass ein aktivierter Atlas-Schalter die Variable setzt und Layer-Combo/Button aktiviert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">OnAtlasErzeugenChangedTests<br><span class="testname">test_deaktiviert_speichert_variable_und_deaktiviert_widgets</span></td><td>Prüft, dass ein deaktivierter Atlas-Schalter die Variable setzt und Layer-Combo/Button deaktiviert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">OnAtlasErzeugenChangedTests<br><span class="testname">test_ohne_widgets_wirft_keine_ausnahme</span></td><td>Prüft, dass _on_atlas_erzeugen_changed ohne Atlas-Combo/-Button keine Ausnahme wirft.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_pruef_ergebnis.py istverfahrensdbaktiontests test_liefert_true_fuer_alle_verfahrens_db_aktionen istverfahrensdbaktiontests test_liefert_false_fuer_andere_aktionen erlaubtepersistierungtests test_liefert_true_fuer_erzeugen_ueberschreiben_anhaengen erlaubtepersistierungtests test_liefert_false_fuer_ueberspringen_und_reines_existieren dateipfadtests test_liefert_path_wenn_kontext_ein_path_ist dateipfadtests test_liefert_none_wenn_kontext_kein_path_ist" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-pruef-ergebnis-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_pruef_ergebnis.py</span><span class="card-meta"><span class="count-total">6 Testfälle</span><span class="cpill cpill-ok">6</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-pruef-ergebnis-py"><p class="filedesc">Tests für sn_basis/modules/pruef_ergebnis.py::ist_verfahrens_db_aktion/erlaubte_persistierung/dateipfad (Issue #65/#67).</p><div class="gchips"><span class="gchip" title="">IstVerfahrensDbAktionTests <b>2</b></span><span class="gchip" title="">ErlaubtePersistierungTests <b>2</b></span><span class="gchip" title="">DateipfadTests <b>2</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_pruef_ergebnis.py&quot;])
class root rootnode
root --&gt; g1[&quot;IstVerfahrensDbAktionTests (2)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;liefert_true_fuer_alle_verfahrens_db_aktionen&quot;)
g1 --&gt; t2(&quot;liefert_false_fuer_andere_aktionen&quot;)
root --&gt; g2[&quot;ErlaubtePersistierungTests (2)&quot;]
class g2 groupnode
g2 --&gt; t3(&quot;liefert_true_fuer_erzeugen_ueberschreiben_anhaengen&quot;)
g2 --&gt; t4(&quot;liefert_false_fuer_ueberspringen_und_reines_existieren&quot;)
root --&gt; g3[&quot;DateipfadTests (2)&quot;]
class g3 groupnode
g3 --&gt; t5(&quot;liefert_path_wenn_kontext_ein_path_ist&quot;)
g3 --&gt; t6(&quot;liefert_none_wenn_kontext_kein_path_ist&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">IstVerfahrensDbAktionTests<br><span class="testname">test_liefert_true_fuer_alle_verfahrens_db_aktionen</span></td><td>Prüft, dass ist_verfahrens_db_aktion für alle vier Verfahrens-DB-Aktionscodes True liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">IstVerfahrensDbAktionTests<br><span class="testname">test_liefert_false_fuer_andere_aktionen</span></td><td>Prüft, dass ist_verfahrens_db_aktion für Nicht-Verfahrens-DB-Aktionen und ohne Aktion False liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ErlaubtePersistierungTests<br><span class="testname">test_liefert_true_fuer_erzeugen_ueberschreiben_anhaengen</span></td><td>Prüft, dass erlaubte_persistierung für Erzeugen/Überschreiben/Anhängen True liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ErlaubtePersistierungTests<br><span class="testname">test_liefert_false_fuer_ueberspringen_und_reines_existieren</span></td><td>Prüft, dass erlaubte_persistierung bei Überspringen und reinem &#x27;datei_existiert&#x27; False liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">DateipfadTests<br><span class="testname">test_liefert_path_wenn_kontext_ein_path_ist</span></td><td>Prüft, dass dateipfad den Kontext liefert, wenn dieser bereits ein Path-Objekt ist.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">DateipfadTests<br><span class="testname">test_liefert_none_wenn_kontext_kein_path_ist</span></td><td>Prüft, dass dateipfad None liefert, wenn der Kontext kein Path-Objekt ist (z. B. String oder Layer).</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_pruefmanager.py testpruefmanager test_ok testpruefmanager test_leereingabe_erlaubt_ja testpruefmanager test_leereingabe_erlaubt_nein testpruefmanager test_standarddatei_vorschlagen_ja testpruefmanager test_standarddatei_vorschlagen_nein testpruefmanager test_temporaer_erlaubt_ja testpruefmanager test_temporaer_erlaubt_nein testpruefmanager test_layer_unsichtbar_ja testpruefmanager test_layer_unsichtbar_nein testpruefmanager test_unbekannte_aktion testpruefmanager test_datei_existiert_overwrite testpruefmanager test_datei_existiert_append testpruefmanager test_datei_existiert_cancel testpruefmanager test_datei_existiert_in_non_qgis_mode_returns_input testpruefmanager test_verfahrensgebiet_layer_existiert_ergaenzen testpruefmanager test_verfahrensgebiet_layer_existiert_abbrechen testpruefmanager test_verfahrensgebiet_layer_existiert_entfernen testpruefmanager test_verfahrensgebiet_layer_existiert_ersetzen testpruefmanager test_verfahrensgebiet_layer_existiert_in_non_qgis_mode_returns_input testpruefmanager test_report_error_kritische_aktion_ruft_error_auf testpruefmanager test_report_error_warn_aktion_ruft_warning_auf testpruefmanager test_report_error_unbekannte_aktion_faellt_auf_warning_zurueck testpruefmanager test_frage_ja_nein_im_qgis_modus_fragt_nutzer testpruefmanager test_frage_ja_nein_ausserhalb_qgis_liefert_default_ohne_rueckfrage testpruefmanager test_frage_text_im_qgis_modus_fragt_nutzer testpruefmanager test_frage_text_ausserhalb_qgis_liefert_default_ohne_rueckfrage" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-pruefmanager-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_pruefmanager.py</span><span class="card-meta"><span class="count-total">26 Testfälle</span><span class="cpill cpill-ok">26</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-pruefmanager-py"><p class="filedesc">— (Docstring fehlt)</p><div class="gchips"><span class="gchip" title="">TestPruefmanager <b>26</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_pruefmanager.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestPruefmanager (26)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;ok&quot;)
g1 --&gt; t2(&quot;leereingabe_erlaubt_ja&quot;)
g1 --&gt; t3(&quot;leereingabe_erlaubt_nein&quot;)
g1 --&gt; t4(&quot;standarddatei_vorschlagen_ja&quot;)
g1 --&gt; t5(&quot;standarddatei_vorschlagen_nein&quot;)
g1 --&gt; t6(&quot;temporaer_erlaubt_ja&quot;)
g1 --&gt; t7(&quot;temporaer_erlaubt_nein&quot;)
g1 --&gt; t8(&quot;layer_unsichtbar_ja&quot;)
g1 --&gt; t9(&quot;layer_unsichtbar_nein&quot;)
g1 --&gt; t10(&quot;unbekannte_aktion&quot;)
g1 --&gt; t11(&quot;datei_existiert_overwrite&quot;)
g1 --&gt; t12(&quot;datei_existiert_append&quot;)
g1 --&gt; t13(&quot;datei_existiert_cancel&quot;)
g1 --&gt; t14(&quot;datei_existiert_in_non_qgis_mode_returns_input&quot;)
g1 --&gt; t15(&quot;verfahrensgebiet_layer_existiert_ergaenzen&quot;)
g1 --&gt; t16(&quot;verfahrensgebiet_layer_existiert_abbrechen&quot;)
g1 --&gt; t17(&quot;verfahrensgebiet_layer_existiert_entfernen&quot;)
g1 --&gt; t18(&quot;verfahrensgebiet_layer_existiert_ersetzen&quot;)
g1 --&gt; t19(&quot;verfahrensgebiet_layer_existiert_in_non_qgis_mode_returns_input&quot;)
g1 --&gt; t20(&quot;report_error_kritische_aktion_ruft_error_auf&quot;)
g1 --&gt; t21(&quot;report_error_warn_aktion_ruft_warning_auf&quot;)
g1 --&gt; t22(&quot;report_error_unbekannte_aktion_faellt_auf_warning_zurueck&quot;)
g1 --&gt; t23(&quot;frage_ja_nein_im_qgis_modus_fragt_nutzer&quot;)
g1 --&gt; t24(&quot;frage_ja_nein_ausserhalb_qgis_liefert_default_ohne_rueckfrage&quot;)
g1 --&gt; t25(&quot;frage_text_im_qgis_modus_fragt_nutzer&quot;)
g1 --&gt; t26(&quot;frage_text_ausserhalb_qgis_liefert_default_ohne_rueckfrage&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestPruefmanager<br><span class="testname">test_ok</span></td><td>Prüft, dass ein bereits erfolgreiches Prüfergebnis ohne Nutzerinteraktion als &#x27;ok&#x27; durchgereicht wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_leereingabe_erlaubt_ja</span></td><td>Prüft, dass bei erlaubter leerer Eingabe eine Ja-Antwort des Nutzers die Entscheidung &#x27;ok&#x27; liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_leereingabe_erlaubt_nein</span></td><td>Prüft, dass bei erlaubter leerer Eingabe eine Nein-Antwort die Aktion &#x27;leereingabe_erlaubt&#x27; als abgelehnt bestehen lässt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_standarddatei_vorschlagen_ja</span></td><td>Prüft, dass eine Ja-Antwort auf den Vorschlag der Standarddatei die Entscheidung &#x27;ok&#x27; mit dem Standardpfad als Kontext liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_standarddatei_vorschlagen_nein</span></td><td>Prüft, dass eine Nein-Antwort auf den Vorschlag der Standarddatei die Aktion &#x27;standarddatei_vorschlagen&#x27; als abgelehnt bestehen lässt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_temporaer_erlaubt_ja</span></td><td>Prüft, dass eine Ja-Antwort auf die Rückfrage nach einer temporären Datei die Aktion &#x27;temporaer_erzeugen&#x27; auslöst.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_temporaer_erlaubt_nein</span></td><td>Prüft, dass eine Nein-Antwort auf die Rückfrage nach einer temporären Datei die Aktion &#x27;temporaer_erlaubt&#x27; als abgelehnt bestehen lässt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_layer_unsichtbar_ja</span></td><td>Prüft, dass eine Ja-Antwort bei unsichtbarem Layer den Layer sichtbar schaltet und die Entscheidung &#x27;ok&#x27; liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_layer_unsichtbar_nein</span></td><td>Prüft, dass eine Nein-Antwort bei unsichtbarem Layer die Aktion &#x27;layer_unsichtbar&#x27; als abgelehnt bestehen lässt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_unbekannte_aktion</span></td><td>Prüft, dass eine unbekannte Aktion eine Warnung auslöst und unverarbeitet als Fehlschlag zurückgegeben wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_datei_existiert_overwrite</span></td><td>Prüft, dass die Nutzerwahl &#x27;überschreiben&#x27; bei bestehender Datei zur Aktion &#x27;datei_existiert_ueberschreiben&#x27; führt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_datei_existiert_append</span></td><td>Prüft, dass die Nutzerwahl &#x27;anhängen&#x27; bei bestehender Datei zur Aktion &#x27;datei_existiert_anhaengen&#x27; führt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_datei_existiert_cancel</span></td><td>Prüft, dass die Nutzerwahl &#x27;abbrechen&#x27; bei bestehender Datei zur Aktion &#x27;datei_existiert_ueberspringen&#x27; führt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_datei_existiert_in_non_qgis_mode_returns_input</span></td><td>Prüft, dass außerhalb des QGIS-Modus bei bestehender Datei keine Rückfrage erfolgt, sondern die ursprüngliche Aktion unentschieden zurückgegeben wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_verfahrensgebiet_layer_existiert_ergaenzen</span></td><td>Prüft, dass die Nutzerwahl &#x27;ergänzen&#x27; bei bestehendem Verfahrensgebiet zur Aktion &#x27;verfahrensgebiet_ergaenzen&#x27; führt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_verfahrensgebiet_layer_existiert_abbrechen</span></td><td>Prüft, dass die Nutzerwahl &#x27;abbrechen&#x27; bei bestehendem Verfahrensgebiet ok=False mit Aktion &#x27;verfahrensgebiet_abbrechen&#x27; liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_verfahrensgebiet_layer_existiert_entfernen</span></td><td>Prüft, dass die Nutzerwahl &#x27;entfernen&#x27; bei bestehendem Verfahrensgebiet zur Aktion &#x27;verfahrensgebiet_entfernen&#x27; führt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_verfahrensgebiet_layer_existiert_ersetzen</span></td><td>Prüft, dass die Nutzerwahl &#x27;ersetzen&#x27; bei bestehendem Verfahrensgebiet zur Aktion &#x27;verfahrensgebiet_ersetzen&#x27; führt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_verfahrensgebiet_layer_existiert_in_non_qgis_mode_returns_input</span></td><td>Prüft, dass außerhalb des QGIS-Modus bei bestehendem Verfahrensgebiet keine Rückfrage erfolgt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_report_error_kritische_aktion_ruft_error_auf</span></td><td>Prüft, dass eine kritische Aktion (z. B. &#x27;netzwerkfehler&#x27;) über error() gemeldet wird, nicht über warning().</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_report_error_warn_aktion_ruft_warning_auf</span></td><td>Prüft, dass eine Warn-Aktion (z. B. &#x27;datei_nicht_gefunden&#x27;) über warning() gemeldet wird, nicht über error().</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_report_error_unbekannte_aktion_faellt_auf_warning_zurueck</span></td><td>Prüft, dass eine nicht eingestufte Aktion als Fallback über warning() gemeldet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_frage_ja_nein_im_qgis_modus_fragt_nutzer</span></td><td>Prüft, dass frage_ja_nein im QGIS-Modus den Nutzer fragt und dessen Antwort liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_frage_ja_nein_ausserhalb_qgis_liefert_default_ohne_rueckfrage</span></td><td>Prüft, dass frage_ja_nein außerhalb des QGIS-Modus den Default-Wert liefert, ohne den Nutzer zu fragen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_frage_text_im_qgis_modus_fragt_nutzer</span></td><td>Prüft, dass frage_text im QGIS-Modus den Nutzer fragt und Text plus OK-Status liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefmanager<br><span class="testname">test_frage_text_ausserhalb_qgis_liefert_default_ohne_rueckfrage</span></td><td>Prüft, dass frage_text außerhalb des QGIS-Modus den Standardtext mit OK=True liefert, ohne den Nutzer zu fragen.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_qgiscore_wrapper_helpers.py polygonzulinietests test_none_liefert_none polygonzulinietests test_leere_geometrie_liefert_none polygonzulinietests test_stufe1_nutzt_boundary_wenn_vorhanden polygonzulinietests test_stufe2_extrahiert_ringe_bei_einfachem_polygon polygonzulinietests test_stufe2_extrahiert_alle_ringe_bei_multipolygon polygonzulinietests test_stufe3_fallback_wenn_keine_ringe_extrahierbar polygonzulinietests test_alle_stufen_scheitern_liefert_none layerexistsingpkgtests test_fehlende_datei_liefert_false layerexistsingpkgtests test_leerer_pfad_oder_layername_liefert_false layerexistsingpkgtests test_vorhandener_layer_liefert_true layerexistsingpkgtests test_fehlender_layer_liefert_false createbufferlayertests test_ohne_qgis_liefert_none createbufferlayertests test_fehlender_source_layer_liefert_none createbufferlayertests test_source_layer_ohne_getfeatures_liefert_none" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-qgiscore-wrapper-helpers-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_qgiscore_wrapper_helpers.py</span><span class="card-meta"><span class="count-total">14 Testfälle</span><span class="cpill cpill-ok">14</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-qgiscore-wrapper-helpers-py"><p class="filedesc">Tests für sn_basis/functions/qgiscore_wrapper.py::polygon_zu_linie/layer_exists_in_gpkg/create_buffer_layer (Issue #65/#67).</p><div class="gchips"><span class="gchip" title="">PolygonZuLinieTests <b>7</b></span><span class="gchip" title="">LayerExistsInGpkgTests <b>4</b></span><span class="gchip" title="Deckt nur die Wächter ab: die eigentliche Pufferbildung importiert `qgis.core.QgsFeature`">CreateBufferLayerTests <b>3</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_qgiscore_wrapper_helpers.py&quot;])
class root rootnode
root --&gt; g1[&quot;PolygonZuLinieTests (7)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;none_liefert_none&quot;)
g1 --&gt; t2(&quot;leere_geometrie_liefert_none&quot;)
g1 --&gt; t3(&quot;stufe1_nutzt_boundary_wenn_vorhanden&quot;)
g1 --&gt; t4(&quot;stufe2_extrahiert_ringe_bei_einfachem_polygon&quot;)
g1 --&gt; t5(&quot;stufe2_extrahiert_alle_ringe_bei_multipolygon&quot;)
g1 --&gt; t6(&quot;stufe3_fallback_wenn_keine_ringe_extrahierbar&quot;)
g1 --&gt; t7(&quot;alle_stufen_scheitern_liefert_none&quot;)
root --&gt; g2[&quot;LayerExistsInGpkgTests (4)&quot;]
class g2 groupnode
g2 --&gt; t8(&quot;fehlende_datei_liefert_false&quot;)
g2 --&gt; t9(&quot;leerer_pfad_oder_layername_liefert_false&quot;)
g2 --&gt; t10(&quot;vorhandener_layer_liefert_true&quot;)
g2 --&gt; t11(&quot;fehlender_layer_liefert_false&quot;)
root --&gt; g3[&quot;CreateBufferLayerTests (3)&quot;]
class g3 groupnode
g3 --&gt; t12(&quot;ohne_qgis_liefert_none&quot;)
g3 --&gt; t13(&quot;fehlender_source_layer_liefert_none&quot;)
g3 --&gt; t14(&quot;source_layer_ohne_getfeatures_liefert_none&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">PolygonZuLinieTests<br><span class="testname">test_none_liefert_none</span></td><td>Prüft, dass polygon_zu_linie für None-Eingabe None liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">PolygonZuLinieTests<br><span class="testname">test_leere_geometrie_liefert_none</span></td><td>Prüft, dass eine leere Geometrie None liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">PolygonZuLinieTests<br><span class="testname">test_stufe1_nutzt_boundary_wenn_vorhanden</span></td><td>Prüft, dass eine Geometrie mit boundary() (QGIS 3.x-Pfad) deren Ergebnis direkt liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">PolygonZuLinieTests<br><span class="testname">test_stufe2_extrahiert_ringe_bei_einfachem_polygon</span></td><td>Prüft, dass ohne boundary() die Ringe eines einfachen Polygons manuell extrahiert werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">PolygonZuLinieTests<br><span class="testname">test_stufe2_extrahiert_alle_ringe_bei_multipolygon</span></td><td>Prüft, dass bei einem MultiPolygon die Ringe aller Teilpolygone extrahiert werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">PolygonZuLinieTests<br><span class="testname">test_stufe3_fallback_wenn_keine_ringe_extrahierbar</span></td><td>Prüft, dass bei fehlgeschlagener Ringextraktion auf convertToType zurückgefallen wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">PolygonZuLinieTests<br><span class="testname">test_alle_stufen_scheitern_liefert_none</span></td><td>Prüft, dass polygon_zu_linie None liefert, wenn Ringextraktion und convertToType beide scheitern.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">LayerExistsInGpkgTests<br><span class="testname">test_fehlende_datei_liefert_false</span></td><td>Prüft, dass eine nicht vorhandene GPKG-Datei False liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">LayerExistsInGpkgTests<br><span class="testname">test_leerer_pfad_oder_layername_liefert_false</span></td><td>Prüft, dass ein leerer Pfad oder Layername False liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">LayerExistsInGpkgTests<br><span class="testname">test_vorhandener_layer_liefert_true</span></td><td>Prüft, dass ein in gpkg_contents eingetragener Layername als vorhanden erkannt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">LayerExistsInGpkgTests<br><span class="testname">test_fehlender_layer_liefert_false</span></td><td>Prüft, dass ein nicht in gpkg_contents eingetragener Layername als nicht vorhanden gilt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">CreateBufferLayerTests<br><span class="testname">test_ohne_qgis_liefert_none</span></td><td>Prüft, dass create_buffer_layer ohne verfügbares QGIS None liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">CreateBufferLayerTests<br><span class="testname">test_fehlender_source_layer_liefert_none</span></td><td>Prüft, dass ein fehlender Quelllayer (None) None liefert, auch wenn QGIS verfügbar wäre.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">CreateBufferLayerTests<br><span class="testname">test_source_layer_ohne_getfeatures_liefert_none</span></td><td>Prüft, dass ein Quelllayer ohne getFeatures()-Methode None liefert.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_qgisui_wrapper_helpers.py addlayertoprojecttests test_none_layer_liefert_false addlayertoprojecttests test_mock_modus_liefert_true_ohne_projektzugriff addlayertoprojecttests test_mit_qgis_fuegt_layer_dem_projekt_hinzu addlayertoprojecttests test_mit_qgis_fehler_liefert_false finddockwidgetstests test_ohne_main_window_liefert_leere_liste finddockwidgetstests test_liefert_dock_widgets_des_main_window finddockwidgetstests test_fehler_beim_suchen_liefert_leere_liste addremovemenutests test_add_menu_ohne_main_window_tut_nichts addremovemenutests test_add_menu_mit_echtem_qt_menu_fuegt_es_der_menubar_hinzu addremovemenutests test_add_menu_ohne_menuaction_wird_ignoriert addremovemenutests test_remove_menu_entfernt_ueber_menuaction addremovemenutests test_remove_menu_ohne_main_window_tut_nichts" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-qgisui-wrapper-helpers-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_qgisui_wrapper_helpers.py</span><span class="card-meta"><span class="count-total">12 Testfälle</span><span class="cpill cpill-ok">12</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-qgisui-wrapper-helpers-py"><p class="filedesc">Tests für sn_basis/functions/qgisui_wrapper.py::add_layer_to_project/find_dock_widgets/add_menu/remove_menu (Issue #65/#67).</p><div class="gchips"><span class="gchip" title="">AddLayerToProjectTests <b>4</b></span><span class="gchip" title="">FindDockWidgetsTests <b>3</b></span><span class="gchip" title="">AddRemoveMenuTests <b>5</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_qgisui_wrapper_helpers.py&quot;])
class root rootnode
root --&gt; g1[&quot;AddLayerToProjectTests (4)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;none_layer_liefert_false&quot;)
g1 --&gt; t2(&quot;mock_modus_liefert_true_ohne_projektzugriff&quot;)
g1 --&gt; t3(&quot;mit_qgis_fuegt_layer_dem_projekt_hinzu&quot;)
g1 --&gt; t4(&quot;mit_qgis_fehler_liefert_false&quot;)
root --&gt; g2[&quot;FindDockWidgetsTests (3)&quot;]
class g2 groupnode
g2 --&gt; t5(&quot;ohne_main_window_liefert_leere_liste&quot;)
g2 --&gt; t6(&quot;liefert_dock_widgets_des_main_window&quot;)
g2 --&gt; t7(&quot;fehler_beim_suchen_liefert_leere_liste&quot;)
root --&gt; g3[&quot;AddRemoveMenuTests (5)&quot;]
class g3 groupnode
g3 --&gt; t8(&quot;add_menu_ohne_main_window_tut_nichts&quot;)
g3 --&gt; t9(&quot;add_menu_mit_echtem_qt_menu_fuegt_es_der_menubar_hinzu&quot;)
g3 --&gt; t10(&quot;add_menu_ohne_menuaction_wird_ignoriert&quot;)
g3 --&gt; t11(&quot;remove_menu_entfernt_ueber_menuaction&quot;)
g3 --&gt; t12(&quot;remove_menu_ohne_main_window_tut_nichts&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">AddLayerToProjectTests<br><span class="testname">test_none_layer_liefert_false</span></td><td>Prüft, dass add_layer_to_project für einen fehlenden Layer (None) False liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">AddLayerToProjectTests<br><span class="testname">test_mock_modus_liefert_true_ohne_projektzugriff</span></td><td>Prüft, dass im Mock-Modus (ohne QGIS) ein gültiger Layer True liefert, ohne das Projekt anzufassen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">AddLayerToProjectTests<br><span class="testname">test_mit_qgis_fuegt_layer_dem_projekt_hinzu</span></td><td>Prüft, dass bei verfügbarem QGIS der Layer über QgsProject.instance().addMapLayer hinzugefügt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">AddLayerToProjectTests<br><span class="testname">test_mit_qgis_fehler_liefert_false</span></td><td>Prüft, dass ein Fehler beim Hinzufügen zum Projekt abgefangen wird und False liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FindDockWidgetsTests<br><span class="testname">test_ohne_main_window_liefert_leere_liste</span></td><td>Prüft, dass find_dock_widgets ohne verfügbares Hauptfenster eine leere Liste liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FindDockWidgetsTests<br><span class="testname">test_liefert_dock_widgets_des_main_window</span></td><td>Prüft, dass find_dock_widgets die vom Hauptfenster gefundenen Dock-Widgets durchreicht.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">FindDockWidgetsTests<br><span class="testname">test_fehler_beim_suchen_liefert_leere_liste</span></td><td>Prüft, dass ein Fehler beim Suchen der Dock-Widgets abgefangen wird und eine leere Liste liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">AddRemoveMenuTests<br><span class="testname">test_add_menu_ohne_main_window_tut_nichts</span></td><td>Prüft, dass add_menu ohne Hauptfenster keine Ausnahme wirft.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">AddRemoveMenuTests<br><span class="testname">test_add_menu_mit_echtem_qt_menu_fuegt_es_der_menubar_hinzu</span></td><td>Prüft, dass ein echtes Qt-Menü (mit menuAction) der Menüleiste hinzugefügt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">AddRemoveMenuTests<br><span class="testname">test_add_menu_ohne_menuaction_wird_ignoriert</span></td><td>Prüft, dass ein Objekt ohne menuAction nicht an die Menüleiste übergeben wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">AddRemoveMenuTests<br><span class="testname">test_remove_menu_entfernt_ueber_menuaction</span></td><td>Prüft, dass remove_menu das Menü über dessen menuAction() aus der Menüleiste entfernt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">AddRemoveMenuTests<br><span class="testname">test_remove_menu_ohne_main_window_tut_nichts</span></td><td>Prüft, dass remove_menu ohne Hauptfenster keine Ausnahme wirft.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_settings_logic.py testsettingslogic test_load testsettingslogic test_save testsettingslogic test_load_handles_partial_values_with_empty_fallback testsettingslogic test_save_empty_string_value_is_persisted" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-settings-logic-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_settings_logic.py</span><span class="card-meta"><span class="count-total">4 Testfälle</span><span class="cpill cpill-ok">4</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-settings-logic-py"><p class="filedesc">— (Docstring fehlt)</p><div class="gchips"><span class="gchip" title="">TestSettingsLogic <b>4</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_settings_logic.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestSettingsLogic (4)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;load&quot;)
g1 --&gt; t2(&quot;save&quot;)
g1 --&gt; t3(&quot;load_handles_partial_values_with_empty_fallback&quot;)
g1 --&gt; t4(&quot;save_empty_string_value_is_persisted&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestSettingsLogic<br><span class="testname">test_load</span></td><td>Prüft, dass load() jede bekannte Projektvariable genau einmal über get_variable() liest.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSettingsLogic<br><span class="testname">test_save</span></td><td>Prüft, dass save() nur bekannte Variablen-Keys speichert und unbekannte Keys ignoriert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSettingsLogic<br><span class="testname">test_load_handles_partial_values_with_empty_fallback</span></td><td>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.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSettingsLogic<br><span class="testname">test_save_empty_string_value_is_persisted</span></td><td>Prüft, dass save() einen leeren String als gültigen Wert speichert, statt ihn wie einen fehlenden Key zu behandeln.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_settings_tab.py savedatatests test_sammelt_text_und_combobox_werte_inklusive_landkreiskennzahl savedatatests test_ohne_landkreis_dropdown_wird_keine_kennzahl_ergaenzt loaddatatests test_befuellt_textfelder_aus_gespeicherten_daten loaddatatests test_ohne_gespeicherten_wert_bleibt_textfeld_leer loaddatatests test_waehlt_combobox_eintrag_bei_bekanntem_namen loaddatatests test_unbekannter_gespeicherter_name_waehlt_ersten_eintrag buildinputtests test_landkreis_feld_liefert_combobox_mit_allen_landkreisen buildinputtests test_anderes_feld_liefert_lineedit" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-settings-tab-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_settings_tab.py</span><span class="card-meta"><span class="count-total">8 Testfälle</span><span class="cpill cpill-ok">8</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-settings-tab-py"><p class="filedesc">Tests für sn_basis/ui/tabs/settings_tab.py::save_data/load_data/_build_input (Issue #65/#67).</p><div class="gchips"><span class="gchip" title="">SaveDataTests <b>2</b></span><span class="gchip" title="">LoadDataTests <b>4</b></span><span class="gchip" title="">BuildInputTests <b>2</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_settings_tab.py&quot;])
class root rootnode
root --&gt; g1[&quot;SaveDataTests (2)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;sammelt_text_und_combobox_werte_inklusive_landkreiskennzahl&quot;)
g1 --&gt; t2(&quot;ohne_landkreis_dropdown_wird_keine_kennzahl_ergaenzt&quot;)
root --&gt; g2[&quot;LoadDataTests (4)&quot;]
class g2 groupnode
g2 --&gt; t3(&quot;befuellt_textfelder_aus_gespeicherten_daten&quot;)
g2 --&gt; t4(&quot;ohne_gespeicherten_wert_bleibt_textfeld_leer&quot;)
g2 --&gt; t5(&quot;waehlt_combobox_eintrag_bei_bekanntem_namen&quot;)
g2 --&gt; t6(&quot;unbekannter_gespeicherter_name_waehlt_ersten_eintrag&quot;)
root --&gt; g3[&quot;BuildInputTests (2)&quot;]
class g3 groupnode
g3 --&gt; t7(&quot;landkreis_feld_liefert_combobox_mit_allen_landkreisen&quot;)
g3 --&gt; t8(&quot;anderes_feld_liefert_lineedit&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">SaveDataTests<br><span class="testname">test_sammelt_text_und_combobox_werte_inklusive_landkreiskennzahl</span></td><td>Prüft, dass save_data Text- und Dropdown-Werte sammelt und die Landkreiskennzahl separat ergänzt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">SaveDataTests<br><span class="testname">test_ohne_landkreis_dropdown_wird_keine_kennzahl_ergaenzt</span></td><td>Prüft, dass ohne Landkreis-Dropdown im Formular keine &#x27;landkreis_kennzahl&#x27; ergänzt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">LoadDataTests<br><span class="testname">test_befuellt_textfelder_aus_gespeicherten_daten</span></td><td>Prüft, dass load_data ein Textfeld mit dem gespeicherten Wert befüllt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">LoadDataTests<br><span class="testname">test_ohne_gespeicherten_wert_bleibt_textfeld_leer</span></td><td>Prüft, dass load_data ohne gespeicherten Wert das Textfeld auf einen leeren Text setzt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">LoadDataTests<br><span class="testname">test_waehlt_combobox_eintrag_bei_bekanntem_namen</span></td><td>Prüft, dass load_data im Landkreis-Dropdown den gespeicherten Landkreisnamen auswählt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">LoadDataTests<br><span class="testname">test_unbekannter_gespeicherter_name_waehlt_ersten_eintrag</span></td><td>Prüft, dass load_data bei einem nicht mehr vorhandenen Landkreisnamen auf den ersten Eintrag zurückfällt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">BuildInputTests<br><span class="testname">test_landkreis_feld_liefert_combobox_mit_allen_landkreisen</span></td><td>Prüft, dass _build_input für das Landkreis-Feld eine ComboBox mit Platzhalter und allen Landkreisen liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">BuildInputTests<br><span class="testname">test_anderes_feld_liefert_lineedit</span></td><td>Prüft, dass _build_input für ein normales Feld ein leeres Textfeld liefert.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_stilpruefer.py teststilpruefer test_keine_datei_angegeben teststilpruefer test_datei_existiert_mit_qml teststilpruefer test_datei_existiert_falsche_endung teststilpruefer test_datei_existiert_nicht" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-stilpruefer-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_stilpruefer.py</span><span class="card-meta"><span class="count-total">4 Testfälle</span><span class="cpill cpill-ok">4</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-stilpruefer-py"><p class="filedesc">— (Docstring fehlt)</p><div class="gchips"><span class="gchip" title="">TestStilpruefer <b>4</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_stilpruefer.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestStilpruefer (4)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;keine_datei_angegeben&quot;)
g1 --&gt; t2(&quot;datei_existiert_mit_qml&quot;)
g1 --&gt; t3(&quot;datei_existiert_falsche_endung&quot;)
g1 --&gt; t4(&quot;datei_existiert_nicht&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestStilpruefer<br><span class="testname">test_keine_datei_angegeben</span></td><td>Prüft, dass eine leere Pfadangabe als &#x27;ok&#x27; ohne Kontext akzeptiert wird (Stil ist optional).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestStilpruefer<br><span class="testname">test_datei_existiert_mit_qml</span></td><td>Prüft, dass eine existierende .qml-Datei als &#x27;stil_anwendbar&#x27; bestätigt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestStilpruefer<br><span class="testname">test_datei_existiert_falsche_endung</span></td><td>Prüft, dass eine existierende Datei ohne .qml-Endung als &#x27;falsche_endung&#x27; abgelehnt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestStilpruefer<br><span class="testname">test_datei_existiert_nicht</span></td><td>Prüft, dass ein nicht existierender .qml-Pfad als &#x27;datei_nicht_gefunden&#x27; abgelehnt wird.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_sys_wrapper.py testgetpluginroot test_get_plugin_root_folgt_keiner_verzeichnisverknuepfung joinpathtests test_verbindet_mehrere_pfadbestandteile ensuredirtests test_legt_fehlendes_verzeichnis_inklusive_eltern_an ensuredirtests test_vorhandenes_verzeichnis_wirft_keinen_fehler getattrsafetests test_liefert_vorhandenes_attribut getattrsafetests test_liefert_default_bei_fehlendem_attribut" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-sys-wrapper-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_sys_wrapper.py</span><span class="card-meta"><span class="count-total">6 Testfälle</span><span class="cpill cpill-ok">6</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-sys-wrapper-py"><p class="filedesc">Unit-Tests für sn_basis.functions.sys_wrapper.get_plugin_root().</p><div class="gchips"><span class="gchip" title="">TestGetPluginRoot <b>1</b></span><span class="gchip" title="">JoinPathTests <b>1</b></span><span class="gchip" title="">EnsureDirTests <b>2</b></span><span class="gchip" title="">GetattrSafeTests <b>2</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_sys_wrapper.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestGetPluginRoot (1)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;get_plugin_root_folgt_keiner_verzeichnisverknuepfung&quot;)
root --&gt; g2[&quot;JoinPathTests (1)&quot;]
class g2 groupnode
g2 --&gt; t2(&quot;verbindet_mehrere_pfadbestandteile&quot;)
root --&gt; g3[&quot;EnsureDirTests (2)&quot;]
class g3 groupnode
g3 --&gt; t3(&quot;legt_fehlendes_verzeichnis_inklusive_eltern_an&quot;)
g3 --&gt; t4(&quot;vorhandenes_verzeichnis_wirft_keinen_fehler&quot;)
root --&gt; g4[&quot;GetattrSafeTests (2)&quot;]
class g4 groupnode
g4 --&gt; t5(&quot;liefert_vorhandenes_attribut&quot;)
g4 --&gt; t6(&quot;liefert_default_bei_fehlendem_attribut&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestGetPluginRoot<br><span class="testname">test_get_plugin_root_folgt_keiner_verzeichnisverknuepfung</span></td><td>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).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">JoinPathTests<br><span class="testname">test_verbindet_mehrere_pfadbestandteile</span></td><td>Prüft, dass join_path mehrere Bestandteile OS-sicher zu einem Path zusammenfügt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">EnsureDirTests<br><span class="testname">test_legt_fehlendes_verzeichnis_inklusive_eltern_an</span></td><td>Prüft, dass ensure_dir ein fehlendes Verzeichnis samt Elternverzeichnissen anlegt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">EnsureDirTests<br><span class="testname">test_vorhandenes_verzeichnis_wirft_keinen_fehler</span></td><td>Prüft, dass ensure_dir bei einem bereits vorhandenen Verzeichnis keinen Fehler wirft.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">GetattrSafeTests<br><span class="testname">test_liefert_vorhandenes_attribut</span></td><td>Prüft, dass getattr_safe ein vorhandenes Attribut liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">GetattrSafeTests<br><span class="testname">test_liefert_default_bei_fehlendem_attribut</span></td><td>Prüft, dass getattr_safe bei fehlendem Attribut den Default-Wert liefert.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_text_wrapper.py testsanitizebezeichner test_umlaute_bleiben_erhalten testsanitizebezeichner test_bindestrich_bleibt_erhalten testsanitizebezeichner test_unterstrich_bleibt_erhalten testsanitizebezeichner test_leerzeichen_wird_durch_ersatz_zusammengefasst testsanitizebezeichner test_fuehrender_und_folgender_ersatz_wird_entfernt testsanitizebezeichner test_eigenes_ersatzzeichen_wird_verwendet testsanitizebezeichner test_nur_unzulaessige_zeichen_ergibt_leeren_string" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-text-wrapper-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_text_wrapper.py</span><span class="card-meta"><span class="count-total">7 Testfälle</span><span class="cpill cpill-ok">7</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-text-wrapper-py"><p class="filedesc">Unit-Tests für `sn_basis.functions.text_wrapper`.</p><div class="gchips"><span class="gchip" title="">TestSanitizeBezeichner <b>7</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_text_wrapper.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestSanitizeBezeichner (7)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;umlaute_bleiben_erhalten&quot;)
g1 --&gt; t2(&quot;bindestrich_bleibt_erhalten&quot;)
g1 --&gt; t3(&quot;unterstrich_bleibt_erhalten&quot;)
g1 --&gt; t4(&quot;leerzeichen_wird_durch_ersatz_zusammengefasst&quot;)
g1 --&gt; t5(&quot;fuehrender_und_folgender_ersatz_wird_entfernt&quot;)
g1 --&gt; t6(&quot;eigenes_ersatzzeichen_wird_verwendet&quot;)
g1 --&gt; t7(&quot;nur_unzulaessige_zeichen_ergibt_leeren_string&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestSanitizeBezeichner<br><span class="testname">test_umlaute_bleiben_erhalten</span></td><td>Prüft, dass Umlaute und ß nicht durch den Ersatz entfernt werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSanitizeBezeichner<br><span class="testname">test_bindestrich_bleibt_erhalten</span></td><td>Prüft, dass ein Bindestrich im Bezeichner erhalten bleibt (Issue #42).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSanitizeBezeichner<br><span class="testname">test_unterstrich_bleibt_erhalten</span></td><td>Prüft, dass ein Unterstrich im Bezeichner erhalten bleibt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSanitizeBezeichner<br><span class="testname">test_leerzeichen_wird_durch_ersatz_zusammengefasst</span></td><td>Prüft, dass Leerzeichen (kein zulässiges Zeichen) zu einem Ersatzzeichen werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSanitizeBezeichner<br><span class="testname">test_fuehrender_und_folgender_ersatz_wird_entfernt</span></td><td>Prüft, dass ein Ersatzzeichen am Anfang oder Ende des Ergebnisses entfernt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSanitizeBezeichner<br><span class="testname">test_eigenes_ersatzzeichen_wird_verwendet</span></td><td>Prüft, dass ein abweichendes Ersatzzeichen anstelle von Unterstrich genutzt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSanitizeBezeichner<br><span class="testname">test_nur_unzulaessige_zeichen_ergibt_leeren_string</span></td><td>Prüft, dass ein Bezeichner ganz aus unzulässigen Zeichen zu einem leeren String wird.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_variable_wrapper.py testvariablewrapper test_set_variable_project_noop_write_is_skipped testvariablewrapper test_set_variable_project_changed_value_is_written testvariablewrapper test_set_variable_global_writes_prefixed_name testvariablewrapper test_get_variable_global_returns_empty_string_fallback testvariablewrapper test_get_variable_invalid_scope_raises testvariablewrapper test_set_variable_invalid_scope_raises" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-variable-wrapper-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_variable_wrapper.py</span><span class="card-meta"><span class="count-total">6 Testfälle</span><span class="cpill cpill-ok">6</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-variable-wrapper-py"><p class="filedesc">— (Docstring fehlt)</p><div class="gchips"><span class="gchip" title="">TestVariableWrapper <b>6</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_variable_wrapper.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestVariableWrapper (6)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;set_variable_project_noop_write_is_skipped&quot;)
g1 --&gt; t2(&quot;set_variable_project_changed_value_is_written&quot;)
g1 --&gt; t3(&quot;set_variable_global_writes_prefixed_name&quot;)
g1 --&gt; t4(&quot;get_variable_global_returns_empty_string_fallback&quot;)
g1 --&gt; t5(&quot;get_variable_invalid_scope_raises&quot;)
g1 --&gt; t6(&quot;set_variable_invalid_scope_raises&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestVariableWrapper<br><span class="testname">test_set_variable_project_noop_write_is_skipped</span></td><td>Prüft, dass set_variable() im Projekt-Scope nicht schreibt, wenn der neue Wert dem bestehenden entspricht.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVariableWrapper<br><span class="testname">test_set_variable_project_changed_value_is_written</span></td><td>Prüft, dass set_variable() im Projekt-Scope bei geändertem Wert mit dem Präfix &#x27;sn_&#x27; geschrieben wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVariableWrapper<br><span class="testname">test_set_variable_global_writes_prefixed_name</span></td><td>Prüft, dass set_variable() im globalen Scope den Variablennamen mit &#x27;sn_&#x27; vorangestellt schreibt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVariableWrapper<br><span class="testname">test_get_variable_global_returns_empty_string_fallback</span></td><td>Prüft, dass get_variable() im globalen Scope für eine nicht gesetzte Variable einen leeren String liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVariableWrapper<br><span class="testname">test_get_variable_invalid_scope_raises</span></td><td>Prüft, dass get_variable() bei einem unbekannten Scope-Namen einen ValueError auslöst.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVariableWrapper<br><span class="testname">test_set_variable_invalid_scope_raises</span></td><td>Prüft, dass set_variable() bei einem unbekannten Scope-Namen einen ValueError auslöst.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_basis/tests/test_verfahrensgebiet_manager.py testverfahrensgebietmanager test_get_verfahrensgebiet_layer_id_returns_value testverfahrensgebietmanager test_get_verfahrensgebiet_layer_id_returns_none_for_empty_value testverfahrensgebietmanager test_set_verfahrensgebiet_layer_id_writes_project_variable testverfahrensgebietmanager test_update_without_layer_does_not_write_when_already_empty testverfahrensgebietmanager test_update_with_layer_writes_variable onhandlertests test_on_project_changed_ohne_layer_setzt_variable_leer onhandlertests test_on_project_changed_mit_layer_setzt_variable onhandlertests test_on_layers_added_findet_neuen_layer onhandlertests test_on_layer_removed_bei_aktuellem_layer_sucht_neu onhandlertests test_on_layer_removed_bei_anderem_layer_aendert_nichts listenersetuptests test_setup_ohne_qgis_tut_nichts listenersetuptests test_setup_verbindet_signale_und_ist_idempotent listenersetuptests test_teardown_trennt_alle_signale_und_ist_idempotent" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-verfahrensgebiet-manager-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Basis/tests/test_verfahrensgebiet_manager.py</span><span class="card-meta"><span class="count-total">13 Testfälle</span><span class="cpill cpill-ok">13</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-basis-tests-test-verfahrensgebiet-manager-py"><p class="filedesc">Tests für sn_basis/functions/verfahrensgebiet_manager.py (zentrale Layer-Verfolgung, Issue #65).</p><div class="gchips"><span class="gchip" title="">TestVerfahrensgebietManager <b>5</b></span><span class="gchip" title="">OnHandlerTests <b>5</b></span><span class="gchip" title="">ListenerSetupTests <b>3</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_verfahrensgebiet_manager.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestVerfahrensgebietManager (5)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;get_verfahrensgebiet_layer_id_returns_value&quot;)
g1 --&gt; t2(&quot;get_verfahrensgebiet_layer_id_returns_none_for_empty_value&quot;)
g1 --&gt; t3(&quot;set_verfahrensgebiet_layer_id_writes_project_variable&quot;)
g1 --&gt; t4(&quot;update_without_layer_does_not_write_when_already_empty&quot;)
g1 --&gt; t5(&quot;update_with_layer_writes_variable&quot;)
root --&gt; g2[&quot;OnHandlerTests (5)&quot;]
class g2 groupnode
g2 --&gt; t6(&quot;on_project_changed_ohne_layer_setzt_variable_leer&quot;)
g2 --&gt; t7(&quot;on_project_changed_mit_layer_setzt_variable&quot;)
g2 --&gt; t8(&quot;on_layers_added_findet_neuen_layer&quot;)
g2 --&gt; t9(&quot;on_layer_removed_bei_aktuellem_layer_sucht_neu&quot;)
g2 --&gt; t10(&quot;on_layer_removed_bei_anderem_layer_aendert_nichts&quot;)
root --&gt; g3[&quot;ListenerSetupTests (3)&quot;]
class g3 groupnode
g3 --&gt; t11(&quot;setup_ohne_qgis_tut_nichts&quot;)
g3 --&gt; t12(&quot;setup_verbindet_signale_und_ist_idempotent&quot;)
g3 --&gt; t13(&quot;teardown_trennt_alle_signale_und_ist_idempotent&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestVerfahrensgebietManager<br><span class="testname">test_get_verfahrensgebiet_layer_id_returns_value</span></td><td>Prüft, dass get_verfahrensgebiet_layer_id() die in der Projektvariable gespeicherte Layer-ID liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietManager<br><span class="testname">test_get_verfahrensgebiet_layer_id_returns_none_for_empty_value</span></td><td>Prüft, dass get_verfahrensgebiet_layer_id() bei leerer Projektvariable None statt eines leeren Strings liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietManager<br><span class="testname">test_set_verfahrensgebiet_layer_id_writes_project_variable</span></td><td>Prüft, dass set_verfahrensgebiet_layer_id() die Layer-ID als Projektvariable &#x27;verfahrensgebiet_layer&#x27; speichert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietManager<br><span class="testname">test_update_without_layer_does_not_write_when_already_empty</span></td><td>Prüft, dass ohne gefundenen Verfahrensgebiet-Layer keine Schreibaktion erfolgt, wenn die Variable bereits leer ist.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietManager<br><span class="testname">test_update_with_layer_writes_variable</span></td><td>Prüft, dass ein gefundener Verfahrensgebiet-Layer seine ID als Projektvariable speichert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">OnHandlerTests<br><span class="testname">test_on_project_changed_ohne_layer_setzt_variable_leer</span></td><td>Prüft, dass _on_project_changed die Variable leert, wenn kein Verfahrensgebiet-Layer existiert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">OnHandlerTests<br><span class="testname">test_on_project_changed_mit_layer_setzt_variable</span></td><td>Prüft, dass _on_project_changed die Layer-ID eines gefundenen Verfahrensgebiet-Layers übernimmt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">OnHandlerTests<br><span class="testname">test_on_layers_added_findet_neuen_layer</span></td><td>Prüft, dass _on_layers_added nach neu hinzugefügten Layern sucht und die Variable aktualisiert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">OnHandlerTests<br><span class="testname">test_on_layer_removed_bei_aktuellem_layer_sucht_neu</span></td><td>Prüft, dass das Entfernen des aktuell aktiven Verfahrensgebiet-Layers eine Neusuche auslöst.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">OnHandlerTests<br><span class="testname">test_on_layer_removed_bei_anderem_layer_aendert_nichts</span></td><td>Prüft, dass das Entfernen eines anderen Layers keine Neusuche auslöst.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ListenerSetupTests<br><span class="testname">test_setup_ohne_qgis_tut_nichts</span></td><td>Prüft, dass setup_verfahrensgebiet_listener ohne QGIS keine Signale registriert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ListenerSetupTests<br><span class="testname">test_setup_verbindet_signale_und_ist_idempotent</span></td><td>Prüft, dass setup_verfahrensgebiet_listener die Projektsignale verbindet und ein zweiter Aufruf nichts doppelt registriert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">ListenerSetupTests<br><span class="testname">test_teardown_trennt_alle_signale_und_ist_idempotent</span></td><td>Prüft, dass teardown_verfahrensgebiet_listener alle Signale trennt und mehrfacher Aufruf nicht fehlschlägt.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article></div>
</section>
<section class="pkg-section" id="pkg-sn_verfahrensgebiet">
<div class="pkg-head">
<div>
<h2>sn_verfahrensgebiet</h2>
<p class="pkg-sub">Fachplugin · Ordner <span class="mono">Plugin_SN_Verfahrensgebiet</span> · 18 Testdateien · 289 Testfälle</p>
</div>
<div class="pkg-bar" role="img" aria-label="247 grün, 34 rot, 8 übersprungen">
<span class="seg seg-ok" style="width:85%"></span><span class="seg seg-warn" style="width:12%"></span><span class="seg seg-skip" style="width:3%"></span>
</div>
</div>
<div class="card-grid"><article class="filecard" data-search="plugin_sn_verfahrensgebiet/tests/test_beteiligung_pruefung.py testbaueflurstueckcsv test_normalfall_mit_fuehrenden_nullen testbaueflurstueckcsv test_nenner_null_wird_zu_unterstrichen testbaueflurstueckcsv test_nenner_leer_wird_zu_unterstrichen testbaueflurstueckcsv test_gemarkung_ohne_fuehrende_nullen_wird_aufgefuellt testbaueflurstueckcsv test_ungueltiges_format_gibt_none testbaueflurstueckcsv test_leerer_wert_gibt_none testbaueflurstueckcsv test_nenner_9001_wird_zu_buchstabe_a testbaueflurstueckcsv test_nenner_9002_wird_zu_buchstabe_b testbaueflurstueckcsv test_nenner_9026_wird_zu_buchstabe_z testbaueflurstueckcsv test_nenner_ausserhalb_buchstaben_bereich_bleibt_numerisch testbaueflurstueckcsv test_nenner_9001_mit_fuehrenden_nullen_wird_erkannt testbaueflurstueckcsv test_einstellige_folge_wird_auf_2_stellen_aufgefuellt testbaueflurstueckcsvliste test_nur_gueltige_zeilen_in_liste testholeverfahrensgebietlayer test_layer_per_name_hat_vorrang_vor_combo_auswahl testholeverfahrensgebietlayer test_combo_auswahl_als_fallback_ohne_namens_layer testholeverfahrensgebietlayer test_kein_layer_gibt_none testforderemanuellesladenan test_ohne_vef_vkzf_nennt_fehlende_kennzeichen testforderemanuellesladenan test_mit_vef_vkzf_nennt_verfahrensnummer testtry3bootstrap test_setzt_verfahrensnummer_und_fordert_manuelles_laden_an testbeteiligungpruefendispatch test_layer_ohne_kennzeichen_fordert_manuelles_laden_an testbeteiligungpruefendispatch test_kein_layer_setzt_verfahrensnummer_und_fordert_laden_an testladebeteiligungcsv test_dialog_abgebrochen_gibt_none testladebeteiligungcsv test_fehlende_flurstueck_spalte_wirft_fehler testladebeteiligungcsv test_leere_datei_wirft_fehler testladebeteiligungcsv test_erfolgsfall_gibt_zeilen_und_spalten_zurueck" data-hasred="0" data-hasskip="0" data-nodoc="1"><button class="card-toggle" data-target="plugin-sn-verfahrensgebiet-tests-test-beteiligung-pruefung-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Verfahrensgebiet/tests/test_beteiligung_pruefung.py</span><span class="card-meta"><span class="count-total">25 Testfälle</span><span class="cpill cpill-ok">25</span><span class="docbadge" title="Anteil mit Docstring">0% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-verfahrensgebiet-tests-test-beteiligung-pruefung-py"><p class="filedesc">Unit-Tests für `sn_verfahrensgebiet.functions.beteiligung_pruefung`.</p><div class="gchips"><span class="gchip" title="">TestBaueFlurstueckCsv <b>12</b></span><span class="gchip" title="">TestBaueFlurstueckCsvListe <b>1</b></span><span class="gchip" title="">TestHoleVerfahrensgebietLayer <b>3</b></span><span class="gchip" title="try2/try3 laden nicht mehr automatisch, sondern fordern den Nutzer auf,">TestFordereManuellesLadenAn <b>2</b></span><span class="gchip" title="">TestTry3Bootstrap <b>1</b></span><span class="gchip" title="Dispatch-Logik in beteiligung_pruefen(): try1 unverändert, try2/try3">TestBeteiligungPruefenDispatch <b>2</b></span><span class="gchip" title="">TestLadeBeteiligungCsv <b>4</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_beteiligung_pruefung.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestBaueFlurstueckCsv (12)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;normalfall_mit_fuehrenden_nullen&quot;)
g1 --&gt; t2(&quot;nenner_null_wird_zu_unterstrichen&quot;)
g1 --&gt; t3(&quot;nenner_leer_wird_zu_unterstrichen&quot;)
g1 --&gt; t4(&quot;gemarkung_ohne_fuehrende_nullen_wird_aufgefuellt&quot;)
g1 --&gt; t5(&quot;ungueltiges_format_gibt_none&quot;)
g1 --&gt; t6(&quot;leerer_wert_gibt_none&quot;)
g1 --&gt; t7(&quot;nenner_9001_wird_zu_buchstabe_a&quot;)
g1 --&gt; t8(&quot;nenner_9002_wird_zu_buchstabe_b&quot;)
g1 --&gt; t9(&quot;nenner_9026_wird_zu_buchstabe_z&quot;)
g1 --&gt; t10(&quot;nenner_ausserhalb_buchstaben_bereich_bleibt_numerisch&quot;)
g1 --&gt; t11(&quot;nenner_9001_mit_fuehrenden_nullen_wird_erkannt&quot;)
g1 --&gt; t12(&quot;einstellige_folge_wird_auf_2_stellen_aufgefuellt&quot;)
root --&gt; g2[&quot;TestBaueFlurstueckCsvListe (1)&quot;]
class g2 groupnode
g2 --&gt; t13(&quot;nur_gueltige_zeilen_in_liste&quot;)
root --&gt; g3[&quot;TestHoleVerfahrensgebietLayer (3)&quot;]
class g3 groupnode
g3 --&gt; t14(&quot;layer_per_name_hat_vorrang_vor_combo_auswahl&quot;)
g3 --&gt; t15(&quot;combo_auswahl_als_fallback_ohne_namens_layer&quot;)
g3 --&gt; t16(&quot;kein_layer_gibt_none&quot;)
root --&gt; g4[&quot;TestFordereManuellesLadenAn (2)&quot;]
class g4 groupnode
g4 --&gt; t17(&quot;ohne_vef_vkzf_nennt_fehlende_kennzeichen&quot;)
g4 --&gt; t18(&quot;mit_vef_vkzf_nennt_verfahrensnummer&quot;)
root --&gt; g5[&quot;TestTry3Bootstrap (1)&quot;]
class g5 groupnode
g5 --&gt; t19(&quot;setzt_verfahrensnummer_und_fordert_manuelles_laden_an&quot;)
root --&gt; g6[&quot;TestBeteiligungPruefenDispatch (2)&quot;]
class g6 groupnode
g6 --&gt; t20(&quot;layer_ohne_kennzeichen_fordert_manuelles_laden_an&quot;)
g6 --&gt; t21(&quot;kein_layer_setzt_verfahrensnummer_und_fordert_laden_an&quot;)
root --&gt; g7[&quot;TestLadeBeteiligungCsv (4)&quot;]
class g7 groupnode
g7 --&gt; t22(&quot;dialog_abgebrochen_gibt_none&quot;)
g7 --&gt; t23(&quot;fehlende_flurstueck_spalte_wirft_fehler&quot;)
g7 --&gt; t24(&quot;leere_datei_wirft_fehler&quot;)
g7 --&gt; t25(&quot;erfolgsfall_gibt_zeilen_und_spalten_zurueck&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestBaueFlurstueckCsv<br><span class="testname">test_normalfall_mit_fuehrenden_nullen</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBaueFlurstueckCsv<br><span class="testname">test_nenner_null_wird_zu_unterstrichen</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBaueFlurstueckCsv<br><span class="testname">test_nenner_leer_wird_zu_unterstrichen</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBaueFlurstueckCsv<br><span class="testname">test_gemarkung_ohne_fuehrende_nullen_wird_aufgefuellt</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBaueFlurstueckCsv<br><span class="testname">test_ungueltiges_format_gibt_none</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBaueFlurstueckCsv<br><span class="testname">test_leerer_wert_gibt_none</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBaueFlurstueckCsv<br><span class="testname">test_nenner_9001_wird_zu_buchstabe_a</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBaueFlurstueckCsv<br><span class="testname">test_nenner_9002_wird_zu_buchstabe_b</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBaueFlurstueckCsv<br><span class="testname">test_nenner_9026_wird_zu_buchstabe_z</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBaueFlurstueckCsv<br><span class="testname">test_nenner_ausserhalb_buchstaben_bereich_bleibt_numerisch</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBaueFlurstueckCsv<br><span class="testname">test_nenner_9001_mit_fuehrenden_nullen_wird_erkannt</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBaueFlurstueckCsv<br><span class="testname">test_einstellige_folge_wird_auf_2_stellen_aufgefuellt</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBaueFlurstueckCsvListe<br><span class="testname">test_nur_gueltige_zeilen_in_liste</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestHoleVerfahrensgebietLayer<br><span class="testname">test_layer_per_name_hat_vorrang_vor_combo_auswahl</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestHoleVerfahrensgebietLayer<br><span class="testname">test_combo_auswahl_als_fallback_ohne_namens_layer</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestHoleVerfahrensgebietLayer<br><span class="testname">test_kein_layer_gibt_none</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFordereManuellesLadenAn<br><span class="testname">test_ohne_vef_vkzf_nennt_fehlende_kennzeichen</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFordereManuellesLadenAn<br><span class="testname">test_mit_vef_vkzf_nennt_verfahrensnummer</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestTry3Bootstrap<br><span class="testname">test_setzt_verfahrensnummer_und_fordert_manuelles_laden_an</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBeteiligungPruefenDispatch<br><span class="testname">test_layer_ohne_kennzeichen_fordert_manuelles_laden_an</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestBeteiligungPruefenDispatch<br><span class="testname">test_kein_layer_setzt_verfahrensnummer_und_fordert_laden_an</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLadeBeteiligungCsv<br><span class="testname">test_dialog_abgebrochen_gibt_none</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLadeBeteiligungCsv<br><span class="testname">test_fehlende_flurstueck_spalte_wirft_fehler</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLadeBeteiligungCsv<br><span class="testname">test_leere_datei_wirft_fehler</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLadeBeteiligungCsv<br><span class="testname">test_erfolgsfall_gibt_zeilen_und_spalten_zurueck</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_verfahrensgebiet/tests/test_dockwidget.py testdockwidget test_init_tabs_with_services_injects_available_services testdockwidget test_init_tabs_with_services_reports_errors" data-hasred="0" data-hasskip="0" data-nodoc="1"><button class="card-toggle" data-target="plugin-sn-verfahrensgebiet-tests-test-dockwidget-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Verfahrensgebiet/tests/test_dockwidget.py</span><span class="card-meta"><span class="count-total">2 Testfälle</span><span class="cpill cpill-ok">2</span><span class="docbadge" title="Anteil mit Docstring">0% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-verfahrensgebiet-tests-test-dockwidget-py"><p class="filedesc">— (Docstring fehlt)</p><div class="gchips"><span class="gchip" title="">TestDockWidget <b>2</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_dockwidget.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestDockWidget (2)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;init_tabs_with_services_injects_available_services&quot;)
g1 --&gt; t2(&quot;init_tabs_with_services_reports_errors&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestDockWidget<br><span class="testname">test_init_tabs_with_services_injects_available_services</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDockWidget<br><span class="testname">test_init_tabs_with_services_reports_errors</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_verfahrensgebiet/tests/test_eigentuemer_anzeige.py testanzeigetext test_name_anschrift_email testanzeigetext test_keine_internen_angaben testanzeigetext test_fehlende_email_wird_genannt testanzeigetext test_werte_werden_maskiert testanzeigetext test_mehrere_eintraege_getrennt testanzeigetext test_leer_nur_platzhalter testfensteroeffnen test_normales_fenster_in_standardgroesse testfensteroeffnen test_gemerkte_lage_wird_wiederhergestellt testfensteroeffnen test_unbrauchbare_lage_ergibt_standardgroesse" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-verfahrensgebiet-tests-test-eigentuemer-anzeige-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Verfahrensgebiet/tests/test_eigentuemer_anzeige.py</span><span class="card-meta"><span class="count-total">9 Testfälle</span><span class="cpill cpill-ok">9</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-verfahrensgebiet-tests-test-eigentuemer-anzeige-py"><p class="filedesc">Tests für das Anzeigefenster des Eigentümer-Datenabgleichs (#56).</p><div class="gchips"><span class="gchip" title="">TestAnzeigetext <b>6</b></span><span class="gchip" title="">TestFensterOeffnen <b>3</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_eigentuemer_anzeige.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestAnzeigetext (6)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;name_anschrift_email&quot;)
g1 --&gt; t2(&quot;keine_internen_angaben&quot;)
g1 --&gt; t3(&quot;fehlende_email_wird_genannt&quot;)
g1 --&gt; t4(&quot;werte_werden_maskiert&quot;)
g1 --&gt; t5(&quot;mehrere_eintraege_getrennt&quot;)
g1 --&gt; t6(&quot;leer_nur_platzhalter&quot;)
root --&gt; g2[&quot;TestFensterOeffnen (3)&quot;]
class g2 groupnode
g2 --&gt; t7(&quot;normales_fenster_in_standardgroesse&quot;)
g2 --&gt; t8(&quot;gemerkte_lage_wird_wiederhergestellt&quot;)
g2 --&gt; t9(&quot;unbrauchbare_lage_ergibt_standardgroesse&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestAnzeigetext<br><span class="testname">test_name_anschrift_email</span></td><td>Prüft, dass die Anzeige Name mit Anrede und Titel, die mehrzeilige Anschrift mit Ortsteil und die E-Mail zeigt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAnzeigetext<br><span class="testname">test_keine_internen_angaben</span></td><td>Prüft, dass der Eigentümer weder Konten, Personen-IDs, Rechtsperson-Wert noch das Kennzeichen „verstorben“ sieht.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAnzeigetext<br><span class="testname">test_fehlende_email_wird_genannt</span></td><td>Prüft, dass eine fehlende E-Mail ausdrücklich als „keine angegeben“ erscheint.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAnzeigetext<br><span class="testname">test_werte_werden_maskiert</span></td><td>Prüft, dass Sonderzeichen aus den Daten maskiert werden und kein HTML einschleusen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAnzeigetext<br><span class="testname">test_mehrere_eintraege_getrennt</span></td><td>Prüft, dass mehrere Einträge untereinander, durch eine Linie getrennt, erscheinen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAnzeigetext<br><span class="testname">test_leer_nur_platzhalter</span></td><td>Prüft, dass die leere Anzeige nur den neutralen Platzhalter zeigt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFensterOeffnen<br><span class="testname">test_normales_fenster_in_standardgroesse</span></td><td>Prüft, dass das Anzeigefenster ohne gemerkte Lage als normales Fenster mit Rahmen in Standardgröße öffnet, nie im Vollbild.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFensterOeffnen<br><span class="testname">test_gemerkte_lage_wird_wiederhergestellt</span></td><td>Prüft, dass eine gemerkte Größe und Lage der letzten Sitzung wiederhergestellt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFensterOeffnen<br><span class="testname">test_unbrauchbare_lage_ergibt_standardgroesse</span></td><td>Prüft, dass eine nicht wiederherstellbare Lage auf die Standardgröße zurückfällt.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_verfahrensgebiet/tests/test_eigentuemer_korrektur.py testaenderungen test_feldwerte testaenderungen test_nur_echte_aenderungen testaenderungen test_feld_leeren_ist_aenderung testaenderungen test_wende_an testkorrekturpfad test_textdatei_provider testkorrekturpfad test_ogr_provider testkorrekturpfad test_keine_csv testschreiben test_neue_datei_mit_kopfzeile_und_bom testschreiben test_anhaengen_ohne_zweite_kopfzeile testschreiben test_ohne_aenderung_keine_datei testschreiben test_schreibfehler_wird_weitergereicht testschreiben test_schreibt_nichts_auf_die_konsole" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-verfahrensgebiet-tests-test-eigentuemer-korrektur-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Verfahrensgebiet/tests/test_eigentuemer_korrektur.py</span><span class="card-meta"><span class="count-total">12 Testfälle</span><span class="cpill cpill-ok">12</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-verfahrensgebiet-tests-test-eigentuemer-korrektur-py"><p class="filedesc">Tests für die Korrekturen beim Eigentümer-Datenabgleich (#56).</p><div class="gchips"><span class="gchip" title="">TestAenderungen <b>4</b></span><span class="gchip" title="">TestKorrekturPfad <b>3</b></span><span class="gchip" title="">TestSchreiben <b>5</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_eigentuemer_korrektur.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestAenderungen (4)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;feldwerte&quot;)
g1 --&gt; t2(&quot;nur_echte_aenderungen&quot;)
g1 --&gt; t3(&quot;feld_leeren_ist_aenderung&quot;)
g1 --&gt; t4(&quot;wende_an&quot;)
root --&gt; g2[&quot;TestKorrekturPfad (3)&quot;]
class g2 groupnode
g2 --&gt; t5(&quot;textdatei_provider&quot;)
g2 --&gt; t6(&quot;ogr_provider&quot;)
g2 --&gt; t7(&quot;keine_csv&quot;)
root --&gt; g3[&quot;TestSchreiben (5)&quot;]
class g3 groupnode
g3 --&gt; t8(&quot;neue_datei_mit_kopfzeile_und_bom&quot;)
g3 --&gt; t9(&quot;anhaengen_ohne_zweite_kopfzeile&quot;)
g3 --&gt; t10(&quot;ohne_aenderung_keine_datei&quot;)
g3 --&gt; t11(&quot;schreibfehler_wird_weitergereicht&quot;)
g3 --&gt; t12(&quot;schreibt_nichts_auf_die_konsole&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestAenderungen<br><span class="testname">test_feldwerte</span></td><td>Prüft, dass alle korrigierbaren Felder vorbelegt werden, mehrere E-Mails durch Komma getrennt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAenderungen<br><span class="testname">test_nur_echte_aenderungen</span></td><td>Prüft, dass nur geänderte Felder zählen und Leerraum am Rand oder doppelte Leerzeichen keine Änderung sind.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAenderungen<br><span class="testname">test_feld_leeren_ist_aenderung</span></td><td>Prüft, dass das Leeren eines Feldes als Änderung zählt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAenderungen<br><span class="testname">test_wende_an</span></td><td>Prüft, dass die Änderungen im angezeigten Eintrag landen und E-Mails wieder getrennt werden; Konten bleiben.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKorrekturPfad<br><span class="testname">test_textdatei_provider</span></td><td>Prüft, dass aus der Quelle eines Textdatei-Layers (file-URI, Leerzeichen kodiert) der Pfad neben der CSV wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKorrekturPfad<br><span class="testname">test_ogr_provider</span></td><td>Prüft, dass auch eine OGR-Quelle mit Layernamen den Pfad neben der CSV ergibt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKorrekturPfad<br><span class="testname">test_keine_csv</span></td><td>Prüft, dass für Quellen ohne CSV-Datei kein Pfad vorgeschlagen wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSchreiben<br><span class="testname">test_neue_datei_mit_kopfzeile_und_bom</span></td><td>Prüft, dass eine neue Korrektur-CSV mit BOM, Kopfzeile und je Änderung einer Zeile mit Exportspaltennamen entsteht.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSchreiben<br><span class="testname">test_anhaengen_ohne_zweite_kopfzeile</span></td><td>Prüft, dass weitere Korrekturen angehängt werden, ohne Kopfzeile oder BOM zu wiederholen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSchreiben<br><span class="testname">test_ohne_aenderung_keine_datei</span></td><td>Prüft, dass ohne Änderung keine Datei angelegt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSchreiben<br><span class="testname">test_schreibfehler_wird_weitergereicht</span></td><td>Prüft, dass ein nicht schreibbarer Pfad als OSError beim Aufrufer ankommt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSchreiben<br><span class="testname">test_schreibt_nichts_auf_die_konsole</span></td><td>Prüft, dass das Festhalten von Korrekturen keine Personendaten auf die Konsole schreibt (Datenschutz).</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_verfahrensgebiet/tests/test_eigentuemer_suche.py testlayererkennung test_layer_mit_name_und_vorname_ist_eigentuemerlayer testlayererkennung test_eigentuemerlayer_im_projekt testsuche test_ohne_eingabe_fehler testsuche test_layer_ohne_pflichtspalten testsuche test_teilstring_ohne_gross_kleinschreibung testsuche test_umlaute_und_eszett testsuche test_gleiche_person_gleiche_anschrift_zusammengefasst testsuche test_andere_anschrift_eigener_treffer testsuche test_kennzeichen_verstorben testsuche test_rechtsperson_als_rohwert testsuche test_plz_mit_fuehrender_null testsuche test_suche_gibt_nichts_aus testanzeigeformen test_name_und_anschrift" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-verfahrensgebiet-tests-test-eigentuemer-suche-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Verfahrensgebiet/tests/test_eigentuemer_suche.py</span><span class="card-meta"><span class="count-total">13 Testfälle</span><span class="cpill cpill-ok">13</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-verfahrensgebiet-tests-test-eigentuemer-suche-py"><p class="filedesc">Tests für die Eigentümersuche im Serienbriefexport (#56).</p><div class="gchips"><span class="gchip" title="">TestLayererkennung <b>2</b></span><span class="gchip" title="">TestSuche <b>10</b></span><span class="gchip" title="">TestAnzeigeformen <b>1</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_eigentuemer_suche.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestLayererkennung (2)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;layer_mit_name_und_vorname_ist_eigentuemerlayer&quot;)
g1 --&gt; t2(&quot;eigentuemerlayer_im_projekt&quot;)
root --&gt; g2[&quot;TestSuche (10)&quot;]
class g2 groupnode
g2 --&gt; t3(&quot;ohne_eingabe_fehler&quot;)
g2 --&gt; t4(&quot;layer_ohne_pflichtspalten&quot;)
g2 --&gt; t5(&quot;teilstring_ohne_gross_kleinschreibung&quot;)
g2 --&gt; t6(&quot;umlaute_und_eszett&quot;)
g2 --&gt; t7(&quot;gleiche_person_gleiche_anschrift_zusammengefasst&quot;)
g2 --&gt; t8(&quot;andere_anschrift_eigener_treffer&quot;)
g2 --&gt; t9(&quot;kennzeichen_verstorben&quot;)
g2 --&gt; t10(&quot;rechtsperson_als_rohwert&quot;)
g2 --&gt; t11(&quot;plz_mit_fuehrender_null&quot;)
g2 --&gt; t12(&quot;suche_gibt_nichts_aus&quot;)
root --&gt; g3[&quot;TestAnzeigeformen (1)&quot;]
class g3 groupnode
g3 --&gt; t13(&quot;name_und_anschrift&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestLayererkennung<br><span class="testname">test_layer_mit_name_und_vorname_ist_eigentuemerlayer</span></td><td>Prüft, dass ein Layer mit den Spalten Nachname und Vorname als Eigentümerdatei erkannt wird, auch mit BOM und anderer Schreibweise.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLayererkennung<br><span class="testname">test_eigentuemerlayer_im_projekt</span></td><td>Prüft, dass aus dem Projekt nur passende Layer kommen, nach Namen sortiert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSuche<br><span class="testname">test_ohne_eingabe_fehler</span></td><td>Prüft, dass ohne Name und Vorname nicht die ganze Datei gelistet, sondern um eine Eingabe gebeten wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSuche<br><span class="testname">test_layer_ohne_pflichtspalten</span></td><td>Prüft, dass ein Layer ohne Nachname/Vorname mit Hinweis auf den Serienbriefexport abgelehnt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSuche<br><span class="testname">test_teilstring_ohne_gross_kleinschreibung</span></td><td>Prüft, dass Name und Vorname als Teilstring ohne Rücksicht auf Groß-/Kleinschreibung gesucht werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSuche<br><span class="testname">test_umlaute_und_eszett</span></td><td>Prüft, dass „Müller“ auch „Mueller“ findet und „Strauss“ auch „Strauß“.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSuche<br><span class="testname">test_gleiche_person_gleiche_anschrift_zusammengefasst</span></td><td>Prüft, dass Zeilen mit gleichem Namen und gleicher Anschrift ein Treffer werden und Konten, Personen-IDs und E-Mails gesammelt werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSuche<br><span class="testname">test_andere_anschrift_eigener_treffer</span></td><td>Prüft, dass dieselbe Person mit anderer Anschrift ein eigener Treffer bleibt, sortiert nach Wohnort.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSuche<br><span class="testname">test_kennzeichen_verstorben</span></td><td>Prüft, dass „verstorben“ beim Exportwert 1 (auch als Zahl gelesen) gesetzt ist und bei 0, Leerem und NULL nicht.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSuche<br><span class="testname">test_rechtsperson_als_rohwert</span></td><td>Prüft, dass PER_RECHTSPERSON unverändert angezeigt wird (0, 1, 5, 9; noch nicht entschlüsselt) und abweichende Werte einer Person gesammelt werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSuche<br><span class="testname">test_plz_mit_fuehrender_null</span></td><td>Prüft, dass eine von QGIS als Zahl gelesene PLZ wieder fünfstellig mit führender Null erscheint und Zeilen dadurch zusammenfinden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSuche<br><span class="testname">test_suche_gibt_nichts_aus</span></td><td>Prüft, dass die Suche keine Personendaten auf die Konsole schreibt (Datenschutz).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAnzeigeformen<br><span class="testname">test_name_und_anschrift</span></td><td>Prüft, dass Name mit Titel und einzeilige Anschrift mit Ortsteil lesbar zusammengesetzt werden.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_verfahrensgebiet/tests/test_eigentuemer_tab.py testflurstuecksuchen test_ohne_flurstueckslayer_erscheint_hinweisdialog testflurstuecksuchen test_eingabefehler_als_warnung testflurstuecksuchen test_kein_treffer testflurstuecksuchen test_treffer_werden_ausgewaehlt_und_angezoomt testflurstuecksuchen test_ohne_kartenansicht_bleibt_auswahl testeigentuemersuchen test_ohne_eigentuemerdatei_warnung testeigentuemersuchen test_suchfehler_als_warnung testeigentuemersuchen test_kein_treffer_ohne_namen_in_meldung testeigentuemersuchen test_treffer_oeffnen_trefferliste_und_ersetzen_die_alte testtrefferliste test_trefferzeile_mit_hinweis testtrefferliste test_ausgewaehlte_eigentuemer testtrefferliste test_daten_anzeigen_gibt_auswahl_weiter testsitzung test_sitzung_beginnen_oeffnet_leeres_fenster_mit_rahmen testsitzung test_lage_gilt_fuer_naechste_sitzung testsitzung test_daten_anzeigen_beginnt_sitzung_bei_bedarf testsitzung test_daten_anzeigen_ohne_auswahl testsitzung test_anzeige_leeren_laesst_fenster_offen testsitzung test_sitzung_beenden_schliesst_fenster testsitzung test_von_aussen_geschlossen_beendet_sitzung testkorrekturlabel test_ohne_eigentuemerdatei testkorrekturlabel test_pfad_neben_der_eigentuemerdatei testkorrekturlabel test_ohne_csv_quelle_wird_abgefragt testkorrekturlabel test_gewaehlter_pfad_wird_angezeigt testkorrektur test_korrektur_wird_festgehalten_und_angezeigt testkorrektur test_ohne_aenderung_nichts_schreiben testkorrektur test_abbruch_nichts_schreiben testkorrektur test_schreibfehler_warnung_und_anzeige_unveraendert testkorrektur test_ohne_anzeige_keine_korrektur testkorrekturdatei test_vorschlag_neben_der_eigentuemerdatei testkorrekturdatei test_ohne_csv_quelle_wird_gefragt testdockwidgettabs test_tab_ist_im_dockwidget_eingetragen" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-verfahrensgebiet-tests-test-eigentuemer-tab-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Verfahrensgebiet/tests/test_eigentuemer_tab.py</span><span class="card-meta"><span class="count-total">31 Testfälle</span><span class="cpill cpill-ok">31</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-verfahrensgebiet-tests-test-eigentuemer-tab-py"><p class="filedesc">Tests für den Tab „Eigentümer“ – Flurstückssuche, Eigentümersuche, Anzeige und Korrektur (#56).</p><div class="gchips"><span class="gchip" title="">TestFlurstueckSuchen <b>5</b></span><span class="gchip" title="">TestEigentuemerSuchen <b>4</b></span><span class="gchip" title="">TestTrefferliste <b>3</b></span><span class="gchip" title="">TestSitzung <b>7</b></span><span class="gchip" title="">TestKorrekturLabel <b>4</b></span><span class="gchip" title="">TestKorrektur <b>5</b></span><span class="gchip" title="">TestKorrekturDatei <b>2</b></span><span class="gchip" title="">TestDockWidgetTabs <b>1</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_eigentuemer_tab.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestFlurstueckSuchen (5)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;ohne_flurstueckslayer_erscheint_hinweisdialog&quot;)
g1 --&gt; t2(&quot;eingabefehler_als_warnung&quot;)
g1 --&gt; t3(&quot;kein_treffer&quot;)
g1 --&gt; t4(&quot;treffer_werden_ausgewaehlt_und_angezoomt&quot;)
g1 --&gt; t5(&quot;ohne_kartenansicht_bleibt_auswahl&quot;)
root --&gt; g2[&quot;TestEigentuemerSuchen (4)&quot;]
class g2 groupnode
g2 --&gt; t6(&quot;ohne_eigentuemerdatei_warnung&quot;)
g2 --&gt; t7(&quot;suchfehler_als_warnung&quot;)
g2 --&gt; t8(&quot;kein_treffer_ohne_namen_in_meldung&quot;)
g2 --&gt; t9(&quot;treffer_oeffnen_trefferliste_und_ersetzen_die_alte&quot;)
root --&gt; g3[&quot;TestTrefferliste (3)&quot;]
class g3 groupnode
g3 --&gt; t10(&quot;trefferzeile_mit_hinweis&quot;)
g3 --&gt; t11(&quot;ausgewaehlte_eigentuemer&quot;)
g3 --&gt; t12(&quot;daten_anzeigen_gibt_auswahl_weiter&quot;)
root --&gt; g4[&quot;TestSitzung (7)&quot;]
class g4 groupnode
g4 --&gt; t13(&quot;sitzung_beginnen_oeffnet_leeres_fenster_mit_rahmen&quot;)
g4 --&gt; t14(&quot;lage_gilt_fuer_naechste_sitzung&quot;)
g4 --&gt; t15(&quot;daten_anzeigen_beginnt_sitzung_bei_bedarf&quot;)
g4 --&gt; t16(&quot;daten_anzeigen_ohne_auswahl&quot;)
g4 --&gt; t17(&quot;anzeige_leeren_laesst_fenster_offen&quot;)
g4 --&gt; t18(&quot;sitzung_beenden_schliesst_fenster&quot;)
g4 --&gt; t19(&quot;von_aussen_geschlossen_beendet_sitzung&quot;)
root --&gt; g5[&quot;TestKorrekturLabel (4)&quot;]
class g5 groupnode
g5 --&gt; t20(&quot;ohne_eigentuemerdatei&quot;)
g5 --&gt; t21(&quot;pfad_neben_der_eigentuemerdatei&quot;)
g5 --&gt; t22(&quot;ohne_csv_quelle_wird_abgefragt&quot;)
g5 --&gt; t23(&quot;gewaehlter_pfad_wird_angezeigt&quot;)
root --&gt; g6[&quot;TestKorrektur (5)&quot;]
class g6 groupnode
g6 --&gt; t24(&quot;korrektur_wird_festgehalten_und_angezeigt&quot;)
g6 --&gt; t25(&quot;ohne_aenderung_nichts_schreiben&quot;)
g6 --&gt; t26(&quot;abbruch_nichts_schreiben&quot;)
g6 --&gt; t27(&quot;schreibfehler_warnung_und_anzeige_unveraendert&quot;)
g6 --&gt; t28(&quot;ohne_anzeige_keine_korrektur&quot;)
root --&gt; g7[&quot;TestKorrekturDatei (2)&quot;]
class g7 groupnode
g7 --&gt; t29(&quot;vorschlag_neben_der_eigentuemerdatei&quot;)
g7 --&gt; t30(&quot;ohne_csv_quelle_wird_gefragt&quot;)
root --&gt; g8[&quot;TestDockWidgetTabs (1)&quot;]
class g8 groupnode
g8 --&gt; t31(&quot;tab_ist_im_dockwidget_eingetragen&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestFlurstueckSuchen<br><span class="testname">test_ohne_flurstueckslayer_erscheint_hinweisdialog</span></td><td>Prüft, dass ohne Layer „Flurstücke“ ein Dialog zum Laden von Verfahrensgebiet und Flurstücken erscheint.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFlurstueckSuchen<br><span class="testname">test_eingabefehler_als_warnung</span></td><td>Prüft, dass eine ungültige Eingabe als Warnung in der Meldungsleiste erscheint, nicht als Dialog.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFlurstueckSuchen<br><span class="testname">test_kein_treffer</span></td><td>Prüft, dass ohne Treffer ein Hinweis erscheint und keine Auswahl gesetzt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFlurstueckSuchen<br><span class="testname">test_treffer_werden_ausgewaehlt_und_angezoomt</span></td><td>Prüft, dass Treffer im Flurstückslayer ausgewählt, angezoomt und gemeldet werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFlurstueckSuchen<br><span class="testname">test_ohne_kartenansicht_bleibt_auswahl</span></td><td>Prüft, dass die Auswahl auch ohne Kartenansicht gesetzt und gemeldet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestEigentuemerSuchen<br><span class="testname">test_ohne_eigentuemerdatei_warnung</span></td><td>Prüft, dass ohne gewählte Eigentümerdatei die Liste aufgefrischt und dann auf das Laden der CSV hingewiesen wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestEigentuemerSuchen<br><span class="testname">test_suchfehler_als_warnung</span></td><td>Prüft, dass ein Fehler der Suche (z. B. leere Eingabe) als Warnung erscheint.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestEigentuemerSuchen<br><span class="testname">test_kein_treffer_ohne_namen_in_meldung</span></td><td>Prüft, dass ohne Treffer ein Hinweis erscheint, der den gesuchten Namen nicht wiederholt (Datenschutz).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestEigentuemerSuchen<br><span class="testname">test_treffer_oeffnen_trefferliste_und_ersetzen_die_alte</span></td><td>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.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestTrefferliste<br><span class="testname">test_trefferzeile_mit_hinweis</span></td><td>Prüft, dass die Trefferliste Name, Anschrift, E-Mail, den Rohwert von PER_RECHTSPERSON und das Kennzeichen „verstorben“ zeigt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestTrefferliste<br><span class="testname">test_ausgewaehlte_eigentuemer</span></td><td>Prüft, dass das Trefferfenster die in der Tabelle gewählten Einträge zurückgibt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestTrefferliste<br><span class="testname">test_daten_anzeigen_gibt_auswahl_weiter</span></td><td>Prüft, dass „Daten anzeigen“ die Auswahl der Trefferliste an den Tab übergibt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSitzung<br><span class="testname">test_sitzung_beginnen_oeffnet_leeres_fenster_mit_rahmen</span></td><td>Prüft, dass „Sitzung beginnen“ ein leeres Anzeigefenster als normales Fenster öffnet (ohne gemerkte Lage beim ersten Mal).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSitzung<br><span class="testname">test_lage_gilt_fuer_naechste_sitzung</span></td><td>Prüft, dass Größe und Lage des Fensters beim Beenden gemerkt und in der nächsten Sitzung wiederverwendet werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSitzung<br><span class="testname">test_daten_anzeigen_beginnt_sitzung_bei_bedarf</span></td><td>Prüft, dass „Daten anzeigen“ ohne laufende Sitzung diese beginnt und die Einträge zeigt; die Statuszeile nennt nur die Anzahl.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSitzung<br><span class="testname">test_daten_anzeigen_ohne_auswahl</span></td><td>Prüft, dass „Daten anzeigen“ ohne Auswahl nur einen Hinweis gibt und keine Sitzung beginnt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSitzung<br><span class="testname">test_anzeige_leeren_laesst_fenster_offen</span></td><td>Prüft, dass „Anzeige leeren“ die Daten entfernt, das Fenster aber nicht schließt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSitzung<br><span class="testname">test_sitzung_beenden_schliesst_fenster</span></td><td>Prüft, dass „Sitzung beenden“ das Anzeigefenster schließt und die angezeigten Daten vergisst.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSitzung<br><span class="testname">test_von_aussen_geschlossen_beendet_sitzung</span></td><td>Prüft, dass ein über den Fensterrahmen geschlossenes Anzeigefenster die Sitzung beendet und seine Lage gemerkt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKorrekturLabel<br><span class="testname">test_ohne_eigentuemerdatei</span></td><td>Prüft, dass ohne Eigentümerdatei unter den Knöpfen steht, dass keine gewählt ist.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKorrekturLabel<br><span class="testname">test_pfad_neben_der_eigentuemerdatei</span></td><td>Prüft, dass der Pfad der Korrektur-CSV angezeigt wird, mit Hinweis, solange sie noch nicht angelegt ist.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKorrekturLabel<br><span class="testname">test_ohne_csv_quelle_wird_abgefragt</span></td><td>Prüft, dass bei einer Quelle ohne CSV angekündigt wird, dass der Speicherort beim ersten Speichern abgefragt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKorrekturLabel<br><span class="testname">test_gewaehlter_pfad_wird_angezeigt</span></td><td>Prüft, dass ein einmal gewählter Speicherort angezeigt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKorrektur<br><span class="testname">test_korrektur_wird_festgehalten_und_angezeigt</span></td><td>Prüft, dass eine Korrektur in die Korrektur-CSV geschrieben, sofort angezeigt und ohne Namen gemeldet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKorrektur<br><span class="testname">test_ohne_aenderung_nichts_schreiben</span></td><td>Prüft, dass ein unverändert gespeicherter Dialog nichts schreibt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKorrektur<br><span class="testname">test_abbruch_nichts_schreiben</span></td><td>Prüft, dass ein abgebrochener Korrekturdialog nichts schreibt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKorrektur<br><span class="testname">test_schreibfehler_warnung_und_anzeige_unveraendert</span></td><td>Prüft, dass bei einem Schreibfehler gewarnt, die Anzeige nicht geändert und der Pfad beim nächsten Mal neu bestimmt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKorrektur<br><span class="testname">test_ohne_anzeige_keine_korrektur</span></td><td>Prüft, dass ohne angezeigte Daten kein Korrekturdialog erscheint.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKorrekturDatei<br><span class="testname">test_vorschlag_neben_der_eigentuemerdatei</span></td><td>Prüft, dass die Korrektur-CSV ohne Rückfrage neben der Eigentümerdatei liegt, wenn der Ordner beschreibbar ist, und gemerkt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKorrekturDatei<br><span class="testname">test_ohne_csv_quelle_wird_gefragt</span></td><td>Prüft, dass ohne verwertbare CSV-Quelle nach dem Speicherort gefragt wird; Abbrechen liefert keinen Pfad.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestDockWidgetTabs<br><span class="testname">test_tab_ist_im_dockwidget_eingetragen</span></td><td>Prüft, dass der Tab „Eigentümer“ im DockWidget direkt nach dem Bearbeitungs-Tab steht.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_verfahrensgebiet/tests/test_flurstueck_alkis.py testflurstueckalkis test_user_cancel_returns_none testflurstueckalkis test_empty_text_after_confirmation_returns_none testflurstueckalkis test_invalid_wfs_layer_returns_none testflurstueckalkis test_success_returns_layer_and_first_status testflurstueckalkis test_sql_filter_contains_all_schluessel testflurstueckalkis test_existing_layer_reload_yes testflurstueckalkis test_existing_layer_abbrechen_returns_none testflurstueckalkis test_vorgabe_schluessel_prefills_default_text testflurstueckalkis test_vorgabe_namen_appears_in_label testflurstueckalkis test_backwards_compatible_no_new_params testflurstueckalkis test_ohne_schluessel_abfrage_ueberspringt_ask_text testflurstueckalkisanhaengendedup test_append_ueberspringt_bereits_vorhandene_flurstuecke testflurstueckalkisanhaengendedup test_append_ohne_kennzeichen_feld_haengt_alles_an testflurstueckalkisanhaengendedup test_ohne_schluessel_abfrage_append_dedup" data-hasred="1" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-verfahrensgebiet-tests-test-flurstueck-alkis-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Verfahrensgebiet/tests/test_flurstueck_alkis.py</span><span class="card-meta"><span class="count-total">14 Testfälle</span><span class="cpill cpill-ok">8</span><span class="cpill cpill-warn">6</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-verfahrensgebiet-tests-test-flurstueck-alkis-py"><p class="filedesc">Unit-Tests für das flurstueck_alkis-Modul.</p><div class="gchips"><span class="gchip" title="">TestFlurstueckAlkis <b>11</b></span><span class="gchip" title="Anhängen an einen bestehenden Flurstück-Layer (Issue #28).">TestFlurstueckAlkisAnhaengenDedup <b>3</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_flurstueck_alkis.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestFlurstueckAlkis (11)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;user_cancel_returns_none&quot;)
g1 --&gt; t2(&quot;empty_text_after_confirmation_returns_none&quot;)
g1 --&gt; t3(&quot;invalid_wfs_layer_returns_none&quot;)
g1 --&gt; t4(&quot;success_returns_layer_and_first_status&quot;)
g1 --&gt; t5(&quot;sql_filter_contains_all_schluessel&quot;)
g1 --&gt; t6(&quot;existing_layer_reload_yes&quot;)
g1 --&gt; t7(&quot;existing_layer_abbrechen_returns_none&quot;)
g1 --&gt; t8(&quot;vorgabe_schluessel_prefills_default_text&quot;)
g1 --&gt; t9(&quot;vorgabe_namen_appears_in_label&quot;)
g1 --&gt; t10(&quot;backwards_compatible_no_new_params&quot;)
g1 --&gt; t11(&quot;ohne_schluessel_abfrage_ueberspringt_ask_text&quot;)
root --&gt; g2[&quot;TestFlurstueckAlkisAnhaengenDedup (3)&quot;]
class g2 groupnode
g2 --&gt; t12(&quot;append_ueberspringt_bereits_vorhandene_flurstuecke&quot;)
g2 --&gt; t13(&quot;append_ohne_kennzeichen_feld_haengt_alles_an&quot;)
g2 --&gt; t14(&quot;ohne_schluessel_abfrage_append_dedup&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestFlurstueckAlkis<br><span class="testname">test_user_cancel_returns_none</span></td><td>Prüft, dass ein Abbruch im Eingabedialog (ok=False) (None, LoadStatus.NONE) liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFlurstueckAlkis<br><span class="testname">test_empty_text_after_confirmation_returns_none</span></td><td>Prüft, dass ein bestätigter, aber leerer Eingabetext ebenfalls (None, LoadStatus.NONE) liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFlurstueckAlkis<br><span class="testname">test_invalid_wfs_layer_returns_none</span></td><td>Prüft, dass ein ungültiger WFS-Layer (None, LoadStatus.NONE) liefert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFlurstueckAlkis<br><span class="testname">test_success_returns_layer_and_first_status</span></td><td>Prüft, dass ohne bestehenden Layer der von lade_flurstuecke_per_gemarkung gelieferte Layer mit LoadStatus.FIRST zurückgegeben wird.</td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestFlurstueckAlkis<br><span class="testname">test_sql_filter_contains_all_schluessel</span></td><td>Prüft, dass lade_flurstuecke_per_gemarkung für jeden Gemarkungsschlüssel eine eigene WFS-Anfrage mit dessen Schlüssel stellt.</td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestFlurstueckAlkis<br><span class="testname">test_existing_layer_reload_yes</span></td><td>Prüft, dass bei bestehendem Layer und Klick auf &#x27;Überschreiben&#x27; der alte Layer entfernt und LoadStatus.RELOAD geliefert wird.</td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestFlurstueckAlkis<br><span class="testname">test_existing_layer_abbrechen_returns_none</span></td><td>Prüft, dass bei bestehendem Layer und Klick auf &#x27;Abbrechen&#x27; nichts verändert wird und (None, LoadStatus.NONE) geliefert wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFlurstueckAlkis<br><span class="testname">test_vorgabe_schluessel_prefills_default_text</span></td><td>Prüft, dass vorgabe_schluessel als vorbelegter default_text im Eingabedialog erscheint.</td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestFlurstueckAlkis<br><span class="testname">test_vorgabe_namen_appears_in_label</span></td><td>Prüft, dass vorgabe_namen im Beschriftungstext des Eingabedialogs erscheint.</td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestFlurstueckAlkis<br><span class="testname">test_backwards_compatible_no_new_params</span></td><td>Prüft, dass flurstueck_alkis() ohne die neuen optionalen Parameter weiterhin fehlerfrei einen Layer mit LoadStatus.FIRST liefert.</td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestFlurstueckAlkis<br><span class="testname">test_ohne_schluessel_abfrage_ueberspringt_ask_text</span></td><td>Prüft, dass ohne_schluessel_abfrage=True vorgabe_schluessel direkt verwendet und ask_text nicht aufgerufen wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFlurstueckAlkisAnhaengenDedup<br><span class="testname">test_append_ueberspringt_bereits_vorhandene_flurstuecke</span></td><td>Prüft, dass beim Anhängen bereits vorhandene flurstueckskennzeichen nicht erneut hinzugefügt werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFlurstueckAlkisAnhaengenDedup<br><span class="testname">test_append_ohne_kennzeichen_feld_haengt_alles_an</span></td><td>Prüft, dass ohne flurstueckskennzeichen-Feld weiterhin alle Features angehängt werden (Rückfallverhalten).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFlurstueckAlkisAnhaengenDedup<br><span class="testname">test_ohne_schluessel_abfrage_append_dedup</span></td><td>ohne_schluessel_abfrage=True: Anhängen dedupliziert trotzdem, ohne nach Schlüsseln zu fragen (#47).</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_verfahrensgebiet/tests/test_flurstueck_suche.py testeingabe test_flurstuecksnummer_mit_und_ohne_nenner testeingabe test_ungueltige_flurstuecksnummer testeingabe test_kennzeichen_zerlegen testeingabe test_gemarkungsnummer_aus_ziffern testeingabe test_gemarkungsname_ueber_gemarkungslayer testeingabe test_gemarkungsname_ohne_layer_oder_unbekannt testsuche test_mit_nenner_genau_ein_treffer testsuche test_ohne_nenner_alle_mit_diesem_zaehler testsuche test_kein_treffer testsuche test_layer_ohne_kennzeichenfeld testsuche test_fehlender_flurstueckslayer_bricht_ab testsuche test_suche_im_projekt_mit_gemarkungsname" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-verfahrensgebiet-tests-test-flurstueck-suche-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Verfahrensgebiet/tests/test_flurstueck_suche.py</span><span class="card-meta"><span class="count-total">12 Testfälle</span><span class="cpill cpill-ok">12</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-verfahrensgebiet-tests-test-flurstueck-suche-py"><p class="filedesc">Tests für die Flurstückssuche im Layer „Flurstücke“ (#56).</p><div class="gchips"><span class="gchip" title="">TestEingabe <b>6</b></span><span class="gchip" title="">TestSuche <b>6</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_flurstueck_suche.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestEingabe (6)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;flurstuecksnummer_mit_und_ohne_nenner&quot;)
g1 --&gt; t2(&quot;ungueltige_flurstuecksnummer&quot;)
g1 --&gt; t3(&quot;kennzeichen_zerlegen&quot;)
g1 --&gt; t4(&quot;gemarkungsnummer_aus_ziffern&quot;)
g1 --&gt; t5(&quot;gemarkungsname_ueber_gemarkungslayer&quot;)
g1 --&gt; t6(&quot;gemarkungsname_ohne_layer_oder_unbekannt&quot;)
root --&gt; g2[&quot;TestSuche (6)&quot;]
class g2 groupnode
g2 --&gt; t7(&quot;mit_nenner_genau_ein_treffer&quot;)
g2 --&gt; t8(&quot;ohne_nenner_alle_mit_diesem_zaehler&quot;)
g2 --&gt; t9(&quot;kein_treffer&quot;)
g2 --&gt; t10(&quot;layer_ohne_kennzeichenfeld&quot;)
g2 --&gt; t11(&quot;fehlender_flurstueckslayer_bricht_ab&quot;)
g2 --&gt; t12(&quot;suche_im_projekt_mit_gemarkungsname&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestEingabe<br><span class="testname">test_flurstuecksnummer_mit_und_ohne_nenner</span></td><td>Prüft, dass Zähler und Nenner getrennt und führende Nullen entfernt werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestEingabe<br><span class="testname">test_ungueltige_flurstuecksnummer</span></td><td>Prüft, dass leere oder unzulässige Flurstücksnummern abgelehnt werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestEingabe<br><span class="testname">test_kennzeichen_zerlegen</span></td><td>Prüft, dass Gemarkung, Zähler und Nenner aus dem ALKIS-Kennzeichen gelesen werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestEingabe<br><span class="testname">test_gemarkungsnummer_aus_ziffern</span></td><td>Prüft, dass Ziffern als Gemarkungsnummer gelten, auch ohne führende Nullen oder als langer Schlüssel.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestEingabe<br><span class="testname">test_gemarkungsname_ueber_gemarkungslayer</span></td><td>Prüft, dass ein Gemarkungsname ohne Rücksicht auf Großschreibung in alle passenden Nummern übersetzt wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestEingabe<br><span class="testname">test_gemarkungsname_ohne_layer_oder_unbekannt</span></td><td>Prüft, dass ein Name ohne Gemarkungslayer oder ohne Treffer eine verständliche Meldung ergibt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSuche<br><span class="testname">test_mit_nenner_genau_ein_treffer</span></td><td>Prüft, dass mit Nenner nur das passende Flurstück der Gemarkung gefunden wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSuche<br><span class="testname">test_ohne_nenner_alle_mit_diesem_zaehler</span></td><td>Prüft, dass ohne Nenner alle Flurstücke mit dem Zähler gefunden werden, aber nur in der gesuchten Gemarkung.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSuche<br><span class="testname">test_kein_treffer</span></td><td>Prüft, dass ein nicht vorhandenes Flurstück eine leere Trefferliste ergibt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSuche<br><span class="testname">test_layer_ohne_kennzeichenfeld</span></td><td>Prüft, dass ein Flurstückslayer ohne Feld „flurstueckskennzeichen“ gemeldet wird.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSuche<br><span class="testname">test_fehlender_flurstueckslayer_bricht_ab</span></td><td>Prüft, dass die Suche ohne Layer „Flurstücke“ mit dem Hinweis abbricht, zuerst Verfahrensgebiet und Flurstücke zu laden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSuche<br><span class="testname">test_suche_im_projekt_mit_gemarkungsname</span></td><td>Prüft, dass die Suche im Projekt den Gemarkungsnamen auflöst und Layer samt Treffern liefert.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_verfahrensgebiet/tests/test_gemarkung_alkis.py testextractschluesselundname test_standard_attribute testextractschluesselundname test_fallback_attribute testextractschluesselundname test_missing_attribute_returns_empty testextractschluesselundname test_none_value_returns_empty testgemarkungschluesselbbox test_success_bbox_filter testgemarkungschluesselbbox test_fallback_when_bbox_fails testgemarkungschluesselbbox test_both_layers_fail_returns_empty testgemarkungschluesselbbox test_deduplication_and_sorting testgemarkungschluesselbbox test_feature_without_schluessel_skipped testgemarkungschluesselbbox test_exception_returns_empty testgemarkungschluesselnurnummern test_returns_only_nummern testgemarkungschluesselnurnummern test_empty_input_returns_empty testladegemarkungenlayer test_returns_layer_when_service_reachable testladegemarkungenlayer test_returns_none_when_service_unreachable" data-hasred="1" data-hasskip="1" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-verfahrensgebiet-tests-test-gemarkung-alkis-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Verfahrensgebiet/tests/test_gemarkung_alkis.py</span><span class="card-meta"><span class="count-total">14 Testfälle</span><span class="cpill cpill-ok">4</span><span class="cpill cpill-warn">2</span><span class="cpill cpill-skip">8</span><span class="docbadge" title="Anteil mit Docstring">57% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-verfahrensgebiet-tests-test-gemarkung-alkis-py"><p class="filedesc">Unit-Tests für `sn_verfahrensgebiet.functions.gemarkung_alkis`.</p><div class="gchips"><span class="gchip" title="">TestExtractSchluesselUndName <b>4</b></span><span class="gchip" title="">TestGemarkungSchluesselbbox <b>6</b></span><span class="gchip" title="">TestGemarkungSchluesselnurNummern <b>2</b></span><span class="gchip" title="">TestLadeGemarkungenlayer <b>2</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_gemarkung_alkis.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestExtractSchluesselUndName (4)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;standard_attribute&quot;)
g1 --&gt; t2(&quot;fallback_attribute&quot;)
g1 --&gt; t3(&quot;missing_attribute_returns_empty&quot;)
g1 --&gt; t4(&quot;none_value_returns_empty&quot;)
root --&gt; g2[&quot;TestGemarkungSchluesselbbox (6)&quot;]
class g2 groupnode
g2 --&gt; t5(&quot;success_bbox_filter&quot;)
g2 --&gt; t6(&quot;fallback_when_bbox_fails&quot;)
g2 --&gt; t7(&quot;both_layers_fail_returns_empty&quot;)
g2 --&gt; t8(&quot;deduplication_and_sorting&quot;)
g2 --&gt; t9(&quot;feature_without_schluessel_skipped&quot;)
g2 --&gt; t10(&quot;exception_returns_empty&quot;)
root --&gt; g3[&quot;TestGemarkungSchluesselnurNummern (2)&quot;]
class g3 groupnode
g3 --&gt; t11(&quot;returns_only_nummern&quot;)
g3 --&gt; t12(&quot;empty_input_returns_empty&quot;)
root --&gt; g4[&quot;TestLadeGemarkungenlayer (2)&quot;]
class g4 groupnode
g4 --&gt; t13(&quot;returns_layer_when_service_reachable&quot;)
g4 --&gt; t14(&quot;returns_none_when_service_unreachable&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestExtractSchluesselUndName<br><span class="testname">test_standard_attribute</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestExtractSchluesselUndName<br><span class="testname">test_fallback_attribute</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestExtractSchluesselUndName<br><span class="testname">test_missing_attribute_returns_empty</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestExtractSchluesselUndName<br><span class="testname">test_none_value_returns_empty</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestGemarkungSchluesselbbox<br><span class="testname">test_success_bbox_filter</span></td><td>WFS-BBox-Filter liefert Features → korrekte Tupel-Liste.</td><td><span class="pill pill-skip" title="Legacy API (by_bbox) not available in current module">übersp.</span></td></tr><tr><td class="mono">TestGemarkungSchluesselbbox<br><span class="testname">test_fallback_when_bbox_fails</span></td><td>BBox-Filter schlägt fehl → Fallback auf Volllade + client-seitige Filterung.</td><td><span class="pill pill-skip" title="Legacy API (by_bbox) not available in current module">übersp.</span></td></tr><tr><td class="mono">TestGemarkungSchluesselbbox<br><span class="testname">test_both_layers_fail_returns_empty</span></td><td>Beide Lade-Strategien scheitern → leere Liste.</td><td><span class="pill pill-skip" title="Legacy API (by_bbox) not available in current module">übersp.</span></td></tr><tr><td class="mono">TestGemarkungSchluesselbbox<br><span class="testname">test_deduplication_and_sorting</span></td><td>Doppelte Schlüssel werden dedupliziert, Ergebnis ist sortiert.</td><td><span class="pill pill-skip" title="Legacy API (by_bbox) not available in current module">übersp.</span></td></tr><tr><td class="mono">TestGemarkungSchluesselbbox<br><span class="testname">test_feature_without_schluessel_skipped</span></td><td>Feature ohne Schlüssel-Attribut wird übersprungen.</td><td><span class="pill pill-skip" title="Legacy API (by_bbox) not available in current module">übersp.</span></td></tr><tr><td class="mono">TestGemarkungSchluesselbbox<br><span class="testname">test_exception_returns_empty</span></td><td>Exception im Ladevorgang → leere Liste (kein Crash).</td><td><span class="pill pill-skip" title="Legacy API (by_bbox) not available in current module">übersp.</span></td></tr><tr><td class="mono">TestGemarkungSchluesselnurNummern<br><span class="testname">test_returns_only_nummern</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-skip" title="Legacy API (by_bbox) not available in current module">übersp.</span></td></tr><tr><td class="mono">TestGemarkungSchluesselnurNummern<br><span class="testname">test_empty_input_returns_empty</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-skip" title="Legacy API (by_bbox) not available in current module">übersp.</span></td></tr><tr><td class="mono">TestLadeGemarkungenlayer<br><span class="testname">test_returns_layer_when_service_reachable</span></td><td>Dienst erreichbar (isValid=True) → Layer-Objekt zurückgegeben.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLadeGemarkungenlayer<br><span class="testname">test_returns_none_when_service_unreachable</span></td><td>Dienst nicht erreichbar (isValid=False) → None zurückgegeben.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_verfahrensgebiet/tests/test_grenzpunkt_alkis.py testextrahieregmlids test_xlink_href_format testextrahieregmlids test_plain_gml_id testextrahieregmlids test_empty_value_skipped testextrahieregmlids test_deduplication testextrahieregmlids test_sorted_output testgrenzpunktalkis test_no_vg_layer_returns_none testgrenzpunktalkis test_invalid_punktort_layer testgrenzpunktalkis test_empty_punktort_layer testgrenzpunktalkis test_no_gml_ids_returns_pta_only testgrenzpunktalkis test_grenzpunkt_batch_empty testgrenzpunktalkis test_success_returns_both_layers testgrenzpunktalkis test_extent_derived_from_vg_layer testgrenzpunktegemarkungsweisestil test_stil_wird_nach_dem_laden_auf_den_ergebnis_layer_angewendet" data-hasred="1" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-verfahrensgebiet-tests-test-grenzpunkt-alkis-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Verfahrensgebiet/tests/test_grenzpunkt_alkis.py</span><span class="card-meta"><span class="count-total">13 Testfälle</span><span class="cpill cpill-ok">9</span><span class="cpill cpill-warn">4</span><span class="docbadge" title="Anteil mit Docstring">54% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-verfahrensgebiet-tests-test-grenzpunkt-alkis-py"><p class="filedesc">Unit-Tests für `sn_verfahrensgebiet.functions.grenzpunkt_alkis`.</p><div class="gchips"><span class="gchip" title="">TestExtrahiereGmlIds <b>5</b></span><span class="gchip" title="">TestGrenzpunktAlkis <b>7</b></span><span class="gchip" title="">TestGrenzpunkteGemarkungsweiseStil <b>1</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_grenzpunkt_alkis.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestExtrahiereGmlIds (5)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;xlink_href_format&quot;)
g1 --&gt; t2(&quot;plain_gml_id&quot;)
g1 --&gt; t3(&quot;empty_value_skipped&quot;)
g1 --&gt; t4(&quot;deduplication&quot;)
g1 --&gt; t5(&quot;sorted_output&quot;)
root --&gt; g2[&quot;TestGrenzpunktAlkis (7)&quot;]
class g2 groupnode
g2 --&gt; t6(&quot;no_vg_layer_returns_none&quot;)
g2 --&gt; t7(&quot;invalid_punktort_layer&quot;)
g2 --&gt; t8(&quot;empty_punktort_layer&quot;)
g2 --&gt; t9(&quot;no_gml_ids_returns_pta_only&quot;)
g2 --&gt; t10(&quot;grenzpunkt_batch_empty&quot;)
g2 --&gt; t11(&quot;success_returns_both_layers&quot;)
g2 --&gt; t12(&quot;extent_derived_from_vg_layer&quot;)
root --&gt; g3[&quot;TestGrenzpunkteGemarkungsweiseStil (1)&quot;]
class g3 groupnode
g3 --&gt; t13(&quot;stil_wird_nach_dem_laden_auf_den_ergebnis_layer_angewendet&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestExtrahiereGmlIds<br><span class="testname">test_xlink_href_format</span></td><td>URN-Format &#x27;urn:adv:oid:DEABC123&#x27; → nur &#x27;DEABC123&#x27; extrahiert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestExtrahiereGmlIds<br><span class="testname">test_plain_gml_id</span></td><td>Plain-GML-ID ohne Doppelpunkt → direkt übernommen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestExtrahiereGmlIds<br><span class="testname">test_empty_value_skipped</span></td><td>Leerer gehoertZu-Wert wird übersprungen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestExtrahiereGmlIds<br><span class="testname">test_deduplication</span></td><td>Doppelte Referenzen werden dedupliziert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestExtrahiereGmlIds<br><span class="testname">test_sorted_output</span></td><td>Rückgabe ist aufsteigend sortiert.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestGrenzpunktAlkis<br><span class="testname">test_no_vg_layer_returns_none</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestGrenzpunktAlkis<br><span class="testname">test_invalid_punktort_layer</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestGrenzpunktAlkis<br><span class="testname">test_empty_punktort_layer</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestGrenzpunktAlkis<br><span class="testname">test_no_gml_ids_returns_pta_only</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestGrenzpunktAlkis<br><span class="testname">test_grenzpunkt_batch_empty</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestGrenzpunktAlkis<br><span class="testname">test_success_returns_both_layers</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestGrenzpunktAlkis<br><span class="testname">test_extent_derived_from_vg_layer</span></td><td>Wenn kein extent übergeben → Extent aus VG-Layer holen.</td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestGrenzpunkteGemarkungsweiseStil<br><span class="testname">test_stil_wird_nach_dem_laden_auf_den_ergebnis_layer_angewendet</span></td><td>Prüft, dass grenzpunkte_gemarkungsweise() nach dem Laden apply_style() mit dem neuen ALKIS-Grenzpunkt-Stil auf den fertigen Join-Layer anwendet (#53).</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_verfahrensgebiet/tests/test_knickpunkt_pruefung.py testextrahiereknickpunkte test_leerer_layer_gibt_leere_liste testextrahiereknickpunkte test_keine_gueltige_geometrie_gibt_leere_liste testextrahiereknickpunkte test_feature_mit_leerer_geometrie_gibt_leere_liste testextrahiereknickpunkte test_qgis_nicht_verfuegbar_gibt_leere_liste testknickpunktpruefunginputvalidierung test_keine_knickpunkte_gibt_none_zurueck testknickpunktpruefunginputvalidierung test_kein_punktort_layer_gibt_none_zurueck testknickpunktpruefunginputvalidierung test_abbruch_via_progress_gibt_none_zurueck testknickpunktpruefungklassifizierung test_identischer_punkt_wird_gruen_gezaehlt testknickpunktpruefungklassifizierung test_kein_pta_an_knickpunkt_wird_rot_gezaehlt testfehlendknickpunkteviaverbindungslinien test_leere_union_gibt_null_zurueck testfehlendknickpunkteviaverbindungslinien test_weniger_als_zwei_pta_auf_ring_kein_orange testfehlendknickpunkteviaverbindungslinien test_ungematchter_pta_im_puffer_wird_orange testfehlendknickpunkteviaverbindungslinien test_ungematchter_pta_ausserhalb_puffer_kein_orange" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-verfahrensgebiet-tests-test-knickpunkt-pruefung-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Verfahrensgebiet/tests/test_knickpunkt_pruefung.py</span><span class="card-meta"><span class="count-total">13 Testfälle</span><span class="cpill cpill-ok">13</span><span class="docbadge" title="Anteil mit Docstring">54% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-verfahrensgebiet-tests-test-knickpunkt-pruefung-py"><p class="filedesc">Unit-Tests für `sn_verfahrensgebiet.functions.knickpunkt_pruefung`.</p><div class="gchips"><span class="gchip" title="">TestExtrahiereKnickpunkte <b>4</b></span><span class="gchip" title="">TestKnickpunktPruefungInputvalidierung <b>3</b></span><span class="gchip" title="Testet die Grün/Rot/Orange-Klassifizierung mit gesteuertem QGIS-Mock.">TestKnickpunktPruefungKlassifizierung <b>2</b></span><span class="gchip" title="Direkte Tests für `_fehlende_knickpunkte_via_verbindungslinien`.">TestFehlendKnickpunkteViaVerbindungslinien <b>4</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_knickpunkt_pruefung.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestExtrahiereKnickpunkte (4)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;leerer_layer_gibt_leere_liste&quot;)
g1 --&gt; t2(&quot;keine_gueltige_geometrie_gibt_leere_liste&quot;)
g1 --&gt; t3(&quot;feature_mit_leerer_geometrie_gibt_leere_liste&quot;)
g1 --&gt; t4(&quot;qgis_nicht_verfuegbar_gibt_leere_liste&quot;)
root --&gt; g2[&quot;TestKnickpunktPruefungInputvalidierung (3)&quot;]
class g2 groupnode
g2 --&gt; t5(&quot;keine_knickpunkte_gibt_none_zurueck&quot;)
g2 --&gt; t6(&quot;kein_punktort_layer_gibt_none_zurueck&quot;)
g2 --&gt; t7(&quot;abbruch_via_progress_gibt_none_zurueck&quot;)
root --&gt; g3[&quot;TestKnickpunktPruefungKlassifizierung (2)&quot;]
class g3 groupnode
g3 --&gt; t8(&quot;identischer_punkt_wird_gruen_gezaehlt&quot;)
g3 --&gt; t9(&quot;kein_pta_an_knickpunkt_wird_rot_gezaehlt&quot;)
root --&gt; g4[&quot;TestFehlendKnickpunkteViaVerbindungslinien (4)&quot;]
class g4 groupnode
g4 --&gt; t10(&quot;leere_union_gibt_null_zurueck&quot;)
g4 --&gt; t11(&quot;weniger_als_zwei_pta_auf_ring_kein_orange&quot;)
g4 --&gt; t12(&quot;ungematchter_pta_im_puffer_wird_orange&quot;)
g4 --&gt; t13(&quot;ungematchter_pta_ausserhalb_puffer_kein_orange&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestExtrahiereKnickpunkte<br><span class="testname">test_leerer_layer_gibt_leere_liste</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestExtrahiereKnickpunkte<br><span class="testname">test_keine_gueltige_geometrie_gibt_leere_liste</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestExtrahiereKnickpunkte<br><span class="testname">test_feature_mit_leerer_geometrie_gibt_leere_liste</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestExtrahiereKnickpunkte<br><span class="testname">test_qgis_nicht_verfuegbar_gibt_leere_liste</span></td><td>Wenn qgis.core kein QgsPointXY hat (ImportError in Funktion), leere Liste.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKnickpunktPruefungInputvalidierung<br><span class="testname">test_keine_knickpunkte_gibt_none_zurueck</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKnickpunktPruefungInputvalidierung<br><span class="testname">test_kein_punktort_layer_gibt_none_zurueck</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKnickpunktPruefungInputvalidierung<br><span class="testname">test_abbruch_via_progress_gibt_none_zurueck</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKnickpunktPruefungKlassifizierung<br><span class="testname">test_identischer_punkt_wird_gruen_gezaehlt</span></td><td>PunktortTA exakt am Knickpunkt → identisch_count == 1.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestKnickpunktPruefungKlassifizierung<br><span class="testname">test_kein_pta_an_knickpunkt_wird_rot_gezaehlt</span></td><td>Kein PunktortTA am Knickpunkt → kein_pta_count == 1.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFehlendKnickpunkteViaVerbindungslinien<br><span class="testname">test_leere_union_gibt_null_zurueck</span></td><td>bror_union.isEmpty() == True → (0, []).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFehlendKnickpunkteViaVerbindungslinien<br><span class="testname">test_weniger_als_zwei_pta_auf_ring_kein_orange</span></td><td>Nur 1 gematchter PunktortTA auf Ring → keine fehlenden Knickpunkte.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFehlendKnickpunkteViaVerbindungslinien<br><span class="testname">test_ungematchter_pta_im_puffer_wird_orange</span></td><td>Nicht-gematchter PunktortTA innerhalb 3-cm-Puffer → orange gezählt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFehlendKnickpunkteViaVerbindungslinien<br><span class="testname">test_ungematchter_pta_ausserhalb_puffer_kein_orange</span></td><td>Nicht-gematchter PunktortTA außerhalb Puffer → nicht orange gezählt.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_verfahrensgebiet/tests/test_main.py testpluginmain test_init_sets_services_and_names testpluginmain test_initgui_registers_action_when_basis_ui_exists testpluginmain test_run_creates_dock_and_marks_toolbar_active testpluginmain test_unload_removes_dock_and_action" data-hasred="0" data-hasskip="0" data-nodoc="1"><button class="card-toggle" data-target="plugin-sn-verfahrensgebiet-tests-test-main-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Verfahrensgebiet/tests/test_main.py</span><span class="card-meta"><span class="count-total">4 Testfälle</span><span class="cpill cpill-ok">4</span><span class="docbadge" title="Anteil mit Docstring">0% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-verfahrensgebiet-tests-test-main-py"><p class="filedesc">— (Docstring fehlt)</p><div class="gchips"><span class="gchip" title="">TestPluginMain <b>4</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_main.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestPluginMain (4)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;init_sets_services_and_names&quot;)
g1 --&gt; t2(&quot;initGui_registers_action_when_basis_ui_exists&quot;)
g1 --&gt; t3(&quot;run_creates_dock_and_marks_toolbar_active&quot;)
g1 --&gt; t4(&quot;unload_removes_dock_and_action&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestPluginMain<br><span class="testname">test_init_sets_services_and_names</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPluginMain<br><span class="testname">test_initGui_registers_action_when_basis_ui_exists</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPluginMain<br><span class="testname">test_run_creates_dock_and_marks_toolbar_active</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPluginMain<br><span class="testname">test_unload_removes_dock_and_action</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_verfahrensgebiet/tests/test_verfahrensgebiet_alkis.py testverfahrensgebietalkis test_check_existing_layer_first_load testverfahrensgebietalkis test_check_existing_layer_keep_existing testverfahrensgebietalkis test_verfahrensgebiet_alkis_fails_when_verfahrensnummer_missing testverfahrensgebietalkis test_verfahrensgebiet_alkis_fails_on_invalid_wfs_layer testverfahrensgebietalkis test_verfahrensgebiet_alkis_success_single_kombination testverfahrensgebietalkis test_verfahrensgebiet_alkis_multi_kombination_dialog_auswahl testverfahrensgebietalkis test_verfahrensgebiet_alkis_multi_kombination_dialog_abbruch testverfahrensgebietalkis test_verfahrensgebiet_alkis_multi_kombination_mehrfachauswahl" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-verfahrensgebiet-tests-test-verfahrensgebiet-alkis-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Verfahrensgebiet/tests/test_verfahrensgebiet_alkis.py</span><span class="card-meta"><span class="count-total">8 Testfälle</span><span class="cpill cpill-ok">8</span><span class="docbadge" title="Anteil mit Docstring">50% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-verfahrensgebiet-tests-test-verfahrensgebiet-alkis-py"><p class="filedesc">— (Docstring fehlt)</p><div class="gchips"><span class="gchip" title="">TestVerfahrensgebietAlkis <b>8</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_verfahrensgebiet_alkis.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestVerfahrensgebietAlkis (8)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;check_existing_layer_first_load&quot;)
g1 --&gt; t2(&quot;check_existing_layer_keep_existing&quot;)
g1 --&gt; t3(&quot;verfahrensgebiet_alkis_fails_when_verfahrensnummer_missing&quot;)
g1 --&gt; t4(&quot;verfahrensgebiet_alkis_fails_on_invalid_wfs_layer&quot;)
g1 --&gt; t5(&quot;verfahrensgebiet_alkis_success_single_kombination&quot;)
g1 --&gt; t6(&quot;verfahrensgebiet_alkis_multi_kombination_dialog_auswahl&quot;)
g1 --&gt; t7(&quot;verfahrensgebiet_alkis_multi_kombination_dialog_abbruch&quot;)
g1 --&gt; t8(&quot;verfahrensgebiet_alkis_multi_kombination_mehrfachauswahl&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestVerfahrensgebietAlkis<br><span class="testname">test_check_existing_layer_first_load</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkis<br><span class="testname">test_check_existing_layer_keep_existing</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkis<br><span class="testname">test_verfahrensgebiet_alkis_fails_when_verfahrensnummer_missing</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkis<br><span class="testname">test_verfahrensgebiet_alkis_fails_on_invalid_wfs_layer</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkis<br><span class="testname">test_verfahrensgebiet_alkis_success_single_kombination</span></td><td>Einzelne (adv_name, bezeichnung)-Kombination → kein Dialog, Memory-Layer zurück.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkis<br><span class="testname">test_verfahrensgebiet_alkis_multi_kombination_dialog_auswahl</span></td><td>Zwei verschiedene Kombinationen → Dialog wird gezeigt, gewählte Features genutzt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkis<br><span class="testname">test_verfahrensgebiet_alkis_multi_kombination_dialog_abbruch</span></td><td>Zwei verschiedene Kombinationen → Nutzer bricht Dialog ab → NONE.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkis<br><span class="testname">test_verfahrensgebiet_alkis_multi_kombination_mehrfachauswahl</span></td><td>Zwei verschiedene Kombinationen → beide ausgewählt → beide Feature-Gruppen genutzt.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_verfahrensgebiet/tests/test_verfahrensgebiet_alkis_komplett.py testselectbylocation test_processing_not_available_returns_zero testselectbylocation test_processing_success_returns_count testselectbylocation test_processing_exception_returns_zero testfuegevkzfeldhinzu test_empty_vkz_does_nothing testfuegevkzfeldhinzu test_none_vkz_does_nothing testfuegevkzfeldhinzu test_vkz_field_added testflaechenvergleich test_gleiche_flaeche_stimmt_ueberein testflaechenvergleich test_verschiedene_flaeche_stimmt_nicht_ueberein testflaechenvergleich test_differenz_innerhalb_toleranz testflaechenvergleich test_differenz_ausserhalb_toleranz testflaechenvergleich test_flaechen_werte_korrekt testflaechenvergleich test_lese_toleranz_default_ist_null testflaechenvergleich test_lese_toleranz_parst_string testflaechenvergleich test_lese_toleranz_ungueltig_fallback_null testverfahrensgebietalkiskomplett test_vg_alkis_none_aborts testverfahrensgebietalkiskomplett test_flst_none_aborts testverfahrensgebietalkiskomplett test_no_selection_returns_none_enriched testverfahrensgebietalkiskomplett test_invalid_enriched_layer_returns_none testverfahrensgebietalkiskomplett test_progress_cancel_after_step1_returns_none testverfahrensgebietalkiskomplett test_success_flaechen_match_zeigt_info testverfahrensgebietalkiskomplett test_no_vkz_variable_passes_empty_string testverfahrensgebietalkiskomplett test_flaechen_abweichung_abbrechen_kein_detailcheck testverfahrensgebietalkiskomplett test_flaechen_abweichung_als_vg_laden testverfahrensgebietalkiskomplett test_flaechen_abweichung_detailpruefung_startet_knickpruefung testverfahrensgebietalkiskomplett test_bror_layer_bleibt_bei_erfolg_im_projekt testverfahrensgebietalkiskomplett test_bror_layer_wird_bei_fehler_entfernt testverfahrensgebietalkiskomplett test_kein_vkz_kein_landkreis_dialog_abgebrochen testverfahrensgebietalkiskomplett test_kein_vkz_kein_landkreis_dialog_liefert_landkreis testverfahrensgebietalkiskomplett test_landkreis_modus_wird_bei_fehlender_vkz_verwendet testverfahrensgebietalkiskomplett test_landkreis_modus_nur_laden_ueberspringt_dialog2" data-hasred="0" data-hasskip="0" data-nodoc="1"><button class="card-toggle" data-target="plugin-sn-verfahrensgebiet-tests-test-verfahrensgebiet-alkis-komplett-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Verfahrensgebiet/tests/test_verfahrensgebiet_alkis_komplett.py</span><span class="card-meta"><span class="count-total">30 Testfälle</span><span class="cpill cpill-ok">30</span><span class="docbadge" title="Anteil mit Docstring">37% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-verfahrensgebiet-tests-test-verfahrensgebiet-alkis-komplett-py"><p class="filedesc">Unit-Tests für `sn_verfahrensgebiet.functions.verfahrensgebiet_alkis_komplett`.</p><div class="gchips"><span class="gchip" title="">TestSelectByLocation <b>3</b></span><span class="gchip" title="">TestFuegeVkzFeldHinzu <b>3</b></span><span class="gchip" title="">TestFlaechenvergleich <b>8</b></span><span class="gchip" title="">TestVerfahrensgebietAlkisKomplett <b>16</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_verfahrensgebiet_alkis_komplett.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestSelectByLocation (3)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;processing_not_available_returns_zero&quot;)
g1 --&gt; t2(&quot;processing_success_returns_count&quot;)
g1 --&gt; t3(&quot;processing_exception_returns_zero&quot;)
root --&gt; g2[&quot;TestFuegeVkzFeldHinzu (3)&quot;]
class g2 groupnode
g2 --&gt; t4(&quot;empty_vkz_does_nothing&quot;)
g2 --&gt; t5(&quot;none_vkz_does_nothing&quot;)
g2 --&gt; t6(&quot;vkz_field_added&quot;)
root --&gt; g3[&quot;TestFlaechenvergleich (8)&quot;]
class g3 groupnode
g3 --&gt; t7(&quot;gleiche_flaeche_stimmt_ueberein&quot;)
g3 --&gt; t8(&quot;verschiedene_flaeche_stimmt_nicht_ueberein&quot;)
g3 --&gt; t9(&quot;differenz_innerhalb_toleranz&quot;)
g3 --&gt; t10(&quot;differenz_ausserhalb_toleranz&quot;)
g3 --&gt; t11(&quot;flaechen_werte_korrekt&quot;)
g3 --&gt; t12(&quot;lese_toleranz_default_ist_null&quot;)
g3 --&gt; t13(&quot;lese_toleranz_parst_string&quot;)
g3 --&gt; t14(&quot;lese_toleranz_ungueltig_fallback_null&quot;)
root --&gt; g4[&quot;TestVerfahrensgebietAlkisKomplett (16)&quot;]
class g4 groupnode
g4 --&gt; t15(&quot;vg_alkis_none_aborts&quot;)
g4 --&gt; t16(&quot;flst_none_aborts&quot;)
g4 --&gt; t17(&quot;no_selection_returns_none_enriched&quot;)
g4 --&gt; t18(&quot;invalid_enriched_layer_returns_none&quot;)
g4 --&gt; t19(&quot;progress_cancel_after_step1_returns_none&quot;)
g4 --&gt; t20(&quot;success_flaechen_match_zeigt_info&quot;)
g4 --&gt; t21(&quot;no_vkz_variable_passes_empty_string&quot;)
g4 --&gt; t22(&quot;flaechen_abweichung_abbrechen_kein_detailcheck&quot;)
g4 --&gt; t23(&quot;flaechen_abweichung_als_vg_laden&quot;)
g4 --&gt; t24(&quot;flaechen_abweichung_detailpruefung_startet_knickpruefung&quot;)
g4 --&gt; t25(&quot;bror_layer_bleibt_bei_erfolg_im_projekt&quot;)
g4 --&gt; t26(&quot;bror_layer_wird_bei_fehler_entfernt&quot;)
g4 --&gt; t27(&quot;kein_vkz_kein_landkreis_dialog_abgebrochen&quot;)
g4 --&gt; t28(&quot;kein_vkz_kein_landkreis_dialog_liefert_landkreis&quot;)
g4 --&gt; t29(&quot;landkreis_modus_wird_bei_fehlender_vkz_verwendet&quot;)
g4 --&gt; t30(&quot;landkreis_modus_nur_laden_ueberspringt_dialog2&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestSelectByLocation<br><span class="testname">test_processing_not_available_returns_zero</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSelectByLocation<br><span class="testname">test_processing_success_returns_count</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestSelectByLocation<br><span class="testname">test_processing_exception_returns_zero</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFuegeVkzFeldHinzu<br><span class="testname">test_empty_vkz_does_nothing</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFuegeVkzFeldHinzu<br><span class="testname">test_none_vkz_does_nothing</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFuegeVkzFeldHinzu<br><span class="testname">test_vkz_field_added</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFlaechenvergleich<br><span class="testname">test_gleiche_flaeche_stimmt_ueberein</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFlaechenvergleich<br><span class="testname">test_verschiedene_flaeche_stimmt_nicht_ueberein</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFlaechenvergleich<br><span class="testname">test_differenz_innerhalb_toleranz</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFlaechenvergleich<br><span class="testname">test_differenz_ausserhalb_toleranz</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFlaechenvergleich<br><span class="testname">test_flaechen_werte_korrekt</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFlaechenvergleich<br><span class="testname">test_lese_toleranz_default_ist_null</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFlaechenvergleich<br><span class="testname">test_lese_toleranz_parst_string</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFlaechenvergleich<br><span class="testname">test_lese_toleranz_ungueltig_fallback_null</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkisKomplett<br><span class="testname">test_vg_alkis_none_aborts</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkisKomplett<br><span class="testname">test_flst_none_aborts</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkisKomplett<br><span class="testname">test_no_selection_returns_none_enriched</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkisKomplett<br><span class="testname">test_invalid_enriched_layer_returns_none</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkisKomplett<br><span class="testname">test_progress_cancel_after_step1_returns_none</span></td><td>Abbruch nach Schritt 1 → sofortiger sauberer Rückgabestatus.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkisKomplett<br><span class="testname">test_success_flaechen_match_zeigt_info</span></td><td>Flächenübereinstimmung → show_info_dialog mit erwartetem Text.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkisKomplett<br><span class="testname">test_no_vkz_variable_passes_empty_string</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkisKomplett<br><span class="testname">test_flaechen_abweichung_abbrechen_kein_detailcheck</span></td><td>Abweichung + Abbrechen → knickpunkt_pruefung wird NICHT aufgerufen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkisKomplett<br><span class="testname">test_flaechen_abweichung_als_vg_laden</span></td><td>Abweichung + Als VG laden → BROR-Layer wird umbenannt und als</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkisKomplett<br><span class="testname">test_flaechen_abweichung_detailpruefung_startet_knickpruefung</span></td><td>Abweichung + Detailprüfung → lade_punktort_ta + knickpunkt_pruefung</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkisKomplett<br><span class="testname">test_bror_layer_bleibt_bei_erfolg_im_projekt</span></td><td>Bei Erfolg darf der BROR-Layer NICHT entfernt werden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkisKomplett<br><span class="testname">test_bror_layer_wird_bei_fehler_entfernt</span></td><td>Bei Fehler (flst_alkis NONE) wird der BROR-Layer aus dem Projekt entfernt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkisKomplett<br><span class="testname">test_kein_vkz_kein_landkreis_dialog_abgebrochen</span></td><td>Weder Verfahrensnummer noch Landkreis gesetzt, Nutzer bricht den</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkisKomplett<br><span class="testname">test_kein_vkz_kein_landkreis_dialog_liefert_landkreis</span></td><td>Weder Verfahrensnummer noch Landkreis gesetzt, Nutzer wählt einen</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkisKomplett<br><span class="testname">test_landkreis_modus_wird_bei_fehlender_vkz_verwendet</span></td><td>Keine Verfahrensnummer, aber Landkreis gesetzt → Landkreis-Suchpfad</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietAlkisKomplett<br><span class="testname">test_landkreis_modus_nur_laden_ueberspringt_dialog2</span></td><td>nur_laden=True → Funktion kehrt sofort zurück, Dialog 2 (Gemarkung</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_verfahrensgebiet/tests/test_verfahrensgebiet_dialoge.py testauswahltabelle test_suchfilter_ueber_alle_spalten testauswahltabelle test_auswahl_nach_umsortieren" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-verfahrensgebiet-tests-test-verfahrensgebiet-dialoge-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Verfahrensgebiet/tests/test_verfahrensgebiet_dialoge.py</span><span class="card-meta"><span class="count-total">2 Testfälle</span><span class="cpill cpill-ok">2</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-verfahrensgebiet-tests-test-verfahrensgebiet-dialoge-py"><p class="filedesc">Tests für die gemeinsame Auswahltabelle in verfahrensgebiet_dialoge (#56).</p><div class="gchips"><span class="gchip" title="">TestAuswahltabelle <b>2</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_verfahrensgebiet_dialoge.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestAuswahltabelle (2)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;suchfilter_ueber_alle_spalten&quot;)
g1 --&gt; t2(&quot;auswahl_nach_umsortieren&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestAuswahltabelle<br><span class="testname">test_suchfilter_ueber_alle_spalten</span></td><td>Prüft, dass der Suchfilter Teilstrings in jeder Spalte ohne Groß-/Kleinschreibung findet und leer alles zeigt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestAuswahltabelle<br><span class="testname">test_auswahl_nach_umsortieren</span></td><td>Prüft, dass die Auswahl über den gespeicherten Index auf die ursprünglichen Zeilen zurückgeführt wird, auch wenn die Tabelle umsortiert ist.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_verfahrensgebiet/tests/test_verfahrensgebiet_edit_service.py testpruefeflurstuecklayer test_layer_ok_passes testpruefeflurstuecklayer test_layer_missing_field_fails testpruefeflurstuecklayer test_layer_wrong_geometry_fails testpruefeauswahl test_no_selection_fails testpruefeauswahl test_with_selection_passes testpruefeauswahl test_selectedfeaturecount_exception_treated_as_zero testgetkennzeichenmenge test_returns_set_of_ids testgetkennzeichenmenge test_empty_layer_returns_empty_set testgetkennzeichenmenge test_single_kennzeichen_without_comma testerstelle test_success_counts testerstelle test_partial_failure_on_empty_geometry testerstelle test_all_fail_on_empty_geometries testergaenzeverfahrensgebiet test_adds_only_new_ids testergaenzeverfahrensgebiet test_skip_empty_geometry_counts_as_failed testergaenzeverfahrensgebiet test_all_already_present testentferneausverfahrensgebiet test_removes_present_ids testentferneausverfahrensgebiet test_counts_ids_not_in_layer testentferneausverfahrensgebiet test_none_present_in_layer testentferneausverfahrensgebiet test_empty_selection_removes_nothing testentferneausverfahrensgebiet test_removes_last_id_deletes_feature testersetze test_ersetze_delegates_to_erstelle" data-hasred="0" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-verfahrensgebiet-tests-test-verfahrensgebiet-edit-service-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Verfahrensgebiet/tests/test_verfahrensgebiet_edit_service.py</span><span class="card-meta"><span class="count-total">21 Testfälle</span><span class="cpill cpill-ok">21</span><span class="docbadge" title="Anteil mit Docstring">81% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-verfahrensgebiet-tests-test-verfahrensgebiet-edit-service-py"><p class="filedesc">Unit-Tests für das Verfahrensgebiet-Edit-Service-Modul.</p><div class="gchips"><span class="gchip" title="">TestPruefeFlurstueckLayer <b>3</b></span><span class="gchip" title="">TestPruefeAuswahl <b>3</b></span><span class="gchip" title="">TestGetKennzeichenMenge <b>3</b></span><span class="gchip" title="">TestErstelle <b>3</b></span><span class="gchip" title="">TestErgaenzeVerfahrensgebiet <b>3</b></span><span class="gchip" title="">TestEntferneAusVerfahrensgebiet <b>5</b></span><span class="gchip" title="">TestErsetze <b>1</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_verfahrensgebiet_edit_service.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestPruefeFlurstueckLayer (3)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;layer_ok_passes&quot;)
g1 --&gt; t2(&quot;layer_missing_field_fails&quot;)
g1 --&gt; t3(&quot;layer_wrong_geometry_fails&quot;)
root --&gt; g2[&quot;TestPruefeAuswahl (3)&quot;]
class g2 groupnode
g2 --&gt; t4(&quot;no_selection_fails&quot;)
g2 --&gt; t5(&quot;with_selection_passes&quot;)
g2 --&gt; t6(&quot;selectedFeatureCount_exception_treated_as_zero&quot;)
root --&gt; g3[&quot;TestGetKennzeichenMenge (3)&quot;]
class g3 groupnode
g3 --&gt; t7(&quot;returns_set_of_ids&quot;)
g3 --&gt; t8(&quot;empty_layer_returns_empty_set&quot;)
g3 --&gt; t9(&quot;single_kennzeichen_without_comma&quot;)
root --&gt; g4[&quot;TestErstelle (3)&quot;]
class g4 groupnode
g4 --&gt; t10(&quot;success_counts&quot;)
g4 --&gt; t11(&quot;partial_failure_on_empty_geometry&quot;)
g4 --&gt; t12(&quot;all_fail_on_empty_geometries&quot;)
root --&gt; g5[&quot;TestErgaenzeVerfahrensgebiet (3)&quot;]
class g5 groupnode
g5 --&gt; t13(&quot;adds_only_new_ids&quot;)
g5 --&gt; t14(&quot;skip_empty_geometry_counts_as_failed&quot;)
g5 --&gt; t15(&quot;all_already_present&quot;)
root --&gt; g6[&quot;TestEntferneAusVerfahrensgebiet (5)&quot;]
class g6 groupnode
g6 --&gt; t16(&quot;removes_present_ids&quot;)
g6 --&gt; t17(&quot;counts_ids_not_in_layer&quot;)
g6 --&gt; t18(&quot;none_present_in_layer&quot;)
g6 --&gt; t19(&quot;empty_selection_removes_nothing&quot;)
g6 --&gt; t20(&quot;removes_last_id_deletes_feature&quot;)
root --&gt; g7[&quot;TestErsetze (1)&quot;]
class g7 groupnode
g7 --&gt; t21(&quot;ersetze_delegates_to_erstelle&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestPruefeFlurstueckLayer<br><span class="testname">test_layer_ok_passes</span></td><td>Gültiger Polygon-Vektor-Layer mit Pflichtfeldern → ok=True.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefeFlurstueckLayer<br><span class="testname">test_layer_missing_field_fails</span></td><td>Layer ohne Pflichtfelder → ok=False, aktion=felder_fehlen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefeFlurstueckLayer<br><span class="testname">test_layer_wrong_geometry_fails</span></td><td>Layer mit falschem Geometrietyp → ok=False, aktion=falscher_geotyp.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefeAuswahl<br><span class="testname">test_no_selection_fails</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefeAuswahl<br><span class="testname">test_with_selection_passes</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestPruefeAuswahl<br><span class="testname">test_selectedFeatureCount_exception_treated_as_zero</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestGetKennzeichenMenge<br><span class="testname">test_returns_set_of_ids</span></td><td>Kommagetrennte Kennzeichen im Single-Feature werden korrekt geparst.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestGetKennzeichenMenge<br><span class="testname">test_empty_layer_returns_empty_set</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestGetKennzeichenMenge<br><span class="testname">test_single_kennzeichen_without_comma</span></td><td>Einzelnes Kennzeichen ohne Komma wird korrekt erkannt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestErstelle<br><span class="testname">test_success_counts</span></td><td>3 gültige Features → erfolgreich=3, fehlgeschlagen=0, 1 Union-Feature im Layer.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestErstelle<br><span class="testname">test_partial_failure_on_empty_geometry</span></td><td>2 ok + 1 leere Geometrie → erfolgreich=2, fehlgeschlagen=1.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestErstelle<br><span class="testname">test_all_fail_on_empty_geometries</span></td><td>Alle Features haben leere Geometrie → erfolgreich=0, kein Feature im Layer.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestErgaenzeVerfahrensgebiet<br><span class="testname">test_adds_only_new_ids</span></td><td>Auswahl enthält 1 neue + 1 bereits vorhandene ID → hinzugefügt=1.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestErgaenzeVerfahrensgebiet<br><span class="testname">test_skip_empty_geometry_counts_as_failed</span></td><td>Neue ID mit leerer Geometrie → fehlgeschlagen=1, hinzugefügt=0.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestErgaenzeVerfahrensgebiet<br><span class="testname">test_all_already_present</span></td><td>Alle ausgewählten IDs bereits vorhanden → bereits_vorhanden=n, hinzugefügt=0.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestEntferneAusVerfahrensgebiet<br><span class="testname">test_removes_present_ids</span></td><td>Auswahl enthält 1 vorhandene ID → entfernt=1, nicht_enthalten=0.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestEntferneAusVerfahrensgebiet<br><span class="testname">test_counts_ids_not_in_layer</span></td><td>Auswahl enthält ID, die nicht im Verfahrensgebiet ist → nicht_enthalten=1.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestEntferneAusVerfahrensgebiet<br><span class="testname">test_none_present_in_layer</span></td><td>Auswahl hat IDs, die alle nicht im Layer sind → entfernt=0, nicht_enthalten=n.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestEntferneAusVerfahrensgebiet<br><span class="testname">test_empty_selection_removes_nothing</span></td><td>Leere Auswahl → nichts entfernt, nichts nicht_enthalten.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestEntferneAusVerfahrensgebiet<br><span class="testname">test_removes_last_id_deletes_feature</span></td><td>Wird das letzte Kennzeichen entfernt, wird das Feature gelöscht.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestErsetze<br><span class="testname">test_ersetze_delegates_to_erstelle</span></td><td>ersetze_verfahrensgebiet gibt dasselbe Ergebnis wie erstelle zurück.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_verfahrensgebiet/tests/test_verfahrensgebiet_shape_komplett.py testfindshp test_findet_shp_in_root testfindshp test_findet_shp_in_unterordner testfindshp test_kein_shp_gibt_none_zurueck testfindshp test_case_insensitive_erkennung testerstellememorylayerausshp test_leere_geometrien_geben_none testerstellememorylayerausshp test_keine_features_gibt_none testerstellememorylayerausshp test_attribute_von_erstem_feature_werden_gesetzt testladevgauszip test_dialog_abgebrochen_gibt_none_zurueck testladevgauszip test_zip_fehler_gibt_none_und_warning testladevgauszip test_kein_shp_in_zip_gibt_none_und_warning testladevgauszip test_invalider_qgslayer_gibt_none_und_warning testladevgauszip test_leere_geometrien_geben_none_und_warning testladevgauszip test_erfolg_gibt_memory_layer_zurueck testverfahrensgebietshapekomplett test_lade_zip_none_aborts testverfahrensgebietshapekomplett test_shape_vg_sofort_ins_projekt_nach_laden testverfahrensgebietshapekomplett test_shape_vg_wird_bei_abbruch_aus_projekt_entfernt testverfahrensgebietshapekomplett test_shape_vg_bleibt_im_projekt_bei_erfolg testverfahrensgebietshapekomplett test_flst_none_aborts testverfahrensgebietshapekomplett test_keine_flurstuecke_selektiert_gibt_warning testverfahrensgebietshapekomplett test_flaechen_uebereinstimmung_gibt_info_und_kein_dialog testverfahrensgebietshapekomplett test_abweichung_abbrechen_gibt_shape_vg_zurueck testverfahrensgebietshapekomplett test_abweichung_detailpruefung_ruft_knickpunkt_pruefung_auf testverfahrensgebietshapekomplett test_punktort_ta_none_gibt_shape_vg_zurueck_und_zeigt_fehler testverfahrensgebietshapekomplett test_temp_layer_wird_stets_entfernt testverfahrensgebietshapekomplett test_bror_layer_ist_stets_none testverfahrensgebietshapekomplett test_bror_geladen_und_zurueckgegeben_wenn_vkz_gesetzt testverfahrensgebietshapekomplett test_bror_wird_vor_shape_vg_ins_projekt_eingefuegt testverfahrensgebietshapekomplett test_bror_wird_bei_abbruch_aus_projekt_entfernt testverfahrensgebietshapekomplett test_verfahrensgebiet_alkis_nicht_aufgerufen_wenn_vkz_leer testverfahrensgebietshapekomplett test_bror_als_erstes_argument_beim_flaechenvergleich testverfahrensgebietshapekomplett test_fallback_auf_temp_enriched_wenn_bror_ladeversagen" data-hasred="1" data-hasskip="0" data-nodoc="1"><button class="card-toggle" data-target="plugin-sn-verfahrensgebiet-tests-test-verfahrensgebiet-shape-komplett-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Verfahrensgebiet/tests/test_verfahrensgebiet_shape_komplett.py</span><span class="card-meta"><span class="count-total">31 Testfälle</span><span class="cpill cpill-ok">14</span><span class="cpill cpill-warn">17</span><span class="docbadge" title="Anteil mit Docstring">35% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-verfahrensgebiet-tests-test-verfahrensgebiet-shape-komplett-py"><p class="filedesc">Unit-Tests für `sn_verfahrensgebiet.functions.verfahrensgebiet_shape_komplett`.</p><div class="gchips"><span class="gchip" title="">TestFindShp <b>4</b></span><span class="gchip" title="">TestErstelleMemoryLayerAusShp <b>3</b></span><span class="gchip" title="">TestLadeVgAusZip <b>6</b></span><span class="gchip" title="">TestVerfahrensgebietShapeKomplett <b>18</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_verfahrensgebiet_shape_komplett.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestFindShp (4)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;findet_shp_in_root&quot;)
g1 --&gt; t2(&quot;findet_shp_in_unterordner&quot;)
g1 --&gt; t3(&quot;kein_shp_gibt_none_zurueck&quot;)
g1 --&gt; t4(&quot;case_insensitive_erkennung&quot;)
root --&gt; g2[&quot;TestErstelleMemoryLayerAusShp (3)&quot;]
class g2 groupnode
g2 --&gt; t5(&quot;leere_geometrien_geben_none&quot;)
g2 --&gt; t6(&quot;keine_features_gibt_none&quot;)
g2 --&gt; t7(&quot;attribute_von_erstem_feature_werden_gesetzt&quot;)
root --&gt; g3[&quot;TestLadeVgAusZip (6)&quot;]
class g3 groupnode
g3 --&gt; t8(&quot;dialog_abgebrochen_gibt_none_zurueck&quot;)
g3 --&gt; t9(&quot;zip_fehler_gibt_none_und_warning&quot;)
g3 --&gt; t10(&quot;kein_shp_in_zip_gibt_none_und_warning&quot;)
g3 --&gt; t11(&quot;invalider_qgslayer_gibt_none_und_warning&quot;)
g3 --&gt; t12(&quot;leere_geometrien_geben_none_und_warning&quot;)
g3 --&gt; t13(&quot;erfolg_gibt_memory_layer_zurueck&quot;)
root --&gt; g4[&quot;TestVerfahrensgebietShapeKomplett (18)&quot;]
class g4 groupnode
g4 --&gt; t14(&quot;lade_zip_none_aborts&quot;)
g4 --&gt; t15(&quot;shape_vg_sofort_ins_projekt_nach_laden&quot;)
g4 --&gt; t16(&quot;shape_vg_wird_bei_abbruch_aus_projekt_entfernt&quot;)
g4 --&gt; t17(&quot;shape_vg_bleibt_im_projekt_bei_erfolg&quot;)
g4 --&gt; t18(&quot;flst_none_aborts&quot;)
g4 --&gt; t19(&quot;keine_flurstuecke_selektiert_gibt_warning&quot;)
g4 --&gt; t20(&quot;flaechen_uebereinstimmung_gibt_info_und_kein_dialog&quot;)
g4 --&gt; t21(&quot;abweichung_abbrechen_gibt_shape_vg_zurueck&quot;)
g4 --&gt; t22(&quot;abweichung_detailpruefung_ruft_knickpunkt_pruefung_auf&quot;)
g4 --&gt; t23(&quot;punktort_ta_none_gibt_shape_vg_zurueck_und_zeigt_fehler&quot;)
g4 --&gt; t24(&quot;temp_layer_wird_stets_entfernt&quot;)
g4 --&gt; t25(&quot;bror_layer_ist_stets_none&quot;)
g4 --&gt; t26(&quot;bror_geladen_und_zurueckgegeben_wenn_vkz_gesetzt&quot;)
g4 --&gt; t27(&quot;bror_wird_vor_shape_vg_ins_projekt_eingefuegt&quot;)
g4 --&gt; t28(&quot;bror_wird_bei_abbruch_aus_projekt_entfernt&quot;)
g4 --&gt; t29(&quot;verfahrensgebiet_alkis_nicht_aufgerufen_wenn_vkz_leer&quot;)
g4 --&gt; t30(&quot;bror_als_erstes_argument_beim_flaechenvergleich&quot;)
g4 --&gt; t31(&quot;fallback_auf_temp_enriched_wenn_bror_ladeversagen&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestFindShp<br><span class="testname">test_findet_shp_in_root</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFindShp<br><span class="testname">test_findet_shp_in_unterordner</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFindShp<br><span class="testname">test_kein_shp_gibt_none_zurueck</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestFindShp<br><span class="testname">test_case_insensitive_erkennung</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestErstelleMemoryLayerAusShp<br><span class="testname">test_leere_geometrien_geben_none</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestErstelleMemoryLayerAusShp<br><span class="testname">test_keine_features_gibt_none</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestErstelleMemoryLayerAusShp<br><span class="testname">test_attribute_von_erstem_feature_werden_gesetzt</span></td><td>Attributwerte des ersten Features werden auf das Union-Feature übertragen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestLadeVgAusZip<br><span class="testname">test_dialog_abgebrochen_gibt_none_zurueck</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestLadeVgAusZip<br><span class="testname">test_zip_fehler_gibt_none_und_warning</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestLadeVgAusZip<br><span class="testname">test_kein_shp_in_zip_gibt_none_und_warning</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestLadeVgAusZip<br><span class="testname">test_invalider_qgslayer_gibt_none_und_warning</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestLadeVgAusZip<br><span class="testname">test_leere_geometrien_geben_none_und_warning</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestLadeVgAusZip<br><span class="testname">test_erfolg_gibt_memory_layer_zurueck</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestVerfahrensgebietShapeKomplett<br><span class="testname">test_lade_zip_none_aborts</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietShapeKomplett<br><span class="testname">test_shape_vg_sofort_ins_projekt_nach_laden</span></td><td>Shape-VG wird unmittelbar nach dem Laden ins Projekt eingefügt.</td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestVerfahrensgebietShapeKomplett<br><span class="testname">test_shape_vg_wird_bei_abbruch_aus_projekt_entfernt</span></td><td>Shape-VG wird bei Fehler/Abbruch aus dem Projekt entfernt.</td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestVerfahrensgebietShapeKomplett<br><span class="testname">test_shape_vg_bleibt_im_projekt_bei_erfolg</span></td><td>Bei erfolgreichem Abschluss wird shape_vg NICHT aus dem Projekt entfernt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietShapeKomplett<br><span class="testname">test_flst_none_aborts</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietShapeKomplett<br><span class="testname">test_keine_flurstuecke_selektiert_gibt_warning</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietShapeKomplett<br><span class="testname">test_flaechen_uebereinstimmung_gibt_info_und_kein_dialog</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestVerfahrensgebietShapeKomplett<br><span class="testname">test_abweichung_abbrechen_gibt_shape_vg_zurueck</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestVerfahrensgebietShapeKomplett<br><span class="testname">test_abweichung_detailpruefung_ruft_knickpunkt_pruefung_auf</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestVerfahrensgebietShapeKomplett<br><span class="testname">test_punktort_ta_none_gibt_shape_vg_zurueck_und_zeigt_fehler</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestVerfahrensgebietShapeKomplett<br><span class="testname">test_temp_layer_wird_stets_entfernt</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietShapeKomplett<br><span class="testname">test_bror_layer_ist_stets_none</span></td><td>Dritter Rückgabewert ist im Shape-Workflow immer None (kein BROR).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietShapeKomplett<br><span class="testname">test_bror_geladen_und_zurueckgegeben_wenn_vkz_gesetzt</span></td><td>VKZ gesetzt → verfahrensgebiet_alkis aufgerufen, bror_layer zurückgegeben.</td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestVerfahrensgebietShapeKomplett<br><span class="testname">test_bror_wird_vor_shape_vg_ins_projekt_eingefuegt</span></td><td>BROR wird VOR shape_vg ins Projekt eingefügt (kein Namenskonflikt).</td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestVerfahrensgebietShapeKomplett<br><span class="testname">test_bror_wird_bei_abbruch_aus_projekt_entfernt</span></td><td>BROR und shape_vg werden bei Fehler aus dem Projekt entfernt.</td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestVerfahrensgebietShapeKomplett<br><span class="testname">test_verfahrensgebiet_alkis_nicht_aufgerufen_wenn_vkz_leer</span></td><td>Leere VKZ → verfahrensgebiet_alkis wird NICHT aufgerufen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVerfahrensgebietShapeKomplett<br><span class="testname">test_bror_als_erstes_argument_beim_flaechenvergleich</span></td><td>Mit BROR: _vergleiche_flaechen wird (bror, shape_vg, ...) aufgerufen.</td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestVerfahrensgebietShapeKomplett<br><span class="testname">test_fallback_auf_temp_enriched_wenn_bror_ladeversagen</span></td><td>BROR-Ladeversagen → Fallback: _vergleiche_flaechen mit shape_vg vs temp_enriched.</td><td><span class="pill pill-warn">rot</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_verfahrensgebiet/tests/test_working_tab.py testworkingtab test_set_busy_updates_button_state testworkingtab test_on_verf_layer_changed_valid_sets_variable testworkingtab test_on_verf_layer_changed_none_clears_variable testworkingtab test_handle_verf_alkis_success_path testworkingtab test_handle_verf_alkis_failure_clears_layer_var testworkingtab test_handle_flurst_alkis_first_load_uebernimmt_layer testworkingtab test_handle_flurst_aus_gemarkungen_ruft_flurstueck_alkis_ohne_schluessel_abfrage testworkingtab test_handle_flurst_aus_gemarkungen_abbruch_zeigt_keine_zusaetzliche_meldung testworkingtab test_handle_grenz_alkis_success_sets_haken testworkingtab test_handle_grenz_alkis_none_result_sets_no_haken testworkingtab test_handle_flurst_alkis_success_sets_haken_and_style testworkingtab test_handle_flurst_alkis_existing_layer_keep_path testworkingtab test_handle_flurst_alkis_invalid_input_returns_early testworkingtab test_handle_verfahrensgebiet_from_selection_requires_active_layer testworkingtab test_handle_verfahrensgebiet_from_selection_requires_required_fields testworkingtab test_handle_verfahrensgebiet_from_selection_requires_selection testworkingtab test_handle_verfahrensgebiet_from_selection_new_layer_success testworkingtab test_handle_verfahrensgebiet_from_selection_existing_layer_ergaenzen_dispatch testworkingtab test_handle_verfahrensgebiet_from_selection_existing_layer_entfernen_dispatch testworkingtab test_handle_verfahrensgebiet_from_selection_existing_layer_ersetzen_dispatch testworkingtab test_aus_liste_button_shows_not_implemented_hint testworkingtab test_handle_gem_alkis_service_reachable_adds_layer testworkingtab test_handle_gem_alkis_service_unreachable_shows_warning testworkingtab test_handle_gem_alkis_layer_already_exists_shows_info testhandleverfshape test_status_none_clears_layer_variable testhandleverfshape test_button_always_re_enabled_on_failure testhandleverfshape test_verfahrensnummer_nicht_gesetzt_nein_bricht_ab testhandleverfshape test_verfahrensnummer_nicht_gesetzt_ja_fuehrt_fort testhandleverfshape test_verfahrensnummer_gesetzt_kein_rueckfrage_dialog testhandleverfshape test_success_path_applies_style_and_sets_haken testhandleverfshape test_bror_layer_erhaelt_qml_stil testhandleverfshape test_enriched_layer_already_in_project_not_added_again testhandleverfshape test_busy_state_set_during_execution testzoomimprojektkbs test_alkis_zoom_ueber_zoom_auf_layer testzoomimprojektkbs test_shape_zoom_ueber_zoom_auf_layer" data-hasred="1" data-hasskip="0" data-nodoc="0"><button class="card-toggle" data-target="plugin-sn-verfahrensgebiet-tests-test-working-tab-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Verfahrensgebiet/tests/test_working_tab.py</span><span class="card-meta"><span class="count-total">35 Testfälle</span><span class="cpill cpill-ok">30</span><span class="cpill cpill-warn">5</span><span class="docbadge" title="Anteil mit Docstring">83% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-verfahrensgebiet-tests-test-working-tab-py"><p class="filedesc">— (Docstring fehlt)</p><div class="gchips"><span class="gchip" title="">TestWorkingTab <b>24</b></span><span class="gchip" title="">TestHandleVerfShape <b>9</b></span><span class="gchip" title="Zoom auf das neue Verfahrensgebiet rechnet in das KBS der Kartenansicht um (Basis #99).">TestZoomImProjektKbs <b>2</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_working_tab.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestWorkingTab (24)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;set_busy_updates_button_state&quot;)
g1 --&gt; t2(&quot;on_verf_layer_changed_valid_sets_variable&quot;)
g1 --&gt; t3(&quot;on_verf_layer_changed_none_clears_variable&quot;)
g1 --&gt; t4(&quot;handle_verf_alkis_success_path&quot;)
g1 --&gt; t5(&quot;handle_verf_alkis_failure_clears_layer_var&quot;)
g1 --&gt; t6(&quot;handle_flurst_alkis_first_load_uebernimmt_layer&quot;)
g1 --&gt; t7(&quot;handle_flurst_aus_gemarkungen_ruft_flurstueck_alkis_ohne_schluessel_abfrage&quot;)
g1 --&gt; t8(&quot;handle_flurst_aus_gemarkungen_abbruch_zeigt_keine_zusaetzliche_meldung&quot;)
g1 --&gt; t9(&quot;handle_grenz_alkis_success_sets_haken&quot;)
g1 --&gt; t10(&quot;handle_grenz_alkis_none_result_sets_no_haken&quot;)
g1 --&gt; t11(&quot;handle_flurst_alkis_success_sets_haken_and_style&quot;)
g1 --&gt; t12(&quot;handle_flurst_alkis_existing_layer_keep_path&quot;)
g1 --&gt; t13(&quot;handle_flurst_alkis_invalid_input_returns_early&quot;)
g1 --&gt; t14(&quot;handle_verfahrensgebiet_from_selection_requires_active_layer&quot;)
g1 --&gt; t15(&quot;handle_verfahrensgebiet_from_selection_requires_required_fields&quot;)
g1 --&gt; t16(&quot;handle_verfahrensgebiet_from_selection_requires_selection&quot;)
g1 --&gt; t17(&quot;handle_verfahrensgebiet_from_selection_new_layer_success&quot;)
g1 --&gt; t18(&quot;handle_verfahrensgebiet_from_selection_existing_layer_ergaenzen_dispatch&quot;)
g1 --&gt; t19(&quot;handle_verfahrensgebiet_from_selection_existing_layer_entfernen_dispatch&quot;)
g1 --&gt; t20(&quot;handle_verfahrensgebiet_from_selection_existing_layer_ersetzen_dispatch&quot;)
g1 --&gt; t21(&quot;aus_liste_button_shows_not_implemented_hint&quot;)
g1 --&gt; t22(&quot;handle_gem_alkis_service_reachable_adds_layer&quot;)
g1 --&gt; t23(&quot;handle_gem_alkis_service_unreachable_shows_warning&quot;)
g1 --&gt; t24(&quot;handle_gem_alkis_layer_already_exists_shows_info&quot;)
root --&gt; g2[&quot;TestHandleVerfShape (9)&quot;]
class g2 groupnode
g2 --&gt; t25(&quot;status_none_clears_layer_variable&quot;)
g2 --&gt; t26(&quot;button_always_re_enabled_on_failure&quot;)
g2 --&gt; t27(&quot;verfahrensnummer_nicht_gesetzt_nein_bricht_ab&quot;)
g2 --&gt; t28(&quot;verfahrensnummer_nicht_gesetzt_ja_fuehrt_fort&quot;)
g2 --&gt; t29(&quot;verfahrensnummer_gesetzt_kein_rueckfrage_dialog&quot;)
g2 --&gt; t30(&quot;success_path_applies_style_and_sets_haken&quot;)
g2 --&gt; t31(&quot;bror_layer_erhaelt_qml_stil&quot;)
g2 --&gt; t32(&quot;enriched_layer_already_in_project_not_added_again&quot;)
g2 --&gt; t33(&quot;busy_state_set_during_execution&quot;)
root --&gt; g3[&quot;TestZoomImProjektKbs (2)&quot;]
class g3 groupnode
g3 --&gt; t34(&quot;alkis_zoom_ueber_zoom_auf_layer&quot;)
g3 --&gt; t35(&quot;shape_zoom_ueber_zoom_auf_layer&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestWorkingTab<br><span class="testname">test_set_busy_updates_button_state</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_on_verf_layer_changed_valid_sets_variable</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_on_verf_layer_changed_none_clears_variable</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_verf_alkis_success_path</span></td><td>verfahrensgebiet_alkis_komplett → 4-Tupel (enriched, flst, bror, FIRST).</td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_verf_alkis_failure_clears_layer_var</span></td><td>Status NONE → Layer-Variable wird auf &#x27;&#x27; gesetzt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_flurst_alkis_first_load_uebernimmt_layer</span></td><td>Erstmaliges Laden über &#x27;Flurstücke laden&#x27; fügt den Layer dem Projekt hinzu.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_flurst_aus_gemarkungen_ruft_flurstueck_alkis_ohne_schluessel_abfrage</span></td><td>Der Gemarkungen-Auswahl-Button ruft dieselbe Ladefunktion mit ohne_schluessel_abfrage=True auf (#47).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_flurst_aus_gemarkungen_abbruch_zeigt_keine_zusaetzliche_meldung</span></td><td>Bricht flurstueck_alkis() ab (None, NONE), zeigt der Button keine eigene Meldung – flurstueck_alkis() hat das schon getan (#47).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_grenz_alkis_success_sets_haken</span></td><td>Grenzpunkte erfolgreich geladen → haken_grenz wird gesetzt.</td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_grenz_alkis_none_result_sets_no_haken</span></td><td>grenzpunkt_alkis liefert (None, None) → kein Haken.</td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_flurst_alkis_success_sets_haken_and_style</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_flurst_alkis_existing_layer_keep_path</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_flurst_alkis_invalid_input_returns_early</span></td><td>Status NONE (z. B. Nutzerabbruch) → kein Layer, kein Haken.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_verfahrensgebiet_from_selection_requires_active_layer</span></td><td>Kein aktiver Layer → warning, kein Layer wird erstellt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_verfahrensgebiet_from_selection_requires_required_fields</span></td><td>Layer ohne Pflichtfelder → warning, kein Layer wird erstellt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_verfahrensgebiet_from_selection_requires_selection</span></td><td>Keine Flurstück-Auswahl → warning, kein Layer erstellt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_verfahrensgebiet_from_selection_new_layer_success</span></td><td>Erstlauf ohne bestehenden Layer → Layer wird erstellt und hinzugefügt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_verfahrensgebiet_from_selection_existing_layer_ergaenzen_dispatch</span></td><td>Entscheidung &#x27;ergaenzen&#x27; → ergaenze_verfahrensgebiet wird aufgerufen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_verfahrensgebiet_from_selection_existing_layer_entfernen_dispatch</span></td><td>Entscheidung &#x27;entfernen&#x27; → entferne_aus_verfahrensgebiet wird aufgerufen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_verfahrensgebiet_from_selection_existing_layer_ersetzen_dispatch</span></td><td>Entscheidung &#x27;ersetzen&#x27; → alter Layer entfernt, neuer hinzugefügt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_aus_liste_button_shows_not_implemented_hint</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_gem_alkis_service_reachable_adds_layer</span></td><td>Dienst erreichbar → Layer ins Projekt, Stil angewendet, Haken gesetzt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_gem_alkis_service_unreachable_shows_warning</span></td><td>Dienst nicht erreichbar (None) → warning, kein addMapLayer.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_gem_alkis_layer_already_exists_shows_info</span></td><td>Layer &#x27;Gemarkungen&#x27; bereits vorhanden → info, kein erneutes Laden.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestHandleVerfShape<br><span class="testname">test_status_none_clears_layer_variable</span></td><td>Status NONE → Layer-Variable wird auf &#x27;&#x27; gesetzt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestHandleVerfShape<br><span class="testname">test_button_always_re_enabled_on_failure</span></td><td>Button muss nach Status NONE wieder freigegeben sein (finally).</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestHandleVerfShape<br><span class="testname">test_verfahrensnummer_nicht_gesetzt_nein_bricht_ab</span></td><td>Verfahrensnummer leer + Nutzer wählt &#x27;Nein&#x27; → Vorgang abgebrochen.</td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestHandleVerfShape<br><span class="testname">test_verfahrensnummer_nicht_gesetzt_ja_fuehrt_fort</span></td><td>Verfahrensnummer leer + Nutzer wählt &#x27;Ja&#x27; → Pipeline wird aufgerufen.</td><td><span class="pill pill-warn">rot</span></td></tr><tr><td class="mono">TestHandleVerfShape<br><span class="testname">test_verfahrensnummer_gesetzt_kein_rueckfrage_dialog</span></td><td>Verfahrensnummer gesetzt → kein ask_yes_no-Dialog.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestHandleVerfShape<br><span class="testname">test_success_path_applies_style_and_sets_haken</span></td><td>Erfolg → verfahrensgebiet.qml angewendet, haken_verf gesetzt, success aufgerufen.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestHandleVerfShape<br><span class="testname">test_bror_layer_erhaelt_qml_stil</span></td><td>Wenn bror_layer zurückgegeben → BauRaumOderBodenordnungsrecht.qml angewendet.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestHandleVerfShape<br><span class="testname">test_enriched_layer_already_in_project_not_added_again</span></td><td>Layer bereits im Projekt → kein erneutes addMapLayer für VG-Layer.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestHandleVerfShape<br><span class="testname">test_busy_state_set_during_execution</span></td><td>Button wird während der Ausführung auf busy gesetzt.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestZoomImProjektKbs<br><span class="testname">test_alkis_zoom_ueber_zoom_auf_layer</span></td><td>Prüft, dass nach dem Laden aus ALKIS über zoom_auf_layer auf das Verfahrensgebiet gezoomt wird und nicht mit der unumgerechneten Layer-Ausdehnung.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestZoomImProjektKbs<br><span class="testname">test_shape_zoom_ueber_zoom_auf_layer</span></td><td>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.</td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article></div>
</section>
<section class="pkg-section" id="pkg-sn_plan41">
<div class="pkg-head">
<div>
<h2>sn_plan41</h2>
<p class="pkg-sub">Fachplugin · Ordner <span class="mono">Plugin_SN_Plan41</span> · 5 Testdateien · 44 Testfälle</p>
</div>
<div class="pkg-bar" role="img" aria-label="43 grün, 1 rot, 0 übersprungen">
<span class="seg seg-ok" style="width:98%"></span><span class="seg seg-warn" style="width:2%"></span><span class="seg seg-skip" style="width:0%"></span>
</div>
</div>
<div class="card-grid"><article class="filecard" data-search="plugin_sn_plan41/tests/test_listenauswerter.py testlistenauswerter test_validate_rows_accepts_valid_row_and_normalizes_provider testlistenauswerter test_validate_rows_rejects_missing_required_fields testlistenauswerter test_validate_rows_sets_stildatei_none_on_style_failure testlistenauswerter test_validate_rows_handles_non_mapping_rows_edge_case" data-hasred="0" data-hasskip="0" data-nodoc="1"><button class="card-toggle" data-target="plugin-sn-plan41-tests-test-listenauswerter-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Plan41/tests/test_listenauswerter.py</span><span class="card-meta"><span class="count-total">4 Testfälle</span><span class="cpill cpill-ok">4</span><span class="docbadge" title="Anteil mit Docstring">0% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-plan41-tests-test-listenauswerter-py"><p class="filedesc">— (Docstring fehlt)</p><div class="gchips"><span class="gchip" title="">TestListenauswerter <b>4</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_listenauswerter.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestListenauswerter (4)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;validate_rows_accepts_valid_row_and_normalizes_provider&quot;)
g1 --&gt; t2(&quot;validate_rows_rejects_missing_required_fields&quot;)
g1 --&gt; t3(&quot;validate_rows_sets_stildatei_none_on_style_failure&quot;)
g1 --&gt; t4(&quot;validate_rows_handles_non_mapping_rows_edge_case&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestListenauswerter<br><span class="testname">test_validate_rows_accepts_valid_row_and_normalizes_provider</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestListenauswerter<br><span class="testname">test_validate_rows_rejects_missing_required_fields</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestListenauswerter<br><span class="testname">test_validate_rows_sets_stildatei_none_on_style_failure</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestListenauswerter<br><span class="testname">test_validate_rows_handles_non_mapping_rows_edge_case</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_plan41/tests/test_tab_a_logic.py testtabalogic test_verfahrens_db_set_and_load_roundtrip testtabalogic test_verfahrens_db_clear testtabalogic test_linkliste_set_and_load_existing_path testtabalogic test_linkliste_load_returns_none_when_file_missing testtabalogic test_resolve_linkliste_empty_uses_standard_and_persists testtabalogic test_resolve_linkliste_returns_none_when_pruefmanager_rejects testtabalogic test_resolve_raumfilter_without_filter_returns_none testtabalogic test_resolve_raumfilter_verfahrensgebiet_uses_layer_lookup testtabalogic test_extract_datenabruf_error_maps_merges_reason_maps" data-hasred="0" data-hasskip="0" data-nodoc="1"><button class="card-toggle" data-target="plugin-sn-plan41-tests-test-tab-a-logic-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Plan41/tests/test_tab_a_logic.py</span><span class="card-meta"><span class="count-total">9 Testfälle</span><span class="cpill cpill-ok">9</span><span class="docbadge" title="Anteil mit Docstring">0% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-plan41-tests-test-tab-a-logic-py"><p class="filedesc">— (Docstring fehlt)</p><div class="gchips"><span class="gchip" title="">TestTabALogic <b>9</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_tab_a_logic.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestTabALogic (9)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;verfahrens_db_set_and_load_roundtrip&quot;)
g1 --&gt; t2(&quot;verfahrens_db_clear&quot;)
g1 --&gt; t3(&quot;linkliste_set_and_load_existing_path&quot;)
g1 --&gt; t4(&quot;linkliste_load_returns_none_when_file_missing&quot;)
g1 --&gt; t5(&quot;resolve_linkliste_empty_uses_standard_and_persists&quot;)
g1 --&gt; t6(&quot;resolve_linkliste_returns_none_when_pruefmanager_rejects&quot;)
g1 --&gt; t7(&quot;resolve_raumfilter_without_filter_returns_none&quot;)
g1 --&gt; t8(&quot;resolve_raumfilter_verfahrensgebiet_uses_layer_lookup&quot;)
g1 --&gt; t9(&quot;extract_datenabruf_error_maps_merges_reason_maps&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestTabALogic<br><span class="testname">test_verfahrens_db_set_and_load_roundtrip</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestTabALogic<br><span class="testname">test_verfahrens_db_clear</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestTabALogic<br><span class="testname">test_linkliste_set_and_load_existing_path</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestTabALogic<br><span class="testname">test_linkliste_load_returns_none_when_file_missing</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestTabALogic<br><span class="testname">test_resolve_linkliste_empty_uses_standard_and_persists</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestTabALogic<br><span class="testname">test_resolve_linkliste_returns_none_when_pruefmanager_rejects</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestTabALogic<br><span class="testname">test_resolve_raumfilter_without_filter_returns_none</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestTabALogic<br><span class="testname">test_resolve_raumfilter_verfahrensgebiet_uses_layer_lookup</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestTabALogic<br><span class="testname">test_extract_datenabruf_error_maps_merges_reason_maps</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_plan41/tests/test_tab_a_preconditions.py testtabapreconditions test_get_verfahrensgebiet_layer_shows_hint_when_layer_id_missing testtabapreconditions test_get_verfahrensgebiet_layer_shows_hint_when_layer_not_in_project testtabapreconditions test_pipeline_aborts_and_shows_hint_when_verfahrensgebiet_missing" data-hasred="0" data-hasskip="0" data-nodoc="1"><button class="card-toggle" data-target="plugin-sn-plan41-tests-test-tab-a-preconditions-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Plan41/tests/test_tab_a_preconditions.py</span><span class="card-meta"><span class="count-total">3 Testfälle</span><span class="cpill cpill-ok">3</span><span class="docbadge" title="Anteil mit Docstring">0% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-plan41-tests-test-tab-a-preconditions-py"><p class="filedesc">— (Docstring fehlt)</p><div class="gchips"><span class="gchip" title="">TestTabAPreconditions <b>3</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_tab_a_preconditions.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestTabAPreconditions (3)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;get_verfahrensgebiet_layer_shows_hint_when_layer_id_missing&quot;)
g1 --&gt; t2(&quot;get_verfahrensgebiet_layer_shows_hint_when_layer_not_in_project&quot;)
g1 --&gt; t3(&quot;pipeline_aborts_and_shows_hint_when_verfahrensgebiet_missing&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestTabAPreconditions<br><span class="testname">test_get_verfahrensgebiet_layer_shows_hint_when_layer_id_missing</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestTabAPreconditions<br><span class="testname">test_get_verfahrensgebiet_layer_shows_hint_when_layer_not_in_project</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestTabAPreconditions<br><span class="testname">test_pipeline_aborts_and_shows_hint_when_verfahrensgebiet_missing</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_plan41/tests/test_tab_a_ui.py testtabaui test_tab_a_callbacks_can_be_called_without_crash testtabaui test_tab_a_raumfilter_callback_persists_value testtabaui test_set_services_initializes_logic_and_injects_data_grabber" data-hasred="1" data-hasskip="0" data-nodoc="1"><button class="card-toggle" data-target="plugin-sn-plan41-tests-test-tab-a-ui-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Plan41/tests/test_tab_a_ui.py</span><span class="card-meta"><span class="count-total">3 Testfälle</span><span class="cpill cpill-ok">2</span><span class="cpill cpill-warn">1</span><span class="docbadge" title="Anteil mit Docstring">0% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-plan41-tests-test-tab-a-ui-py"><p class="filedesc">— (Docstring fehlt)</p><div class="gchips"><span class="gchip" title="">TestTabAUI <b>3</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_tab_a_ui.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestTabAUI (3)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;tab_a_callbacks_can_be_called_without_crash&quot;)
g1 --&gt; t2(&quot;tab_a_raumfilter_callback_persists_value&quot;)
g1 --&gt; t3(&quot;set_services_initializes_logic_and_injects_data_grabber&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestTabAUI<br><span class="testname">test_tab_a_callbacks_can_be_called_without_crash</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestTabAUI<br><span class="testname">test_tab_a_raumfilter_callback_persists_value</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestTabAUI<br><span class="testname">test_set_services_initializes_logic_and_injects_data_grabber</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-warn">rot</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_plan41/tests/test_vln_api_logic.py testvlnapilogicavailability test_is_available_reflects_import_state testvlnapilogicavailability test_is_available_false_when_vln_karten_missing testvlnapilogiccredentials test_save_api_key_calls_qsettings testvlnapilogiccredentials test_clear_api_key_calls_remove testvlnapilogiccredentials test_load_stored_credentials_returns_api_key_and_mail testvlnapilogiccredentials test_load_stored_credentials_returns_none_for_empty testvlnapilogiclogin test_login_sets_client_and_saves_key testvlnapilogiclogin test_login_raises_runtime_error_without_qgis_modules testvlnapilogiclogin test_login_propagates_api_error testvlnapilogiclogin test_logout_clears_client testvlnapilogiclogin test_is_authenticated_false_after_logout testvlnapilogiclogin test_handle_session_expired_clears_key_and_client testvlnapilogicverfahren test_get_verfahren_raises_when_not_authenticated testvlnapilogicverfahren test_get_verfahren_delegates_to_client testvlnapilogicvkz test_load_stored_vkz_reads_from_project testvlnapilogicvkz test_load_stored_vkz_returns_none_for_empty testvlnapilogicvkz test_save_vkz_writes_to_project testvlnapilogicvkz test_save_vkz_does_nothing_for_none testvlnapilogicloadp41 test_load_p41_raises_without_vln_karten testvlnapilogicloadp41 test_load_p41_applies_styles_to_polygon_and_line_layers testvlnapilogicloadp41 test_load_p41_no_style_for_point_layer testvlnapilogicupload test_upload_returns_error_for_layer_without_api_path testvlnapilogicupload test_upload_returns_error_for_none_layer testvlnapilogicupload test_upload_returns_false_without_qgis_modules testvlnapilogicupload test_upload_calls_save_feature_collection" data-hasred="0" data-hasskip="0" data-nodoc="1"><button class="card-toggle" data-target="plugin-sn-plan41-tests-test-vln-api-logic-py" aria-expanded="false"><span class="card-path mono">Plugin_SN_Plan41/tests/test_vln_api_logic.py</span><span class="card-meta"><span class="count-total">25 Testfälle</span><span class="cpill cpill-ok">25</span><span class="docbadge" title="Anteil mit Docstring">4% beschrieben</span><span class="chev" aria-hidden="true">▾</span></span></button><div class="card-body" id="body-plugin-sn-plan41-tests-test-vln-api-logic-py"><p class="filedesc">Tests für sn_plan41/modules/vln_api_logic.py</p><div class="gchips"><span class="gchip" title="">TestVlnApiLogicAvailability <b>2</b></span><span class="gchip" title="">TestVlnApiLogicCredentials <b>4</b></span><span class="gchip" title="">TestVlnApiLogicLogin <b>6</b></span><span class="gchip" title="">TestVlnApiLogicVerfahren <b>2</b></span><span class="gchip" title="">TestVlnApiLogicVkz <b>4</b></span><span class="gchip" title="">TestVlnApiLogicLoadP41 <b>3</b></span><span class="gchip" title="">TestVlnApiLogicUpload <b>4</b></span></div><div class="diagram-wrap"><pre class="mermaid">flowchart TD
root([&quot;test_vln_api_logic.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestVlnApiLogicAvailability (2)&quot;]
class g1 groupnode
g1 --&gt; t1(&quot;is_available_reflects_import_state&quot;)
g1 --&gt; t2(&quot;is_available_false_when_vln_karten_missing&quot;)
root --&gt; g2[&quot;TestVlnApiLogicCredentials (4)&quot;]
class g2 groupnode
g2 --&gt; t3(&quot;save_api_key_calls_qsettings&quot;)
g2 --&gt; t4(&quot;clear_api_key_calls_remove&quot;)
g2 --&gt; t5(&quot;load_stored_credentials_returns_api_key_and_mail&quot;)
g2 --&gt; t6(&quot;load_stored_credentials_returns_none_for_empty&quot;)
root --&gt; g3[&quot;TestVlnApiLogicLogin (6)&quot;]
class g3 groupnode
g3 --&gt; t7(&quot;login_sets_client_and_saves_key&quot;)
g3 --&gt; t8(&quot;login_raises_runtime_error_without_qgis_modules&quot;)
g3 --&gt; t9(&quot;login_propagates_api_error&quot;)
g3 --&gt; t10(&quot;logout_clears_client&quot;)
g3 --&gt; t11(&quot;is_authenticated_false_after_logout&quot;)
g3 --&gt; t12(&quot;handle_session_expired_clears_key_and_client&quot;)
root --&gt; g4[&quot;TestVlnApiLogicVerfahren (2)&quot;]
class g4 groupnode
g4 --&gt; t13(&quot;get_verfahren_raises_when_not_authenticated&quot;)
g4 --&gt; t14(&quot;get_verfahren_delegates_to_client&quot;)
root --&gt; g5[&quot;TestVlnApiLogicVkz (4)&quot;]
class g5 groupnode
g5 --&gt; t15(&quot;load_stored_vkz_reads_from_project&quot;)
g5 --&gt; t16(&quot;load_stored_vkz_returns_none_for_empty&quot;)
g5 --&gt; t17(&quot;save_vkz_writes_to_project&quot;)
g5 --&gt; t18(&quot;save_vkz_does_nothing_for_none&quot;)
root --&gt; g6[&quot;TestVlnApiLogicLoadP41 (3)&quot;]
class g6 groupnode
g6 --&gt; t19(&quot;load_p41_raises_without_vln_karten&quot;)
g6 --&gt; t20(&quot;load_p41_applies_styles_to_polygon_and_line_layers&quot;)
g6 --&gt; t21(&quot;load_p41_no_style_for_point_layer&quot;)
root --&gt; g7[&quot;TestVlnApiLogicUpload (4)&quot;]
class g7 groupnode
g7 --&gt; t22(&quot;upload_returns_error_for_layer_without_api_path&quot;)
g7 --&gt; t23(&quot;upload_returns_error_for_none_layer&quot;)
g7 --&gt; t24(&quot;upload_returns_false_without_qgis_modules&quot;)
g7 --&gt; t25(&quot;upload_calls_save_feature_collection&quot;)
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;</pre></div><table class="test-table"><thead><tr><th>Testfall</th><th>prüft</th><th>Status</th></tr></thead><tbody><tr><td class="mono">TestVlnApiLogicAvailability<br><span class="testname">test_is_available_reflects_import_state</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicAvailability<br><span class="testname">test_is_available_false_when_vln_karten_missing</span></td><td>Wenn VLN_KARTEN_AVAILABLE=False, liefert is_available() False.</td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicCredentials<br><span class="testname">test_save_api_key_calls_qsettings</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicCredentials<br><span class="testname">test_clear_api_key_calls_remove</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicCredentials<br><span class="testname">test_load_stored_credentials_returns_api_key_and_mail</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicCredentials<br><span class="testname">test_load_stored_credentials_returns_none_for_empty</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicLogin<br><span class="testname">test_login_sets_client_and_saves_key</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicLogin<br><span class="testname">test_login_raises_runtime_error_without_qgis_modules</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicLogin<br><span class="testname">test_login_propagates_api_error</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicLogin<br><span class="testname">test_logout_clears_client</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicLogin<br><span class="testname">test_is_authenticated_false_after_logout</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicLogin<br><span class="testname">test_handle_session_expired_clears_key_and_client</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicVerfahren<br><span class="testname">test_get_verfahren_raises_when_not_authenticated</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicVerfahren<br><span class="testname">test_get_verfahren_delegates_to_client</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicVkz<br><span class="testname">test_load_stored_vkz_reads_from_project</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicVkz<br><span class="testname">test_load_stored_vkz_returns_none_for_empty</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicVkz<br><span class="testname">test_save_vkz_writes_to_project</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicVkz<br><span class="testname">test_save_vkz_does_nothing_for_none</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicLoadP41<br><span class="testname">test_load_p41_raises_without_vln_karten</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicLoadP41<br><span class="testname">test_load_p41_applies_styles_to_polygon_and_line_layers</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicLoadP41<br><span class="testname">test_load_p41_no_style_for_point_layer</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicUpload<br><span class="testname">test_upload_returns_error_for_layer_without_api_path</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicUpload<br><span class="testname">test_upload_returns_error_for_none_layer</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicUpload<br><span class="testname">test_upload_returns_false_without_qgis_modules</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr><tr><td class="mono">TestVlnApiLogicUpload<br><span class="testname">test_upload_calls_save_feature_collection</span></td><td><span class="nodoc">— (Docstring fehlt)</span></td><td><span class="pill pill-ok">grün</span></td></tr></tbody></table></div></article></div>
</section>
<footer>Erzeugt von <span class="mono">python scripts/testkatalog.py</span> aus den unittest-Suiten der sn_*-Plugins. Diagramme gruppieren Testfälle je Testdatei nach <span class="mono">unittest.TestCase</span>-Klasse; Farbe zeigt den Baseline-Status (grün / rot / übersprungen), nicht die fachliche Wichtigkeit.</footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mermaid/10.9.1/mermaid.min.js"></script>
<script>
(function(){
function initMermaid(){
try{
mermaid.initialize({ startOnLoad:false, theme:"base", securityLevel:"loose",
themeVariables:{ fontFamily:'"IBM Plex Mono", monospace', fontSize:'12.5px' } });
mermaid.run({ querySelector: 'pre.mermaid' }).then(setupToggles).catch(function(e){
console.error('mermaid render failed', e); setupToggles();
});
}catch(e){ console.error(e); setupToggles(); }
}
function setupToggles(){
document.querySelectorAll('.card-toggle').forEach(function(btn){
var card = btn.closest('.filecard');
var body = card.querySelector('.card-body');
if (!body.querySelector('.card-body-inner')){
var inner = document.createElement('div');
inner.className = 'card-body-inner';
while (body.firstChild) inner.appendChild(body.firstChild);
body.appendChild(inner);
}
btn.addEventListener('click', function(){
var isOpen = card.classList.toggle('open');
btn.setAttribute('aria-expanded', isOpen ? 'true':'false');
body.style.maxHeight = isOpen ? (body.scrollHeight + 40) + 'px' : '0px';
});
});
}
function applyFilters(){
var active = document.querySelector('.chip[aria-pressed="true"]').dataset.filter;
var q = document.getElementById('searchInput').value.trim().toLowerCase();
document.querySelectorAll('.filecard').forEach(function(card){
var passFilter = active === 'all' || card.dataset[active] === '1';
var passSearch = !q || card.dataset.search.indexOf(q) !== -1;
card.hidden = !(passFilter && passSearch);
});
document.querySelectorAll('.pkg-section').forEach(function(sec){
sec.hidden = !sec.querySelector('.filecard:not([hidden])');
});
}
document.querySelectorAll('.chip').forEach(function(chip){
chip.addEventListener('click', function(){
document.querySelectorAll('.chip').forEach(function(c){ c.setAttribute('aria-pressed','false'); });
chip.setAttribute('aria-pressed','true');
applyFilters();
});
});
document.getElementById('searchInput').addEventListener('input', applyFilters);
if (document.readyState === 'loading'){ document.addEventListener('DOMContentLoaded', initMermaid); }
else { initMermaid(); }
})();
</script>