Module abschaltbar machen
Merkkarten, Praxisaufgaben, Checklisten, Berichtsheft, Lernzielkontrollen und Feedbackgespraech lassen sich unter Verwaltung -> Module fuer die ganze Lern-Bar ab- und einschalten. Wochenplan, Handouts, Glossar, Auswertung und Verwaltung bleiben immer an. Gesperrt wird an drei Stellen, nicht im Layout (Next rendert Layouts beim Seitenwechsel darunter nicht neu): Seiten mit erfordereModul, Routen fuer PDF, Anhaenge und Lernstand mit modulAn, alle 37 Serveraktionen der Module mit pruefeModul. Die Anmeldepruefung kommt jeweils zuerst, damit ein Unangemeldeter nicht am 404 abliest, was abgeschaltet ist. Ein abgeschaltetes Modul traegt nirgends bei: Wochenplan, Fortschritt, Was-wartet, Mein Stand, Ergebnisverlauf, Rahmenplanabdeckung, Vorschlaege fuers Berichtsheft, Karten im Handout, Kurzbefehle im Manifest. Die Lernstand-Schnittstelle antwortet mit 410, das Geraet verwirft daraufhin seine Offline-Warteschlange. Abschalten loescht nichts. Gespeichert in modul_einstellung (Migration 0010); fehlt die Zeile, ist das Modul an, eine bestehende Datenbank verhaelt sich also wie vorher. 12 Tests fuer die Regeln, Abschnitt A8 im Abnahmelauf, Anleitung Kapitel 9 mit Bildschirmfoto, README, E43. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
54ce7d87ae
commit
44e6c8bb79
@@ -404,6 +404,7 @@ try {
|
||||
);
|
||||
|
||||
const blatt = await z.$('.blattzeile-link');
|
||||
let blattAdresse = null;
|
||||
if (blatt) {
|
||||
await blatt.click();
|
||||
// Auf die Adresse warten, nicht auf eine Überschrift: Die steht auch auf
|
||||
@@ -411,6 +412,7 @@ try {
|
||||
// die Anfrage landet auf der Sammelroute statt auf dem einzelnen Blatt.
|
||||
await z.waitForURL(/\/berichtsheft\/[0-9a-f-]{36}$/, { timeout: 30000 });
|
||||
pruefe(true, 'Ein Wochenblatt lässt sich öffnen');
|
||||
blattAdresse = z.url();
|
||||
|
||||
const pdf = await azubi.request.get(`${z.url()}/pdf`);
|
||||
const puffer = await pdf.body();
|
||||
@@ -425,9 +427,59 @@ try {
|
||||
pruefe(false, 'Ein Wochenblatt lässt sich öffnen', 'keine Blattzeile gefunden');
|
||||
}
|
||||
|
||||
// --- A8 Sicherung und Rückspielung ---------------------------------------
|
||||
// --- A8 Module abschalten -------------------------------------------------
|
||||
|
||||
abschnitt('A8 · Sicherung zurückspielen');
|
||||
abschnitt('A8 · Module abschalten');
|
||||
|
||||
// Über die Oberfläche, wie im Betrieb: Verwaltung → Module.
|
||||
const umschalten = async (modul) => {
|
||||
await a.goto(`${BASIS}/verwaltung/module`);
|
||||
await a.click(`form:has(input[name="modul"][value="${modul}"]) button[type=submit]`);
|
||||
await a.waitForLoadState('networkidle');
|
||||
};
|
||||
const zustandIn = async (modul) => {
|
||||
await a.goto(`${BASIS}/verwaltung/module`);
|
||||
// Die Statusmarke steht direkt neben der Überschrift des Moduls.
|
||||
return (await a.locator(`#modul-${modul} + .marke-status`).innerText()).trim();
|
||||
};
|
||||
|
||||
await umschalten('berichtsheft');
|
||||
await umschalten('karten');
|
||||
pruefe((await zustandIn('berichtsheft')).includes('aus'), 'Der Ausbilder schaltet das Berichtsheft ab');
|
||||
|
||||
await z.goto(`${BASIS}/`);
|
||||
pruefe((await z.locator('nav a[href="/berichtsheft"]').count()) === 0, 'Das Berichtsheft verschwindet aus der Navigation');
|
||||
|
||||
const seiteAus = await azubi.request.get(`${BASIS}/berichtsheft`);
|
||||
const ausbilderSeiteAus = await ausbilder.request.get(`${BASIS}/berichtsheft`);
|
||||
pruefe(
|
||||
seiteAus.status() === 404 && ausbilderSeiteAus.status() === 404,
|
||||
'Die Seite ist für beide Rollen gesperrt, nicht nur ausgeblendet',
|
||||
`Azubi HTTP ${seiteAus.status()}, Ausbilder HTTP ${ausbilderSeiteAus.status()}`,
|
||||
);
|
||||
if (blattAdresse) {
|
||||
const pdfAus = await azubi.request.get(`${blattAdresse}/pdf`);
|
||||
pruefe(pdfAus.status() === 404, 'Auch das PDF ist gesperrt', `HTTP ${pdfAus.status()}`);
|
||||
}
|
||||
|
||||
await z.goto(`${BASIS}/handouts/N3`);
|
||||
pruefe(
|
||||
(await z.locator('text=Merkkarten zu diesem Handout').count()) === 0,
|
||||
'Ohne Merkkarten zeigt das Handout keine Karten',
|
||||
);
|
||||
const lernstandAus = await azubi.request.post(`${BASIS}/api/lernstand`, { data: { eintraege: [] } });
|
||||
pruefe(lernstandAus.status() === 410, 'Ein Gerät mit gesammelten Bewertungen erfährt, dass es sie verwerfen soll', `HTTP ${lernstandAus.status()}`);
|
||||
|
||||
await umschalten('berichtsheft');
|
||||
await umschalten('karten');
|
||||
if (blattAdresse) {
|
||||
const wieder = await azubi.request.get(blattAdresse);
|
||||
pruefe(wieder.status() === 200, 'Nach dem Einschalten ist das Wochenblatt unverändert wieder da', `HTTP ${wieder.status()}`);
|
||||
}
|
||||
|
||||
// --- A9 Sicherung und Rückspielung ---------------------------------------
|
||||
|
||||
abschnitt('A9 · Sicherung zurückspielen');
|
||||
|
||||
// Pfade für bash mit Schrägstrichen: Ein Backslash ist dort ein Fluchtzeichen.
|
||||
const alsPosix = (pfad) => pfad.split(path.sep).join('/');
|
||||
|
||||
@@ -74,6 +74,18 @@ async function main() {
|
||||
await seite.waitForSelector('#neu-name');
|
||||
await bild(seite, '03-verwaltung');
|
||||
|
||||
// Module: für das Bild ein Modul abschalten, danach den alten Stand herstellen.
|
||||
const umschalten = async (modul: string) => {
|
||||
await seite.goto(`${BASIS}/verwaltung/module`);
|
||||
await seite.click(`form:has(input[name="modul"][value="${modul}"]) button[type=submit]`);
|
||||
await seite.waitForLoadState('networkidle');
|
||||
};
|
||||
await umschalten('berichtsheft');
|
||||
await seite.goto(`${BASIS}/verwaltung/module`);
|
||||
await seite.waitForSelector('#modul-karten');
|
||||
await bild(seite, '25-module');
|
||||
await umschalten('berichtsheft');
|
||||
|
||||
await seite.goto(`${BASIS}/wochenplan`);
|
||||
await seite.waitForSelector('h1');
|
||||
await bild(seite, '04-wochenplan');
|
||||
|
||||
Reference in New Issue
Block a user