Files

30 lines
1.7 KiB
JavaScript

const assert = require('assert');
const fs = require('fs');
const path = require('path');
const source = fs.readFileSync(path.join(__dirname, '../htdocs/luci-static/resources/view/status/index.js'), 'utf8');
const view = new Function('view', 'network', 'L', source)(
{extend: o => o}, {flushCache: () => Promise.resolve()},
{bind: (fn, ctx, ...args) => fn.bind(ctx, ...args)});
(async () => {
let release, queries = 0;
const results = [];
const slow = {deferFirstLoad: true, load: () => { queries++; return new Promise(r => {release = r;}); }};
const fast = {load: () => Promise.resolve('system ready')};
const container = {hasAttribute: () => true};
view.applyIncludeResult = (include, el, result) => results.push(result);
await view.poll_status([slow, fast], [container, container], false);
assert.deepEqual(results, ['system ready'], 'slow wireless must not block system rendering');
await view.poll_status([slow, fast], [container, container], false);
assert.equal(queries, 1, 'polls must not duplicate an outstanding wireless query');
assert.equal(results.length, 2, 'system must continue refreshing while wireless is pending');
release('wireless ready');
await slow._pendingLoad;
assert.equal(results[2], 'wireless ready');
assert.equal(slow._pendingLoad, null);
slow.load = () => Promise.reject(new Error('radio not ready'));
await view.poll_status([slow, fast], [container, container], false);
await slow._pendingLoad;
assert.equal(slow._pendingLoad, null, 'failed wireless query must be retried on a later poll');
console.log('Overview asynchronous rendering, in-flight coalescing and failure retry passed');
})().catch(e => {console.error(e); process.exit(1);});