Files
werkjournal/tests/frontend/account-deletion.test.cjs
2026-09-09 13:37:08 +02:00

43 lines
2.3 KiB
JavaScript

const {test} = require('node:test');
const assert = require('node:assert/strict');
const vm = require('node:vm');
const fs = require('node:fs');
const script = fs.readFileSync('src/main/resources/static/account-deletion.js', 'utf8');
function run({hash = '', owner = '', form = null, storage = {}} = {}) {
const changes = [];
const localStorage = {...storage};
Object.defineProperties(localStorage, {
getItem: {value: k => localStorage[k] ?? null},
setItem: {value: (k,v) => {localStorage[k] = v;}},
removeItem: {value: k => {delete localStorage[k];}}
});
vm.runInNewContext(script, {
document: {body:{dataset:{deletedOwner:owner,loginUrl:'/login'}},getElementById:id=>id==='deletion-link'?form:null},
window: {location:{hash,pathname:'/account/delete',search:''},addEventListener(){}},
history: {replaceState: (_,__,url) => changes.push(url)}, localStorage,
crypto: {randomUUID:()=> 'event'}
});
return {changes,localStorage};
}
test('email fragment submits verification only and clears the secret from history',()=>{
const form = {elements:{token:{value:''}},hidden:true,requestSubmit(){this.submitted=true;}};
const token = 'a'.repeat(43);
const result = run({hash:'#token='+token,form});
assert.equal(form.elements.token.value,token); assert.equal(form.submitted,true);
assert.deepEqual(result.changes,['/account/delete']);
});
test('anonymous and malformed email links never submit a form',()=>{
assert.deepEqual(run({hash:'#token='+'a'.repeat(43)}).changes,['/account/delete']);
const form = {elements:{token:{value:''}},requestSubmit(){throw Error('unexpected submit');}};
run({hash:'#token=invalid',form});
});
test('successful deletion removes only the deleted owners drafts and not device preferences',()=>{
const {localStorage,changes} = run({owner:'owner',storage:{'werkjournal.work.owner.tab':'draft','werkjournal.work.other.tab':'keep','werkjournal.last-owner':'owner','werkjournal.theme':'dark'}});
assert.equal(localStorage['werkjournal.work.owner.tab'],undefined);
assert.equal(localStorage['werkjournal.work.other.tab'],'keep');
assert.equal(localStorage['werkjournal.theme'],'dark');
assert.equal(localStorage['werkjournal.logout.owner'],'event');
assert.equal(localStorage['werkjournal.last-owner'],undefined);
assert.deepEqual(changes,['/login?deleted']);
});