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']); });