Open Data Wizard 2.40.1
Ein Fehler im Delta-Endpunkt, gefunden von den wiederbelebten End-to-End-Tests — und die
Absicherung drumherum: zwei Lücken in der CI geschlossen, die größte ungetestete Klasse
getestet, die brachliegenden E2E-Tests wieder in Betrieb genommen.
🐛 Fixed
/delta?since=…wies Zeitstempel mit Sekundenbruchteilen ab. Wer den Parameter so
erzeugt, wie es am nächsten liegt — JavaScriptstoISOString()hängt immer Millisekunden an,
Pythonsdatetime.isoformat()Mikrosekunden —, bekam HTTP 400 statt seiner Daten. RFC 3339
erlaubt Sekundenbruchteile ausdrücklich (time-secfrac); die Formatliste inparse_iso8601()
kannte sie schlicht nicht. Aufgefallen ist es, weil der neue E2E-Test genau so einen
Zeitstempel baut. Genau dafür sind diese Tests da: Der Unit-Test prüfte bis dahin nur
Schreibweisen, die jemand von Hand tippt.
🔧 Nur im Repository, nicht im Paket
Die folgenden Punkte betreffen ausschließlich .github/, bin/, tests/, config/ sowie
die Node- und wp-env-Dateien. Nichts davon wird ausgeliefert.
- Das Release-ZIP wird jetzt geprüft. Bisher liefen PHPCS, PHPStan, PHPUnit und SHACL
alle gegen das Repository — das Paket, das Anwender:innen installieren, sah keine von
ihnen an. Eine vergessene Zeile in der Allowlist vonbin/build-release.sherzeugte
daher ein ZIP, das in grüner CI entstand und trotzdem in einer echten Installation
Fehler warf; genau das ist beiblocks/in v2.38.0 passiert und fiel nur beim manuellen
Entpacken auf. Der neue Job „Release-Paket prüfen" baut das ZIP bei jedem Push und prüft
es mitbin/verify-package.py. - Die Prüfliste pflegt sich selbst. Das Skript liest jeden Pfad, den der Code über
ODW_PLUGIN_DIR/ODW_PLUGIN_URLbildet, aus den im Paket enthaltenen PHP-Dateien —
aktuell 35 — und sieht nach, ob er dort liegt. Eine handgepflegte Liste würde veralten,
diese wächst automatisch mit. Dazu Autoloader,block.jsonund die kompilierte.mo,
die kein solcher Ausdruck nennt. Bewusste Ausnahmen stehen mit Begründung im Skript. - Versionsgleichheit wird erzwungen. Plugin-Header,
ODW_VERSIONund der oberste
CHANGELOG-Eintrag werden von Hand an drei Stellen gepflegt; weichen sie ab, zeigt
WordPress die falsche Version an und der Updater vergleicht gegen den falschen Stand. bin/check-i18n.pyläuft jetzt in der CI. Das Skript existierte, wurde aber nur von
Hand aufgerufen. Eine beim Umformulieren vergessene Übersetzung hätte auf englischen
Installationen mitten im Backend einen deutschen Satz gezeigt.- 40 Testfälle für den Batch-Import.
includes/class-batch-import.phpwar mit 571 Zeilen die
größte ungetestete Klasse — und die einzige Stelle im Plugin, an der fremde Dateien auf den
Code treffen. Abgedeckt sind jetzt: Formaterkennung (auch über den ursprünglichen Dateinamen
bei temporären Uploads), UTF-8-BOM aus Excel-Exporten, verrutschte Spaltenzahl, Leerzeilen,
JSON-Einzelobjekt gegen JSON-Liste, Pflichtfeldprüfung, URL-Schemata (javascript:und
data:werden abgewiesen), ganzzahlige Dateigröße, Lizenz-Kurzcodes, Formel-Injektion
(=,+,@, Tabulator) sowie die Anlage der Datensätze samt Meta-Zuordnung, Lizenz-URI
und Schlagwort-Normalisierung. Suite gesamt: 199 → 239 Tests. - Drei Sniff-Ausnahmen für
tests/. Tests laufen ohne WordPress:wp_delete_file(),
WP_Filesystemundwp_parse_url()gibt es dort nicht. Fixture-Dateien werden daher direkt
geschrieben und gelöscht, und derwp_parse_url()-Mock mussparse_url()aufrufen — das ist
genau die Verhaltensweise, die er nachbildet. - Drei Gründe, warum die alten E2E-Tests nie liefen — alle erst im ersten CI-Lauf sichtbar
geworden:mappingsin.wp-env.jsonbildet Verzeichnisse ab, keine einzelnen Dateien
(die Saat lief deshalb nicht); mit den Standard-Permalinks gibt es/wp-json/überhaupt nicht,
alle Endpunkte antworteten 404; und die Reiter-Selektoren zeigten aufcf-container__tabs-nav
/cf-tab--active, während Carbon Fields 3.6cf-container__tabs-list,
cf-container__tabs-itemund--currentrendert — was im Kommentar über dem Block
FORMULAR-DESIGNinassets/css/admin.cssseit jeher richtig steht. - Die End-to-End-Tests laufen wieder — und prüfen jetzt etwas.
tests/e2e/enthielt zwei
Spec-Dateien, die niemand ausführte: Es gab keine WordPress-Instanz, die Anmeldung klickte auf
einenbutton[type=submit], den das WordPress-Login gar nicht hat, und die Datensatz-ID wurde
aus einemp=-Parameter gelesen, den@idnie enthielt.npx wp-envstartet nun WordPress
samt Plugin, ein neuer CI-Job fährt Chromium dagegen. - Keine bedingten Zusicherungen mehr. Der Großteil der alten Tests stand in einem
if (await x.count() > 0)— sie waren grün, wenn das geprüfte Element fehlte. Genau die
Konstruktion also, die eine kaputte Oberfläche als bestanden meldet.tests/e2e/seed.phplegt
als mu-plugin zwei veröffentlichte Datensätze an, damit die Zusicherungen unbedingt sein können:
der Katalog enthält mindestens zwei Einträge, der Themenfilter liefert genau den passenden,
der zweite Abruf kommt aus dem Cache,/wp/v2/odw_datasetantwortet mit 404. - Im Backend geprüft: alle sieben Spalten der Datensatzliste, Qualitätsbadge mit Prozentwert,
schreibgeschützter Shortcode, fünf Reiter im Formular, Reiterwechsel, blockierte Veröffentlichung
samt Nennung des fehlenden Feldes, speicherbarer unvollständiger Entwurf, Einstiegsseite mit
Ablaufgrafik und die Harvest-URLs auf der Einstellungsseite. - Die
versioninpackage.jsonstand seit v2.1.4 still und zeigt jetzt wieder auf die
Plugin-Version. Sie wird nicht ausgeliefert, war aber beim Nachsehen schlicht irreführend.
Installation: WordPress → Plugins → Installieren → Plugin hochladen.