Files
Projektwissen/docs/tests/testkatalog.html
T

1741 lines
304 KiB
HTML
Raw Normal View History

<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; }
.auditbadge{ 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); }
.pill-pr-ok{ background:var(--ok-bg); color:var(--ok); } .pill-pr-warn{ background:var(--warn-bg); color:var(--warn); } .pill-pr-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)<br>Prüf-Audit: <span class="mono">docs/status/testpruefungen.json</span> (SHA-256 68b590c8feef)</div></div>
<div class="summary">
<div class="stat"><span class="n">418</span><span class="l">Testfälle</span></div>
<div class="stat ok"><span class="n">375</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">65%</span><span class="l">mit Docstring</span></div>
<div class="stat"><span class="n">13%</span><span class="l">aktuell geprüft</span></div>
<div class="stat"><span class="n">36</span><span class="l">Testdateien</span></div>
<div class="stat warn"><span class="n">55%</span><span class="l">ohne Testbezug</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="166 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">19 Dateien · 166 Testfälle</span></div>
<div class="pkg-bar-row"><span class="name">sn_verfahrensgebiet</span><span class="minibar" role="img" aria-label="166 grün, 34 rot, 8 übersprungen"><span class="seg seg-ok" style="width:80%"></span><span class="seg seg-warn" style="width:16%"></span><span class="seg seg-skip" style="width:4%"></span></span><span class="count">12 Dateien · 208 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">(166)</span></a>
<a href="#pkg-sn_verfahrensgebiet">sn_verfahrensgebiet <span class="mono">(208)</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>
<button class="chip" data-filter="ungeprueft" aria-pressed="false">Nie geprüft</button>
<button class="chip" data-filter="veraltet" aria-pressed="false">Veraltet geprüft</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> · 19 Testdateien · 166 Testfälle</p>
</div>
<div class="pkg-bar" role="img" aria-label="166 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_bootstrap.py " data-hasred="0" data-hasskip="0" data-nodoc="1" data-ungeprueft="0" data-veraltet="0"><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="auditbadge" title="Anteil fachlich aktuell geprüft">0% geprüft</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" data-hasred="0" data-hasskip="0" data-nodoc="0" data-ungeprueft="0" data-veraltet="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">6 Testfälle</span><span class="cpill cpill-ok">6</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="auditbadge" title="Anteil fachlich aktuell geprüft">100% geprüft</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>6</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 (6)&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;)
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><th>geprüft</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-16</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-16</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-16</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-16</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-16</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-16</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" data-hasred="0" data-hasskip="0" data-nodoc="0" data-ungeprueft="1" data-veraltet="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">6 Testfälle</span><span class="cpill cpill-ok">6</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="auditbadge" title="Anteil fachlich aktuell geprüft">83% geprüft</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>6</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 (6)&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;)
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><th>geprüft</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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
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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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_geo
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;)
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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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="pi
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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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" data-ungeprueft="0" data-veraltet="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="auditbadge" title="Anteil fachlich aktuell geprüft">100% geprüft</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><th>geprüft</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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" data-ungeprueft="1" data-veraltet="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 cl
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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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
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><th>geprüft</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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" data-ungeprueft="0" data-veraltet="0"><button class="card-toggle" data-target="plugin-sn-basis-tests-test-linkpruefer-py" aria-expanded="false"><span class="card-path m
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><th>geprüft</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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" data-ungeprueft="1" data-veraltet="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="auditbadge" title="Anteil fachlich aktuell geprüft">0% geprüft</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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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" data-ungeprueft="1" data-veraltet="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="auditbadge" title="Anteil fachlich aktuell geprü
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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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 a
root([&quot;test_pruefmanager.py&quot;])
class root rootnode
root --&gt; g1[&quot;TestPruefmanager (14)&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;)
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><th>geprüft</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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</spa
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><th>geprüft</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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" data-ungeprueft="0" data-veraltet="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="auditbadge" title="Anteil fachlich aktuell geprüft">100% geprüft</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><th>geprüft</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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" data-hasred="0" data-hasskip="0" data-nodoc="0" data-ungeprueft="0" data-veraltet="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">1 Testfälle</span><span class="cpill cpill-ok">1</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="auditbadge" title="Anteil fachlich aktuell geprüft">100% geprüft</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></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;)
class t1 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><th>geprüft</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><td><span class="pill pill-pr-ok">geprüft am 2026-09-17</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" data-ungeprueft="1" data-veraltet="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="auditbadge" title="Anteil fachlich aktuell geprüft">0% geprüft</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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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" data-ungeprueft="1" data-veraltet="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="auditbadge" title="Anteil fachlich aktuell geprüft">0% geprüft</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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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" data-hasred="0" data-hasskip="0" data-nodoc="0" data-ungeprueft="1" data-veraltet="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">5 Testfälle</span><span class="cpill cpill-ok">5</span><span class="docbadge" title="Anteil mit Docstring">100% beschrieben</span><span class="auditbadge" title="Anteil fachlich aktuell geprüft">0% geprüft</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">— (Docstring fehlt)</p><div class="gchips"><span class="gchip" title="">TestVerfahrensgebietManager <b>5</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;)
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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</span></td></tr></tbody></table></div></article></div>
<div class="luecken-block" style="margin-top:18px">
<h3 style="font-size:15px">Ungetestete Funktionen (strukturell) – 156 von 229</h3>
<p class="empty-note">Heuristik: Name kommt in keiner Testdatei des Pakets vor. Details siehe docs/tests/testkatalog.md.</p>
<table class="test-table"><thead><tr><th>Datei</th><th>Funktion/Methode</th><th>Zeile</th></tr></thead><tbody><tr><td class="mono">functions/dialog_wrapper.py</td><td class="mono">show_info_dialog</td><td>42</td></tr>
<tr><td class="mono">functions/dialog_wrapper.py</td><td class="mono">ask_text</td><td>56</td></tr>
<tr><td class="mono">functions/dialog_wrapper.py</td><td class="mono">ask_ergaenzen_entfernen_ersetzen_abbrechen</td><td>131</td></tr>
<tr><td class="mono">functions/dialog_wrapper.py</td><td class="mono">ask_detailpruefung_oder_vg_laden</td><td>185</td></tr>
<tr><td class="mono">functions/dialog_wrapper.py</td><td class="mono">ask_detailpruefung_oder_abbrechen</td><td>235</td></tr>
<tr><td class="mono">functions/dialog_wrapper.py</td><td class="mono">ProgressDialog.set_total</td><td>328</td></tr>
<tr><td class="mono">functions/dialog_wrapper.py</td><td class="mono">ProgressDialog.set_value</td><td>336</td></tr>
<tr><td class="mono">functions/dialog_wrapper.py</td><td class="mono">ProgressDialog.set_label</td><td>348</td></tr>
<tr><td class="mono">functions/dialog_wrapper.py</td><td class="mono">ProgressDialog.is_canceled</td><td>357</td></tr>
<tr><td class="mono">functions/dialog_wrapper.py</td><td class="mono">ProgressDialog.close</td><td>366</td></tr>
<tr><td class="mono">functions/dialog_wrapper.py</td><td class="mono">ProgressDialog.raise_to_front</td><td>373</td></tr>
<tr><td class="mono">functions/dialog_wrapper.py</td><td class="mono">create_progress_dialog</td><td>390</td></tr>
<tr><td class="mono">functions/landkreise.py</td><td class="mono">_lade_landkreise</td><td>20</td></tr>
<tr><td class="mono">functions/ly_existence_wrapper.py</td><td class="mono">layer_is_valid</td><td>10</td></tr>
<tr><td class="mono">functions/ly_existence_wrapper.py</td><td class="mono">layer_is_usable</td><td>27</td></tr>
<tr><td class="mono">functions/ly_style_wrapper.py</td><td class="mono">apply_style_from_path</td><td>8</td></tr>
<tr><td class="mono">functions/ly_style_wrapper.py</td><td class="mono">apply_style</td><td>27</td></tr>
<tr><td class="mono">functions/message_wrapper.py</td><td class="mono">_get_message_bar</td><td>15</td></tr>
<tr><td class="mono">functions/message_wrapper.py</td><td class="mono">push_message</td><td>42</td></tr>
<tr><td class="mono">functions/message_wrapper.py</td><td class="mono">info</td><td>67</td></tr>
<tr><td class="mono">functions/message_wrapper.py</td><td class="mono">error</td><td>77</td></tr>
<tr><td class="mono">functions/message_wrapper.py</td><td class="mono">success</td><td>82</td></tr>
<tr><td class="mono">functions/os_wrapper.py</td><td class="mono">normalize_path</td><td>43</td></tr>
<tr><td class="mono">functions/os_wrapper.py</td><td class="mono">get_home_dir</td><td>53</td></tr>
<tr><td class="mono">functions/os_wrapper.py</td><td class="mono">is_absolute_path</td><td>60</td></tr>
<tr><td class="mono">functions/os_wrapper.py</td><td class="mono">basename</td><td>68</td></tr>
<tr><td class="mono">functions/os_wrapper.py</td><td class="mono">is_case_sensitive_fs</td><td>80</td></tr>
<tr><td class="mono">functions/os_wrapper.py</td><td class="mono">path_suffix</td><td>96</td></tr>
<tr><td class="mono">functions/qgiscore_wrapper.py</td><td class="mono">layer_exists_in_gpkg</td><td>1019</td></tr>
<tr><td class="mono">functions/qgiscore_wrapper.py</td><td class="mono">polygon_zu_linie</td><td>1058</td></tr>
<tr><td class="mono">functions/qgisui_wrapper.py</td><td class="mono">get_main_window</td><td>131</td></tr>
<tr><td class="mono">functions/qgisui_wrapper.py</td><td class="mono">add_dock_widget</td><td>149</td></tr>
<tr><td class="mono">functions/qgisui_wrapper.py</td><td class="mono">remove_dock_widget</td><td>156</td></tr>
<tr><td class="mono">functions/qgisui_wrapper.py</td><td class="mono">find_dock_widgets</td><td>163</td></tr>
<tr><td class="mono">functions/qgisui_wrapper.py</td><td class="mono">add_menu</td><td>178</td></tr>
<tr><td class="mono">functions/qgisui_wrapper.py</td><td class="mono">remove_menu</td><td>188</td></tr>
<tr><td class="mono">functions/qgisui_wrapper.py</td><td class="mono">add_toolbar</td><td>201</td></tr>
<tr><td class="mono">functions/qgisui_wrapper.py</td><td class="mono">remove_toolbar</td><td>208</td></tr>
<tr><td class="mono">functions/qgisui_wrapper.py</td><td class="mono">add_layer_to_project</td><td>217</td></tr>
<tr><td class="mono">functions/qt_wrapper.py</td><td class="mono">exec_dialog</td><td>60</td></tr>
<tr><td class="mono">functions/qt_wrapper.py</td><td class="mono">debug_qt_status</td><td>64</td></tr>
<tr><td class="mono">functions/sys_wrapper.py</td><td class="mono">join_path</td><td>36</td></tr>
<tr><td class="mono">functions/sys_wrapper.py</td><td class="mono">ensure_dir</td><td>56</td></tr>
<tr><td class="mono">functions/sys_wrapper.py</td><td class="mono">getattr_safe</td><td>102</td></tr>
<tr><td class="mono">functions/verfahrensgebiet_manager.py</td><td class="mono">_on_layers_added</td><td>109</td></tr>
<tr><td class="mono">functions/verfahrensgebiet_manager.py</td><td class="mono">_on_layer_removed</td><td>114</td></tr>
<tr><td class="mono">functions/verfahrensgebiet_manager.py</td><td class="mono">_on_project_changed</td><td>123</td></tr>
<tr><td class="mono">functions/verfahrensgebiet_manager.py</td><td class="mono">setup_verfahrensgebiet_listener</td><td>132</td></tr>
<tr><td class="mono">functions/verfahrensgebiet_manager.py</td><td class="mono">teardown_verfahrensgebiet_listener</td><td>176</td></tr>
<tr><td class="mono">modules/DataGrabber.py</td><td class="mono">DataGrabber.set_source</td><td>68</td></tr>
<tr><td class="mono">modules/DataGrabber.py</td><td class="mono">DataGrabber._process_database_source</td><td>309</td></tr>
<tr><td class="mono">modules/DataGrabber.py</td><td class="mono">DataGrabber._process_service_source</td><td>320</td></tr>
<tr><td class="mono">modules/DataGrabber.py</td><td class="mono">DataGrabber._aggregate_results</td><td>330</td></tr>
<tr><td class="mono">modules/Dateipruefer.py</td><td class="mono">Dateipruefer.erkenne_dateityp</td><td>77</td></tr>
<tr><td class="mono">modules/Dateipruefer.py</td><td class="mono">Dateipruefer._pfad</td><td>91</td></tr>
<tr><td class="mono">modules/Dateipruefer.py</td><td class="mono">Dateipruefer._ist_leer</td><td>98</td></tr>
<tr><td class="mono">modules/Dateipruefer.py</td><td class="mono">Dateipruefer._ist_gueltiger_gpkg_pfad</td><td>113</td></tr>
<tr><td class="mono">modules/Dateipruefer.py</td><td class="mono">Dateipruefer._handle_leere_eingabe</td><td>227</td></tr>
<tr><td class="mono">modules/Datenschreiber.py</td><td class="mono">Datenschreiber._store_style_in_gpkg</td><td>77</td></tr>
<tr><td class="mono">modules/LayerLoader.py</td><td class="mono">LayerLoader._was_canceled</td><td>42</td></tr>
<tr><td class="mono">modules/LayerLoader.py</td><td class="mono">LayerLoader._process_events</td><td>50</td></tr>
<tr><td class="mono">modules/LayerLoader.py</td><td class="mono">LayerLoader.apply_style</td><td>190</td></tr>
<tr><td class="mono">modules/linkpruefer.py</td><td class="mono">Linkpruefer._pfad</td><td>33</td></tr>
<tr><td class="mono">modules/linkpruefer.py</td><td class="mono">Linkpruefer._ist_url</td><td>41</td></tr>
<tr><td class="mono">modules/linkpruefer.py</td><td class="mono">Linkpruefer._pruefe_url</td><td>81</td></tr>
<tr><td class="mono">modules/linkpruefer.py</td><td class="mono">Linkpruefer._pruefe_dateipfad</td><td>115</td></tr>
<tr><td class="mono">modules/print_layout.py</td><td class="mono">PrintLayout._create_map_item</td><td>98</td></tr>
<tr><td class="mono">modules/print_layout.py</td><td class="mono">PrintLayout._set_item_frame_stroke_width</td><td>119</td></tr>
<tr><td class="mono">modules/print_layout.py</td><td class="mono">PrintLayout._fit_extent_to_map_item</td><td>154</td></tr>
<tr><td class="mono">modules/print_layout.py</td><td class="mono">PrintLayout.add_text_label</td><td>211</td></tr>
<tr><td class="mono">modules/print_layout.py</td><td class="mono">PrintLayout._setup_layout_objects</td><td>242</td></tr>
<tr><td class="mono">modules/print_layout.py</td><td class="mono">PrintLayout._create_label_item</td><td>373</td></tr>
<tr><td class="mono">modules/print_layout.py</td><td class="mono">PrintLayout._resolve_visible_map_layers</td><td>470</td></tr>
<tr><td class="mono">modules/print_layout.py</td><td class="mono">PrintLayout._apply_grid_common_settings</td><td>791</td></tr>
<tr><td class="mono">modules/print_layout.py</td><td class="mono">PrintLayout._safe_grid_call</td><td>797</td></tr>
<tr><td class="mono">modules/print_layout.py</td><td class="mono">PrintLayout._apply_grid_annotation_text_style</td><td>808</td></tr>
<tr><td class="mono">modules/print_layout.py</td><td class="mono">PrintLayout._create_rectangle_box_item</td><td>908</td></tr>
<tr><td class="mono">modules/print_layout_baufreigabe.py</td><td class="mono">PrintLayoutBaufreigabe.create_baufreigabe_layout</td><td>90</td></tr>
<tr><td class="mono">modules/print_layout_baufreigabe.py</td><td class="mono">PrintLayoutBaufreigabe._setup_layout_objects_baufreigabe</td><td>262</td></tr>
<tr><td class="mono">modules/print_layout_baufreigabe.py</td><td class="mono">PrintLayoutBaufreigabe._calc_atlas_margin_percent</td><td>394</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic._failed_result</td><td>123</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic._show_target_size_too_small</td><td>126</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic._is_enabled_flag</td><td>133</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic._resolve_layer_from_project</td><td>138</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic._resolve_active_layer</td><td>158</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic._get_druckpuffer_cm</td><td>167</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic._get_druckpuffer_m</td><td>175</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic._import_qgis_symbol</td><td>178</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic._build_rectangle</td><td>185</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic._clone_extent</td><td>194</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic._get_existing_layer_by_name</td><td>260</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic._create_druckrechteck_layer</td><td>273</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic._clear_layer_features</td><td>301</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic.create_atlas_layer_from_selection</td><td>325</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic.configure_atlas_for_baufreigabe_layout</td><td>468</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic._store_druckrechteck</td><td>614</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic.activate_druckrechteck_capture</td><td>662</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic._resolve_selection_layer</td><td>792</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic._get_selected_extent</td><td>805</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic.set_kartenname_for_auswahl</td><td>961</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic.set_plotmassstab_for_auswahl</td><td>965</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic.set_view_for_auswahl</td><td>976</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic.set_zielgroesse_for_auswahl</td><td>982</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic.set_formfaktor</td><td>985</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic._get_plot_dimensions_mm</td><td>1052</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic._get_required_map_dimensions_mm</td><td>1061</td></tr>
<tr><td class="mono">modules/print_logic.py</td><td class="mono">PrintLogic.druckvorlage_anlegen</td><td>1161</td></tr>
<tr><td class="mono">modules/pruef_ergebnis.py</td><td class="mono">pruef_ergebnis.ist_verfahrens_db_aktion</td><td>149</td></tr>
<tr><td class="mono">modules/pruef_ergebnis.py</td><td class="mono">pruef_ergebnis.dateipfad</td><td>167</td></tr>
<tr><td class="mono">modules/pruef_ergebnis.py</td><td class="mono">pruef_ergebnis.erlaubte_persistierung</td><td>181</td></tr>
<tr><td class="mono">modules/Pruefmanager.py</td><td class="mono">Pruefmanager.report_error</td><td>20</td></tr>
<tr><td class="mono">modules/Pruefmanager.py</td><td class="mono">Pruefmanager.report_summary</td><td>45</td></tr>
<tr><td class="mono">modules/Pruefmanager.py</td><td class="mono">Pruefmanager.zeige_hinweis</td><td>62</td></tr>
<tr><td class="mono">modules/Pruefmanager.py</td><td class="mono">Pruefmanager.frage_ja_nein</td><td>67</td></tr>
<tr><td class="mono">modules/Pruefmanager.py</td><td class="mono">Pruefmanager.frage_text</td><td>73</td></tr>
<tr><td class="mono">modules/Pruefmanager.py</td><td class="mono">Pruefmanager._handle_datei_existiert</td><td>83</td></tr>
<tr><td class="mono">modules/Pruefmanager.py</td><td class="mono">Pruefmanager._handle_verfahrensgebiet_layer_existiert</td><td>230</td></tr>
<tr><td class="mono">modules/Pruefmanager.py</td><td class="mono">Pruefmanager._ask_use_or_replace_pufferlayer</td><td>273</td></tr>
<tr><td class="mono">ui/base_dockwidget.py</td><td class="mono">BaseDockWidget.closeEvent</td><td>97</td></tr>
<tr><td class="mono">ui/dockmanager.py</td><td class="mono">DockManager.show</td><td>30</td></tr>
<tr><td class="mono">ui/navigation.py</td><td class="mono">Navigation.init_ui</td><td>33</td></tr>
<tr><td class="mono">ui/navigation.py</td><td class="mono">Navigation.add_action</td><td>68</td></tr>
<tr><td class="mono">ui/navigation.py</td><td class="mono">Navigation.finalize_menu_and_toolbar</td><td>81</td></tr>
<tr><td class="mono">ui/navigation.py</td><td class="mono">Navigation.set_active_plugin</td><td>94</td></tr>
<tr><td class="mono">ui/navigation.py</td><td class="mono">Navigation.remove_action</td><td>104</td></tr>
<tr><td class="mono">ui/navigation.py</td><td class="mono">Navigation.remove_all</td><td>115</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab.set_services</td><td>94</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._build_ui</td><td>115</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._restore_state</td><td>267</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._on_kartenname_changed</td><td>334</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._on_massstab_changed</td><td>347</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._on_thema_changed</td><td>352</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._on_zielgroesse_changed</td><td>357</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._on_formfaktor_changed</td><td>362</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._on_druckbereich_changed</td><td>368</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._on_atlas_erzeugen_changed</td><td>377</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._on_druckpuffer_clicked</td><td>392</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._format_druckpuffer_label</td><td>425</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._on_vorlage_erstellen</td><td>428</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._disconnect_project_signals</td><td>441</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab.cleanup</td><td>459</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._connect_project_signals</td><td>464</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._on_project_changed</td><td>482</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._toggle_atlas</td><td>489</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._restore_atlas_layer_selection</td><td>495</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._disconnect_theme_collection_signals</td><td>519</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._connect_theme_collection_signals</td><td>538</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._refresh_thema_combo_live</td><td>565</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._get_gespeicherte_themen</td><td>585</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._get_current_canvas_scale</td><td>602</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._on_atlas_layer_changed</td><td>612</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._on_auswahl_as_atlas_clicked</td><td>641</td></tr>
<tr><td class="mono">ui/tabs/print_tab.py</td><td class="mono">PrintTab._populate_atlas_layer_combo</td><td>679</td></tr>
<tr><td class="mono">ui/tabs/settings_tab.py</td><td class="mono">SettingsTab._build_input</td><td>118</td></tr>
<tr><td class="mono">ui/tabs/settings_tab.py</td><td class="mono">SettingsTab.save_data</td><td>130</td></tr>
<tr><td class="mono">ui/tabs/settings_tab.py</td><td class="mono">SettingsTab.load_data</td><td>149</td></tr></tbody></table>
</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> · 12 Testdateien · 208 Testfälle</p>
</div>
<div class="pkg-bar" role="img" aria-label="166 grün, 34 rot, 8 übersprungen">
<span class="seg seg-ok" style="width:80%"></span><span class="seg seg-warn" style="width:16%"></span><span class="seg seg-skip" style="width:4%"></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" data-ungeprueft="1" data-veraltet="0"><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="auditbadge" title="Anteil fachlich aktuell geprüft">0% geprüft</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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</span></td></tr><tr><td class="mono">TestHoleVerfahrensgebietLayer<br><span class="testname">test_layer_per
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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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" data-ungeprueft="1" data-veraltet="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="auditbadge" title="Anteil fachlich aktuell geprüft">0% geprüft</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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</span></td></tr><tr><td class="mono">TestFlurstueckAlkisAnhae
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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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
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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</span></td></tr></tbody></table></div></article><article class="filecard" data-search="plugin_sn_verfahrensgebiet/tests/test_knickpunkt_pruefung.py teste
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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</span></td></tr><tr><td class="mono">TestFehlendKnickpunkteViaVerbindungslinien<br><span class="testname">test_ungematchter_pta_ausserhalb_puffer
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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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" data-ungeprueft="1" data-veraltet="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="auditbadge" title="Anteil fachlich aktuell geprüft">0% geprüft</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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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 testv
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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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 clas
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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</span></td></tr><tr><td class="mono">TestErgaenzeVerfahrensgebiet<br><span class="testname">test_
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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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></t
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;)
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
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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</span></td></tr><tr><td class="mono">TestWorkingTab<br><span class="testname">test_handle_flurst_alkis_invalid_input_returns_early</sp
<div class="luecken-block" style="margin-top:18px">
<h3 style="font-size:15px">Ungetestete Funktionen (strukturell) – 34 von 104</h3>
<p class="empty-note">Heuristik: Name kommt in keiner Testdatei des Pakets vor. Details siehe docs/tests/testkatalog.md.</p>
<table class="test-table"><thead><tr><th>Datei</th><th>Funktion/Methode</th><th>Zeile</th></tr></thead><tbody><tr><td class="mono">functions/beteiligung_pruefung.py</td><td class="mono">_baue_nenner_kennzeichen</td><td>139</td></tr>
<tr><td class="mono">functions/beteiligung_pruefung.py</td><td class="mono">_hole_flurstuecke_layer</td><td>253</td></tr>
<tr><td class="mono">functions/beteiligung_pruefung.py</td><td class="mono">_flurstueckskennzeichen_geometrien</td><td>258</td></tr>
<tr><td class="mono">functions/beteiligung_pruefung.py</td><td class="mono">_try1_listenabgleich</td><td>279</td></tr>
<tr><td class="mono">functions/beteiligung_pruefung.py</td><td class="mono">_lese_vef_vkzf</td><td>380</td></tr>
<tr><td class="mono">functions/flurstueck_alkis.py</td><td class="mono">_vorhandene_kennzeichen</td><td>80</td></tr>
<tr><td class="mono">functions/gemarkung_alkis.py</td><td class="mono">gemarkung_schluessel_von_vg_geometrie</td><td>212</td></tr>
<tr><td class="mono">functions/grenzpunkt_alkis.py</td><td class="mono">_punktort_ta_bbox_param</td><td>115</td></tr>
<tr><td class="mono">functions/grenzpunkt_alkis.py</td><td class="mono">_hat_geometrie</td><td>573</td></tr>
<tr><td class="mono">functions/grenzpunkt_alkis.py</td><td class="mono">_lade_gemarkung_extents_mit_puffer</td><td>637</td></tr>
<tr><td class="mono">functions/grenzpunkt_alkis.py</td><td class="mono">_lade_punktort_ta_batches_per_gemarkung</td><td>784</td></tr>
<tr><td class="mono">functions/knickpunkt_pruefung.py</td><td class="mono">_setze_kategorien_symbologie</td><td>158</td></tr>
<tr><td class="mono">functions/knickpunkt_pruefung.py</td><td class="mono">erstelle_korrigiertes_polygon</td><td>604</td></tr>
<tr><td class="mono">functions/umringspruefung.py</td><td class="mono">_zerlege_in_teile</td><td>55</td></tr>
<tr><td class="mono">functions/umringspruefung.py</td><td class="mono">_setze_kategorien_symbologie</td><td>112</td></tr>
<tr><td class="mono">functions/umringspruefung.py</td><td class="mono">umringspruefung</td><td>152</td></tr>
<tr><td class="mono">functions/umringstatistik_grenzpunkte.py</td><td class="mono">_setze_kategorien_symbologie</td><td>74</td></tr>
<tr><td class="mono">functions/umringstatistik_grenzpunkte.py</td><td class="mono">_klassifiziere</td><td>119</td></tr>
<tr><td class="mono">functions/umringstatistik_grenzpunkte.py</td><td class="mono">umringstatistik_grenzpunkte</td><td>164</td></tr>
<tr><td class="mono">functions/verfahrensgebiet_alkis.py</td><td class="mono">_baue_layer_aus_kombinationen</td><td>144</td></tr>
<tr><td class="mono">functions/verfahrensgebiet_alkis_komplett.py</td><td class="mono">_entferne_hilfs_layer</td><td>100</td></tr>
<tr><td class="mono">functions/verfahrensgebiet_alkis_komplett.py</td><td class="mono">_flaeche_des_layers</td><td>210</td></tr>
<tr><td class="mono">functions/verfahrensgebiet_dialoge.py</td><td class="mono">ask_landkreis_objekte</td><td>101</td></tr>
<tr><td class="mono">functions/verfahrensgebiet_shape_komplett.py</td><td class="mono">_normalisiere_feldname</td><td>110</td></tr>
<tr><td class="mono">functions/verfahrensgebiet_shape_komplett.py</td><td class="mono">_finde_fbschl_index</td><td>132</td></tr>
<tr><td class="mono">functions/verfahrensgebiet_shape_komplett.py</td><td class="mono">_ermittle_gebietstyp_aus_fbschl</td><td>161</td></tr>
<tr><td class="mono">functions/verfahrensgebiet_shape_komplett.py</td><td class="mono">_wende_vergleich_stil_an</td><td>211</td></tr>
<tr><td class="mono">functions/verfahrensgebiet_shape_komplett.py</td><td class="mono">_erstelle_vergleich_layer</td><td>251</td></tr>
<tr><td class="mono">functions/verfahrensgebiet_shape_komplett.py</td><td class="mono">_finde_alle_shp</td><td>342</td></tr>
<tr><td class="mono">ui/tabs/working_tab.py</td><td class="mono">WorkingTab.handle_beteiligung_pruefen</td><td>297</td></tr>
<tr><td class="mono">ui/tabs/working_tab.py</td><td class="mono">WorkingTab._haken_label</td><td>349</td></tr>
<tr><td class="mono">ui/tabs/working_tab.py</td><td class="mono">WorkingTab._restore_verf_layer_selection</td><td>374</td></tr>
<tr><td class="mono">ui/tabs/working_tab.py</td><td class="mono">WorkingTab._uebernimm_flurstuecke_ergebnis</td><td>390</td></tr>
<tr><td class="mono">ui/tabs/working_tab.py</td><td class="mono">WorkingTab.handle_umringstatistik</td><td>777</td></tr></tbody></table>
</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" data-ungeprueft="1" data-veraltet="0"><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="auditbadge" title="Anteil fachlich aktuell geprüft">0% geprüft</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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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" data-ungeprueft="1" data-veraltet="0"><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="auditbadge" title="Anteil fachlich aktuell geprüft">0% geprüft</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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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" data-ungeprueft="1" data-veraltet="0"><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="auditbadge" title="Anteil fachlich aktuell geprüft">0% geprüft</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="merm
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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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" data-ungeprueft="1" data-veraltet="0"><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="auditbadge" title="Anteil fachlich aktuell geprüft">0% geprüft</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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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" data-ungeprueft="1" data-veraltet="0"><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="auditbadge" title="Anteil fachlich aktuell geprüft">0% geprüft</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="diagr
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><th>geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</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><td><span class="pill pill-pr-skip">nie geprüft</span></td></tr><tr><td class="mono">TestVlnApiLogicVerfahren<
<div class="luecken-block" style="margin-top:18px">
<h3 style="font-size:15px">Ungetestete Funktionen (strukturell) – 39 von 80</h3>
<p class="empty-note">Heuristik: Name kommt in keiner Testdatei des Pakets vor. Details siehe docs/tests/testkatalog.md.</p>
<table class="test-table"><thead><tr><th>Datei</th><th>Funktion/Methode</th><th>Zeile</th></tr></thead><tbody><tr><td class="mono">modules/vln_api_client.py</td><td class="mono">KartenApiClient.load_feature_collection</td><td>154</td></tr>
<tr><td class="mono">modules/vln_api_client.py</td><td class="mono">KartenApiClient._request</td><td>176</td></tr>
<tr><td class="mono">modules/vln_api_client.py</td><td class="mono">KartenApiClient._error_detail</td><td>235</td></tr>
<tr><td class="mono">modules/vln_api_logic.py</td><td class="mono">VlnApiLogic.get_p41_layers</td><td>233</td></tr>
<tr><td class="mono">modules/vln_api_logic.py</td><td class="mono">VlnApiLogic.remove_p41_layers</td><td>237</td></tr>
<tr><td class="mono">modules/vln_api_logic.py</td><td class="mono">VlnApiLogic._apply_p41_styles</td><td>277</td></tr>
<tr><td class="mono">modules/vln_api_logic.py</td><td class="mono">VlnApiLogic.upload_summary</td><td>347</td></tr>
<tr><td class="mono">modules/vln_layer_manager.py</td><td class="mono">_family</td><td>58</td></tr>
<tr><td class="mono">modules/vln_layer_manager.py</td><td class="mono">memory_layer_from_features</td><td>73</td></tr>
<tr><td class="mono">ui/dockwidget.py</td><td class="mono">DockWidget._init_tabs_with_services</td><td>42</td></tr>
<tr><td class="mono">ui/tab_a_logic.py</td><td class="mono">TabALogic._log</td><td>90</td></tr>
<tr><td class="mono">ui/tab_a_logic.py</td><td class="mono">TabALogic._create_silent_pruefmanager</td><td>93</td></tr>
<tr><td class="mono">ui/tab_a_logic.py</td><td class="mono">TabALogic._zeige_verfahrensgebiet_hinweis</td><td>127</td></tr>
<tr><td class="mono">ui/tab_a_logic.py</td><td class="mono">TabALogic._close_progress_dialog</td><td>139</td></tr>
<tr><td class="mono">ui/tab_a_logic.py</td><td class="mono">TabALogic.write_layer_to_verfahrens_db</td><td>169</td></tr>
<tr><td class="mono">ui/tab_a_logic.py</td><td class="mono">TabALogic.is_valid_verfahrensgebiet_layer</td><td>242</td></tr>
<tr><td class="mono">ui/tab_a_logic.py</td><td class="mono">TabALogic._load_dienste_aus_result_dict</td><td>391</td></tr>
<tr><td class="mono">ui/tab_a_logic.py</td><td class="mono">TabALogic._create_local_layer_from_fetched_features</td><td>639</td></tr>
<tr><td class="mono">ui/tab_a_logic.py</td><td class="mono">TabALogic._write_html_log</td><td>779</td></tr>
<tr><td class="mono">ui/tab_a_logic.py</td><td class="mono">TabALogic._clone_layer_with_extent</td><td>934</td></tr>
<tr><td class="mono">ui/tab_a_logic.py</td><td class="mono">TabALogic._handle_pufferlayer</td><td>1062</td></tr>
<tr><td class="mono">ui/tab_a_logic.py</td><td class="mono">TabALogic._load_existing_pufferlayer</td><td>1084</td></tr>
<tr><td class="mono">ui/tab_a_logic.py</td><td class="mono">TabALogic._create_pufferlayer</td><td>1092</td></tr>
<tr><td class="mono">ui/tab_a_logic.py</td><td class="mono">TabALogic._pufferlayer_exists_in_source</td><td>1119</td></tr>
<tr><td class="mono">ui/tab_a_logic.py</td><td class="mono">TabALogic.Pufferlayer_erstellen</td><td>1133</td></tr>
<tr><td class="mono">ui/tab_a_ui.py</td><td class="mono">TabA._build_ui</td><td>113</td></tr>
<tr><td class="mono">ui/tab_a_ui.py</td><td class="mono">TabA._restore_state</td><td>274</td></tr>
<tr><td class="mono">ui/tab_a_ui.py</td><td class="mono">TabA._restore_vln_state</td><td>296</td></tr>
<tr><td class="mono">ui/tab_a_ui.py</td><td class="mono">TabA._toggle_vln_group</td><td>307</td></tr>
<tr><td class="mono">ui/tab_a_ui.py</td><td class="mono">TabA._update_vln_ui_state</td><td>311</td></tr>
<tr><td class="mono">ui/tab_a_ui.py</td><td class="mono">TabA._populate_verfahren_combo</td><td>347</td></tr>
<tr><td class="mono">ui/tab_a_ui.py</td><td class="mono">TabA._on_vln_login</td><td>374</td></tr>
<tr><td class="mono">ui/tab_a_ui.py</td><td class="mono">TabA._on_vln_logout</td><td>405</td></tr>
<tr><td class="mono">ui/tab_a_ui.py</td><td class="mono">TabA._on_vln_verfahren_changed</td><td>416</td></tr>
<tr><td class="mono">ui/tab_a_ui.py</td><td class="mono">TabA._on_p41_laden</td><td>424</td></tr>
<tr><td class="mono">ui/tab_a_ui.py</td><td class="mono">TabA._on_upload_active</td><td>498</td></tr>
<tr><td class="mono">ui/tab_a_ui.py</td><td class="mono">TabA._create_new_gpkg</td><td>595</td></tr>
<tr><td class="mono">ui/tab_a_ui.py</td><td class="mono">TabA._update_group_color</td><td>608</td></tr>
<tr><td class="mono">ui/tab_a_ui.py</td><td class="mono">TabA._on_load_fachdaten</td><td>618</td></tr></tbody></table>
</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>