Das Foyer: eine Seite vor dem Saal, mit Plan, Eintritt und Vorschlägen
Filipe: „diese kachel soll nicht mehr geschlossen sein, ABER wenn man
drauf drückt geht zuerst eine seite auf mit reihen/kategorien. links
eine reihe wo die nächsten geplanten videos schon bereit stehen. wan
und umd wie viel uhr … und das soll geschlossen sein außer für vanvan
und dogfather. in der mitte sollen die leute dan wenn eine sendung
läuft drauf drücken können und der sendung beitreten. auch bei der
vorschau schon und dan rechts will ich die letzte reihe/kategorie, da
sollen die leute alle mir videos anraten können … und nur ich und
vanvan sehen sie."
Haus: Team Dogi (crew.dogfather-universe.com). Die Agentur ist nicht
berührt -- pruef-haus-trennung 107/0, pruef-workspace-seiten 37/0.
WARUM EINE EIGENE SEITE UND KEIN VIERTER ZUSTAND DES SAALS
Der Saal meldet jeden an, der ihn öffnet („dabei"), baut Verbindungen
auf und hält den Ereignisstrom offen. Das ist richtig für jemanden,
der zusieht -- und falsch für jemanden, der nur nachsehen will, ob
heute Abend etwas läuft. Wäre das Foyer der vierte Zustand derselben
Seite, zählte jeder Blick als Zuschauer, und die Zahl im Regiepult
sähe nach Publikum aus, wo niemand zusieht.
Im Foyer wird nur gelesen: Stand holen, zeichnen, alle 20 Sekunden
nachfragen -- und nicht, solange der Reiter im Hintergrund liegt. Kein
Ereignisstrom: Der hielte eine Verbindung offen, und manche Browser
geben je Adresse nur sechs her; im Saal wird jede davon gebraucht.
DREI REIHEN
LINKS die Warteschlange, nach TERMIN sortiert statt nach Platz.
Was keinen hat, steht unten; was vorbei ist, bekommt
„· überfällig". Nur admin und rechte Hand -- und für alle
anderen steht sie gar nicht erst da, statt leer oder
gesperrt zu sein. Ein Kasten mit Schloss erzählt, dass es
etwas zu sehen gäbe. Entschieden wird das am Server; die
Seite fragt nicht nach der Rolle, sondern danach, ob die
Auskunft gekommen ist.
MITTE Lampe (Geschlossen / Gleich / Auf Sendung), Vorschaubild,
Titel, Satz -- und der Knopf, der NUR dasteht, wenn er auch
hineinführt. Er ist ein Link und kein Button: Wer ihn mit
der mittleren Maustaste antippt, bekommt einen neuen Reiter.
RECHTS Video anraten. Jeder darf schicken, niemand sieht fremde,
jeder sieht seine eigenen mit Stand. Vier Sperren, und jede
beantwortet etwas anderes: zu schnell (45 s), zu viele offen
(5 je Person), schon angeraten, steht schon bereit.
Am Telefon steht die MITTE oben. Dort ist „links" nur noch „vor allem
anderen", und das wäre die falsche Reihenfolge.
WAS SONST NOCH DAZUGEHÖRT
* Jede Zeile der Warteschlange im Saal hat jetzt ein Terminfeld.
* Die Kachel sagt nicht mehr „geschlossen" -- das Foyer ist immer
offen. „gleich" und „● live" bleiben: Sie sagen etwas, das man ohne
sie nicht weiß.
* reaktion.html steht in OHNE_KACHEL_UEBERALL. Die erlaubten Seiten
werden aus den Kachelzielen abgeleitet; als die Kachel aufs Foyer
zeigte, war der Saal plötzlich von keiner mehr genannt und
antwortete mit einer Umleitung.
DREI DOPPELTE ANTWORTEN BESEITIGT
* „Wie viele Vorschläge darf einer offen haben" stand VIERMAL:
dreimal als `je_person_max || 5` und einmal als Wort „fünf" im Satz
(plus ein fünftes Mal in meldung.js). Kommt jetzt vom Server.
* `maxlength="200"` im Formular neben VORSCHLAG_NOTIZ_MAX im Server.
Das Feld lernt die Grenze von der Auskunft.
* Die drei Foyer-Tafeln hatten eine eigene Fläche (Weiß mit 4,5 %) und
eine eigene Form. Beides gibt es im Haus längst: Material in
start.css (45 Klassen, gemessen), Form in module.css. Die eigene
Fläche war dazu fast durchsichtig -- über einem hellen
Hintergrundbild stand der Text ohne deckenden Grund. Gefunden hat
das nicht eine Prüfung, sondern das Bildschirmfoto.
EINE LÜCKE IN DER PRÜFUNG GESCHLOSSEN
In module.css steht dieselbe 48er-Klassenliste ACHTMAL. Sieben trugen
die Marke MODULLISTE und wurden verglichen; die achte -- die Umrandung
beim Tabben (:focus-visible) -- nicht. Sie war damit die Einzige, die
still hätte abweichen können, ausgerechnet bei der Regel, die nur
sieht, wer mit der Tastatur bedient. pruef-css-klassen erwartet jetzt
acht. Eine steigende Prüfzahl, und sie ist begründet.
UND EINER, DEN KEIN WERKZEUG FINDEN KANN
Der Satz oben lautete „Links steht, was ansteht; rechts kannst du
etwas anraten." Für die Community gibt es „links" gar nicht, und am
Telefon stehen die Reihen untereinander. Eine Richtung im Text ist
eine Aussage über das Aussehen -- und das ändert sich mit dem
Bildschirm und mit der Rolle. Jetzt steht dort, WAS geht, nicht WO.
GEMESSEN
mess-foyer (neu) 70 Messungen, 0 Fehler, 9 Bildschirmfotos
pruef-reaktion 538, 0 Fehler (vorher 478)
pruef-handy-teamdogi 263 Seitenaufrufe, 0 Befunde (vorher 244)
pruef-sackgassen 14, 0 Fehler
pruef-crew-adresse 173, 0 Fehler
pruef-haus-trennung 107, 0 Fehler
pruef-struktur 102, 0 Fehler
pruef-neue-seiten 109, 0 Fehler
pruef-portnummern 41, 0 Fehler
pruef-haus-seiten 38, 0 Fehler
pruef-workspace-seiten 37, 0 Fehler
pruef-breiten 45 Seiten auf fünf Breiten, 0 beanstandet
pruef-community-sicht 10, 0 Fehler
pruef-deutsche-texte 12, 0 Fehler
pruef-css-klassen grün
mess-foyer klickt den ganzen Weg durch: Ein Gast schickt ein Video,
DogFather sieht es mit Namen, nimmt es, und es muss links im Plan
stehen. Zum Schluss macht es sechs seiner Messungen absichtlich kaputt
und prüft, dass sie das merken.
NICHT BEHOBEN, WEIL NICHT MEINS: pruef-meldungen ist rot (28
Kennungen ohne Satz, 3 Rohanzeigen) -- gemessen im worktree auf dem
letzten Commit schon vorher, Zeichen für Zeichen dieselbe Liste. Die
Dateien gehören überwiegend der Agentur; das gehört in einen eigenen
Durchgang.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
+309
-1
@@ -784,7 +784,10 @@ melde("=== 10. Was um die Seite herum stimmen muss ===");
|
||||
haben sich in diesem Haus schon zweimal geaendert. */
|
||||
const w = await import("./workspace.js");
|
||||
const alle = w.bereicheFuer({ id: IDS.gast, rolle: "gast", name: "Nachtfalter" }, CREW);
|
||||
const kachel = (alle || []).find((b) => b.ziel === "reaktion.html");
|
||||
/* SEIT DEM 08.10.2026 ZEIGT SIE AUFS FOYER. Filipe: „wenn man
|
||||
drauf drückt geht zuerst eine seite auf mit reihen/kategorien."
|
||||
In den Saal geht es von dort aus. */
|
||||
const kachel = (alle || []).find((b) => b.ziel === "reaktion-foyer.html");
|
||||
ok(!!kachel, "die Community hat die Reaction-Kachel");
|
||||
ok(kachel?.live === true,
|
||||
"sie traegt das Merkmal `live` statt einer Ton-Nummer (der Farbraum ist bei 46 voll)");
|
||||
@@ -3200,6 +3203,311 @@ melde("=== 19. Vorraum, Geraete, zweites Video ===");
|
||||
"und wer mit der Tastatur bedient, wird gesehen");
|
||||
}
|
||||
|
||||
/* =======================================================================
|
||||
20. DAS FOYER (08.10.2026)
|
||||
|
||||
Filipe: „diese kachel soll nicht mehr geschlossen sein, ABER wenn
|
||||
man drauf drückt geht zuerst eine seite auf mit reihen/kategorien.
|
||||
links eine reihe wo die nächsten geplanten videos schon bereit
|
||||
stehen. wan und umd wie viel uhr … und das soll geschlossen sein
|
||||
außer für vanvan und dogfather. in der mitte sollen die leute dan
|
||||
wenn eine sendung läuft drauf drücken können und der sendung
|
||||
beitreten … und dan rechts … da können die leute videos
|
||||
reinschicken und nur ich und vanvan sehen sie."
|
||||
======================================================================= */
|
||||
melde("");
|
||||
melde("=== 20. Das Foyer: Plan, Eintritt, Vorschlaege ===");
|
||||
{
|
||||
/* ---- Die Seite selbst ---- */
|
||||
for (const rolle of ["admin", "hand", "linke", "modi", "gast"]) {
|
||||
const s = await roh(CREW, "/workspace/reaktion-foyer.html", { keks: k[rolle] });
|
||||
ok(s.code === 200, `${rolle}: kommt ins Foyer (${s.code})`);
|
||||
}
|
||||
{
|
||||
const kAgentur = await anmelden("admin", AGENTUR);
|
||||
const a = await roh(AGENTUR, "/workspace/reaktion-foyer.html", { keks: kAgentur });
|
||||
ok(!!kAgentur && a.code === 404, `und die Agentur kennt es nicht (${a.code})`);
|
||||
}
|
||||
/* DIE KACHEL ZEIGT AUFS FOYER UND NICHT MEHR IN DEN SAAL. Zeigte
|
||||
sie weiter auf `reaktion.html`, gaebe es das Foyer zwar -- nur
|
||||
fuehrte kein Weg hin. */
|
||||
{
|
||||
const w = await import("./workspace.js");
|
||||
const alle = w.bereicheFuer({ id: IDS.gast, rolle: "gast", name: "Nachtfalter" }, CREW);
|
||||
const kachel = (alle || []).find((b) => b.name === "Reaction");
|
||||
ok(kachel?.ziel === "reaktion-foyer.html",
|
||||
`die Kachel fuehrt ins Foyer (${kachel?.ziel})`);
|
||||
ok(kachel?.live === true,
|
||||
"und traegt weiterhin ihren Zustand (grau / bernstein / rot)");
|
||||
/* ==== UND DER SAAL BLEIBT TROTZDEM ERREICHBAR ==============
|
||||
Er hat seit heute KEINE Kachel mehr, und die Adressregel vom
|
||||
15.09. verlangt eine. Ohne den Eintrag in
|
||||
OHNE_KACHEL_UEBERALL liefe der Knopf „Jetzt beitreten" auf
|
||||
die Startseite -- wortlos. Genau so ist diese Pruefung beim
|
||||
Umhaengen rot geworden. */
|
||||
ok(w.OHNE_KACHEL_UEBERALL.has("/workspace/reaktion.html"),
|
||||
"und der Saal ist ohne Kachel trotzdem erreichbar");
|
||||
}
|
||||
|
||||
/* ---- Der Termin an der Warteschlange ---- */
|
||||
await roh(CREW, "/workspace/api/reaktion/zuruecksetzen", { method: "POST", keks: k.admin });
|
||||
const angehaengt = await roh(CREW, "/workspace/api/reaktion/liste", {
|
||||
method: "POST", keks: k.admin, rumpf: { video: "dQw4w9WgXcQ" },
|
||||
});
|
||||
const zeile = (angehaengt.j?.liste || [])[0];
|
||||
ok(!!zeile, `ein Video liegt bereit (${angehaengt.code})`);
|
||||
ok(zeile?.wann === "", `und es hat zuerst KEINEN Termin ("${zeile?.wann}")`);
|
||||
|
||||
const termin = new Date(Date.now() + 86400000).toISOString();
|
||||
const gesetzt = await roh(CREW, `/workspace/api/reaktion/liste/${zeile.id}/wann`, {
|
||||
method: "PUT", keks: k.admin, rumpf: { wann: termin },
|
||||
});
|
||||
ok(gesetzt.code === 200
|
||||
&& (gesetzt.j?.liste || []).find((z) => z.id === zeile.id)?.wann === termin,
|
||||
`der Termin laesst sich setzen (${gesetzt.code})`);
|
||||
|
||||
const leer = await roh(CREW, `/workspace/api/reaktion/liste/${zeile.id}/wann`, {
|
||||
method: "PUT", keks: k.admin, rumpf: { wann: "" },
|
||||
});
|
||||
ok(leer.code === 200
|
||||
&& (leer.j?.liste || []).find((z) => z.id === zeile.id)?.wann === "",
|
||||
"und wieder wegnehmen -- leer ist ein gueltiger Wert und der Normalfall");
|
||||
await roh(CREW, `/workspace/api/reaktion/liste/${zeile.id}/wann`, {
|
||||
method: "PUT", keks: k.admin, rumpf: { wann: termin },
|
||||
});
|
||||
|
||||
const quatsch = await roh(CREW, `/workspace/api/reaktion/liste/${zeile.id}/wann`, {
|
||||
method: "PUT", keks: k.admin, rumpf: { wann: "irgendwann mal" },
|
||||
});
|
||||
ok(quatsch.code === 400 && quatsch.j?.fehler === "termin_unklar",
|
||||
`ein freier Text wird abgelehnt (${quatsch.code}/${quatsch.j?.fehler})`);
|
||||
|
||||
for (const rolle of ["linke", "modi", "gast"]) {
|
||||
const a = await roh(CREW, `/workspace/api/reaktion/liste/${zeile.id}/wann`, {
|
||||
method: "PUT", keks: k[rolle], rumpf: { wann: termin },
|
||||
});
|
||||
ok(a.code === 403, `${rolle}: setzt keinen Termin (${a.code})`);
|
||||
}
|
||||
|
||||
/* ==== UND DIE GANZE REIHE SIEHT NUR DIE LEITUNG ==============
|
||||
Filipe: „und das soll geschlossen sein außer für vanvan und
|
||||
dogfather." Die Reihe im Foyer entsteht aus `liste` -- wer die
|
||||
nicht bekommt, bekommt die Reihe nicht. */
|
||||
{
|
||||
const beiDenZweien = await roh(CREW, "/workspace/api/reaktion", { keks: k.hand });
|
||||
ok(Array.isArray(beiDenZweien.j?.liste) && beiDenZweien.j.liste.length > 0,
|
||||
"die rechte Hand bekommt den Plan");
|
||||
for (const rolle of ["linke", "modi", "gast"]) {
|
||||
const a = await roh(CREW, "/workspace/api/reaktion", { keks: k[rolle] });
|
||||
ok(a.j?.liste === null, `${rolle}: bekommt ihn NICHT (${a.j?.liste})`);
|
||||
}
|
||||
}
|
||||
|
||||
/* ---- Die Vorschlaege ---- */
|
||||
const v1 = await roh(CREW, "/workspace/api/reaktion/vorschlag", {
|
||||
method: "POST", keks: k.gast,
|
||||
rumpf: { video: "https://www.youtube.com/watch?v=9bZkp7q19f0", notiz: "Das waere was" },
|
||||
});
|
||||
ok(v1.code === 201, `ein Zuschauer darf anraten (${v1.code})`);
|
||||
ok(v1.j?.vorschlag?.video === "9bZkp7q19f0",
|
||||
`aus der Adresse wird die Kennung (${v1.j?.vorschlag?.video})`);
|
||||
|
||||
/* EINER JE PERSON UND MINUTE -- gegen den Doppelklick. */
|
||||
const vSchnell = await roh(CREW, "/workspace/api/reaktion/vorschlag", {
|
||||
method: "POST", keks: k.gast, rumpf: { video: "bm0sK2-KkW8" },
|
||||
});
|
||||
ok(vSchnell.code === 429, `zweimal gleich hintereinander nicht (${vSchnell.code})`);
|
||||
|
||||
const vDoppelt = await roh(CREW, "/workspace/api/reaktion/vorschlag", {
|
||||
method: "POST", keks: k.gast2, rumpf: { video: "9bZkp7q19f0" },
|
||||
});
|
||||
ok(vDoppelt.code === 409 && vDoppelt.j?.fehler === "vorschlag_doppelt",
|
||||
`dasselbe Video nicht zweimal offen (${vDoppelt.code}/${vDoppelt.j?.fehler})`);
|
||||
|
||||
const vBereit = await roh(CREW, "/workspace/api/reaktion/vorschlag", {
|
||||
method: "POST", keks: k.modi, rumpf: { video: "dQw4w9WgXcQ" },
|
||||
});
|
||||
ok(vBereit.code === 409 && vBereit.j?.fehler === "steht_schon_bereit",
|
||||
`und nichts, was schon bereitliegt (${vBereit.code}/${vBereit.j?.fehler})`);
|
||||
|
||||
/* ==== WER SIEHT WAS -- DIE EIGENTLICHE FRAGE =================
|
||||
Filipe: „nur ich und vanvan sehen sie." */
|
||||
{
|
||||
const beiDogi = await roh(CREW, "/workspace/api/reaktion/vorschlaege", { keks: k.admin });
|
||||
ok(beiDogi.j?.darf_entscheiden === true && (beiDogi.j?.vorschlaege || []).length === 1,
|
||||
`DogFather sieht alle (${beiDogi.j?.vorschlaege?.length})`);
|
||||
ok(beiDogi.j?.vorschlaege?.[0]?.name === "Nachtfalter",
|
||||
`mit dem Namen dessen, der ihn geschickt hat (${beiDogi.j?.vorschlaege?.[0]?.name})`);
|
||||
ok(beiDogi.j?.offen === 1, `und wie viele offen sind (${beiDogi.j?.offen})`);
|
||||
|
||||
const beiVanVan = await roh(CREW, "/workspace/api/reaktion/vorschlaege", { keks: k.hand });
|
||||
ok((beiVanVan.j?.vorschlaege || []).length === 1, "die rechte Hand auch");
|
||||
|
||||
/* DER EINSENDER SIEHT SEINEN EIGENEN -- und zwar OHNE Namen:
|
||||
Dort staende er selbst, und eine Zeile, die einem den eigenen
|
||||
Namen vorliest, ist Platz ohne Auskunft. */
|
||||
const beiIhr = await roh(CREW, "/workspace/api/reaktion/vorschlaege", { keks: k.gast });
|
||||
ok(beiIhr.j?.darf_entscheiden === false && (beiIhr.j?.vorschlaege || []).length === 1,
|
||||
"der Einsender sieht seinen eigenen");
|
||||
ok(beiIhr.j?.vorschlaege?.[0]?.name === undefined,
|
||||
"aber keinen Namen");
|
||||
ok(beiIhr.j?.offen === null, "und nicht, wie viele insgesamt offen sind");
|
||||
|
||||
/* UND EIN DRITTER SIEHT GAR NICHTS. Das ist der Satz, um den es
|
||||
geht. */
|
||||
const fremd = await roh(CREW, "/workspace/api/reaktion/vorschlaege", { keks: k.gast2 });
|
||||
ok((fremd.j?.vorschlaege || []).length === 0,
|
||||
`wer nichts geschickt hat, sieht nichts (${fremd.j?.vorschlaege?.length})`);
|
||||
const modi = await roh(CREW, "/workspace/api/reaktion/vorschlaege", { keks: k.modi });
|
||||
ok((modi.j?.vorschlaege || []).length === 0,
|
||||
"auch ein Modi nicht -- Moderation ist etwas anderes als Leitung");
|
||||
}
|
||||
|
||||
/* ---- Entscheiden ---- */
|
||||
const offene = await roh(CREW, "/workspace/api/reaktion/vorschlaege", { keks: k.admin });
|
||||
const vid = offene.j.vorschlaege[0].id;
|
||||
for (const rolle of ["linke", "modi", "gast"]) {
|
||||
const a = await roh(CREW, `/workspace/api/reaktion/vorschlag/${vid}/uebernehmen`, {
|
||||
method: "POST", keks: k[rolle],
|
||||
});
|
||||
ok(a.code === 403, `${rolle}: entscheidet nicht (${a.code})`);
|
||||
}
|
||||
|
||||
const vorListe = (await roh(CREW, "/workspace/api/reaktion", { keks: k.admin }))
|
||||
.j?.liste?.length || 0;
|
||||
const genommen = await roh(CREW, `/workspace/api/reaktion/vorschlag/${vid}/uebernehmen`, {
|
||||
method: "POST", keks: k.admin,
|
||||
});
|
||||
ok(genommen.code === 200 && (genommen.j?.liste || []).length === vorListe + 1,
|
||||
`uebernehmen legt es in die Warteschlange (${vorListe} -> ${genommen.j?.liste?.length})`);
|
||||
ok((genommen.j?.liste || []).some((z) => z.video === "9bZkp7q19f0"),
|
||||
"und zwar genau dieses Video");
|
||||
|
||||
const nochmal = await roh(CREW, `/workspace/api/reaktion/vorschlag/${vid}/uebernehmen`, {
|
||||
method: "POST", keks: k.admin,
|
||||
});
|
||||
ok(nochmal.code === 409 && nochmal.j?.fehler === "schon_entschieden",
|
||||
`zweimal uebernehmen geht nicht (${nochmal.code}/${nochmal.j?.fehler})`);
|
||||
|
||||
/* DER EINSENDER ERFAEHRT, WAS DARAUS WURDE. Ohne das waere das
|
||||
Feld ein Loch, in das man etwas wirft. */
|
||||
{
|
||||
const beiIhr = await roh(CREW, "/workspace/api/reaktion/vorschlaege", { keks: k.gast });
|
||||
ok(beiIhr.j?.vorschlaege?.[0]?.stand === "uebernommen",
|
||||
`und sie sieht, dass er drankommt (${beiIhr.j?.vorschlaege?.[0]?.stand})`);
|
||||
}
|
||||
|
||||
/* ---- Ablehnen und Zurueckziehen ---- */
|
||||
{
|
||||
const neu = await roh(CREW, "/workspace/api/reaktion/vorschlag", {
|
||||
method: "POST", keks: k.gast2, rumpf: { video: "bm0sK2-KkW8" },
|
||||
});
|
||||
ok(neu.code === 201, `noch ein Vorschlag (${neu.code})`);
|
||||
const id2 = neu.j.vorschlag.id;
|
||||
|
||||
/* Ein Fremder kann ihn nicht wegnehmen -- auch nicht den
|
||||
offenen. */
|
||||
const fremdWeg = await roh(CREW, `/workspace/api/reaktion/vorschlag/${id2}`, {
|
||||
method: "DELETE", keks: k.gast,
|
||||
});
|
||||
ok(fremdWeg.code === 403 && fremdWeg.j?.fehler === "nicht_deiner",
|
||||
`ein Fremder nimmt ihn nicht weg (${fremdWeg.code}/${fremdWeg.j?.fehler})`);
|
||||
|
||||
const abgelehnt = await roh(CREW, `/workspace/api/reaktion/vorschlag/${id2}/ablehnen`, {
|
||||
method: "POST", keks: k.admin,
|
||||
});
|
||||
ok(abgelehnt.code === 200, `ablehnen geht (${abgelehnt.code})`);
|
||||
const danach = await roh(CREW, "/workspace/api/reaktion/vorschlaege", { keks: k.gast2 });
|
||||
ok(danach.j?.vorschlaege?.[0]?.stand === "abgelehnt",
|
||||
"und er sieht es -- die Zeile bleibt stehen");
|
||||
|
||||
/* ==== WAS ENTSCHIEDEN IST, ZIEHT ER NICHT ZURUECK ==========
|
||||
Sonst verschwaende die Spur, dass ueberhaupt entschieden
|
||||
wurde -- und derselbe Vorschlag saehe beim naechsten Mal aus
|
||||
wie der erste. */
|
||||
const zurueck = await roh(CREW, `/workspace/api/reaktion/vorschlag/${id2}`, {
|
||||
method: "DELETE", keks: k.gast2,
|
||||
});
|
||||
ok(zurueck.code === 403,
|
||||
`einen abgelehnten zieht der Einsender nicht zurueck (${zurueck.code})`);
|
||||
/* GEGENPROBE: einen OFFENEN schon. Ohne sie bewiese das Obige
|
||||
nur, dass Loeschen ueberhaupt nicht geht. */
|
||||
const frisch = await roh(CREW, "/workspace/api/reaktion/vorschlag", {
|
||||
method: "POST", keks: k.linke, rumpf: { video: "kJQP7kiw5Fk" },
|
||||
});
|
||||
const weg = await roh(CREW, `/workspace/api/reaktion/vorschlag/${frisch.j.vorschlag.id}`, {
|
||||
method: "DELETE", keks: k.linke,
|
||||
});
|
||||
ok(frisch.code === 201 && weg.code === 200,
|
||||
`Gegenprobe: seinen eigenen OFFENEN schon (${weg.code})`);
|
||||
}
|
||||
|
||||
/* ---- Die Grenze je Person ---- */
|
||||
{
|
||||
const { db } = await import("./workspace.js");
|
||||
const { VORSCHLAEGE_JE_PERSON } = await import("./reaktion-tabellen.js");
|
||||
/* Zurueckdatieren statt warten: Eine Pruefung, die 45 Sekunden
|
||||
je Vorschlag wartet, wird beim naechsten Mal uebersprungen. */
|
||||
const alt = () => db().prepare("UPDATE reaktion_vorschlaege SET erstellt = ?"
|
||||
+ " WHERE person_id = ?").run(new Date(Date.now() - 600_000).toISOString(), IDS.modi);
|
||||
|
||||
const kennungen = ["aqz-KE-bpKQ", "ZZ5LpwO-An4", "e-ORhEE9VVg", "YQHsXMglC9A", "fJ9rUzIMcZQ"];
|
||||
let letzte = null;
|
||||
for (const v of kennungen) {
|
||||
alt();
|
||||
letzte = await roh(CREW, "/workspace/api/reaktion/vorschlag", {
|
||||
method: "POST", keks: k.modi, rumpf: { video: v },
|
||||
});
|
||||
if (letzte.code !== 201) break;
|
||||
}
|
||||
alt();
|
||||
const einerZuViel = await roh(CREW, "/workspace/api/reaktion/vorschlag", {
|
||||
method: "POST", keks: k.modi, rumpf: { video: "L_jWHffIx5E" },
|
||||
});
|
||||
ok(einerZuViel.code === 409 && einerZuViel.j?.fehler === "zu_viele_vorschlaege",
|
||||
`hoechstens ${VORSCHLAEGE_JE_PERSON} offene je Person `
|
||||
+ `(${einerZuViel.code}/${einerZuViel.j?.fehler})`);
|
||||
}
|
||||
|
||||
/* ---- Und was auf der Seite stehen muss ---- */
|
||||
{
|
||||
const html = readFileSync(join(HIER, "..", "workspace", "reaktion-foyer.html"), "utf8");
|
||||
const js = readFileSync(
|
||||
join(HIER, "..", "workspace", "assets", "js", "reaktion-foyer.js"), "utf8");
|
||||
const css = readFileSync(
|
||||
join(HIER, "..", "workspace", "assets", "css", "foyer.css"), "utf8");
|
||||
ok(/id="reihe-plan"/.test(html) && /id="reihe-saal"/.test(html)
|
||||
&& /id="reihe-raten"/.test(html),
|
||||
"die drei Reihen stehen in der Seite");
|
||||
ok(/id="saal-knopf"/.test(html) && /href="reaktion\.html"/.test(html),
|
||||
"und die Mitte fuehrt in den Saal");
|
||||
ok(/<a class="saal-knopf"/.test(html),
|
||||
"der Weg hinein ist ein Link und kein Knopf -- mittlere Maustaste, neuer Reiter");
|
||||
ok(/id="raten-form"/.test(html), "rechts kann man etwas anraten");
|
||||
/* DER PLAN DARF NICHT AN DER ROLLE HAENGEN, SONDERN AN DEN DATEN.
|
||||
Eine zweite Rollenliste im Browser waere die, die irgendwann
|
||||
von der echten abweicht. */
|
||||
ok(!/rolle\s*===\s*['"]admin/.test(js),
|
||||
"das Foyer fuehrt keine eigene Rollenliste");
|
||||
ok(/Array\.isArray\(lage\?\.liste\)/.test(js),
|
||||
"es fragt, ob die Auskunft gekommen ist");
|
||||
ok(/visibilityState/.test(js),
|
||||
"und fragt nicht nach, wenn der Reiter im Hintergrund liegt");
|
||||
ok(/foyer-reihen/.test(css) && /grid-template-columns/.test(css),
|
||||
"das Stilblatt kennt die drei Reihen");
|
||||
ok(/@media \(max-width: 900px\)/.test(css) && /order: 1/.test(css),
|
||||
"am Handy steht die Mitte oben");
|
||||
|
||||
/* ---- Und „geschlossen" steht nicht mehr an der Kachel ---- */
|
||||
const start = readFileSync(
|
||||
join(HIER, "..", "workspace", "assets", "css", "start.css"), "utf8");
|
||||
ok(!/content:\s*"geschlossen"/.test(start),
|
||||
"die Kachel sagt nicht mehr „geschlossen“");
|
||||
ok(/content:\s*"gleich"/.test(start) && /content:\s*"● live"/.test(start),
|
||||
"Gegenprobe: „gleich“ und „live“ stehen weiterhin da");
|
||||
}
|
||||
}
|
||||
|
||||
melde("");
|
||||
melde(`${geprueft} Pruefungen, ${fehler} Fehler`);
|
||||
melde(fehler === 0 ? "ALLES IN ORDNUNG" : "NICHT IN ORDNUNG");
|
||||
|
||||
Reference in New Issue
Block a user