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); });