- 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>
54 lines
2.9 KiB
JavaScript
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, []);
|
|
});
|