196 lines
4.4 KiB
JavaScript
Executable File
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();
|
|
});
|