feat(verzeichnis): LDAP-Abgleich, Zeitplan, CSV-Import und Log (#30)
This commit was merged in pull request #30.
This commit is contained in:
+69
-4
@@ -18,7 +18,7 @@
|
||||
* Bild sieht dann richtig aus, zeigt aber eine Seite, auf der kein Knopf etwas
|
||||
* tut. Siehe CLAUDE.md, Abschnitt „Oberflaeche pruefen“.
|
||||
*/
|
||||
import { mkdir } from "node:fs/promises";
|
||||
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
||||
import { join } from "node:path";
|
||||
import { chromium, type Browser, type Cookie, type Locator, type Page } from "@playwright/test";
|
||||
|
||||
@@ -191,6 +191,56 @@ const SEITEN: readonly Seite[] = [
|
||||
},
|
||||
},
|
||||
{ name: "archiv", pfad: "/archiv?suche=Inventar" },
|
||||
{ name: "verzeichnis", pfad: "/admin/verzeichnis", nurModus: "INTERN" },
|
||||
{
|
||||
/*
|
||||
* Der Verbindungstest zeigt seinen Wert erst mit Ergebnis: die Tabelle der
|
||||
* gemappten Felder. Also wird der Knopf gedrueckt und gewartet, bis der
|
||||
* Server geantwortet hat — ohne Container steht dort eine Fehlermeldung,
|
||||
* und auch die ist ein ehrliches Bild.
|
||||
*/
|
||||
name: "verbindungstest",
|
||||
pfad: "/admin/verzeichnis",
|
||||
nurModus: "INTERN",
|
||||
vorbereiten: async (tab) => {
|
||||
const knopf = tab.getByRole("button", { name: "Verbindung testen" }).first();
|
||||
if ((await knopf.count()) === 0) return;
|
||||
await knopf.click();
|
||||
await tab.waitForTimeout(4000);
|
||||
},
|
||||
},
|
||||
{
|
||||
/*
|
||||
* Das Abgleich-Log braucht einen Lauf, damit ueberhaupt etwas darin steht.
|
||||
* Also erst „Jetzt abgleichen“ druecken und dann aufklappen — ob der Lauf
|
||||
* gelingt, haengt am Testcontainer, und beide Ausgaenge sind ein ehrliches
|
||||
* Bild: die Zeile zeigt Zahlen oder den Grund.
|
||||
*/
|
||||
name: "abgleich-log",
|
||||
pfad: "/admin/verzeichnis",
|
||||
nurModus: "INTERN",
|
||||
vorbereiten: async (tab) => {
|
||||
const knopf = tab.getByRole("button", { name: "Jetzt abgleichen" }).first();
|
||||
if ((await knopf.count()) > 0) {
|
||||
await knopf.click();
|
||||
await tab.waitForTimeout(5000);
|
||||
await tab.reload({ waitUntil: "load" });
|
||||
}
|
||||
const aufklappen = tab.locator("summary", { hasText: "Abgleich-Log" }).first();
|
||||
if ((await aufklappen.count()) === 0) return;
|
||||
await aufklappen.click();
|
||||
await tab.waitForTimeout(150);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: "personen-import",
|
||||
pfad: "/mitarbeiter",
|
||||
vorbereiten: async (tab) => {
|
||||
await tab.locator("summary", { hasText: "CSV" }).first().click();
|
||||
await tab.waitForTimeout(150);
|
||||
},
|
||||
},
|
||||
{ name: "abteilungen-vorschlaege", pfad: "/admin/abteilungen" },
|
||||
{
|
||||
/*
|
||||
* Die Druckansicht braucht einen Lauf, und welcher das ist, weiss nur die
|
||||
@@ -263,15 +313,30 @@ async function anmelden(browser: Browser): Promise<Cookie[]> {
|
||||
return kekse;
|
||||
}
|
||||
|
||||
/** Erzeugt die PWA-Kacheln aus dem SVG, damit keine Bilddatei von Hand entsteht. */
|
||||
/**
|
||||
* Erzeugt die PWA-Kacheln aus dem SVG, damit keine Bilddatei von Hand entsteht.
|
||||
*
|
||||
* Geschrieben wird nur, wenn sich die Bytes wirklich unterscheiden. Vorher legte
|
||||
* jeder Screenshot-Lauf zwei geaenderte PNG-Dateien in den Arbeitsbaum, obwohl das
|
||||
* Bild dasselbe war — und `git status` zeigte Aenderungen, die niemand gemacht
|
||||
* hatte (Reviewbefund zu #016).
|
||||
*/
|
||||
async function kachelnErzeugen(browser: Browser): Promise<void> {
|
||||
const svg = new URL(`${APP_URL}/icon-kachel.svg`).toString();
|
||||
for (const kante of [192, 512]) {
|
||||
const seite = await browser.newPage({ viewport: { width: kante, height: kante } });
|
||||
await seite.goto(svg, { waitUntil: "load" });
|
||||
await seite.screenshot({ path: join("public", `icon-${kante}.png`), omitBackground: false });
|
||||
const neu = await seite.screenshot({ omitBackground: false });
|
||||
await seite.close();
|
||||
console.log(` public/icon-${kante}.png`);
|
||||
|
||||
const datei = join("public", `icon-${kante}.png`);
|
||||
const alt = await readFile(datei).catch(() => undefined);
|
||||
if (alt && alt.equals(neu)) {
|
||||
console.log(` ${datei} (unverändert)`);
|
||||
continue;
|
||||
}
|
||||
await writeFile(datei, neu);
|
||||
console.log(` ${datei}`);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user