35 lines
2.3 KiB
JavaScript
35 lines
2.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 source = fs.readFileSync(__dirname + '/app.js', 'utf8');
|
|
// Exercise the production persistence/profile functions without starting a DOM player.
|
|
const declaration = name => source.match(new RegExp('(?:async )?function ' + name + '\\([^]*?\\n}'))[0];
|
|
function fixture(updatedAt) {
|
|
const settings = { saveBeforePlay: true, autoPreload: true, layout: 'f7-swipe', eq: { preset: 'custom', g: [1,2,3,4,5] } };
|
|
const context = vm.createContext({ WEB: true, data: { settings, profile: { name: 'test', syncedAt: 200 } }, DEFAULT_SETTINGS: { saveBeforePlay: false, autoPreload: true, layout: 'classic' }, API: { saveData: async () => {} }, profileHeaders: () => ({}), scheduleProfilePush: () => context.pushes++, pushes: 0, fetch: async () => ({ status: 200, json: async () => ({ ok: true, name: 'test', updatedAt, data: { settings: { saveBeforePlay: false } } }) }), localStorage: { getItem: () => JSON.stringify({ settings }) } });
|
|
vm.runInContext([declaration('loadDataFromStorage'), declaration('applyProfileData'), declaration('pullProfileIfNewer')].join('\n'), context);
|
|
return context;
|
|
}
|
|
test('stored settings load verbatim instead of reverting to defaults', () => {
|
|
const c = fixture(100);
|
|
const loaded = vm.runInContext('loadDataFromStorage()', c);
|
|
assert.equal(loaded.settings.saveBeforePlay, true);
|
|
assert.equal(loaded.settings.layout, 'f7-swipe');
|
|
assert.deepEqual(JSON.parse(JSON.stringify(loaded.settings.eq.g)), [1,2,3,4,5]);
|
|
});
|
|
for (const updatedAt of [100,200]) test(`profile timestamp ${updatedAt} cannot overwrite local settings synced at 200`, async () => {
|
|
const c = fixture(updatedAt), previous = c.data.settings;
|
|
await vm.runInContext('pullProfileIfNewer()', c);
|
|
assert.equal(c.data.settings, previous);
|
|
assert.equal(c.pushes, 1);
|
|
});
|
|
test('newer profile intentionally replaces settings and restores missing defaults', async () => {
|
|
const c = fixture(300);
|
|
await vm.runInContext('pullProfileIfNewer()', c);
|
|
assert.equal(c.data.settings.saveBeforePlay, false);
|
|
assert.equal(c.data.settings.autoPreload, true);
|
|
assert.equal(c.data.settings.layout, 'classic');
|
|
assert.equal(c.data.profile.syncedAt, 300);
|
|
});
|