const test=require('node:test'); const assert=require('node:assert/strict'); const fs=require('node:fs'); const vm=require('node:vm'); const source=fs.readFileSync('static/js/case-v5.js','utf8'); function fixture(groupId){ const nodes={v5UserSearch:{value:''},v5UserOptions:{children:[],replaceChildren(){this.children=[];},append(button){this.children.push(button);}}}; const context={members:[{user_id:7,display_name:'Christian Thomas',group_ids:[2,3]},{user_id:8,display_name:'Mette Jensen',group_ids:[4]}],groupId,userId:null,busy:false,pending:null,byId:id=>nodes[id],renderGroups(){},renderActions(){},document:{createElement(){return {setAttribute(key,value){this[key]=value;},addEventListener(type,fn){this[type]=fn;}};}}}; vm.createContext(context); vm.runInContext(source.slice(source.indexOf(' function employeeInitials('),source.indexOf(' async function loadMembers()')),context); context.renderUsers(); return {context,nodes}; } test('initial buttons identify employees and infer their assignment group',()=>{ const {context,nodes}=fixture(2); const buttons=nodes.v5UserOptions.children; assert.deepEqual(buttons.map(b=>b.textContent),['CT','MJ']); assert.equal(buttons[0].title,'Christian Thomas'); buttons[0].click();assert.equal(context.userId,7);assert.equal(context.groupId,2); nodes.v5UserOptions.children[1].click();assert.equal(context.userId,8);assert.equal(context.groupId,4); }); test('initials can be searched and an unrelated group is replaced',()=>{ const {context,nodes}=fixture(99); nodes.v5UserSearch.value='ct';context.renderUsers(); assert.equal(nodes.v5UserOptions.children.length,1); nodes.v5UserOptions.children[0].click();assert.equal(context.groupId,2); });