Files
werkjournal/tests/frontend/device-timezone.test.cjs

22 lines
1.3 KiB
JavaScript

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);
});