feat(ux): zentrales deleteWithUndo + Undo-Toast in Birthdays
deleteWithUndo in ux.js: onDelete ausführen, Undo-Toast anzeigen. Birthdays migriert; Contacts/Notes/Meals haben bereits optimistische Undo-Logik.
This commit is contained in:
+29
-3
@@ -6,12 +6,12 @@ import { test } from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
|
||||
// Minimales Window/Navigator-Mock für Node
|
||||
const { stagger, vibrate } = await (async () => {
|
||||
// stagger braucht window.matchMedia - wir mocken es
|
||||
const { stagger, vibrate, deleteWithUndo } = await (async () => {
|
||||
global.window = {
|
||||
matchMedia: () => ({ matches: false }),
|
||||
oikos: { showToast: () => {} },
|
||||
};
|
||||
// navigator ist in Node ein getter-only property - über defineProperty überschreiben
|
||||
global.t = (k) => k;
|
||||
Object.defineProperty(global, 'navigator', {
|
||||
value: { vibrate: null },
|
||||
writable: true,
|
||||
@@ -47,3 +47,29 @@ test('vibrate: ruft navigator.vibrate auf wenn vorhanden', () => {
|
||||
vibrate(15);
|
||||
assert.equal(called, 15);
|
||||
});
|
||||
|
||||
test('deleteWithUndo: ruft onDelete auf', async () => {
|
||||
let deleteCalled = false;
|
||||
global.window.oikos = { showToast: () => {} };
|
||||
await deleteWithUndo({
|
||||
onDelete: async () => { deleteCalled = true; },
|
||||
toastMessage: 'Gelöscht',
|
||||
});
|
||||
assert.equal(deleteCalled, true);
|
||||
});
|
||||
|
||||
test('deleteWithUndo: übergibt onUndo an showToast', async () => {
|
||||
let undoCalled = false;
|
||||
let capturedUndo = null;
|
||||
global.window.oikos = {
|
||||
showToast: (_msg, _type, _duration, undoFn) => { capturedUndo = undoFn; },
|
||||
};
|
||||
await deleteWithUndo({
|
||||
onDelete: async () => {},
|
||||
onUndo: async () => { undoCalled = true; },
|
||||
toastMessage: 'Gelöscht',
|
||||
});
|
||||
assert.ok(capturedUndo, 'showToast muss eine Undo-Funktion erhalten haben');
|
||||
await capturedUndo();
|
||||
assert.equal(undoCalled, true);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user