Files
projektuebersicht/test/zusammenfuehren.test.js
T
erikandClaude Opus 5.5 fd44db2213 Update über den Git-Server, Tests, Repo ohne node_modules und Sicherungen
- Admin → Update: neuere Versionen (Tags) vom Git-Server anzeigen und per
  Knopf einspielen; ausgeführt vom Dienst auf dem Rechner
  (Docker/update-einrichten.sh, Docker/update-ausfuehren.sh), nur vorwärts,
  Fehler bei ausbleibendem Neustart, abgebrochene Läufe sperren nicht
- Tests (npm test): Zusammenführen paralleler Änderungen, Rechteprüfung
  beim Speichern; SESSIONS_DIR lenkt den Datenordner für Testserver um
- node_modules, Sicherungen und Uploads aus dem Repo genommen
- cors und requireRole() entfernt

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 11:10:56 +01:00

54 lines
2.9 KiB
JavaScript

// Test: Zusammenführen, wenn zwei Personen gleichzeitig dieselbe Sitzung
// bearbeiten (dreiwegeZusammenfuehren() in public/js/store.js). Das Modul ist
// ein Browser-Skript; es wird hier mit leeren Platzhaltern für window und
// Zeitgeber geladen. Aufruf: npm test
const test = require('node:test');
const assert = require('node:assert');
const fs = require('fs');
const path = require('path');
const vm = require('vm');
const ctx = vm.createContext({ window: { addEventListener(){} }, setInterval(){}, setTimeout(){}, console });
vm.runInContext(fs.readFileSync(path.join(__dirname, '../public/js/store.js'), 'utf8'), ctx);
const zusammen = (basis, eigen, fremd) => {
const konflikte = [];
// JSON-Runde: Objekte aus dem vm-Kontext mit denen von hier vergleichbar machen.
return { ergebnis: JSON.parse(JSON.stringify(ctx.dreiwegeZusammenfuehren(basis, eigen, fremd, '', konflikte))), konflikte };
};
const kopie = x => JSON.parse(JSON.stringify(x));
const basis = { label: 'KW 46 / 2026', projects: [
{ id: 'a', name: 'Feuerwache', plan: { todos: [{ id: 't1', title: 'Lastaufstellung', done: false }] } },
{ id: 'b', name: 'Rathaus', plan: { todos: [] } }
] };
test('Änderungen an verschiedenen Projekten bleiben beide erhalten', () => {
const eigen = kopie(basis); eigen.projects[0].plan.todos[0].done = true;
const fremd = kopie(basis); fremd.projects[1].plan.todos.push({ id: 't2', title: 'Brandschutz', done: false });
const { ergebnis, konflikte } = zusammen(basis, eigen, fremd);
assert.strictEqual(ergebnis.projects[0].plan.todos[0].done, true);
assert.deepStrictEqual(ergebnis.projects[1].plan.todos.map(t => t.id), ['t2']);
assert.deepStrictEqual(konflikte, []);
});
test('Neue Aufgaben beider Seiten im selben Projekt gehen nicht verloren', () => {
const eigen = kopie(basis); eigen.projects[0].plan.todos.push({ id: 'e1', title: 'Meine' });
const fremd = kopie(basis); fremd.projects[0].plan.todos.push({ id: 'f1', title: 'Fremde' });
const ids = zusammen(basis, eigen, fremd).ergebnis.projects[0].plan.todos.map(t => t.id).sort();
assert.deepStrictEqual(ids, ['e1', 'f1', 't1']);
});
test('Gleiches Feld unterschiedlich geändert: eigene Fassung gewinnt, Konflikt wird gemeldet', () => {
const eigen = kopie(basis); eigen.projects[0].plan.todos[0].title = 'Lastaufstellung Ebene 1';
const fremd = kopie(basis); fremd.projects[0].plan.todos[0].title = 'Lastaufstellung Ebene 2';
const { ergebnis, konflikte } = zusammen(basis, eigen, fremd);
assert.strictEqual(ergebnis.projects[0].plan.todos[0].title, 'Lastaufstellung Ebene 1');
assert.strictEqual(konflikte.length, 1);
});
test('Von der anderen Seite gelöschte, hier unveränderte Aufgabe bleibt gelöscht', () => {
const eigen = kopie(basis);
const fremd = kopie(basis); fremd.projects[0].plan.todos = [];
assert.deepStrictEqual(zusammen(basis, eigen, fremd).ergebnis.projects[0].plan.todos, []);
});