import {test} from 'node:test'; import assert from 'node:assert/strict'; import fs from 'node:fs'; import vm from 'node:vm'; import ts from '../apps/web/node_modules/typescript/lib/typescript.js'; const raw=fs.readFileSync('apps/web/src/schedule.tsx','utf8'); const js=ts.transpileModule(raw,{compilerOptions:{module:ts.ModuleKind.CommonJS,jsx:ts.JsxEmit.React}}).outputText; const box={exports:{},require:()=>({t:x=>x})};vm.runInNewContext(js,box);const {cronFromPreset,presetFromCron,defaultCronPreset}=box.exports; test('fixed intervals retain exact elapsed units',()=>{ for (const unit of ['minutes','hours','days']) {const p={...defaultCronPreset(),freq:'Interval',n:45,unit};const cron=cronFromPreset(p);const restored=presetFromCron(cron);assert.equal(restored.n,45);assert.equal(restored.unit,unit);} }); test('unknown cron is preserved verbatim instead of silently rewritten',()=>{ for(const cron of ['0 0 9 * * 1','0 25 * * *','99 9 * * *','0 0 */3 * *','*/45 * * * *']){const p=presetFromCron(cron);assert.equal(p.freq,'Advanced');assert.equal(cronFromPreset(p),cron);} }); test('blank advanced expressions are never converted to a scheduled job',()=>assert.equal(cronFromPreset({...defaultCronPreset(),freq:'Advanced',cron:''}),'')); test('VNC paste delegates once to confirmed backend and rejects another source',async()=>{ const source=fs.readFileSync('apps/web/vnc.html','utf8').match(/'),undefined); assert.equal(sanitizeMarkdownUrl('/relative'),undefined); }); test('hanging up before microphone permission resolves releases the late stream',async()=>{ let grant; let stopped=0; const context={exports:{},navigator:{mediaDevices:{getUserMedia:()=>new Promise(resolve=>grant=resolve)}}}; vm.runInNewContext(audioJs,context); const audio=new context.exports.CallAudio({onCapture(){},onError(){}}); const starting=audio.start(); audio.stop(); grant({getTracks:()=>[{stop(){stopped++;}}]}); await starting; assert.equal(stopped,1); });