Files
2024-09-27 01:01:17 +08:00

196 lines
4.4 KiB
JavaScript
Executable File

var test = require('tape');
var render = require('../../src/render');
var domEl = document.createElement('div');
document.body.appendChild(domEl); // needed to use selectors
function buildWidget(id) {
return {
id: id,
implementation: {id: id, refreshFrequency: false},
mtime: new Date(),
};
}
var state = {
widgets: {
foo: buildWidget('foo'),
bar: buildWidget('bar'),
},
settings: {},
screens: ['123'],
};
test('rendering a clean slate', (t) => {
render(state, '123', domEl);
t.equal(domEl.childNodes.length, 2, 'it renders 2 widgets');
t.ok(!!domEl.querySelector('#foo'), 'it renders widget foo');
t.ok(!!domEl.querySelector('#bar'), 'it renders widget bar');
t.end();
});
test('rendering new widgets', (t) => {
state.widgets.baz = buildWidget('baz');
render(state, '123', domEl);
t.equal(domEl.childNodes.length, 3, 'it renders 3 widgets');
t.ok(!!domEl.querySelector('#foo'), 'it renders widget foo');
t.ok(!!domEl.querySelector('#bar'), 'it renders widget bar');
t.ok(!!domEl.querySelector('#baz'), 'it renders widget baz');
t.end();
});
test('destroying removed widgets', (t) => {
delete state.widgets.bar;
render(state, '123', domEl);
t.equal(domEl.childNodes.length, 2, 'it leaves 2');
t.ok(!!domEl.querySelector('#foo'), 'it does not remove widget foo');
t.ok(!!domEl.querySelector('#baz'), 'it does not remove widget baz');
t.end();
});
test('rendering widgets that are visible on all screens', (t) => {
state.settings.baz = {
showOnAllScreens: true,
};
render(state, '123', domEl);
t.equal(domEl.childNodes.length, 2, 'it renders them');
render(state, '678', domEl);
t.equal(domEl.childNodes.length, 2, 'it renders them on any screen');
t.end();
});
test('rendering widgets that are pinned to the main screen', (t) => {
state.settings.baz = {
showOnAllScreens: false,
showOnMainScreen: true,
};
render(state, '123', domEl);
t.equal(
domEl.childNodes.length,
2,
'it renders them if current screen is main',
);
render(state, '156', domEl);
t.equal(
domEl.childNodes.length,
1,
'it does not render them if current screen is mot main',
);
t.end();
});
test('rendering widgets that are pinned to selected screens', (t) => {
state.settings.baz = {
showOnAllScreens: false,
showOnMainScreen: false,
showOnSelectedScreens: true,
};
render(state, '123', domEl);
t.equal(
domEl.childNodes.length,
1,
'it does not render them if no screen is selected',
);
state.settings.baz.screens = ['567'];
render(state, '123', domEl);
t.equal(
domEl.childNodes.length,
1,
'it does not render them if current screen is not in selected screens',
);
state.settings.baz.screens = ['567', '123'];
render(state, '123', domEl);
t.equal(
domEl.childNodes.length,
2,
'it renders them if current screen is in selected screens',
);
t.end();
});
test('performance when re-rendering', (t) => {
var prevNode = domEl.querySelector('#foo');
render(state, '123', domEl);
var newNode = domEl.querySelector('#foo');
t.ok(
prevNode === newNode,
'it does not re-render nodes if it does not need to',
);
prevNode = domEl.querySelector('#foo');
// new mtime
state.widgets.foo = buildWidget('foo');
render(state, '123', domEl);
newNode = domEl.querySelector('#foo');
t.ok(prevNode !== newNode, 'it does re-render nodes when it has to');
t.end();
});
test('rendering background widgets', (t) => {
var state = {
widgets: {
foo: buildWidget('foo'),
},
settings: {foo: {inBackground: true, showOnAllScreens: true}},
screens: ['123'],
};
render(state, '123', domEl);
t.equal(
domEl.childNodes.length,
1,
'it renders them if window.isBackground is not set',
);
window.isBackground = false;
render(state, '123', domEl);
t.equal(
domEl.childNodes.length,
0,
'it does not render them if window.background is false',
);
window.isBackground = true;
render(state, '123', domEl);
t.equal(
domEl.childNodes.length,
1,
'it renders them if window.background is true',
);
window.isBackground = false;
var state = {
widgets: {
foo: buildWidget('foo'),
},
settings: {foo: {showOnAllScreens: true}},
screens: ['123'],
};
render(state, '123', domEl);
t.equal(
domEl.childNodes.length,
1,
'it renders them in foreground if setting is undefined',
);
window.isBackground = undefined;
t.end();
});