// 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, []); });