D31 lieh sich fuer die Echtzeit-Zusammenarbeit ein Etherpad: Das Pad war die Schreibflaeche, Werkbaum die Ansicht. Richtig fuer den Zeitpunkt - die schwere Arbeit war dort getan, und Werkbaum hatte kein Backend. Jetzt hat es eins (D76), das dasselbe besser und im Editor selbst kann. D31 bleibt stehen: Was dort gemessen wurde, ist der Grund, warum die Anbindung nie gut wurde - Export-Drosselung (10 je 90 s), SameSite=Lax beim Autoren-Cookie, abgelehnter Socket-Upgrade. Uebrig blieb ein Neu-laden-Knopf und ein schreibgeschuetztes Textfeld. Ein alter ?etherpad=-Link meldet sich, statt still nichts zu tun: Der Parameter bleibt erkannt und ergibt die zeilenlose Warnung padGone, die auf ?live= zeigt (neun Sprachen). Geholt wird nichts - nachgemessen geht keine Anfrage mehr an den Pad-Host. Vorhandene Pad-Dokumente bleiben liegen und werden dabei besser: ohne Schreibschutz sind sie bearbeitbar und sammeln fruehere Staende. Mit ausgebaut, weil sie nur der Anbindung dienten: remote.js samt Tests, der Ansichts-Waehler und sein Splitter, der Neu-laden-Knopf samt Drosselungs-Zaehler, die Warnungen sourceTimeout/padRateLimit, elf i18n- Schluessel x 9 Sprachen - und src.readOnly ganz, denn nur Pad-Dokumente haben es gesetzt (mit ihm updateSnapBtn und sieben tote Waechter). Auch #srcArea faellt weg: den Kasten gab es nur, damit Pad-Rahmen und Spiegel sich einen Bereich teilen. ?sourceUrl= bleibt unangetastet - beide teilten sich einen Fetch-Pfad, das war die Stelle, an der nichts verrutschen durfte. Im Plan wird aus dem #col.pad-Zweig (14 Knoten samt der ganzen "Update by itself"-Gruppe) ein verworfener Knoten mit Begruendung; der gemeinsame Zeigefinger wandert als #col.point heraus, denn !!! gilt jedem geteilten Dokument. 196 Knoten, 0 Warnungen. Nebengewinn: Der README bekommt endlich den Abschnitt zu ?live= - den gab es nie, die Einstiegs-Beschreibung stand weiter beim Pad. Nachgemessen im Browser: ?etherpad= zeigt die Warnung ohne Netz-Anfrage, ?sourceUrl= laedt unveraendert und ist beschreibbar, Textfeld und Zahlenstreifen liegen buendig, Legenden-Splitter teilt wie zuvor (954+10+300), Falten und Staende funktionieren. 501 Tests, 946 Zeilen weniger.
57 lines
2.6 KiB
JavaScript
57 lines
2.6 KiB
JavaScript
import { describe, it, expect } from 'vitest';
|
|
import { formatWarning, warningText } from '../src/warnings.js';
|
|
|
|
/* Stub bildet key + interpolierte Variablen sichtbar ab, damit wir prüfen
|
|
können, welche Werte (inkl. Escaping) formatWarning durchreicht. */
|
|
const t = (key, vars) => `${key}|${JSON.stringify(vars)}`;
|
|
|
|
describe('formatWarning — vereinheitlichtes Warnungs-Modell', () => {
|
|
it('mixedGate reicht Zeile durch und HTML-escaped das Label', () => {
|
|
const out = formatWarning({type: 'mixedGate', line: 7, label: 'A & <B>'}, t);
|
|
expect(out).toBe('mixedWarn|{"line":7,"label":"A & <B>"}');
|
|
});
|
|
|
|
it('unknownStatus reicht Zeile durch und escaped den Code', () => {
|
|
const out = formatWarning({type: 'unknownStatus', line: 3, code: '<'}, t);
|
|
expect(out).toBe('unknownStatusWarn|{"line":3,"code":"<"}');
|
|
});
|
|
|
|
it('sourceLoad escaped die URL und reicht das technische Detail durch', () => {
|
|
const out = formatWarning({type: 'sourceLoad', url: 'https://a/?x=1&y=2', error: 'HTTP 404'}, t);
|
|
expect(out).toBe('sourceLoadWarn|{"url":"https://a/?x=1&y=2","error":"HTTP 404"}');
|
|
});
|
|
|
|
/* Ein alter ?etherpad=-Link soll nicht still ins Leere laufen: Die Anbindung
|
|
ist ausgebaut (D78), der Text zeigt auf ?live=. Ohne Platzhalter — die
|
|
Meldung hat nichts einzusetzen. */
|
|
it('padGone meldet den ausgebauten Eingang ohne Platzhalter', () => {
|
|
expect(formatWarning({type: 'padGone'}, t)).toBe('padGoneWarn|undefined');
|
|
});
|
|
|
|
it('unbekannter Typ fällt auf eine generische, escapte Meldung zurück', () => {
|
|
expect(formatWarning({type: 'was?', line: 9}, t)).toBe('was? (9)');
|
|
expect(formatWarning({type: 'x'}, t)).toBe('x (?)');
|
|
});
|
|
});
|
|
|
|
/* Der `title` der Zeilennummer ist kein HTML — dort stünde sonst wörtlich
|
|
„Drag & Drop“ (D33-Nachtrag). Dieselben Typen, dieselbe Vorlage, nur
|
|
ohne Escaping. */
|
|
describe('warningText — dieselbe Meldung als Klartext', () => {
|
|
it('lässt das Label unangetastet', () => {
|
|
expect(warningText({type: 'mixedGate', line: 7, label: 'A & <B>'}, t))
|
|
.toBe('mixedWarn|{"line":7,"label":"A & <B>"}');
|
|
});
|
|
|
|
it('lässt die URL unangetastet', () => {
|
|
expect(warningText({type: 'sourceLoad', url: 'https://a/?x=1&y=2', error: 'HTTP 404'}, t))
|
|
.toBe('sourceLoadWarn|{"url":"https://a/?x=1&y=2","error":"HTTP 404"}');
|
|
});
|
|
|
|
it('deckt dieselben Typen ab wie formatWarning', () => {
|
|
expect(warningText({type: 'descStray', line: 4}, t)).toBe('descStrayWarn|{"line":4}');
|
|
expect(warningText({type: 'cheapApprox'}, t)).toBe('cheapApproxWarn|undefined');
|
|
expect(warningText({type: 'was?', line: 9}, t)).toBe('was? (9)');
|
|
});
|
|
});
|