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>
This commit is contained in:
1 parent
e12936444d
commit
fd44db2213
2357 files changed
+588
-514948
No files matched your search
@@ -0,0 +1,53 @@
|
||||
// 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, []);
|
||||
});
|
||||
Reference in new issue
Block a user