const {JSDOM}=require('jsdom'); const fs=require('node:fs'); const assert=require('node:assert/strict'); (async()=>{ const dom=new JSDOM(fs.readFileSync('app/shared/frontend/internal_message.html','utf8'),{url:'http://localhost:8001',runScripts:'outside-only'}); const w=dom.window,d=w.document;let sent=null,fail=false; w.bootstrap={Modal:{getOrCreateInstance:()=>({show(){},hide(){}})}}; w.fetch=async(url,options={})=>{ if(options.method==='POST'){sent=JSON.parse(options.body);return {ok:!fail,json:async()=>fail?{detail:'Testfejl'}:{message:'Besked sendt'}};} return {ok:true,json:async()=>url.includes('auth/me')?{id:1}:url.includes('users')?[{id:1,full_name:'Mig'},{id:2,full_name:'Kollega'}]:[]}; }; w.eval(fs.readFileSync('static/js/internal-message.js','utf8')); await w.openInternalMessage(); assert.equal(d.getElementById('im-recipient').options.length,2); assert.equal(sent,null,'Opening must not send anything'); d.getElementById('im-recipient').value='2';d.getElementById('im-text').value='Kort besked'; d.getElementById('internalMessageForm').dispatchEvent(new w.Event('submit',{cancelable:true}));await new Promise(r=>setTimeout(r,10)); assert.equal(sent.contact_id,null);assert.equal(sent.message_kind,'message');assert.equal(sent.recipient_user_id,2); await w.openInternalMessage({contact:{id:4,name:'Kontakt'}}); d.querySelector('[data-internal-kind="phone"]').click(); assert.ok(!d.getElementById('im-phone-fields').classList.contains('d-none')); d.getElementById('im-recipient').value='2';d.getElementById('im-phone').value='12345678';d.getElementById('im-text').value='Ring venligst tilbage'; fail=true;d.getElementById('internalMessageForm').dispatchEvent(new w.Event('submit',{cancelable:true}));await new Promise(r=>setTimeout(r,10)); assert.equal(sent.contact_id,4);assert.equal(sent.caller_name,'Kontakt');assert.equal(sent.callback_phone,'12345678');assert.equal(sent.message_kind,'phone'); assert.equal(d.getElementById('im-text').value,'Ring venligst tilbage','Failure must preserve draft'); d.getElementById('im-contact').querySelector('button').click();fail=false; d.getElementById('internalMessageForm').dispatchEvent(new w.Event('submit',{cancelable:true}));await new Promise(r=>setTimeout(r,10)); assert.equal(sent.contact_id,null);assert.equal(sent.caller_name,'Kontakt');assert.equal(d.getElementById('im-text').value,''); dom.window.close();console.log('PASS: explicit sending, recipient choice, normal/phone messages, optional/removable contact, failure preserves text'); })().catch(e=>{console.error(e);process.exit(1);});