144 lines
3.3 KiB
JavaScript
144 lines
3.3 KiB
JavaScript
const test = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
const fs = require('node:fs');
|
|
const vm = require('node:vm');
|
|
|
|
test('system status shows connected player count in the live feed label', () => {
|
|
const script = fs.readFileSync(require.resolve('../src/web/public/js/system-status.js'), 'utf8');
|
|
const elements = {
|
|
'sidebar-status-dot': {
|
|
classList: {
|
|
remove() {},
|
|
add() {}
|
|
},
|
|
setAttribute() {}
|
|
},
|
|
'sidebar-status-text': {
|
|
textContent: ''
|
|
}
|
|
};
|
|
const sockets = [];
|
|
|
|
const context = {
|
|
document: {
|
|
getElementById(id) {
|
|
return elements[id] || null;
|
|
}
|
|
},
|
|
window: {
|
|
WebSocket: true,
|
|
location: {
|
|
protocol: 'http:',
|
|
host: 'example.test'
|
|
},
|
|
setTimeout() {
|
|
return 1;
|
|
},
|
|
clearTimeout() {},
|
|
webHandleDashboardState() {}
|
|
},
|
|
WebSocket: function MockWebSocket(url) {
|
|
this.url = url;
|
|
sockets.push(this);
|
|
this.close = function () {};
|
|
},
|
|
JSON: JSON,
|
|
Number: Number,
|
|
String: String,
|
|
Boolean: Boolean,
|
|
Array: Array,
|
|
Object: Object,
|
|
Math: Math,
|
|
setTimeout() {},
|
|
clearTimeout() {},
|
|
console: console
|
|
};
|
|
context.window.document = context.document;
|
|
context.window.WebSocket = context.WebSocket;
|
|
|
|
vm.runInNewContext(script, context);
|
|
|
|
assert.equal(sockets.length, 1);
|
|
sockets[0].onmessage({
|
|
data: JSON.stringify({
|
|
type: 'dashboard-state',
|
|
state: {
|
|
screens: [{ slug: 'alpha' }],
|
|
playerServiceConnected: true,
|
|
connectedPlayersCount: 4
|
|
}
|
|
})
|
|
});
|
|
|
|
assert.equal(elements['sidebar-status-text'].textContent, 'Live player feed - 4 players connected');
|
|
});
|
|
|
|
test('system status shows an explicit idle label when no players are connected', () => {
|
|
const script = fs.readFileSync(require.resolve('../src/web/public/js/system-status.js'), 'utf8');
|
|
const elements = {
|
|
'sidebar-status-dot': {
|
|
classList: {
|
|
remove() {},
|
|
add() {}
|
|
},
|
|
setAttribute() {}
|
|
},
|
|
'sidebar-status-text': {
|
|
textContent: ''
|
|
}
|
|
};
|
|
const sockets = [];
|
|
|
|
const context = {
|
|
document: {
|
|
getElementById(id) {
|
|
return elements[id] || null;
|
|
}
|
|
},
|
|
window: {
|
|
WebSocket: true,
|
|
location: {
|
|
protocol: 'http:',
|
|
host: 'example.test'
|
|
},
|
|
setTimeout() {
|
|
return 1;
|
|
},
|
|
clearTimeout() {},
|
|
webHandleDashboardState() {}
|
|
},
|
|
WebSocket: function MockWebSocket(url) {
|
|
this.url = url;
|
|
sockets.push(this);
|
|
this.close = function () {};
|
|
},
|
|
JSON: JSON,
|
|
Number: Number,
|
|
String: String,
|
|
Boolean: Boolean,
|
|
Array: Array,
|
|
Object: Object,
|
|
Math: Math,
|
|
setTimeout() {},
|
|
clearTimeout() {},
|
|
console: console
|
|
};
|
|
context.window.document = context.document;
|
|
context.window.WebSocket = context.WebSocket;
|
|
|
|
vm.runInNewContext(script, context);
|
|
|
|
assert.equal(sockets.length, 1);
|
|
sockets[0].onmessage({
|
|
data: JSON.stringify({
|
|
type: 'dashboard-state',
|
|
state: {
|
|
screens: [{ slug: 'alpha' }],
|
|
playerServiceConnected: true,
|
|
connectedPlayersCount: 0
|
|
}
|
|
})
|
|
});
|
|
|
|
assert.equal(elements['sidebar-status-text'].textContent, 'Player feed online - no players connected');
|
|
}); |