const {JSDOM}=require('jsdom'); const fs=require('node:fs'); const assert=require('node:assert/strict'); (async()=>{ const dom=new JSDOM('
',{url:'http://localhost:8001',runScripts:'outside-only',pretendToBeVisual:true}); const w=dom.window,d=w.document; await new Promise(r=>w.addEventListener('DOMContentLoaded',r)); w.fetch=async()=>({ok:true,json:async()=>[]}); w.eval(fs.readFileSync('static/js/message-ui.js','utf8')); const src=fs.readFileSync('static/js/bottom-bar.js','utf8').replace(/\}\)\(\);\s*$/, 'window.inboxTest={render(items,key=""){latestSections={messages:{list:items,count:0}};activeKey="messages";chatComposerState.activeThreadKey=key;chatComposerState.loaded=true;renderTabPanel();},threads:getMessageThreads};})();'); w.eval(src); w.inboxTest.render([]); assert.ok(d.querySelector('.bb-message-threads')); assert.ok(d.querySelector('.msg-conversation')); assert.ok(d.getElementById('btnSendMsg').disabled,'Empty inbox must not silently broadcast'); const items=[{id:1,sender_user_id:2,recipient_user_id:null,from:'Kollega',text:'Fælles besked',created_at:'2026-09-08T10:00:00'}, {id:2,sender_user_id:2,recipient_user_id:1,from:'Kollega',text:'Ring tilbage ',message_kind:'phone',caller_name:'Anne',callback_phone:'+45 12345678',contact_id:4,created_at:'2026-09-08T11:00:00'}, {id:3,sender_user_id:1,recipient_user_id:2,to:'Kollega',from:'Dig',text:'Jeg ringer',is_own:true,is_read:true,created_at:'2026-09-08T11:01:00'}]; w.inboxTest.render(items,'user:2'); assert.equal(w.inboxTest.threads().length,2,'Broadcast is separate from sender conversation'); assert.equal(d.querySelectorAll('.msg-message').length,2); assert.equal(d.querySelectorAll('.msg-call').length,1); assert.equal(d.querySelector('.msg-call-action').getAttribute('href'),'tel:+4512345678'); assert.equal(d.querySelector('.msg-bubble script'),null,'Messages must be escaped'); assert.match(d.querySelector('.is-own .msg-delivery').textContent,/Læst/); assert.equal(d.getElementById('chatInputQuick').tagName,'TEXTAREA'); let sends=0;d.getElementById('btnSendMsg').onclick=()=>sends++; d.getElementById('chatInputQuick').dispatchEvent(new w.KeyboardEvent('keydown',{key:'Enter',bubbles:true}));assert.equal(sends,0); d.getElementById('chatInputQuick').dispatchEvent(new w.KeyboardEvent('keydown',{key:'Enter',ctrlKey:true,bubbles:true}));assert.equal(sends,1); dom.window.close();console.log('PASS: inbox layout, empty-state safety, separate broadcasts, phone cards, escaping, read status, multiline and shortcut'); })().catch(e=>{console.error(e);process.exit(1);});