bmc_hub/tests/test_message_inbox_dom.cjs

30 lines
2.8 KiB
JavaScript
Raw Normal View History

const {JSDOM}=require('jsdom');
const fs=require('node:fs');
const assert=require('node:assert/strict');
(async()=>{
const dom=new JSDOM('<div class="global-bottom-bar"><div id="bbTabTitle"><span class="bb-tab-title-text"></span></div><div id="bbTabDescription"></div><div id="bbTabInnerContent"></div></div>',{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 <script>alert(1)</script>',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);});