Zwoelf rote Pruefungen -- und kein einziger Fehler im Programm
Der Rundumcheck geht weiter. Diese zwoelf standen im Nachtlauf als rot
und waren es nicht: Jede hat den Umbau vom 24.09. (die Haustrennung),
den vom 25.09. (die zugetragenen Punkte) oder eine Umbenennung
mitbekommen -- nur ihre Erwartung nicht.
DAS IST KEIN TROST. Ein Fehlalarm zeigt auf eine echte Stelle und nennt
eine plausible Zahl; man sucht danach an richtigem Code. Und zwoelf rote
Zeilen, die immer rot sind, nehmen dem ganzen Satz die Stimme.
=== DIESELBE WURZEL, SECHSMAL: DAS FALSCHE HAUS ===
Seit dem 24.09. antwortet der Server auf der Agenturadresse nicht mehr
ueber Team-Dogi-Leute -- und genau das taten diese Pruefungen:
pruef-nachwuchs legte einen Modi ueber die Agenturadresse an
(400). Einundzwanzig Meldungen hingen an diesem
einen Aufruf. 82 Zeilen auf crew. umgestellt,
aus „Mara, Managerin" wurde die linke Hand --
im Teamhaus ist sie das, was gemeint war.
230 -> 262 Pruefungen, 0 Fehler.
pruef-schritt dasselbe beim Aufgabenbrett (404/400).
pruef-treff-werkzeuge fragte die Einladungsliste eines Modis auf der
Agenturadresse ab -- dort ist er nicht.
pruef-rechte-umstellen benutzte `wissen.html` als zweite Probeseite.
Die ist laut Rechtetafel fuer alle offen und auf
crew. trotzdem zu: Dort kommt man nur auf Seiten,
fuer die es eine Kachel gibt. Jetzt material.html.
pruef-personen-formular verglich eine Erwartung FUER die Agentur mit
einer Messung OHNE Adresse (127.0.0.1) -- vier
gegen acht Rollen. Beides war richtig, nur nicht
dasselbe.
pruef-treff suchte „Support" zwischen den Brettern. Er steht
in „Fuer dich", wo er hingehoert -- eine kaputte
Seite zu melden ist kein Aushang. Die Liste stand
ZWEIMAL in der Datei; nachgezogen wurde eine.
Jetzt eine, von beiden benutzt.
=== ZWEIMAL: EINE FESTE ZAHL, DIE DIE SEITE UEBERHOLT HAT ===
pruef-community-sicht erlaubte „3 bis 8 Seiten". Es sind zwoelf, und
jede gehoert dorthin. Statt einer Spanne steht
jetzt die LISTE da: Kommt eine dazu, wird die
Zeile rot und nennt sie beim Namen. Eine Spanne
haette elf statt zwoelf stillschweigend
durchgelassen -- in beide Richtungen.
pruef-nachwuchs schaltete EINE Person ab und erwartete, dass die
Ampel danach schweigt. Der Kommentar darueber
sagt selbst: „Die Schwelle wird nicht
abgeschrieben, sondern aus dem Verhalten
abgeleitet" -- eine feste Anzahl abzuschalten ist
aber eine Abschrift in anderer Waehrung. Jetzt
wird abgeschaltet, BIS es kippt.
=== UND VIERMAL EIN WERKZEUG, DAS STUMPF WAR ===
pruef-scout-zuteilung suchte `.person__zeile` -- eine Klasse, die es
nicht mehr gibt. `querySelectorAll` liefert dafuer
ein leeres Feld, `.some()` darauf ist immer
false: Die Pruefung war nicht rot, weil etwas
fehlte, sondern weil sie nichts ansehen konnte.
Jetzt `.person`, und die ANZAHL der gefundenen
Karten steht in einer eigenen Bedingung.
pruef-loeschen suchte `::before` in einem Fenster von 600
Zeichen ab dem Selektor. Das misst die Laenge des
KOMMENTARS: Am 25.09. kam eine Begruendung von
zwanzig Zeilen dazu, und die Regel rutschte
hinaus. Jetzt wird nach dem Selektor gesucht.
pruef-portnummern hielt jedes `listen(` fuer einen Serverstart --
auch das blosse Nachsehen, ob eine Nummer frei
ist. Damit mahnte sie ausgerechnet die Datei an,
die das Vergeben der Nummern prueft. Jetzt zaehlt
der Import von `index.js`; dazu vier Gegenproben,
damit die engere Fassung nicht zum blinden Fleck
wird.
pruef-spicy stellte eine Person auf „manager" und dann
weiter. An Managern aendert seit dem 22.09. nur
DogFather etwas -- die Pruefung hatte sich selbst
die Tuer zugezogen. Jetzt kommt „manager" zuletzt,
und dass danach nichts mehr geht, ist eine eigene
Zeile. Aus dem Stolperstein wird eine Aussage.
=== EINER WAR FAST EIN BEFUND ===
pruef-alle-sehen-es meldete „highlight: DogFather 0, Community 0".
Das Brett hat als einziges keinen Katalog (dort
stehen echte Hoehepunkte, keine Vorlagen), und an
einem leeren Brett ist „sehen beide dasselbe?"
nicht zu messen: null gleich null waere auch dann
wahr, wenn die Community gar nichts duerfte.
Die Pruefung legt dort jetzt selbst einen Eintrag
an -- und musste dabei zweimal lernen: Der Eintrag
gehoert VOR den Katalog (danach ist die
Schreibbremse ausgeloest, 429), und er muss
FREIGEGEBEN werden, sonst sieht die Community ihn
zu Recht nicht. Beides steht jetzt als Aussage in
der Pruefung.
GEMESSEN: alle zwoelf gruen -- 43, 10, 31, 262, 43, 15, 56, 69, 37, 85,
73 und 80 Pruefungen, zusammen 804, kein Fehler.
Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
+174
-94
@@ -58,7 +58,18 @@ let offen = 0;
|
||||
const unklar = (t) => { offen++; console.log(" -- " + t); };
|
||||
|
||||
const CREW = "crew.dogfather-universe.com";
|
||||
const HAUS = "workspace.dogfather-universe.com";
|
||||
/* ==== DIESE PRUEFUNG WOHNT BEI TEAM DOGI (25.09.2026) ==============
|
||||
|
||||
Nachwuchs, Entwicklung, Talente, die 68 Punkte -- alles davon
|
||||
gehoert ins Teamhaus. Gefragt wurde trotzdem ueber die
|
||||
AGENTURadresse, und seit der Trennung vom 24.09. antwortet der
|
||||
Server dort richtigerweise mit 400: Einen Modi legt man dort
|
||||
nicht an. Einundzwanzig Meldungen hingen an diesem einen
|
||||
Aufruf -- alle Folge, keine Ursache.
|
||||
|
||||
Die Agenturadresse bleibt als Name stehen; gebraucht wird sie
|
||||
nur noch dort, wo ausdruecklich das andere Haus gemeint ist. */
|
||||
const AGENTUR = "workspace.dogfather-universe.com";
|
||||
|
||||
const { DatabaseSync } = await import("node:sqlite");
|
||||
const { scryptSync, randomBytes, createHmac } = await import("node:crypto");
|
||||
@@ -84,7 +95,12 @@ const idDogi = anlegen("Filipe", "admin", "CODE-DOGI-0001");
|
||||
const idHand = anlegen("Rieke", "hand", "CODE-HAND-0001");
|
||||
const idModi = anlegen("Frida", "modi", "CODE-MODI-0001");
|
||||
anlegen("Nina", "modi", "CODE-MODI-0002");
|
||||
anlegen("Mara", "manager", "CODE-MANA-0001");
|
||||
/* MARA IST DIE LINKE HAND UND KEIN MANAGER (25.09.2026).
|
||||
Diese Pruefung misst das Teamhaus; ein Manager taucht dort seit
|
||||
der Haustrennung nicht mehr auf und konnte deshalb auch nichts
|
||||
mehr beweisen. Als linke Hand steht sie da, wo sie gebraucht
|
||||
wird: in der Rangfolge unter der rechten Hand. */
|
||||
anlegen("Mara", "linke", "CODE-LINK-0001");
|
||||
|
||||
/* Ein Kandidat im Talente-Brett -- ohne ihn waere jede Zeile ueber den
|
||||
Trichter ein gruener Haken ueber der Null. */
|
||||
@@ -116,7 +132,7 @@ async function anmelden(rolle, code, host) {
|
||||
const r = await roh("/workspace/api/anmelden", host, {}, { rolle, code });
|
||||
return [].concat(r.kopf?.["set-cookie"] || []).map((c) => c.split(";")[0]).join("; ");
|
||||
}
|
||||
const kDogi = await anmelden("admin", "CODE-DOGI-0001", HAUS);
|
||||
const kDogi = await anmelden("admin", "CODE-DOGI-0001", CREW);
|
||||
const kHand = await anmelden("hand", "CODE-HAND-0001", CREW);
|
||||
const kModi = await anmelden("modi", "CODE-MODI-0001", CREW);
|
||||
ok(!!kDogi && !!kHand && !!kModi, "DogFather, rechte Hand und ein Modi sind angemeldet");
|
||||
@@ -176,7 +192,7 @@ melde("=== 2. Block 5 ===");
|
||||
{
|
||||
const selbst = kat.ENTWICKLUNG_SELBST[0].schluessel;
|
||||
|
||||
const karte = await roh(`/workspace/api/entwicklung/person/${idModi}`, HAUS, { cookie: kDogi });
|
||||
const karte = await roh(`/workspace/api/entwicklung/person/${idModi}`, CREW, { cookie: kDogi });
|
||||
const bloecke = json(karte).bloecke || [];
|
||||
const alleSchluessel = bloecke.flatMap((b) => (b.punkte || []).map((p) => p.schluessel));
|
||||
ok(karte.code === 200 && alleSchluessel.length > 0,
|
||||
@@ -188,9 +204,9 @@ melde("=== 2. Block 5 ===");
|
||||
|
||||
/* Und schreiben geht auch nicht -- mit derselben Antwort wie ein
|
||||
erfundener Schluessel, damit man an der Antwort nichts ablesen kann. */
|
||||
const schreib = await roh(`/workspace/api/entwicklung/person/${idModi}/${selbst}`, HAUS,
|
||||
const schreib = await roh(`/workspace/api/entwicklung/person/${idModi}/${selbst}`, CREW,
|
||||
{ cookie: kDogi }, { stufe: "laeuft" }, "PUT");
|
||||
const erfunden = await roh(`/workspace/api/entwicklung/person/${idModi}/e-gibt-es-nicht`, HAUS,
|
||||
const erfunden = await roh(`/workspace/api/entwicklung/person/${idModi}/e-gibt-es-nicht`, CREW,
|
||||
{ cookie: kDogi }, { stufe: "laeuft" }, "PUT");
|
||||
ok(schreib.code === 404, `DogFather kann dort auch nichts setzen (${schreib.code})`);
|
||||
ok(schreib.code === erfunden.code,
|
||||
@@ -209,7 +225,7 @@ melde("=== 2. Block 5 ===");
|
||||
ok(setzen.code === 200, `und kann sie beantworten (${setzen.code})`);
|
||||
|
||||
/* Und danach steht sie immer noch nicht in DogFathers Karte. */
|
||||
const nachher = await roh(`/workspace/api/entwicklung/person/${idModi}`, HAUS, { cookie: kDogi });
|
||||
const nachher = await roh(`/workspace/api/entwicklung/person/${idModi}`, CREW, { cookie: kDogi });
|
||||
ok(!nachher.text.includes(selbst),
|
||||
"auch nach der Antwort steht sie nicht in DogFathers Karte");
|
||||
|
||||
@@ -238,7 +254,7 @@ melde("=== 3. Die Ampel ===");
|
||||
Die Schwelle wird nicht abgeschrieben, sondern aus dem Verhalten
|
||||
abgeleitet: Erst mit vollem Team messen, dann eine Person
|
||||
abschalten und noch einmal. Was dazwischen kippt, IST die Grenze. */
|
||||
const voll = json(await roh("/workspace/api/entwicklung/ampel", HAUS, { cookie: kDogi }));
|
||||
const voll = json(await roh("/workspace/api/entwicklung/ampel", CREW, { cookie: kDogi }));
|
||||
ok(voll.team >= 3 && voll.sagbar === true,
|
||||
`bei ${voll.team} Personen sagt die Ampel etwas (${voll.lage})`);
|
||||
ok(typeof voll.geantwortet === "number" && voll.geantwortet >= 1,
|
||||
@@ -250,14 +266,39 @@ melde("=== 3. Die Ampel ===");
|
||||
ok(!/Frida|Nina|Rieke|Filipe/.test(JSON.stringify(voll)),
|
||||
"und in der ganzen Antwort steht kein einziger Name");
|
||||
|
||||
/* Jetzt eine Person abschalten -- das Team faellt unter die Schwelle. */
|
||||
const dd = new DatabaseSync(process.env.WORKSPACE_DB);
|
||||
dd.prepare("UPDATE personen SET aktiv = 0 WHERE name = 'Nina'").run();
|
||||
dd.close();
|
||||
/* ==== DIE SCHWELLE WIRD GESUCHT, NICHT ANGENOMMEN (25.09.2026) ==
|
||||
|
||||
const klein = json(await roh("/workspace/api/entwicklung/ampel", HAUS, { cookie: kDogi }));
|
||||
ok(klein.team === voll.team - 1 && klein.sagbar === false,
|
||||
`bei ${klein.team} Personen schweigt sie`);
|
||||
Hier wurde EINE Person abgeschaltet und erwartet, dass die Ampel
|
||||
danach schweigt. Das stimmte, solange das Team genau so gross
|
||||
war, wie es an dem Tag war -- und ging kaputt, als eine Rolle
|
||||
dazukam (aus dem Manager im anderen Haus wurde die linke Hand in
|
||||
diesem). Die Pruefung meldete „bei 3 Personen schweigt sie" und
|
||||
meinte: sie tut es nicht.
|
||||
|
||||
Der Kommentar darueber sagt es selbst: „Die Schwelle wird nicht
|
||||
abgeschrieben, sondern aus dem Verhalten abgeleitet." Eine feste
|
||||
Anzahl abzuschalten IST aber eine Abschrift -- nur in einer
|
||||
anderen Waehrung. Jetzt wird abgeschaltet, BIS es kippt, und
|
||||
hoechstens so oft, wie es Leute gibt.
|
||||
|
||||
WAS DAMIT GEMESSEN WIRD, bleibt dasselbe und wird sogar
|
||||
schaerfer: dass es ueberhaupt kippt (eine Ampel, die immer redet,
|
||||
waere ein Bruch des Versprechens an die Leute), dass sie dabei
|
||||
einen Grund nennt, und dass in keiner der beiden Antworten ein
|
||||
Name steht. */
|
||||
const namen = ["Nina", "Mara", "Frida", "Rieke"];
|
||||
let klein = voll, abgeschaltet = 0;
|
||||
for (const wen of namen) {
|
||||
const dd = new DatabaseSync(process.env.WORKSPACE_DB);
|
||||
dd.prepare("UPDATE personen SET aktiv = 0 WHERE name = ?").run(wen);
|
||||
dd.close();
|
||||
abgeschaltet++;
|
||||
klein = json(await roh("/workspace/api/entwicklung/ampel", CREW, { cookie: kDogi }));
|
||||
if (klein.sagbar === false) break;
|
||||
}
|
||||
ok(klein.sagbar === false && klein.team < voll.team,
|
||||
`nach ${abgeschaltet} Abschaltung(en) schweigt sie `
|
||||
+ `(${voll.team} -> ${klein.team} Personen)`);
|
||||
ok(/Name/.test(klein.grund || ""),
|
||||
"und sagt, warum – ein stilles Nichts sieht aus wie ein Fehler");
|
||||
ok(!/Frida|Nina|Rieke|Filipe/.test(JSON.stringify(klein)),
|
||||
@@ -283,7 +324,7 @@ melde("=== 4. Zwei Augenpaare ===");
|
||||
{ cookie: kHand }, { stufe: "laeuft", anlass: "Gestern im Chat gesehen." }, "PUT");
|
||||
ok(gesetzt.code === 200, `die rechte Hand setzt einen Punkt (${gesetzt.code})`);
|
||||
|
||||
const vorher = await roh(`/workspace/api/entwicklung/person/${idModi}`, HAUS, { cookie: kDogi });
|
||||
const vorher = await roh(`/workspace/api/entwicklung/person/${idModi}`, CREW, { cookie: kDogi });
|
||||
const p1 = (json(vorher).bloecke || []).flatMap((b) => b.punkte || [])
|
||||
.find((p) => p.schluessel === punkt);
|
||||
ok(p1 && p1.andere === null,
|
||||
@@ -293,12 +334,12 @@ melde("=== 4. Zwei Augenpaare ===");
|
||||
ok(!vorher.text.includes("Gestern im Chat gesehen"),
|
||||
"und ihr Anlasstext wird gar nicht erst ausgeliefert");
|
||||
|
||||
const eigen = await roh(`/workspace/api/entwicklung/person/${idModi}/${punkt}`, HAUS,
|
||||
const eigen = await roh(`/workspace/api/entwicklung/person/${idModi}/${punkt}`, CREW,
|
||||
{ cookie: kDogi }, { stufe: "waechst" }, "PUT");
|
||||
ok(eigen.code === 200, `DogFather setzt selbst (${eigen.code})`);
|
||||
|
||||
/* GEGENPROBE: jetzt kommt er. */
|
||||
const nachher = await roh(`/workspace/api/entwicklung/person/${idModi}`, HAUS, { cookie: kDogi });
|
||||
const nachher = await roh(`/workspace/api/entwicklung/person/${idModi}`, CREW, { cookie: kDogi });
|
||||
const p2 = (json(nachher).bloecke || []).flatMap((b) => b.punkte || [])
|
||||
.find((p) => p.schluessel === punkt);
|
||||
ok(p2 && p2.andere?.length === 1 && p2.andere[0].stufe === "laeuft",
|
||||
@@ -319,20 +360,20 @@ melde("");
|
||||
melde("=== 5. Kein Klick ohne Anlass ===");
|
||||
{
|
||||
const punkt = kat.ENTWICKLUNG_FREMD[1].schluessel;
|
||||
const ohne = await roh(`/workspace/api/entwicklung/person/${idModi}/${punkt}`, HAUS,
|
||||
const ohne = await roh(`/workspace/api/entwicklung/person/${idModi}/${punkt}`, CREW,
|
||||
{ cookie: kDogi }, { stufe: "hakt", anlass: "" }, "PUT");
|
||||
ok(ohne.code === 400, `„Da hakt es" ohne Anlass wird abgelehnt (${ohne.code})`);
|
||||
ok(/gemerkt|Satz/.test(json(ohne).fehler || ""),
|
||||
"und die Absage sagt, was fehlt, statt nur nein");
|
||||
|
||||
const mit = await roh(`/workspace/api/entwicklung/person/${idModi}/${punkt}`, HAUS,
|
||||
const mit = await roh(`/workspace/api/entwicklung/person/${idModi}/${punkt}`, CREW,
|
||||
{ cookie: kDogi }, { stufe: "hakt", anlass: "Am Samstag zweimal nicht reagiert." }, "PUT");
|
||||
ok(mit.code === 200, `mit Anlass geht es durch (${mit.code})`);
|
||||
|
||||
/* GEGENPROBE: „Läuft" braucht keinen — sonst wären es 28 Pflichtfelder
|
||||
je Person, und „so einfach wie möglich" war die halbe Aufgabe. */
|
||||
const laeuft = await roh(`/workspace/api/entwicklung/person/${idModi}/${kat.ENTWICKLUNG_FREMD[2].schluessel}`,
|
||||
HAUS, { cookie: kDogi }, { stufe: "laeuft" }, "PUT");
|
||||
CREW, { cookie: kDogi }, { stufe: "laeuft" }, "PUT");
|
||||
ok(laeuft.code === 200, `„Läuft" geht ohne Anlass (${laeuft.code})`);
|
||||
}
|
||||
|
||||
@@ -351,7 +392,7 @@ melde("=== 6. Verblassen ===");
|
||||
new Date(Date.now() - (modul.VERBLASST_NACH_TAGEN + 10) * 86400000).toISOString());
|
||||
dd.close();
|
||||
|
||||
const r = await roh(`/workspace/api/entwicklung/person/${idModi}`, HAUS, { cookie: kDogi });
|
||||
const r = await roh(`/workspace/api/entwicklung/person/${idModi}`, CREW, { cookie: kDogi });
|
||||
const punkte = (json(r).bloecke || []).flatMap((b) => b.punkte || []);
|
||||
const alterPunkt = punkte.find((p) => p.schluessel === alt);
|
||||
ok(alterPunkt?.meins?.verblasst === true,
|
||||
@@ -363,7 +404,7 @@ melde("=== 6. Verblassen ===");
|
||||
ok(frisch?.meins?.verblasst === false,
|
||||
"einer von heute nicht");
|
||||
|
||||
const lage = json(await roh("/workspace/api/entwicklung/lage", HAUS, { cookie: kDogi }));
|
||||
const lage = json(await roh("/workspace/api/entwicklung/lage", CREW, { cookie: kDogi }));
|
||||
const zeile = (lage.personen || []).find((p) => p.id === idModi);
|
||||
ok(zeile?.veraltet === 1, `und die Übersicht zählt ihn (${zeile?.veraltet})`);
|
||||
ok(zeile?.abweichungen === 1, `samt der Abweichung (${zeile?.abweichungen})`);
|
||||
@@ -375,7 +416,7 @@ melde("=== 6. Verblassen ===");
|
||||
melde("");
|
||||
melde("=== 7. Talente ===");
|
||||
{
|
||||
const lage = await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi });
|
||||
const lage = await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi });
|
||||
const r = json(lage);
|
||||
ok(lage.code === 200 && (r.kandidaten || []).length === 1,
|
||||
`DogFather sieht den Trichter (${(r.kandidaten || []).length} Kandidat)`);
|
||||
@@ -403,31 +444,31 @@ melde("=== 7. Talente ===");
|
||||
/* Merkmale: ein Klick setzt, der zweite nimmt zurück. */
|
||||
const m = tal.TALENT_ALLE[0].schluessel;
|
||||
const w = tal.TALENT_WARNZEICHEN[0].schluessel;
|
||||
const eins = await roh(`/workspace/api/talente/${idTalent}/merkmal/${m}`, HAUS,
|
||||
const eins = await roh(`/workspace/api/talente/${idTalent}/merkmal/${m}`, CREW,
|
||||
{ cookie: kDogi }, {}, "PUT");
|
||||
ok(eins.code === 200 && json(eins).gesetzt === true, "ein Merkmal wird gesetzt");
|
||||
const zwei = await roh(`/workspace/api/talente/${idTalent}/merkmal/${m}`, HAUS,
|
||||
const zwei = await roh(`/workspace/api/talente/${idTalent}/merkmal/${m}`, CREW,
|
||||
{ cookie: kDogi }, {}, "PUT");
|
||||
ok(zwei.code === 200 && json(zwei).gesetzt === false, "und der zweite Klick nimmt es zurück");
|
||||
await roh(`/workspace/api/talente/${idTalent}/merkmal/${m}`, HAUS, { cookie: kDogi }, {}, "PUT");
|
||||
await roh(`/workspace/api/talente/${idTalent}/merkmal/${w}`, HAUS, { cookie: kDogi }, {}, "PUT");
|
||||
await roh(`/workspace/api/talente/${idTalent}/merkmal/${m}`, CREW, { cookie: kDogi }, {}, "PUT");
|
||||
await roh(`/workspace/api/talente/${idTalent}/merkmal/${w}`, CREW, { cookie: kDogi }, {}, "PUT");
|
||||
|
||||
const nach = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi })).kandidaten[0];
|
||||
const nach = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi })).kandidaten[0];
|
||||
ok(nach.merkmale.length === 1 && nach.warnzeichen.length === 1,
|
||||
`Merkmale und Warnzeichen stehen getrennt (${nach.merkmale.length} / ${nach.warnzeichen.length})`);
|
||||
ok(!nach.merkmale.includes(w),
|
||||
"ein Warnzeichen landet nicht zwischen den Merkmalen");
|
||||
|
||||
/* Die Stufe wandert -- und die Standzeit beginnt von vorn. */
|
||||
const weiter = await roh(`/workspace/api/talente/${idTalent}/stufe`, HAUS,
|
||||
const weiter = await roh(`/workspace/api/talente/${idTalent}/stufe`, CREW,
|
||||
{ cookie: kDogi }, { stufe: "beobachtet" }, "PUT");
|
||||
ok(weiter.code === 200, `ein Schritt weiter im Trichter (${weiter.code})`);
|
||||
const nach2 = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi })).kandidaten[0];
|
||||
const nach2 = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi })).kandidaten[0];
|
||||
ok(nach2.stufe === "beobachtet" && nach2.tage === 0,
|
||||
`Stufe „${nach2.stufe_name}", Standzeit beginnt bei ${nach2.tage}`);
|
||||
ok(nach2.liegt === false, "und liegt damit auch nicht");
|
||||
|
||||
const erfunden = await roh(`/workspace/api/talente/${idTalent}/stufe`, HAUS,
|
||||
const erfunden = await roh(`/workspace/api/talente/${idTalent}/stufe`, CREW,
|
||||
{ cookie: kDogi }, { stufe: "chef" }, "PUT");
|
||||
ok(erfunden.code === 400, `eine erfundene Stufe wird abgelehnt (${erfunden.code})`);
|
||||
}
|
||||
@@ -444,7 +485,7 @@ melde("=== 8. Standzeit ===");
|
||||
.run(new Date(Date.now() - (stufe.frist + 11) * 86400000).toISOString(), idTalent);
|
||||
dd.close();
|
||||
|
||||
const r = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi }));
|
||||
const r = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi }));
|
||||
const k = r.kandidaten[0];
|
||||
ok(k.liegt === true && k.tage === stufe.frist + 11,
|
||||
`nach ${k.tage} Tagen auf einer Stufe mit Frist ${stufe.frist} gilt die Karte als liegengeblieben`);
|
||||
@@ -457,7 +498,7 @@ melde("=== 8. Standzeit ===");
|
||||
dd2.prepare("UPDATE talent_stufe SET seit = ? WHERE eintrag_id = ?")
|
||||
.run(new Date(Date.now() - (stufe.frist - 1) * 86400000).toISOString(), idTalent);
|
||||
dd2.close();
|
||||
const r2 = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi }));
|
||||
const r2 = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi }));
|
||||
ok(r2.kandidaten[0].liegt === false,
|
||||
`einen Tag vor der Frist noch nicht (${r2.kandidaten[0].tage} Tage)`);
|
||||
}
|
||||
@@ -500,7 +541,7 @@ melde("=== 9. Der Vorlagentext ===");
|
||||
ok(/\b(fuer)/i.test("das ist fuer dich"), "und der Sucher findet so einen auch wirklich");
|
||||
|
||||
/* UND ER KOMMT UEBER DIE LEITUNG AN, nicht nur aus dem Modul. */
|
||||
const lage = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi }));
|
||||
const lage = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi }));
|
||||
const k = (lage.kandidaten || [])[0];
|
||||
ok(typeof k?.ansprechtext === "string" && k.ansprechtext.length > 100,
|
||||
"die Karte bringt ihren Text mit");
|
||||
@@ -579,7 +620,7 @@ melde("=== 10. Die eigene Karte ===");
|
||||
ok(ihre.hat_karte === true, `auch die rechte Hand hat eine eigene Karte (${JSON.stringify(ihre).slice(0, 90)})`);
|
||||
ok(ihre.beurteiler === 1, `ueber sie urteilt genau einer (${ihre.beurteiler})`);
|
||||
|
||||
const chef = json(await roh("/workspace/api/entwicklung/meine-karte", HAUS, { cookie: kDogi }));
|
||||
const chef = json(await roh("/workspace/api/entwicklung/meine-karte", CREW, { cookie: kDogi }));
|
||||
ok(chef.hat_karte === false, "DogFather selbst hat keine -- ueber ihn urteilt hier niemand");
|
||||
}
|
||||
|
||||
@@ -646,9 +687,33 @@ melde("=== 11. Probe → Zugang ===");
|
||||
|
||||
/* UND DAS PROTOKOLL BLEIBT BEI DOGFATHER. Dort stehen die
|
||||
Einstellungsaenderungen des ganzen Hauses. */
|
||||
/* ==== INS PROTOKOLL SIEHT SIE SEHR WOHL (25.09.2026) ===========
|
||||
|
||||
Hier stand „und ins Protokoll sieht sie nicht", geprueft mit
|
||||
404/403. Das war richtig, bis Filipe es umgedreht hat: „sie soll
|
||||
die gleichen rechte haben wie dogfather, das einzige was sie
|
||||
nicht kann ist die dogfather rolle oder leute anfassen." Fuer das
|
||||
Protokoll laesst dieser Satz keinen Rest -- und
|
||||
workspace-personen.js oeffnet den Weg seither ausdruecklich
|
||||
(`protokollWeg`, nur GET, ohne Nummer im Pfad).
|
||||
|
||||
ZUM ZWEITEN MAL DIESELBE STELLE. Am 23.09. wurde hier schon
|
||||
einmal aus „darf nicht" ein „darf" -- damals beim Anlegen. Eine
|
||||
Pruefung, die eine Erlaubnis festhaelt, veraltet genau dann, wenn
|
||||
jemand die Erlaubnis erweitert; das ist kein Fehler der Pruefung,
|
||||
sondern ihr Zweck. Gemeldet werden muss es trotzdem, sonst steht
|
||||
sie rot herum und niemand liest sie mehr.
|
||||
|
||||
GEPRUEFT WIRD JETZT BEIDES: dass sie hineinsieht -- und dass es
|
||||
wirklich das Protokoll ist und nicht eine leere Antwort, die
|
||||
zufaellig 200 heisst. */
|
||||
const handProtokoll = await roh("/workspace/api/verwaltung/protokoll", CREW, { cookie: kHand });
|
||||
ok(handProtokoll.code === 404 || handProtokoll.code === 403,
|
||||
`und ins Protokoll sieht sie nicht (${handProtokoll.code})`);
|
||||
ok(handProtokoll.code === 200,
|
||||
`und ins Protokoll sieht sie sehr wohl (${handProtokoll.code})`);
|
||||
const handZeilen = json(handProtokoll).eintraege;
|
||||
ok(Array.isArray(handZeilen),
|
||||
` und bekommt wirklich Eintraege (${Array.isArray(handZeilen)
|
||||
? handZeilen.length + " Stueck" : typeof handZeilen})`);
|
||||
|
||||
/* EIN MODI DARF WEITERHIN GAR NICHTS DAVON. Das ist die eigentliche
|
||||
Aussage dieses Blocks -- und sie ist unveraendert. */
|
||||
@@ -658,7 +723,7 @@ melde("=== 11. Probe → Zugang ===");
|
||||
|
||||
/* GEGENPROBE: DogFather kann es -- sonst waere "404" oben auch dann
|
||||
gruen, wenn der Weg gar nicht existiert. */
|
||||
const neu = await roh("/workspace/api/verwaltung/personen", HAUS, { cookie: kDogi },
|
||||
const neu = await roh("/workspace/api/verwaltung/personen", CREW, { cookie: kDogi },
|
||||
{ name: "Kessi", rolle: "modi" });
|
||||
ok(neu.code === 201, `DogFather legt den Zugang an (${neu.code})`);
|
||||
const person = json(neu);
|
||||
@@ -668,16 +733,16 @@ melde("=== 11. Probe → Zugang ===");
|
||||
|
||||
/* UND DANACH IST ER WEG. Nirgends abrufbar -- auch nicht fuer den,
|
||||
der ihn angelegt hat. */
|
||||
const liste = await roh("/workspace/api/verwaltung/personen", HAUS, { cookie: kDogi });
|
||||
const liste = await roh("/workspace/api/verwaltung/personen", CREW, { cookie: kDogi });
|
||||
ok(liste.code === 200 && !liste.text.includes(person.code),
|
||||
"danach steht er in keiner Liste mehr");
|
||||
|
||||
/* Erst jetzt wandert die Karte -- in derselben Reihenfolge wie in der
|
||||
Oberflaeche: erst der Mensch, dann der Haken. */
|
||||
const stufe = await roh(`/workspace/api/talente/${idTalent}/stufe`, HAUS,
|
||||
const stufe = await roh(`/workspace/api/talente/${idTalent}/stufe`, CREW,
|
||||
{ cookie: kDogi }, { stufe: "imteam" }, "PUT");
|
||||
ok(stufe.code === 200, `und die Karte geht auf "Im Team" (${stufe.code})`);
|
||||
const lage = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi }));
|
||||
const lage = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi }));
|
||||
const k = (lage.kandidaten || []).find((x) => x.id === idTalent);
|
||||
ok(k?.stufe === "imteam" && k?.knopf === null,
|
||||
"dahinter kommt kein weiterer Knopf -- der Trichter ist zu Ende");
|
||||
@@ -727,7 +792,7 @@ melde("=== 12. Die Reihenfolge ===");
|
||||
"die Community steht nicht in der Rangfolge — sie faellt ans Ende");
|
||||
|
||||
/* ---- Die Liste aus dem Bildschirmfoto ---- */
|
||||
const lage = json(await roh("/workspace/api/entwicklung/lage", HAUS, { cookie: kDogi }));
|
||||
const lage = json(await roh("/workspace/api/entwicklung/lage", CREW, { cookie: kDogi }));
|
||||
const namen = (lage.personen || []).map((p) => p.name);
|
||||
ok(namen.length >= 3, `${namen.length} Menschen in „Wen gehst du durch?“ (${namen.join(", ")})`);
|
||||
ok(namen[0] === "Rieke", `die rechte Hand steht ganz links (${namen[0]})`);
|
||||
@@ -739,7 +804,7 @@ melde("=== 12. Die Reihenfolge ===");
|
||||
`alphabetisch stuende dort ${alphabetisch[0]} — die Reihenfolge ist also keine Namensfolge`);
|
||||
|
||||
/* ---- Personen & Zugaenge: unter DogFather, ueber allen anderen ---- */
|
||||
const liste = json(await roh("/workspace/api/verwaltung/personen", HAUS, { cookie: kDogi }));
|
||||
const liste = json(await roh("/workspace/api/verwaltung/personen", CREW, { cookie: kDogi }));
|
||||
const alle = (liste.personen || []).map((p) => ({ name: p.name, rolle: p.rolle }));
|
||||
ok(alle.length >= 4, `${alle.length} Menschen in „Personen & Zugaenge“`);
|
||||
const platz = (rolle) => alle.findIndex((p) => p.rolle === rolle);
|
||||
@@ -751,8 +816,23 @@ melde("=== 12. Die Reihenfolge ===");
|
||||
const darueber = alle.filter((p, i) => i < vonHand).map((p) => p.rolle);
|
||||
ok(darueber.every((r) => r === "admin" || r === "spicy"),
|
||||
`ueber ihr steht nur die Leitung (${darueber.join(", ") || "niemand"})`);
|
||||
ok(darunter.includes("manager") && darunter.includes("modi"),
|
||||
`unter ihr stehen Manager und Modis (${[...new Set(darunter)].join(", ")})`);
|
||||
/* ==== IM TEAMHAUS STEHEN TEAMROLLEN (25.09.2026) ================
|
||||
|
||||
Hier stand `darunter.includes("manager")`. Seit der Haustrennung
|
||||
vom 24.09. liefert die Personenliste nur noch das Haus, aus dem
|
||||
gefragt wird -- und diese Pruefung fragt aus dem Teamhaus. Ein
|
||||
Manager kommt dort nicht mehr vor, und das ist die Absicht:
|
||||
„Eine Aenderung an einem der beiden Haeuser darf im anderen
|
||||
nichts bewirken."
|
||||
|
||||
Gemessen wird deshalb, was hier wirklich unter der rechten Hand
|
||||
steht: die linke Hand und die Modis. Die Aussage bleibt dieselbe
|
||||
-- nach Rang sortiert, die Leitung oben -- nur eben mit den
|
||||
Leuten, die es in diesem Haus gibt. */
|
||||
ok(darunter.includes("linke") && darunter.includes("modi"),
|
||||
`unter ihr stehen die linke Hand und die Modis (${[...new Set(darunter)].join(", ")})`);
|
||||
ok(!darunter.includes("manager") && !darueber.includes("manager"),
|
||||
"und KEIN Manager -- der gehoert ins andere Haus (Gegenprobe zur Trennung)");
|
||||
|
||||
/* ---- Und dieselbe Regel im Haus nebenan ---- */
|
||||
const crew = json(await roh("/workspace/api/entwicklung/lage", CREW, { cookie: kHand }));
|
||||
@@ -838,11 +918,11 @@ melde("=== 13. Die Probezeit ===");
|
||||
waere "vor der Probe steht keine Liste" nicht falsch, sondern
|
||||
unpruefbar. Beim ersten Anlauf war genau das der Grund fuer vier
|
||||
rote Zeilen: meine Annahme, nicht der Code. */
|
||||
const neuerTalent = await roh("/workspace/api/bereich/talente", HAUS, { cookie: kDogi },
|
||||
const neuerTalent = await roh("/workspace/api/bereich/talente", CREW, { cookie: kDogi },
|
||||
{ art: "ruhig", titel: "Jonas aus dem Chat", text: "Faellt seit kurzem auf." });
|
||||
ok(neuerTalent.code === 201 || neuerTalent.code === 200,
|
||||
`ein frischer Kandidat fuer diesen Abschnitt (${neuerTalent.code})`);
|
||||
const lage = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi }));
|
||||
const lage = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi }));
|
||||
const kandidat = (lage.kandidaten || []).find((k) => k.titel === "Jonas aus dem Chat");
|
||||
ok(!!kandidat, `er steht im Trichter (${kandidat?.stufe})`);
|
||||
|
||||
@@ -853,7 +933,7 @@ melde("=== 13. Die Probezeit ===");
|
||||
`vor der Probe steht dort keine Liste (${kandidat.probe ? "doch eine" : "keine"})`);
|
||||
{
|
||||
const r = await roh(`/workspace/api/talente/${kandidat.id}/probe/pr-erste-schicht`,
|
||||
HAUS, { cookie: kDogi }, {}, "PUT");
|
||||
CREW, { cookie: kDogi }, {}, "PUT");
|
||||
ok(r.code === 409,
|
||||
`und abhaken geht nicht, solange die Probe nicht laeuft (${r.code})`);
|
||||
}
|
||||
@@ -871,7 +951,7 @@ melde("=== 13. Die Probezeit ===");
|
||||
while (stufe !== "probe" && schutz++ < 6) {
|
||||
const naechste = tal.talentNaechste(stufe)?.schluessel;
|
||||
if (!naechste) break;
|
||||
const r = await roh(`/workspace/api/talente/${kandidat.id}/stufe`, HAUS,
|
||||
const r = await roh(`/workspace/api/talente/${kandidat.id}/stufe`, CREW,
|
||||
{ cookie: kDogi },
|
||||
naechste === "probe"
|
||||
? { stufe: naechste, buddy_id: idModi, erste_schicht: morgen }
|
||||
@@ -884,7 +964,7 @@ melde("=== 13. Die Probezeit ===");
|
||||
}
|
||||
|
||||
{
|
||||
const k = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi }))
|
||||
const k = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi }))
|
||||
.kandidaten.find((x) => x.id === kandidat.id);
|
||||
ok(!!k.probe, "jetzt steht die Liste an der Karte");
|
||||
ok(k.probe.gesamt === probeplan.PROBE_ALLE.length && k.probe.getan === 0,
|
||||
@@ -899,9 +979,9 @@ melde("=== 13. Die Probezeit ===");
|
||||
/* ---- Abhaken, und WER es war ---- */
|
||||
{
|
||||
const r = await roh(`/workspace/api/talente/${kandidat.id}/probe/pr-erste-schicht`,
|
||||
HAUS, { cookie: kDogi }, {}, "PUT");
|
||||
CREW, { cookie: kDogi }, {}, "PUT");
|
||||
ok(r.code === 200 && json(r).fertig === true, `abhaken geht (${r.code})`);
|
||||
const k = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi }))
|
||||
const k = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi }))
|
||||
.kandidaten.find((x) => x.id === kandidat.id);
|
||||
const s = k.probe.schritte.find((x) => x.schluessel === "pr-erste-schicht");
|
||||
ok(s.fertig === true && s.von === "Filipe",
|
||||
@@ -911,25 +991,25 @@ melde("=== 13. Die Probezeit ===");
|
||||
{
|
||||
/* EIN KNOPF, ZWEI RICHTUNGEN -- wie bei den Merkmalen. */
|
||||
const r = await roh(`/workspace/api/talente/${kandidat.id}/probe/pr-erste-schicht`,
|
||||
HAUS, { cookie: kDogi }, {}, "PUT");
|
||||
CREW, { cookie: kDogi }, {}, "PUT");
|
||||
ok(r.code === 200 && json(r).fertig === false, "ein zweiter Klick nimmt zurueck");
|
||||
const k = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi }))
|
||||
const k = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi }))
|
||||
.kandidaten.find((x) => x.id === kandidat.id);
|
||||
ok(k.probe.getan === 0, "und der Stand geht mit zurueck");
|
||||
}
|
||||
{
|
||||
const r = await roh(`/workspace/api/talente/${kandidat.id}/probe/voellig-erfunden`,
|
||||
HAUS, { cookie: kDogi }, {}, "PUT");
|
||||
CREW, { cookie: kDogi }, {}, "PUT");
|
||||
ok(r.code === 404, `ein erfundener Schritt wird abgewiesen (${r.code})`);
|
||||
}
|
||||
|
||||
/* ---- Und die Frage, wegen der das alles da ist ---- */
|
||||
{
|
||||
for (const s of ["pr-allein-schicht", "pr-team-gefragt", "pr-er-will-noch"]) {
|
||||
await roh(`/workspace/api/talente/${kandidat.id}/probe/${s}`, HAUS,
|
||||
await roh(`/workspace/api/talente/${kandidat.id}/probe/${s}`, CREW,
|
||||
{ cookie: kDogi }, {}, "PUT");
|
||||
}
|
||||
const k = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi }))
|
||||
const k = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi }))
|
||||
.kandidaten.find((x) => x.id === kandidat.id);
|
||||
ok(k.probe.entscheidbar === true,
|
||||
`mit den drei noetigen Schritten ist es entscheidbar (${k.probe.getan} von ${k.probe.gesamt})`);
|
||||
@@ -940,9 +1020,9 @@ melde("=== 13. Die Probezeit ===");
|
||||
/* ---- Wer was gesehen hat ---- */
|
||||
{
|
||||
const m = tal.TALENT_MERKMALE[tal.TALENT_GRUPPEN[0].schluessel][0].schluessel;
|
||||
await roh(`/workspace/api/talente/${kandidat.id}/merkmal/${m}`, HAUS,
|
||||
await roh(`/workspace/api/talente/${kandidat.id}/merkmal/${m}`, CREW,
|
||||
{ cookie: kDogi }, {}, "PUT");
|
||||
const k = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi }))
|
||||
const k = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi }))
|
||||
.kandidaten.find((x) => x.id === kandidat.id);
|
||||
ok(k.gesehen_von?.[m] === "Filipe",
|
||||
`an einem Merkmal steht, wer es gesehen hat (${k.gesehen_von?.[m]})`);
|
||||
@@ -985,7 +1065,7 @@ melde("=== 14. Der Ausgang ===");
|
||||
/* Jonas steht aus Abschnitt 13 in der Probe -- genau der interessante
|
||||
Fall: Wer in der Probe aussteigt, hat eine andere Geschichte als
|
||||
wer nach dem ersten Hinsehen aussteigt. */
|
||||
const vorher = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi }));
|
||||
const vorher = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi }));
|
||||
const jonas = (vorher.kandidaten || []).find((k) => k.titel === "Jonas aus dem Chat");
|
||||
ok(!!jonas && jonas.stufe === "probe",
|
||||
`Jonas steht in der Arbeitsliste, Stufe ${jonas?.stufe}`);
|
||||
@@ -993,7 +1073,7 @@ melde("=== 14. Der Ausgang ===");
|
||||
|
||||
/* ---- Der Satz ist Pflicht ---- */
|
||||
{
|
||||
const r = await roh(`/workspace/api/talente/${jonas.id}/beenden`, HAUS,
|
||||
const r = await roh(`/workspace/api/talente/${jonas.id}/beenden`, CREW,
|
||||
{ cookie: kDogi }, { grund: "" }, "PUT");
|
||||
ok(r.code === 400, `ohne Satz geht es nicht (${r.code})`);
|
||||
ok((json(r).fehler || "").length > 20,
|
||||
@@ -1005,7 +1085,7 @@ melde("=== 14. Der Ausgang ===");
|
||||
auffallen. Ohne diese Zeile wuesste man nur, dass ein LEERES Feld
|
||||
abgewiesen wird, und das ist eine andere, viel schwaechere
|
||||
Aussage. */
|
||||
const r = await roh(`/workspace/api/talente/${jonas.id}/beenden`, HAUS,
|
||||
const r = await roh(`/workspace/api/talente/${jonas.id}/beenden`, CREW,
|
||||
{ cookie: kDogi }, { grund: "passt nix" }, "PUT");
|
||||
ok(r.code === 400, `neun Zeichen sind noch kein Satz (${r.code})`);
|
||||
}
|
||||
@@ -1013,12 +1093,12 @@ melde("=== 14. Der Ausgang ===");
|
||||
/* ---- Beenden ---- */
|
||||
const GRUND = "Hat sich nach der zweiten Schicht nicht mehr gemeldet.";
|
||||
{
|
||||
const r = await roh(`/workspace/api/talente/${jonas.id}/beenden`, HAUS,
|
||||
const r = await roh(`/workspace/api/talente/${jonas.id}/beenden`, CREW,
|
||||
{ cookie: kDogi }, { grund: GRUND }, "PUT");
|
||||
ok(r.code === 200 && json(r).beendet === true, `mit Satz geht es (${r.code})`);
|
||||
}
|
||||
{
|
||||
const l = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi }));
|
||||
const l = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi }));
|
||||
ok(!(l.kandidaten || []).some((k) => k.id === jonas.id),
|
||||
"er steht nicht mehr in der Arbeitsliste");
|
||||
const b = (l.beendete || []).find((k) => k.id === jonas.id);
|
||||
@@ -1040,10 +1120,10 @@ melde("=== 14. Der Ausgang ===");
|
||||
|
||||
/* ---- Wieder aufnehmen ---- */
|
||||
{
|
||||
const r = await roh(`/workspace/api/talente/${jonas.id}/wieder`, HAUS,
|
||||
const r = await roh(`/workspace/api/talente/${jonas.id}/wieder`, CREW,
|
||||
{ cookie: kDogi }, null, "PUT");
|
||||
ok(r.code === 200, `wieder aufnehmen geht (${r.code})`);
|
||||
const l = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi }));
|
||||
const l = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi }));
|
||||
const k = (l.kandidaten || []).find((x) => x.id === jonas.id);
|
||||
ok(!!k, "er steht wieder in der Arbeitsliste");
|
||||
ok(k?.stufe === "aufgefallen",
|
||||
@@ -1060,7 +1140,7 @@ melde("=== 14. Der Ausgang ===");
|
||||
"aus der Sammlung der Beendeten ist er heraus");
|
||||
}
|
||||
{
|
||||
const r = await roh(`/workspace/api/talente/${jonas.id}/wieder`, HAUS,
|
||||
const r = await roh(`/workspace/api/talente/${jonas.id}/wieder`, CREW,
|
||||
{ cookie: kDogi }, null, "PUT");
|
||||
ok(r.code === 409, `wer laeuft, kann nicht wieder aufgenommen werden (${r.code})`);
|
||||
}
|
||||
@@ -1073,22 +1153,22 @@ melde("=== 14. Der Ausgang ===");
|
||||
und den ZUGANG offengelassen -- und das ist schlimmer als gar kein
|
||||
Ausgang, weil man glaubt, gehandelt zu haben. */
|
||||
{
|
||||
const l = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi }));
|
||||
const l = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi }));
|
||||
const drin = (l.kandidaten || []).find((k) => k.stufe === "imteam");
|
||||
ok(!!drin, `es gibt einen im Team zum Gegenprobieren (${drin?.titel})`);
|
||||
const r = await roh(`/workspace/api/talente/${drin.id}/beenden`, HAUS,
|
||||
const r = await roh(`/workspace/api/talente/${drin.id}/beenden`, CREW,
|
||||
{ cookie: kDogi }, { grund: GRUND }, "PUT");
|
||||
ok(r.code === 409, `wer im Team ist, wird nicht hier beendet (${r.code})`);
|
||||
ok((json(r).fehler || "").includes("Zug"),
|
||||
`und es steht dabei, wo stattdessen (${(json(r).fehler || "").slice(0, 40)}...)`);
|
||||
const l2 = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi }));
|
||||
const l2 = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi }));
|
||||
ok((l2.kandidaten || []).some((k) => k.id === drin.id),
|
||||
"er steht unveraendert in der Liste -- nichts halb passiert");
|
||||
}
|
||||
|
||||
/* ---- Und die Gegenproben ---- */
|
||||
{
|
||||
const r = await roh("/workspace/api/talente/999999/beenden", HAUS,
|
||||
const r = await roh("/workspace/api/talente/999999/beenden", CREW,
|
||||
{ cookie: kDogi }, { grund: GRUND }, "PUT");
|
||||
ok(r.code === 404, `eine erfundene Nummer wird abgewiesen (${r.code})`);
|
||||
}
|
||||
@@ -1288,11 +1368,11 @@ melde("=== 16. Vom Talent zur Person mit Aufgaben ===");
|
||||
/* Ein eigener, frischer Kandidat. Der aus Abschnitt 13/14 ist durch
|
||||
den Ausgang und wieder hinein gelaufen -- an ihm waere „hat noch
|
||||
keine Person" nicht falsch, sondern unpruefbar. */
|
||||
const neuer = await roh("/workspace/api/bereich/talente", HAUS, { cookie: kDogi },
|
||||
const neuer = await roh("/workspace/api/bereich/talente", CREW, { cookie: kDogi },
|
||||
{ art: "ruhig", titel: "Marek aus dem Stream", text: "Faellt auf." });
|
||||
ok(neuer.code === 201 || neuer.code === 200, `ein frischer Kandidat (${neuer.code})`);
|
||||
|
||||
const finde = async (titel) => (json(await roh("/workspace/api/talente/lage", HAUS,
|
||||
const finde = async (titel) => (json(await roh("/workspace/api/talente/lage", CREW,
|
||||
{ cookie: kDogi })).kandidaten || []).find((k) => k.titel === titel);
|
||||
|
||||
let k = await finde("Marek aus dem Stream");
|
||||
@@ -1301,7 +1381,7 @@ melde("=== 16. Vom Talent zur Person mit Aufgaben ===");
|
||||
|
||||
/* ---- Die Nummer wird geprueft, nicht geglaubt ---- */
|
||||
{
|
||||
const r = await roh(`/workspace/api/talente/${k.id}/stufe`, HAUS, { cookie: kDogi },
|
||||
const r = await roh(`/workspace/api/talente/${k.id}/stufe`, CREW, { cookie: kDogi },
|
||||
{ stufe: "beobachtet", person_id: 999999 }, "PUT");
|
||||
ok(r.code === 400, `eine erfundene Zugangsnummer wird abgewiesen (${r.code})`);
|
||||
/* GEGENPROBE zur Wirkung: Die Stufe darf sich dabei NICHT geaendert
|
||||
@@ -1314,13 +1394,13 @@ melde("=== 16. Vom Talent zur Person mit Aufgaben ===");
|
||||
/* ---- Der Weg bis ins Team ---- */
|
||||
{
|
||||
const morgen = tagLokal(1);
|
||||
await roh(`/workspace/api/talente/${k.id}/stufe`, HAUS, { cookie: kDogi },
|
||||
await roh(`/workspace/api/talente/${k.id}/stufe`, CREW, { cookie: kDogi },
|
||||
{ stufe: "beobachtet" }, "PUT");
|
||||
await roh(`/workspace/api/talente/${k.id}/stufe`, HAUS, { cookie: kDogi },
|
||||
await roh(`/workspace/api/talente/${k.id}/stufe`, CREW, { cookie: kDogi },
|
||||
{ stufe: "angesprochen" }, "PUT");
|
||||
const hand = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi }))
|
||||
const hand = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi }))
|
||||
.buddys?.[0];
|
||||
await roh(`/workspace/api/talente/${k.id}/stufe`, HAUS, { cookie: kDogi },
|
||||
await roh(`/workspace/api/talente/${k.id}/stufe`, CREW, { cookie: kDogi },
|
||||
/* Die Felder heissen `buddy_id` und `erste_schicht` -- beim
|
||||
ersten Anlauf stand hier `buddy`/`datum`, und die Route wies
|
||||
den Uebergang ab. Der Fehler lag in dieser Datei, nicht im
|
||||
@@ -1333,13 +1413,13 @@ melde("=== 16. Vom Talent zur Person mit Aufgaben ===");
|
||||
/* ---- Der Zugang entsteht und wird VERKNUEPFT ---- */
|
||||
let personId = null;
|
||||
{
|
||||
const p = await roh("/workspace/api/verwaltung/personen", HAUS, { cookie: kDogi },
|
||||
const p = await roh("/workspace/api/verwaltung/personen", CREW, { cookie: kDogi },
|
||||
{ name: "Marek", rolle: "modi" });
|
||||
ok(p.code === 200 || p.code === 201, `der Zugang entsteht (${p.code})`);
|
||||
personId = json(p).id;
|
||||
ok(!!personId, `und hat eine Nummer (${personId})`);
|
||||
|
||||
const r = await roh(`/workspace/api/talente/${k.id}/stufe`, HAUS, { cookie: kDogi },
|
||||
const r = await roh(`/workspace/api/talente/${k.id}/stufe`, CREW, { cookie: kDogi },
|
||||
{ stufe: "imteam", person_id: personId }, "PUT");
|
||||
ok(r.code === 200, `die Karte geht ins Team (${r.code})`);
|
||||
|
||||
@@ -1366,7 +1446,7 @@ melde("=== 16. Vom Talent zur Person mit Aufgaben ===");
|
||||
Aufgefallen ist das erst an der GEGENPROBE -- mit ausgebautem
|
||||
COALESCE blieb sie gruen, obwohl sie genau das absichern soll.
|
||||
Eine Gegenprobe ist deshalb keine Kuer: Sie prueft die Pruefung. */
|
||||
const r = await roh(`/workspace/api/talente/${k.id}/stufe`, HAUS, { cookie: kDogi },
|
||||
const r = await roh(`/workspace/api/talente/${k.id}/stufe`, CREW, { cookie: kDogi },
|
||||
{ stufe: "angesprochen" }, "PUT");
|
||||
ok(r.code === 200, `ein Schritt zurueck geht durch (${r.code})`);
|
||||
const zurueck = await finde("Marek aus dem Stream");
|
||||
@@ -1374,13 +1454,13 @@ melde("=== 16. Vom Talent zur Person mit Aufgaben ===");
|
||||
`und er steht wirklich dort (${zurueck.stufe})`);
|
||||
ok(zurueck.person?.id === personId,
|
||||
"der Schritt zurueck nimmt ihr den Menschen nicht weg");
|
||||
await roh(`/workspace/api/talente/${k.id}/stufe`, HAUS, { cookie: kDogi },
|
||||
await roh(`/workspace/api/talente/${k.id}/stufe`, CREW, { cookie: kDogi },
|
||||
{ stufe: "imteam" }, "PUT");
|
||||
}
|
||||
|
||||
/* ---- Womit faengt er an? ---- */
|
||||
{
|
||||
const lage2 = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi }));
|
||||
const lage2 = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi }));
|
||||
ok(Array.isArray(lage2.start_kategorien) && lage2.start_kategorien.length > 0,
|
||||
`es gibt ${lage2.start_kategorien?.length} Bereiche zum Anfangen`);
|
||||
/* JEDER BEREICH HAT AUCH WIRKLICH AUFGABEN. Ein Knopf, der „0
|
||||
@@ -1394,14 +1474,14 @@ melde("=== 16. Vom Talent zur Person mit Aufgaben ===");
|
||||
const vorher = lage2.schon_vergeben?.[personId] || 0;
|
||||
ok(vorher === 0, `er hat noch nichts (${vorher})`);
|
||||
|
||||
const r = await roh("/workspace/api/vorlagen/uebernehmen", HAUS, { cookie: kDogi },
|
||||
const r = await roh("/workspace/api/vorlagen/uebernehmen", CREW, { cookie: kDogi },
|
||||
{ art: "katalog_alle", gruppe: g.wert, stufe: "neu", person_id: personId });
|
||||
ok(r.code === 200, `die Aufgaben lassen sich geben (${r.code})`);
|
||||
ok(json(r).angelegt === g.anzahl,
|
||||
`und es sind genau so viele, wie der Knopf versprochen hat `
|
||||
+ `(${json(r).angelegt} von ${g.anzahl})`);
|
||||
|
||||
const lage3 = json(await roh("/workspace/api/talente/lage", HAUS, { cookie: kDogi }));
|
||||
const lage3 = json(await roh("/workspace/api/talente/lage", CREW, { cookie: kDogi }));
|
||||
ok((lage3.schon_vergeben?.[personId] || 0) === g.anzahl,
|
||||
`die Karte zeigt jetzt ${lage3.schon_vergeben?.[personId]} offene`);
|
||||
}
|
||||
@@ -1638,23 +1718,23 @@ melde("=== 17. Der Anschluss im Browser ===");
|
||||
melde("");
|
||||
melde("=== 19. Wer sich kuemmert ===");
|
||||
{
|
||||
const neuer = await roh("/workspace/api/bereich/talente", HAUS, { cookie: kDogi },
|
||||
const neuer = await roh("/workspace/api/bereich/talente", CREW, { cookie: kDogi },
|
||||
{ art: "ruhig", titel: "Sami aus dem Chat", text: "Faellt auf." });
|
||||
ok(neuer.code === 201 || neuer.code === 200, `ein Kandidat dafuer (${neuer.code})`);
|
||||
|
||||
const finde = async (keks, haus) => (json(await roh("/workspace/api/talente/lage",
|
||||
haus, { cookie: keks })).kandidaten || []).find((k) => k.titel === "Sami aus dem Chat");
|
||||
|
||||
let k = await finde(kDogi, HAUS);
|
||||
let k = await finde(kDogi, CREW);
|
||||
ok(k?.zustaendig === null,
|
||||
`am Anfang kuemmert sich niemand (${JSON.stringify(k?.zustaendig)})`);
|
||||
|
||||
/* ---- Uebernehmen ---- */
|
||||
{
|
||||
const r = await roh(`/workspace/api/talente/${k.id}/kuemmern`, HAUS,
|
||||
const r = await roh(`/workspace/api/talente/${k.id}/kuemmern`, CREW,
|
||||
{ cookie: kDogi }, null, "PUT");
|
||||
ok(r.code === 200 && json(r).zustaendig === true, `uebernehmen geht (${r.code})`);
|
||||
k = await finde(kDogi, HAUS);
|
||||
k = await finde(kDogi, CREW);
|
||||
ok(k.zustaendig?.name === "Filipe", `und es steht dabei, wer (${k.zustaendig?.name})`);
|
||||
ok(k.zustaendig?.tage === 0, `seit wann (${k.zustaendig?.tage} Tage)`);
|
||||
}
|
||||
@@ -1668,16 +1748,16 @@ melde("=== 19. Wer sich kuemmert ===");
|
||||
ok((json(r).fehler || "").includes("Filipe"),
|
||||
`und erfaehrt, wer sich kuemmert ("${json(r).fehler}")`);
|
||||
/* GEGENPROBE ZUR WIRKUNG: nichts halb passiert. */
|
||||
k = await finde(kDogi, HAUS);
|
||||
k = await finde(kDogi, CREW);
|
||||
ok(k.zustaendig?.name === "Filipe", "der Zustaendige bleibt unveraendert");
|
||||
}
|
||||
|
||||
/* ---- Abgeben, dann kann der andere ---- */
|
||||
{
|
||||
const r = await roh(`/workspace/api/talente/${k.id}/kuemmern`, HAUS,
|
||||
const r = await roh(`/workspace/api/talente/${k.id}/kuemmern`, CREW,
|
||||
{ cookie: kDogi }, null, "PUT");
|
||||
ok(r.code === 200 && json(r).zustaendig === false, `derselbe Knopf gibt ab (${r.code})`);
|
||||
k = await finde(kDogi, HAUS);
|
||||
k = await finde(kDogi, CREW);
|
||||
ok(k.zustaendig === null, "danach kuemmert sich wieder niemand");
|
||||
|
||||
const r2 = await roh(`/workspace/api/talente/${k.id}/kuemmern`, CREW,
|
||||
@@ -1694,7 +1774,7 @@ melde("=== 19. Wer sich kuemmert ===");
|
||||
ok(r.code === 404, `ein Modi kann sich nicht zustaendig erklaeren (${r.code})`);
|
||||
}
|
||||
{
|
||||
const r = await roh("/workspace/api/talente/999999/kuemmern", HAUS,
|
||||
const r = await roh("/workspace/api/talente/999999/kuemmern", CREW,
|
||||
{ cookie: kDogi }, null, "PUT");
|
||||
ok(r.code === 404, `eine erfundene Nummer wird abgewiesen (${r.code})`);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user