const test = require('node:test'); const assert = require('node:assert/strict'); const fs = require('node:fs'); const path = require('node:path'); const { JSDOM } = require('jsdom'); const root = path.resolve(__dirname, '..'); const readPublicScript = relativePath => fs.readFileSync(path.join(root, 'public', relativePath), 'utf8'); function createSettingsDom() { const dom = new JSDOM(`
`, { url: 'http://nodecast.test/', runScripts: 'outside-only' }); const { window } = dom; window.eval(readPublicScript('js/services/liveAnalysisPresentation.js')); window.eval(`${readPublicScript('js/pages/Settings.js')}\nwindow.SettingsPage = SettingsPage;`); return { dom, window }; } test('full refresh keeps the rebuild action visibly busy during Laya language detection from persisted status', () => { const { dom, window } = createSettingsDom(); const settingsPage = Object.create(window.SettingsPage.prototype); settingsPage.app = { player: { settings: { languageDetectionMode: 'laya' } } }; settingsPage.layaStatus = { modelPresent: true, runtimeAvailable: true }; settingsPage.currentLiveAnalysisAction = ''; try { settingsPage.renderLiveAnalysisStatus({ status: 'building', phase: 'laya_language', phaseProcessed: 2, phaseTotal: 4, processed: 0, total: 128 }); assert.equal(window.document.getElementById('live-analysis-status').textContent, 'Detecting stream languages…'); assert.equal(window.document.getElementById('live-analysis-progress-text').textContent, 'Language batch 2 of 4 · 50%'); assert.equal( window.document.getElementById('live-rebuild-catalog-button').textContent, 'Refreshing…', 'full refresh should remain visibly active while the backend publishes laya_language' ); } finally { dom.window.close(); } });