22 lines
1.3 KiB
JavaScript
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);
|
|
});
|