const {test} = require('node:test'); const assert = require('node:assert/strict'); const fs = require('node:fs'); const vm = require('node:vm'); const settle = () => new Promise(resolve => setImmediate(resolve)); test('timezone watcher reports changes only while visible and cleans up detached layouts', async () => { let zone='Europe/Berlin', timer, cleared=0; const listeners={}, calls=[]; const window={setInterval(callback){timer=callback;return 1},clearInterval(){cleared++},addEventListener(name,callback){listeners[name]=callback}}; const document={visibilityState:'visible',addEventListener(name,callback){listeners[name]=callback}}; vm.runInNewContext(fs.readFileSync('src/main/frontend/device-timezone.js','utf8'),{ window,document,AbortController,Intl:{DateTimeFormat:()=>({resolvedOptions:()=>({timeZone:zone})})} }); const host={isConnected:true,$server:{async deviceReady(value){calls.push(value)}}}; window.werkjournalWatchZone(host);await settle();assert.deepEqual(calls,['Europe/Berlin']); await timer();assert.equal(calls.length,1); document.visibilityState='hidden';zone='America/New_York';await timer();assert.equal(calls.length,1); document.visibilityState='visible';await listeners.visibilitychange();assert.equal(calls.at(-1),'America/New_York'); host.isConnected=false;await timer();assert.equal(cleared,1); });