# -*- coding: utf-8 -*- """Seitenleiste headless pruefen: Zustaende, Filter, Rueckrufe — und als PNG rendern. Aufruf (macOS, QGIS 4.2 im Bundle; VLN_TOKEN = API-Key aus dem Login): APP=/Applications/QGIS-final-4_2_0.app; LIB="$APP/Contents/Resources/python3.12" QT_QPA_PLATFORM=offscreen PROJ_DATA="$APP/Contents/Resources/qgis/proj" \ PYTHONPATH="$LIB:$LIB/lib-dynload:$LIB/site-packages" \ "$APP/Contents/MacOS/python3.12" tools/headless_panel_test.py /tmp/panel.png Holt die echte Verfahrensliste (GET /tgen) und prueft Zustaende, Filter und Rueckrufe der Seitenleiste; das PNG zeigt das Layout ohne QGIS-Fenster. """ import os, sys sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from qgis.core import QgsApplication app = QgsApplication([], True) QgsApplication.setPrefixPath("/Applications/QGIS-final-4_2_0.app/Contents/MacOS", True) QgsApplication.setPluginPath("/Applications/QGIS-final-4_2_0.app/Contents/PlugIns/qgis") app.initQgis() from qgis.PyQt.QtNetwork import QNetworkProxyFactory QNetworkProxyFactory.setUseSystemConfiguration(False) from qgis.PyQt.QtCore import QSize from vln_karten.panel import VlnPanel from vln_karten.api_client import KartenApiClient ZIEL = sys.argv[1] FEHLER, GERUFEN = [], [] def pruefe(bed, text): print((" OK " if bed else " FEHL ") + text) if not bed: FEHLER.append(text) rueckrufe = {name: (lambda *a, n=name: GERUFEN.append((n, a))) for name in ("login", "logout", "verfahren_gewaehlt", "load_ogc", "save_edits", "save_style")} panel = VlnPanel(None, callbacks=rueckrufe) print("== abgemeldet ==") pruefe(panel.login_knopf.isVisible() or not panel.logout_knopf.isVisibleTo(panel), "Anmelde-Knopf sichtbar, Abmelden verborgen") pruefe(not panel.ogc_knopf.isEnabled() and not panel.combo.isEnabled() and not panel.speichern_knopf.isEnabled(), "Knoepfe und Auswahl gesperrt") print("== angemeldet, echte Verfahrensliste ==") client = KartenApiClient(api_key=os.environ["VLN_TOKEN"]) verfahren = client.get_verfahren() panel.set_angemeldet(True, "erik.sefkow@…") panel.set_verfahren(verfahren) pruefe(panel.ogc_knopf.isEnabled(), "Knoepfe frei") pruefe(panel.anzahl_eintraege() == len(verfahren) + 1, "Liste gefuellt: %d Verfahren + Platzhalter" % len(verfahren)) print("== Filter ==") panel.filter_feld.setText("berb") treffer = [panel.combo.itemText(i) for i in range(panel.combo.count())][1:] pruefe(treffer and all("berb" in t.lower() for t in treffer), "gefiltert auf %d Treffer: %s" % (len(treffer), ", ".join(treffer)[:70])) panel.filter_feld.setText("gibtsnicht") pruefe(panel.combo.count() == 1 and panel.combo.currentData() is None, "kein Treffer -> Platzhalter, kein VKZ") panel.filter_feld.clear() pruefe(panel.anzahl_eintraege() == len(verfahren) + 1, "Filter geleert -> Liste wieder voll") print("== Auswahl + Rueckruf ==") panel.waehle_vkz("27027") pruefe(panel.aktuelles_vkz() == "27027", "Wiederherstellen ohne Rueckruf: %s" % panel.aktuelles_vkz()) pruefe(not any(n == "verfahren_gewaehlt" for n, _ in GERUFEN), "waehle_vkz loest keinen Rueckruf aus") panel.combo.setCurrentIndex(panel.combo.findData(verfahren[0]["vkz"])) pruefe(any(n == "verfahren_gewaehlt" for n, _ in GERUFEN), "Nutzerauswahl meldet ans Plugin") panel.waehle_vkz("27027") print("== Knoepfe ==") panel.ogc_knopf.click(); panel.speichern_knopf.click(); panel.stil_knopf.click() namen = [n for n, _ in GERUFEN] for erwartet in ("load_ogc", "save_edits", "save_style"): pruefe(erwartet in namen, "Rueckruf %s" % erwartet) pruefe(not hasattr(panel, "datensatz_knoepfe") and not hasattr(panel, "upload_knopf"), "kein GeoJSON-Weg mehr in der Seitenleiste") pruefe(panel.gewaehlte_gruppen() == {"Verfahren", "Vorerhebung", "Maßnahmenblätter"}, "alle Gruppen zunaechst angehakt: %s" % sorted(panel.gewaehlte_gruppen())) panel.gruppen_haken["Verfahren"].setChecked(False) pruefe(panel.gewaehlte_gruppen() == {"Vorerhebung", "Maßnahmenblätter"}, "Abwaehlen wirkt: %s" % sorted(panel.gewaehlte_gruppen())) panel.gruppen_haken["Verfahren"].setChecked(True) pruefe(not panel.als_vorlage(), "Vorlage-Haken standardmaessig aus") panel.vorlage_haken.setChecked(True) pruefe(panel.als_vorlage(), "Vorlage-Haken wirkt") panel.vorlage_haken.setChecked(False) print("== Bild ==") panel.set_status("Stil gespeichert: kas-27027-flaeche (Vorlage)") panel.widget().resize(QSize(300, 760)) panel.widget().grab().save(ZIEL) print(" ", ZIEL, os.path.getsize(ZIEL), "Bytes") app.exitQgis() print("== Ergebnis: %d Fehler ==" % len(FEHLER)) for f in FEHLER: print(" -", f) sys.exit(1 if FEHLER else 0)